Full Code of rxi/lite for AI

master 38bd9b3326c0 cached
429 files
18.6 MB
1.5M tokens
2474 symbols
1 requests
Download .txt
Showing preview only (5,886K chars total). Download the full file or copy to clipboard to get everything.
Repository: rxi/lite
Branch: master
Commit: 38bd9b3326c0
Files: 429
Total size: 18.6 MB

Directory structure:
gitextract_u_nu9sbi/

├── .gitattributes
├── .github/
│   └── FUNDING.yml
├── LICENSE
├── README.md
├── build.bat
├── build.sh
├── build_release.sh
├── data/
│   ├── core/
│   │   ├── command.lua
│   │   ├── commands/
│   │   │   ├── command.lua
│   │   │   ├── core.lua
│   │   │   ├── doc.lua
│   │   │   ├── findreplace.lua
│   │   │   └── root.lua
│   │   ├── commandview.lua
│   │   ├── common.lua
│   │   ├── config.lua
│   │   ├── doc/
│   │   │   ├── highlighter.lua
│   │   │   ├── init.lua
│   │   │   ├── search.lua
│   │   │   └── translate.lua
│   │   ├── docview.lua
│   │   ├── init.lua
│   │   ├── keymap.lua
│   │   ├── logview.lua
│   │   ├── object.lua
│   │   ├── rootview.lua
│   │   ├── statusview.lua
│   │   ├── strict.lua
│   │   ├── style.lua
│   │   ├── syntax.lua
│   │   ├── tokenizer.lua
│   │   └── view.lua
│   ├── plugins/
│   │   ├── autocomplete.lua
│   │   ├── autoreload.lua
│   │   ├── language_c.lua
│   │   ├── language_css.lua
│   │   ├── language_js.lua
│   │   ├── language_lua.lua
│   │   ├── language_md.lua
│   │   ├── language_python.lua
│   │   ├── language_xml.lua
│   │   ├── macro.lua
│   │   ├── projectsearch.lua
│   │   ├── quote.lua
│   │   ├── reflow.lua
│   │   ├── tabularize.lua
│   │   ├── treeview.lua
│   │   └── trimwhitespace.lua
│   └── user/
│       ├── colors/
│       │   ├── fall.lua
│       │   └── summer.lua
│       └── init.lua
├── doc/
│   └── usage.md
├── icon.inl
├── res.rc
├── src/
│   ├── api/
│   │   ├── api.c
│   │   ├── api.h
│   │   ├── renderer.c
│   │   ├── renderer_font.c
│   │   └── system.c
│   ├── lib/
│   │   ├── lua52/
│   │   │   ├── lapi.c
│   │   │   ├── lapi.h
│   │   │   ├── lauxlib.c
│   │   │   ├── lauxlib.h
│   │   │   ├── lbaselib.c
│   │   │   ├── lbitlib.c
│   │   │   ├── lcode.c
│   │   │   ├── lcode.h
│   │   │   ├── lcorolib.c
│   │   │   ├── lctype.c
│   │   │   ├── lctype.h
│   │   │   ├── ldblib.c
│   │   │   ├── ldebug.c
│   │   │   ├── ldebug.h
│   │   │   ├── ldo.c
│   │   │   ├── ldo.h
│   │   │   ├── ldump.c
│   │   │   ├── lfunc.c
│   │   │   ├── lfunc.h
│   │   │   ├── lgc.c
│   │   │   ├── lgc.h
│   │   │   ├── linit.c
│   │   │   ├── liolib.c
│   │   │   ├── llex.c
│   │   │   ├── llex.h
│   │   │   ├── llimits.h
│   │   │   ├── lmathlib.c
│   │   │   ├── lmem.c
│   │   │   ├── lmem.h
│   │   │   ├── loadlib.c
│   │   │   ├── lobject.c
│   │   │   ├── lobject.h
│   │   │   ├── lopcodes.c
│   │   │   ├── lopcodes.h
│   │   │   ├── loslib.c
│   │   │   ├── lparser.c
│   │   │   ├── lparser.h
│   │   │   ├── lstate.c
│   │   │   ├── lstate.h
│   │   │   ├── lstring.c
│   │   │   ├── lstring.h
│   │   │   ├── lstrlib.c
│   │   │   ├── ltable.c
│   │   │   ├── ltable.h
│   │   │   ├── ltablib.c
│   │   │   ├── ltm.c
│   │   │   ├── ltm.h
│   │   │   ├── lua.c_
│   │   │   ├── lua.h
│   │   │   ├── lua.hpp
│   │   │   ├── luac.c_
│   │   │   ├── luaconf.h
│   │   │   ├── lualib.h
│   │   │   ├── lundump.c
│   │   │   ├── lundump.h
│   │   │   ├── lvm.c
│   │   │   ├── lvm.h
│   │   │   ├── lzio.c
│   │   │   └── lzio.h
│   │   └── stb/
│   │       ├── stb_truetype.c
│   │       └── stb_truetype.h
│   ├── main.c
│   ├── rencache.c
│   ├── rencache.h
│   ├── renderer.c
│   └── renderer.h
└── winlib/
    └── SDL2-2.0.10/
        ├── BUGS.txt
        ├── COPYING.txt
        ├── CREDITS.txt
        ├── INSTALL.txt
        ├── Makefile
        ├── README-SDL.txt
        ├── README.txt
        ├── WhatsNew.txt
        ├── docs/
        │   ├── README-android.md
        │   ├── README-cmake.md
        │   ├── README-directfb.md
        │   ├── README-dynapi.md
        │   ├── README-emscripten.md
        │   ├── README-gesture.md
        │   ├── README-hg.md
        │   ├── README-ios.md
        │   ├── README-linux.md
        │   ├── README-macosx.md
        │   ├── README-nacl.md
        │   ├── README-pandora.md
        │   ├── README-platforms.md
        │   ├── README-porting.md
        │   ├── README-psp.md
        │   ├── README-raspberrypi.md
        │   ├── README-touch.md
        │   ├── README-wince.md
        │   ├── README-windows.md
        │   ├── README-winrt.md
        │   ├── README.md
        │   └── doxyfile
        ├── i686-w64-mingw32/
        │   ├── bin/
        │   │   └── sdl2-config
        │   ├── include/
        │   │   └── SDL2/
        │   │       ├── SDL.h
        │   │       ├── SDL_assert.h
        │   │       ├── SDL_atomic.h
        │   │       ├── SDL_audio.h
        │   │       ├── SDL_bits.h
        │   │       ├── SDL_blendmode.h
        │   │       ├── SDL_clipboard.h
        │   │       ├── SDL_config.h
        │   │       ├── SDL_cpuinfo.h
        │   │       ├── SDL_egl.h
        │   │       ├── SDL_endian.h
        │   │       ├── SDL_error.h
        │   │       ├── SDL_events.h
        │   │       ├── SDL_filesystem.h
        │   │       ├── SDL_gamecontroller.h
        │   │       ├── SDL_gesture.h
        │   │       ├── SDL_haptic.h
        │   │       ├── SDL_hints.h
        │   │       ├── SDL_joystick.h
        │   │       ├── SDL_keyboard.h
        │   │       ├── SDL_keycode.h
        │   │       ├── SDL_loadso.h
        │   │       ├── SDL_log.h
        │   │       ├── SDL_main.h
        │   │       ├── SDL_messagebox.h
        │   │       ├── SDL_mouse.h
        │   │       ├── SDL_mutex.h
        │   │       ├── SDL_name.h
        │   │       ├── SDL_opengl.h
        │   │       ├── SDL_opengl_glext.h
        │   │       ├── SDL_opengles.h
        │   │       ├── SDL_opengles2.h
        │   │       ├── SDL_opengles2_gl2.h
        │   │       ├── SDL_opengles2_gl2ext.h
        │   │       ├── SDL_opengles2_gl2platform.h
        │   │       ├── SDL_opengles2_khrplatform.h
        │   │       ├── SDL_pixels.h
        │   │       ├── SDL_platform.h
        │   │       ├── SDL_power.h
        │   │       ├── SDL_quit.h
        │   │       ├── SDL_rect.h
        │   │       ├── SDL_render.h
        │   │       ├── SDL_revision.h
        │   │       ├── SDL_rwops.h
        │   │       ├── SDL_scancode.h
        │   │       ├── SDL_sensor.h
        │   │       ├── SDL_shape.h
        │   │       ├── SDL_stdinc.h
        │   │       ├── SDL_surface.h
        │   │       ├── SDL_system.h
        │   │       ├── SDL_syswm.h
        │   │       ├── SDL_test.h
        │   │       ├── SDL_test_assert.h
        │   │       ├── SDL_test_common.h
        │   │       ├── SDL_test_compare.h
        │   │       ├── SDL_test_crc32.h
        │   │       ├── SDL_test_font.h
        │   │       ├── SDL_test_fuzzer.h
        │   │       ├── SDL_test_harness.h
        │   │       ├── SDL_test_images.h
        │   │       ├── SDL_test_log.h
        │   │       ├── SDL_test_md5.h
        │   │       ├── SDL_test_memory.h
        │   │       ├── SDL_test_random.h
        │   │       ├── SDL_thread.h
        │   │       ├── SDL_timer.h
        │   │       ├── SDL_touch.h
        │   │       ├── SDL_types.h
        │   │       ├── SDL_version.h
        │   │       ├── SDL_video.h
        │   │       ├── SDL_vulkan.h
        │   │       ├── begin_code.h
        │   │       └── close_code.h
        │   ├── lib/
        │   │   ├── cmake/
        │   │   │   └── SDL2/
        │   │   │       └── sdl2-config.cmake
        │   │   ├── libSDL2.a
        │   │   ├── libSDL2.dll.a
        │   │   ├── libSDL2.la
        │   │   ├── libSDL2_test.a
        │   │   ├── libSDL2_test.la
        │   │   ├── libSDL2main.a
        │   │   ├── libSDL2main.la
        │   │   └── pkgconfig/
        │   │       └── sdl2.pc
        │   └── share/
        │       └── aclocal/
        │           └── sdl2.m4
        ├── test/
        │   ├── CMakeLists.txt
        │   ├── COPYING
        │   ├── Makefile.in
        │   ├── Makefile.os2
        │   ├── README
        │   ├── acinclude.m4
        │   ├── aclocal.m4
        │   ├── autogen.sh
        │   ├── checkkeys.c
        │   ├── configure
        │   ├── configure.ac
        │   ├── controllermap.c
        │   ├── emscripten/
        │   │   └── joystick-pre.js
        │   ├── gcc-fat.sh
        │   ├── loopwave.c
        │   ├── loopwavequeue.c
        │   ├── nacl/
        │   │   ├── Makefile
        │   │   ├── background.js
        │   │   ├── common.js
        │   │   ├── index.html
        │   │   └── manifest.json
        │   ├── picture.xbm
        │   ├── relative_mode.markdown
        │   ├── testatomic.c
        │   ├── testaudiocapture.c
        │   ├── testaudiohotplug.c
        │   ├── testaudioinfo.c
        │   ├── testautomation.c
        │   ├── testautomation_audio.c
        │   ├── testautomation_clipboard.c
        │   ├── testautomation_events.c
        │   ├── testautomation_hints.c
        │   ├── testautomation_keyboard.c
        │   ├── testautomation_main.c
        │   ├── testautomation_mouse.c
        │   ├── testautomation_pixels.c
        │   ├── testautomation_platform.c
        │   ├── testautomation_rect.c
        │   ├── testautomation_render.c
        │   ├── testautomation_rwops.c
        │   ├── testautomation_sdltest.c
        │   ├── testautomation_stdlib.c
        │   ├── testautomation_suites.h
        │   ├── testautomation_surface.c
        │   ├── testautomation_syswm.c
        │   ├── testautomation_timer.c
        │   ├── testautomation_video.c
        │   ├── testbounds.c
        │   ├── testcustomcursor.c
        │   ├── testdisplayinfo.c
        │   ├── testdraw2.c
        │   ├── testdrawchessboard.c
        │   ├── testdropfile.c
        │   ├── testerror.c
        │   ├── testfile.c
        │   ├── testfilesystem.c
        │   ├── testgamecontroller.c
        │   ├── testgesture.c
        │   ├── testgl2.c
        │   ├── testgles.c
        │   ├── testgles2.c
        │   ├── testhaptic.c
        │   ├── testhittesting.c
        │   ├── testhotplug.c
        │   ├── testiconv.c
        │   ├── testime.c
        │   ├── testintersections.c
        │   ├── testjoystick.c
        │   ├── testkeys.c
        │   ├── testloadso.c
        │   ├── testlock.c
        │   ├── testmessage.c
        │   ├── testmultiaudio.c
        │   ├── testnative.c
        │   ├── testnative.h
        │   ├── testnativecocoa.m
        │   ├── testnativew32.c
        │   ├── testnativex11.c
        │   ├── testoverlay2.c
        │   ├── testplatform.c
        │   ├── testpower.c
        │   ├── testqsort.c
        │   ├── testrelative.c
        │   ├── testrendercopyex.c
        │   ├── testrendertarget.c
        │   ├── testresample.c
        │   ├── testrumble.c
        │   ├── testscale.c
        │   ├── testsem.c
        │   ├── testsensor.c
        │   ├── testshader.c
        │   ├── testshape.c
        │   ├── testsprite2.c
        │   ├── testspriteminimal.c
        │   ├── teststreaming.c
        │   ├── testthread.c
        │   ├── testtimer.c
        │   ├── testver.c
        │   ├── testviewport.c
        │   ├── testvulkan.c
        │   ├── testwm2.c
        │   ├── testyuv.c
        │   ├── testyuv_cvt.c
        │   ├── testyuv_cvt.h
        │   ├── torturethread.c
        │   └── utf8.txt
        └── x86_64-w64-mingw32/
            ├── bin/
            │   └── sdl2-config
            ├── include/
            │   └── SDL2/
            │       ├── SDL.h
            │       ├── SDL_assert.h
            │       ├── SDL_atomic.h
            │       ├── SDL_audio.h
            │       ├── SDL_bits.h
            │       ├── SDL_blendmode.h
            │       ├── SDL_clipboard.h
            │       ├── SDL_config.h
            │       ├── SDL_cpuinfo.h
            │       ├── SDL_egl.h
            │       ├── SDL_endian.h
            │       ├── SDL_error.h
            │       ├── SDL_events.h
            │       ├── SDL_filesystem.h
            │       ├── SDL_gamecontroller.h
            │       ├── SDL_gesture.h
            │       ├── SDL_haptic.h
            │       ├── SDL_hints.h
            │       ├── SDL_joystick.h
            │       ├── SDL_keyboard.h
            │       ├── SDL_keycode.h
            │       ├── SDL_loadso.h
            │       ├── SDL_log.h
            │       ├── SDL_main.h
            │       ├── SDL_messagebox.h
            │       ├── SDL_mouse.h
            │       ├── SDL_mutex.h
            │       ├── SDL_name.h
            │       ├── SDL_opengl.h
            │       ├── SDL_opengl_glext.h
            │       ├── SDL_opengles.h
            │       ├── SDL_opengles2.h
            │       ├── SDL_opengles2_gl2.h
            │       ├── SDL_opengles2_gl2ext.h
            │       ├── SDL_opengles2_gl2platform.h
            │       ├── SDL_opengles2_khrplatform.h
            │       ├── SDL_pixels.h
            │       ├── SDL_platform.h
            │       ├── SDL_power.h
            │       ├── SDL_quit.h
            │       ├── SDL_rect.h
            │       ├── SDL_render.h
            │       ├── SDL_revision.h
            │       ├── SDL_rwops.h
            │       ├── SDL_scancode.h
            │       ├── SDL_sensor.h
            │       ├── SDL_shape.h
            │       ├── SDL_stdinc.h
            │       ├── SDL_surface.h
            │       ├── SDL_system.h
            │       ├── SDL_syswm.h
            │       ├── SDL_test.h
            │       ├── SDL_test_assert.h
            │       ├── SDL_test_common.h
            │       ├── SDL_test_compare.h
            │       ├── SDL_test_crc32.h
            │       ├── SDL_test_font.h
            │       ├── SDL_test_fuzzer.h
            │       ├── SDL_test_harness.h
            │       ├── SDL_test_images.h
            │       ├── SDL_test_log.h
            │       ├── SDL_test_md5.h
            │       ├── SDL_test_memory.h
            │       ├── SDL_test_random.h
            │       ├── SDL_thread.h
            │       ├── SDL_timer.h
            │       ├── SDL_touch.h
            │       ├── SDL_types.h
            │       ├── SDL_version.h
            │       ├── SDL_video.h
            │       ├── SDL_vulkan.h
            │       ├── begin_code.h
            │       └── close_code.h
            ├── lib/
            │   ├── cmake/
            │   │   └── SDL2/
            │   │       └── sdl2-config.cmake
            │   ├── libSDL2.a
            │   ├── libSDL2.dll.a
            │   ├── libSDL2.la
            │   ├── libSDL2_test.a
            │   ├── libSDL2_test.la
            │   ├── libSDL2main.a
            │   ├── libSDL2main.la
            │   └── pkgconfig/
            │       └── sdl2.pc
            └── share/
                └── aclocal/
                    └── sdl2.m4

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

================================================
FILE: .gitattributes
================================================
winlib/*  linguist-vendored
src/lib/* linguist-vendored
icon.inl  linguist-vendored


================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms

github: rxi


================================================
FILE: LICENSE
================================================
Copyright (c) 2020 rxi

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: README.md
================================================
# lite
![screenshot](https://user-images.githubusercontent.com/3920290/81471642-6c165880-91ea-11ea-8cd1-fae7ae8f0bc4.png)

A lightweight text editor written in Lua

* **[Get lite](https://github.com/rxi/lite/releases/latest)** — Download
  for Windows and Linux
* **[Get started](doc/usage.md)** — A quick overview on how to get started
* **[Get plugins](https://github.com/rxi/lite-plugins)** — Add additional
  functionality
* **[Get color themes](https://github.com/rxi/lite-colors)** — Add additional colors
  themes

## Overview
lite is a lightweight text editor written mostly in Lua — it aims to provide
something practical, pretty, *small* and fast, implemented as simply as
possible; easy to modify and extend, or to use without doing either.

## Customization
Additional functionality can be added through plugins which are available from
the [plugins repository](https://github.com/rxi/lite-plugins); additional color
themes can be found in the [colors repository](https://github.com/rxi/lite-colors).
The editor can be customized by making changes to the
[user module](data/user/init.lua).

## Building
You can build the project yourself on Linux using the `build.sh` script
or on Windows using the `build.bat` script *([MinGW](https://nuwen.net/mingw.html) is required)*.
Note that the project does not need to be rebuilt if you are only making changes
to the Lua portion of the code.

## Contributing
Any additional functionality that can be added through a plugin should be done
so as a plugin, after which a pull request to the
[plugins repository](https://github.com/rxi/lite-plugins) can be made. In hopes
of remaining lightweight, pull requests adding additional functionality to the
core will likely not be merged. Bug reports and bug fixes are welcome.

## License
This project is free software; you can redistribute it and/or modify it under
the terms of the MIT license. See [LICENSE](LICENSE) for details.


================================================
FILE: build.bat
================================================
@echo off

rem download this:
rem https://nuwen.net/mingw.html

echo compiling (windows)...

windres res.rc -O coff -o res.res
gcc src/*.c src/api/*.c src/lib/lua52/*.c src/lib/stb/*.c^
    -O3 -s -std=gnu11 -fno-strict-aliasing -Isrc -DLUA_USE_POPEN^
    -Iwinlib/SDL2-2.0.10/x86_64-w64-mingw32/include^
    -lmingw32 -lm -lSDL2main -lSDL2 -Lwinlib/SDL2-2.0.10/x86_64-w64-mingw32/lib^
    -mwindows res.res^
    -o lite.exe

echo done


================================================
FILE: build.sh
================================================
#!/bin/bash

cflags="-Wall -O3 -g -std=gnu11 -fno-strict-aliasing -Isrc"
lflags="-lSDL2 -lm"

if [[ $* == *windows* ]]; then
  platform="windows"
  outfile="lite.exe"
  compiler="x86_64-w64-mingw32-gcc"
  cflags="$cflags -DLUA_USE_POPEN -Iwinlib/SDL2-2.0.10/x86_64-w64-mingw32/include"
  lflags="$lflags -Lwinlib/SDL2-2.0.10/x86_64-w64-mingw32/lib"
  lflags="-lmingw32 -lSDL2main $lflags -mwindows -o $outfile res.res"
  x86_64-w64-mingw32-windres res.rc -O coff -o res.res
else
  platform="unix"
  outfile="lite"
  compiler="gcc"
  cflags="$cflags -DLUA_USE_POSIX"
  lflags="$lflags -o $outfile"
fi

if command -v ccache >/dev/null; then
  compiler="ccache $compiler"
fi


echo "compiling ($platform)..."
for f in `find src -name "*.c"`; do
  $compiler -c $cflags $f -o "${f//\//_}.o"
  if [[ $? -ne 0 ]]; then
    got_error=true
  fi
done

if [[ ! $got_error ]]; then
  echo "linking..."
  $compiler *.o $lflags
fi

echo "cleaning up..."
rm *.o
rm res.res 2>/dev/null
echo "done"


================================================
FILE: build_release.sh
================================================
#!/bin/bash
./build.sh release windows
./build.sh release
rm lite.zip 2>/dev/null
cp winlib/SDL2-2.0.10/x86_64-w64-mingw32/bin/SDL2.dll SDL2.dll
strip lite
strip lite.exe
strip SDL2.dll
zip lite.zip lite lite.exe SDL2.dll data -r



================================================
FILE: data/core/command.lua
================================================
local core = require "core"
local command = {}

command.map = {}

local always_true = function() return true end


function command.add(predicate, map)
  predicate = predicate or always_true
  if type(predicate) == "string" then
    predicate = require(predicate)
  end
  if type(predicate) == "table" then
    local class = predicate
    predicate = function() return core.active_view:is(class) end
  end
  for name, fn in pairs(map) do
    assert(not command.map[name], "command already exists: " .. name)
    command.map[name] = { predicate = predicate, perform = fn }
  end
end


local function capitalize_first(str)
  return str:sub(1, 1):upper() .. str:sub(2)
end

function command.prettify_name(name)
  return name:gsub(":", ": "):gsub("-", " "):gsub("%S+", capitalize_first)
end


function command.get_all_valid()
  local res = {}
  for name, cmd in pairs(command.map) do
    if cmd.predicate() then
      table.insert(res, name)
    end
  end
  return res
end


local function perform(name)
  local cmd = command.map[name]
  if cmd and cmd.predicate() then
    cmd.perform()
    return true
  end
  return false
end


function command.perform(...)
  local ok, res = core.try(perform, ...)
  return not ok or res
end


function command.add_defaults()
  local reg = { "core", "root", "command", "doc", "findreplace" }
  for _, name in ipairs(reg) do
    require("core.commands." .. name)
  end
end


return command


================================================
FILE: data/core/commands/command.lua
================================================
local core = require "core"
local command = require "core.command"
local CommandView = require "core.commandview"

local function has_commandview()
  return core.active_view:is(CommandView)
end


command.add(has_commandview, {
  ["command:submit"] = function()
    core.active_view:submit()
  end,

  ["command:complete"] = function()
    core.active_view:complete()
  end,

  ["command:escape"] = function()
    core.active_view:exit()
  end,

  ["command:select-previous"] = function()
    core.active_view:move_suggestion_idx(1)
  end,

  ["command:select-next"] = function()
    core.active_view:move_suggestion_idx(-1)
  end,
})


================================================
FILE: data/core/commands/core.lua
================================================
local core = require "core"
local common = require "core.common"
local command = require "core.command"
local keymap = require "core.keymap"
local LogView = require "core.logview"


local fullscreen = false

command.add(nil, {
  ["core:quit"] = function()
    core.quit()
  end,

  ["core:force-quit"] = function()
    core.quit(true)
  end,

  ["core:toggle-fullscreen"] = function()
    fullscreen = not fullscreen
    system.set_window_mode(fullscreen and "fullscreen" or "normal")
  end,

  ["core:reload-module"] = function()
    core.command_view:enter("Reload Module", function(text, item)
      local text = item and item.text or text
      core.reload_module(text)
      core.log("Reloaded module %q", text)
    end, function(text)
      local items = {}
      for name in pairs(package.loaded) do
        table.insert(items, name)
      end
      return common.fuzzy_match(items, text)
    end)
  end,

  ["core:find-command"] = function()
    local commands = command.get_all_valid()
    core.command_view:enter("Do Command", function(text, item)
      if item then
        command.perform(item.command)
      end
    end, function(text)
      local res = common.fuzzy_match(commands, text)
      for i, name in ipairs(res) do
        res[i] = {
          text = command.prettify_name(name),
          info = keymap.get_binding(name),
          command = name,
        }
      end
      return res
    end)
  end,

  ["core:find-file"] = function()
    core.command_view:enter("Open File From Project", function(text, item)
      text = item and item.text or text
      core.root_view:open_doc(core.open_doc(text))
    end, function(text)
      local files = {}
      for _, item in pairs(core.project_files) do
        if item.type == "file" then
          table.insert(files, item.filename)
        end
      end
      return common.fuzzy_match(files, text)
    end)
  end,

  ["core:new-doc"] = function()
    core.root_view:open_doc(core.open_doc())
  end,

  ["core:open-file"] = function()
    core.command_view:enter("Open File", function(text)
      core.root_view:open_doc(core.open_doc(text))
    end, common.path_suggest)
  end,

  ["core:open-log"] = function()
    local node = core.root_view:get_active_node()
    node:add_view(LogView())
  end,

  ["core:open-user-module"] = function()
    core.root_view:open_doc(core.open_doc(EXEDIR .. "/data/user/init.lua"))
  end,

  ["core:open-project-module"] = function()
    local filename = ".lite_project.lua"
    if system.get_file_info(filename) then
      core.root_view:open_doc(core.open_doc(filename))
    else
      local doc = core.open_doc()
      core.root_view:open_doc(doc)
      doc:save(filename)
    end
  end,
})


================================================
FILE: data/core/commands/doc.lua
================================================
local core = require "core"
local command = require "core.command"
local common = require "core.common"
local config = require "core.config"
local translate = require "core.doc.translate"
local DocView = require "core.docview"


local function dv()
  return core.active_view
end


local function doc()
  return core.active_view.doc
end


local function get_indent_string()
  if config.tab_type == "hard" then
    return "\t"
  end
  return string.rep(" ", config.indent_size)
end


local function insert_at_start_of_selected_lines(text, skip_empty)
  local line1, col1, line2, col2, swap = doc():get_selection(true)
  for line = line1, line2 do
    local line_text = doc().lines[line]
    if (not skip_empty or line_text:find("%S")) then
      doc():insert(line, 1, text)
    end
  end
  doc():set_selection(line1, col1 + #text, line2, col2 + #text, swap)
end


local function remove_from_start_of_selected_lines(text, skip_empty)
  local line1, col1, line2, col2, swap = doc():get_selection(true)
  for line = line1, line2 do
    local line_text = doc().lines[line]
    if  line_text:sub(1, #text) == text
    and (not skip_empty or line_text:find("%S"))
    then
      doc():remove(line, 1, line, #text + 1)
    end
  end
  doc():set_selection(line1, col1 - #text, line2, col2 - #text, swap)
end


local function append_line_if_last_line(line)
  if line >= #doc().lines then
    doc():insert(line, math.huge, "\n")
  end
end


local function save(filename)
  doc():save(filename)
  core.log("Saved \"%s\"", doc().filename)
end


local commands = {
  ["doc:undo"] = function()
    doc():undo()
  end,

  ["doc:redo"] = function()
    doc():redo()
  end,

  ["doc:cut"] = function()
    if doc():has_selection() then
      local text = doc():get_text(doc():get_selection())
      system.set_clipboard(text)
      doc():delete_to(0)
    end
  end,

  ["doc:copy"] = function()
    if doc():has_selection() then
      local text = doc():get_text(doc():get_selection())
      system.set_clipboard(text)
    end
  end,

  ["doc:paste"] = function()
    doc():text_input(system.get_clipboard():gsub("\r", ""))
  end,

  ["doc:newline"] = function()
    local line, col = doc():get_selection()
    local indent = doc().lines[line]:match("^[\t ]*")
    if col <= #indent then
      indent = indent:sub(#indent + 2 - col)
    end
    doc():text_input("\n" .. indent)
  end,

  ["doc:newline-below"] = function()
    local line = doc():get_selection()
    local indent = doc().lines[line]:match("^[\t ]*")
    doc():insert(line, math.huge, "\n" .. indent)
    doc():set_selection(line + 1, math.huge)
  end,

  ["doc:newline-above"] = function()
    local line = doc():get_selection()
    local indent = doc().lines[line]:match("^[\t ]*")
    doc():insert(line, 1, indent .. "\n")
    doc():set_selection(line, math.huge)
  end,

  ["doc:delete"] = function()
    local line, col = doc():get_selection()
    if not doc():has_selection() and doc().lines[line]:find("^%s*$", col) then
      doc():remove(line, col, line, math.huge)
    end
    doc():delete_to(translate.next_char)
  end,

  ["doc:backspace"] = function()
    local line, col = doc():get_selection()
    if not doc():has_selection() then
      local text = doc():get_text(line, 1, line, col)
      if #text >= config.indent_size and text:find("^ *$") then
        doc():delete_to(0, -config.indent_size)
        return
      end
    end
    doc():delete_to(translate.previous_char)
  end,

  ["doc:select-all"] = function()
    doc():set_selection(1, 1, math.huge, math.huge)
  end,

  ["doc:select-none"] = function()
    local line, col = doc():get_selection()
    doc():set_selection(line, col)
  end,

  ["doc:select-lines"] = function()
    local line1, _, line2, _, swap = doc():get_selection(true)
    append_line_if_last_line(line2)
    doc():set_selection(line1, 1, line2 + 1, 1, swap)
  end,

  ["doc:select-word"] = function()
    local line1, col1 = doc():get_selection(true)
    local line1, col1 = translate.start_of_word(doc(), line1, col1)
    local line2, col2 = translate.end_of_word(doc(), line1, col1)
    doc():set_selection(line2, col2, line1, col1)
  end,

  ["doc:join-lines"] = function()
    local line1, _, line2 = doc():get_selection(true)
    if line1 == line2 then line2 = line2 + 1 end
    local text = doc():get_text(line1, 1, line2, math.huge)
    text = text:gsub("(.-)\n[\t ]*", function(x)
      return x:find("^%s*$") and x or x .. " "
    end)
    doc():insert(line1, 1, text)
    doc():remove(line1, #text + 1, line2, math.huge)
    if doc():has_selection() then
      doc():set_selection(line1, math.huge)
    end
  end,

  ["doc:indent"] = function()
    local text = get_indent_string()
    if doc():has_selection() then
      insert_at_start_of_selected_lines(text)
    else
      doc():text_input(text)
    end
  end,

  ["doc:unindent"] = function()
    local text = get_indent_string()
    remove_from_start_of_selected_lines(text)
  end,

  ["doc:duplicate-lines"] = function()
    local line1, col1, line2, col2, swap = doc():get_selection(true)
    append_line_if_last_line(line2)
    local text = doc():get_text(line1, 1, line2 + 1, 1)
    doc():insert(line2 + 1, 1, text)
    local n = line2 - line1 + 1
    doc():set_selection(line1 + n, col1, line2 + n, col2, swap)
  end,

  ["doc:delete-lines"] = function()
    local line1, col1, line2 = doc():get_selection(true)
    append_line_if_last_line(line2)
    doc():remove(line1, 1, line2 + 1, 1)
    doc():set_selection(line1, col1)
  end,

  ["doc:move-lines-up"] = function()
    local line1, col1, line2, col2, swap = doc():get_selection(true)
    append_line_if_last_line(line2)
    if line1 > 1 then
      local text = doc().lines[line1 - 1]
      doc():insert(line2 + 1, 1, text)
      doc():remove(line1 - 1, 1, line1, 1)
      doc():set_selection(line1 - 1, col1, line2 - 1, col2, swap)
    end
  end,

  ["doc:move-lines-down"] = function()
    local line1, col1, line2, col2, swap = doc():get_selection(true)
    append_line_if_last_line(line2 + 1)
    if line2 < #doc().lines then
      local text = doc().lines[line2 + 1]
      doc():remove(line2 + 1, 1, line2 + 2, 1)
      doc():insert(line1, 1, text)
      doc():set_selection(line1 + 1, col1, line2 + 1, col2, swap)
    end
  end,

  ["doc:toggle-line-comments"] = function()
    local comment = doc().syntax.comment
    if not comment then return end
    local comment_text = comment .. " "
    local line1, _, line2 = doc():get_selection(true)
    local uncomment = true
    for line = line1, line2 do
      local text = doc().lines[line]
      if text:find("%S") and text:find(comment_text, 1, true) ~= 1 then
        uncomment = false
      end
    end
    if uncomment then
      remove_from_start_of_selected_lines(comment_text, true)
    else
      insert_at_start_of_selected_lines(comment_text, true)
    end
  end,

  ["doc:upper-case"] = function()
    doc():replace(string.upper)
  end,

  ["doc:lower-case"] = function()
    doc():replace(string.lower)
  end,

  ["doc:go-to-line"] = function()
    local dv = dv()

    local items
    local function init_items()
      if items then return end
      items = {}
      local mt = { __tostring = function(x) return x.text end }
      for i, line in ipairs(dv.doc.lines) do
        local item = { text = line:sub(1, -2), line = i, info = "line: " .. i }
        table.insert(items, setmetatable(item, mt))
      end
    end

    core.command_view:enter("Go To Line", function(text, item)
      local line = item and item.line or tonumber(text)
      if not line then
        core.error("Invalid line number or unmatched string")
        return
      end
      dv.doc:set_selection(line, 1  )
      dv:scroll_to_line(line, true)

    end, function(text)
      if not text:find("^%d*$") then
        init_items()
        return common.fuzzy_match(items, text)
      end
    end)
  end,

  ["doc:toggle-line-ending"] = function()
    doc().crlf = not doc().crlf
  end,

  ["doc:save-as"] = function()
    if doc().filename then
      core.command_view:set_text(doc().filename)
    end
    core.command_view:enter("Save As", function(filename)
      save(filename)
    end, common.path_suggest)
  end,

  ["doc:save"] = function()
    if doc().filename then
      save()
    else
      command.perform("doc:save-as")
    end
  end,

  ["doc:rename"] = function()
    local old_filename = doc().filename
    if not old_filename then
      core.error("Cannot rename unsaved doc")
      return
    end
    core.command_view:set_text(old_filename)
    core.command_view:enter("Rename", function(filename)
      doc():save(filename)
      core.log("Renamed \"%s\" to \"%s\"", old_filename, filename)
      if filename ~= old_filename then
        os.remove(old_filename)
      end
    end, common.path_suggest)
  end,
}


local translations = {
  ["previous-char"] = translate.previous_char,
  ["next-char"] = translate.next_char,
  ["previous-word-start"] = translate.previous_word_start,
  ["next-word-end"] = translate.next_word_end,
  ["previous-block-start"] = translate.previous_block_start,
  ["next-block-end"] = translate.next_block_end,
  ["start-of-doc"] = translate.start_of_doc,
  ["end-of-doc"] = translate.end_of_doc,
  ["start-of-line"] = translate.start_of_line,
  ["end-of-line"] = translate.end_of_line,
  ["start-of-word"] = translate.start_of_word,
  ["end-of-word"] = translate.end_of_word,
  ["previous-line"] = DocView.translate.previous_line,
  ["next-line"] = DocView.translate.next_line,
  ["previous-page"] = DocView.translate.previous_page,
  ["next-page"] = DocView.translate.next_page,
}

for name, fn in pairs(translations) do
  commands["doc:move-to-" .. name] = function() doc():move_to(fn, dv()) end
  commands["doc:select-to-" .. name] = function() doc():select_to(fn, dv()) end
  commands["doc:delete-to-" .. name] = function() doc():delete_to(fn, dv()) end
end

commands["doc:move-to-previous-char"] = function()
  if doc():has_selection() then
    local line, col = doc():get_selection(true)
    doc():set_selection(line, col)
  else
    doc():move_to(translate.previous_char)
  end
end

commands["doc:move-to-next-char"] = function()
  if doc():has_selection() then
    local _, _, line, col = doc():get_selection(true)
    doc():set_selection(line, col)
  else
    doc():move_to(translate.next_char)
  end
end

command.add("core.docview", commands)


================================================
FILE: data/core/commands/findreplace.lua
================================================
local core = require "core"
local command = require "core.command"
local config = require "core.config"
local search = require "core.doc.search"
local DocView = require "core.docview"

local max_previous_finds = 50


local function doc()
  return core.active_view.doc
end


local previous_finds
local last_doc
local last_fn, last_text


local function push_previous_find(doc, sel)
  if last_doc ~= doc then
    last_doc = doc
    previous_finds = {}
  end
  if #previous_finds >= max_previous_finds then
    table.remove(previous_finds, 1)
  end
  table.insert(previous_finds, sel or { doc:get_selection() })
end


local function find(label, search_fn)
  local dv = core.active_view
  local sel = { dv.doc:get_selection() }
  local text = dv.doc:get_text(table.unpack(sel))
  local found = false

  core.command_view:set_text(text, true)

  core.command_view:enter(label, function(text)
    if found then
      last_fn, last_text = search_fn, text
      previous_finds = {}
      push_previous_find(dv.doc, sel)
    else
      core.error("Couldn't find %q", text)
      dv.doc:set_selection(table.unpack(sel))
      dv:scroll_to_make_visible(sel[1], sel[2])
    end

  end, function(text)
    local ok, line1, col1, line2, col2 = pcall(search_fn, dv.doc, sel[1], sel[2], text)
    if ok and line1 and text ~= "" then
      dv.doc:set_selection(line2, col2, line1, col1)
      dv:scroll_to_line(line2, true)
      found = true
    else
      dv.doc:set_selection(table.unpack(sel))
      found = false
    end

  end, function(explicit)
    if explicit then
      dv.doc:set_selection(table.unpack(sel))
      dv:scroll_to_make_visible(sel[1], sel[2])
    end
  end)
end


local function replace(kind, default, fn)
  core.command_view:set_text(default, true)

  core.command_view:enter("Find To Replace " .. kind, function(old)
    core.command_view:set_text(old, true)

    local s = string.format("Replace %s %q With", kind, old)
    core.command_view:enter(s, function(new)
      local n = doc():replace(function(text)
        return fn(text, old, new)
      end)
      core.log("Replaced %d instance(s) of %s %q with %q", n, kind, old, new)
    end)
  end)
end


local function has_selection()
  return core.active_view:is(DocView)
     and core.active_view.doc:has_selection()
end

command.add(has_selection, {
  ["find-replace:select-next"] = function()
    local l1, c1, l2, c2 = doc():get_selection(true)
    local text = doc():get_text(l1, c1, l2, c2)
    local l1, c1, l2, c2 = search.find(doc(), l2, c2, text, { wrap = true })
    if l2 then doc():set_selection(l2, c2, l1, c1) end
  end
})

command.add("core.docview", {
  ["find-replace:find"] = function()
    find("Find Text", function(doc, line, col, text)
      local opt = { wrap = true, no_case = true }
      return search.find(doc, line, col, text, opt)
    end)
  end,

  ["find-replace:find-pattern"] = function()
    find("Find Text Pattern", function(doc, line, col, text)
      local opt = { wrap = true, no_case = true, pattern = true }
      return search.find(doc, line, col, text, opt)
    end)
  end,

  ["find-replace:repeat-find"] = function()
    if not last_fn then
      core.error("No find to continue from")
    else
      local line, col = doc():get_selection()
      local line1, col1, line2, col2 = last_fn(doc(), line, col, last_text)
      if line1 then
        push_previous_find(doc())
        doc():set_selection(line2, col2, line1, col1)
        core.active_view:scroll_to_line(line2, true)
      end
    end
  end,

  ["find-replace:previous-find"] = function()
    local sel = table.remove(previous_finds)
    if not sel or doc() ~= last_doc then
      core.error("No previous finds")
      return
    end
    doc():set_selection(table.unpack(sel))
    core.active_view:scroll_to_line(sel[3], true)
  end,

  ["find-replace:replace"] = function()
    replace("Text", "", function(text, old, new)
      return text:gsub(old:gsub("%W", "%%%1"), new:gsub("%%", "%%%%"), nil)
    end)
  end,

  ["find-replace:replace-pattern"] = function()
    replace("Pattern", "", function(text, old, new)
      return text:gsub(old, new)
    end)
  end,

  ["find-replace:replace-symbol"] = function()
    local first = ""
    if doc():has_selection() then
      local text = doc():get_text(doc():get_selection())
      first = text:match(config.symbol_pattern) or ""
    end
    replace("Symbol", first, function(text, old, new)
      local n = 0
      local res = text:gsub(config.symbol_pattern, function(sym)
        if old == sym then
          n = n + 1
          return new
        end
      end)
      return res, n
    end)
  end,
})


================================================
FILE: data/core/commands/root.lua
================================================
local core = require "core"
local style = require "core.style"
local DocView = require "core.docview"
local command = require "core.command"
local common = require "core.common"


local t = {
  ["root:close"] = function()
    local node = core.root_view:get_active_node()
    node:close_active_view(core.root_view.root_node)
  end,

  ["root:switch-to-previous-tab"] = function()
    local node = core.root_view:get_active_node()
    local idx = node:get_view_idx(core.active_view)
    idx = idx - 1
    if idx < 1 then idx = #node.views end
    node:set_active_view(node.views[idx])
  end,

  ["root:switch-to-next-tab"] = function()
    local node = core.root_view:get_active_node()
    local idx = node:get_view_idx(core.active_view)
    idx = idx + 1
    if idx > #node.views then idx = 1 end
    node:set_active_view(node.views[idx])
  end,

  ["root:move-tab-left"] = function()
    local node = core.root_view:get_active_node()
    local idx = node:get_view_idx(core.active_view)
    if idx > 1 then
      table.remove(node.views, idx)
      table.insert(node.views, idx - 1, core.active_view)
    end
  end,

  ["root:move-tab-right"] = function()
    local node = core.root_view:get_active_node()
    local idx = node:get_view_idx(core.active_view)
    if idx < #node.views then
      table.remove(node.views, idx)
      table.insert(node.views, idx + 1, core.active_view)
    end
  end,

  ["root:shrink"] = function()
    local node = core.root_view:get_active_node()
    local parent = node:get_parent_node(core.root_view.root_node)
    local n = (parent.a == node) and -0.1 or 0.1
    parent.divider = common.clamp(parent.divider + n, 0.1, 0.9)
  end,

  ["root:grow"] = function()
    local node = core.root_view:get_active_node()
    local parent = node:get_parent_node(core.root_view.root_node)
    local n = (parent.a == node) and 0.1 or -0.1
    parent.divider = common.clamp(parent.divider + n, 0.1, 0.9)
  end,
}


for i = 1, 9 do
  t["root:switch-to-tab-" .. i] = function()
    local node = core.root_view:get_active_node()
    local view = node.views[i]
    if view then
      node:set_active_view(view)
    end
  end
end


for _, dir in ipairs { "left", "right", "up", "down" } do
  t["root:split-" .. dir] = function()
    local node = core.root_view:get_active_node()
    local av = node.active_view
    node:split(dir)
    if av:is(DocView) then
      core.root_view:open_doc(av.doc)
    end
  end

  t["root:switch-to-" .. dir] = function()
    local node = core.root_view:get_active_node()
    local x, y
    if dir == "left" or dir == "right" then
      y = node.position.y + node.size.y / 2
      x = node.position.x + (dir == "left" and -1 or node.size.x + style.divider_size)
    else
      x = node.position.x + node.size.x / 2
      y = node.position.y + (dir == "up"   and -1 or node.size.y + style.divider_size)
    end
    local node = core.root_view.root_node:get_child_overlapping_point(x, y)
    if not node:get_locked_size() then
      core.set_active_view(node.active_view)
    end
  end
end

command.add(function()
  local node = core.root_view:get_active_node()
  return not node:get_locked_size()
end, t)


================================================
FILE: data/core/commandview.lua
================================================
local core = require "core"
local common = require "core.common"
local style = require "core.style"
local Doc = require "core.doc"
local DocView = require "core.docview"
local View = require "core.view"


local SingleLineDoc = Doc:extend()

function SingleLineDoc:insert(line, col, text)
  SingleLineDoc.super.insert(self, line, col, text:gsub("\n", ""))
end


local CommandView = DocView:extend()

local max_suggestions = 10

local noop = function() end

local default_state = {
  submit = noop,
  suggest = noop,
  cancel = noop,
}


function CommandView:new()
  CommandView.super.new(self, SingleLineDoc())
  self.suggestion_idx = 1
  self.suggestions = {}
  self.suggestions_height = 0
  self.last_change_id = 0
  self.gutter_width = 0
  self.gutter_text_brightness = 0
  self.selection_offset = 0
  self.state = default_state
  self.font = "font"
  self.size.y = 0
  self.label = ""
end


function CommandView:get_name()
  return View.get_name(self)
end


function CommandView:get_line_screen_position()
  local x = CommandView.super.get_line_screen_position(self, 1)
  local _, y = self:get_content_offset()
  local lh = self:get_line_height()
  return x, y + (self.size.y - lh) / 2
end


function CommandView:get_scrollable_size()
  return 0
end


function CommandView:scroll_to_make_visible()
  -- no-op function to disable this functionality
end


function CommandView:get_text()
  return self.doc:get_text(1, 1, 1, math.huge)
end


function CommandView:set_text(text, select)
  self.doc:remove(1, 1, math.huge, math.huge)
  self.doc:text_input(text)
  if select then
    self.doc:set_selection(math.huge, math.huge, 1, 1)
  end
end


function CommandView:move_suggestion_idx(dir)
  local n = self.suggestion_idx + dir
  self.suggestion_idx = common.clamp(n, 1, #self.suggestions)
  self:complete()
  self.last_change_id = self.doc:get_change_id()
end


function CommandView:complete()
  if #self.suggestions > 0 then
    self:set_text(self.suggestions[self.suggestion_idx].text)
  end
end


function CommandView:submit()
  local suggestion = self.suggestions[self.suggestion_idx]
  local text = self:get_text()
  local submit = self.state.submit
  self:exit(true)
  submit(text, suggestion)
end


function CommandView:enter(text, submit, suggest, cancel)
  if self.state ~= default_state then
    return
  end
  self.state = {
    submit = submit or noop,
    suggest = suggest or noop,
    cancel = cancel or noop,
  }
  core.set_active_view(self)
  self:update_suggestions()
  self.gutter_text_brightness = 100
  self.label = text .. ": "
end


function CommandView:exit(submitted, inexplicit)
  if core.active_view == self then
    core.set_active_view(core.last_active_view)
  end
  local cancel = self.state.cancel
  self.state = default_state
  self.doc:reset()
  self.suggestions = {}
  if not submitted then cancel(not inexplicit) end
end


function CommandView:get_gutter_width()
  return self.gutter_width
end


function CommandView:get_suggestion_line_height()
  return self:get_font():get_height() + style.padding.y
end


function CommandView:update_suggestions()
  local t = self.state.suggest(self:get_text()) or {}
  local res = {}
  for i, item in ipairs(t) do
    if i == max_suggestions then
      break
    end
    if type(item) == "string" then
      item = { text = item }
    end
    res[i] = item
  end
  self.suggestions = res
  self.suggestion_idx = 1
end


function CommandView:update()
  CommandView.super.update(self)

  if core.active_view ~= self and self.state ~= default_state then
    self:exit(false, true)
  end

  -- update suggestions if text has changed
  if self.last_change_id ~= self.doc:get_change_id() then
    self:update_suggestions()
    self.last_change_id = self.doc:get_change_id()
  end

  -- update gutter text color brightness
  self:move_towards("gutter_text_brightness", 0, 0.1)

  -- update gutter width
  local dest = self:get_font():get_width(self.label) + style.padding.x
  if self.size.y <= 0 then
    self.gutter_width = dest
  else
    self:move_towards("gutter_width", dest)
  end

  -- update suggestions box height
  local lh = self:get_suggestion_line_height()
  local dest = #self.suggestions * lh
  self:move_towards("suggestions_height", dest)

  -- update suggestion cursor offset
  local dest = self.suggestion_idx * self:get_suggestion_line_height()
  self:move_towards("selection_offset", dest)

  -- update size based on whether this is the active_view
  local dest = 0
  if self == core.active_view then
    dest = style.font:get_height() + style.padding.y * 2
  end
  self:move_towards(self.size, "y", dest)
end


function CommandView:draw_line_highlight()
  -- no-op function to disable this functionality
end


function CommandView:draw_line_gutter(idx, x, y)
  local yoffset = self:get_line_text_y_offset()
  local pos = self.position
  local color = common.lerp(style.text, style.accent, self.gutter_text_brightness / 100)
  core.push_clip_rect(pos.x, pos.y, self:get_gutter_width(), self.size.y)
  x = x + style.padding.x
  renderer.draw_text(self:get_font(), self.label, x, y + yoffset, color)
  core.pop_clip_rect()
end


local function draw_suggestions_box(self)
  local lh = self:get_suggestion_line_height()
  local dh = style.divider_size
  local x, _ = self:get_line_screen_position()
  local h = math.ceil(self.suggestions_height)
  local rx, ry, rw, rh = self.position.x, self.position.y - h - dh, self.size.x, h

  -- draw suggestions background
  if #self.suggestions > 0 then
    renderer.draw_rect(rx, ry, rw, rh, style.background3)
    renderer.draw_rect(rx, ry - dh, rw, dh, style.divider)
    local y = self.position.y - self.selection_offset - dh
    renderer.draw_rect(rx, y, rw, lh, style.line_highlight)
  end

  -- draw suggestion text
  core.push_clip_rect(rx, ry, rw, rh)
  for i, item in ipairs(self.suggestions) do
    local color = (i == self.suggestion_idx) and style.accent or style.text
    local y = self.position.y - i * lh - dh
    common.draw_text(self:get_font(), color, item.text, nil, x, y, 0, lh)

    if item.info then
      local w = self.size.x - x - style.padding.x
      common.draw_text(self:get_font(), style.dim, item.info, "right", x, y, w, lh)
    end
  end
  core.pop_clip_rect()
end


function CommandView:draw()
  CommandView.super.draw(self)
  core.root_view:defer_draw(draw_suggestions_box, self)
end


return CommandView


================================================
FILE: data/core/common.lua
================================================
local common = {}


function common.is_utf8_cont(char)
  local byte = char:byte()
  return byte >= 0x80 and byte < 0xc0
end


function common.utf8_chars(text)
  return text:gmatch("[\0-\x7f\xc2-\xf4][\x80-\xbf]*")
end


function common.clamp(n, lo, hi)
  return math.max(math.min(n, hi), lo)
end


function common.round(n)
  return n >= 0 and math.floor(n + 0.5) or math.ceil(n - 0.5)
end


function common.lerp(a, b, t)
  if type(a) ~= "table" then
    return a + (b - a) * t
  end
  local res = {}
  for k, v in pairs(b) do
    res[k] = common.lerp(a[k], v, t)
  end
  return res
end


function common.color(str)
  local r, g, b, a = str:match("#(%x%x)(%x%x)(%x%x)")
  if r then
    r = tonumber(r, 16)
    g = tonumber(g, 16)
    b = tonumber(b, 16)
    a = 1
  elseif str:match("rgba?%s*%([%d%s%.,]+%)") then
    local f = str:gmatch("[%d.]+")
    r = (f() or 0)
    g = (f() or 0)
    b = (f() or 0)
    a = f() or 1
  else
    error(string.format("bad color string '%s'", str))
  end
  return r, g, b, a * 0xff
end


local function compare_score(a, b)
  return a.score > b.score
end

local function fuzzy_match_items(items, needle)
  local res = {}
  for _, item in ipairs(items) do
    local score = system.fuzzy_match(tostring(item), needle)
    if score then
      table.insert(res, { text = item, score = score })
    end
  end
  table.sort(res, compare_score)
  for i, item in ipairs(res) do
    res[i] = item.text
  end
  return res
end


function common.fuzzy_match(haystack, needle)
  if type(haystack) == "table" then
    return fuzzy_match_items(haystack, needle)
  end
  return system.fuzzy_match(haystack, needle)
end


function common.path_suggest(text)
  local path, name = text:match("^(.-)([^/\\]*)$")
  local files = system.list_dir(path == "" and "." or path) or {}
  local res = {}
  for _, file in ipairs(files) do
    file = path .. file
    local info = system.get_file_info(file)
    if info then
      if info.type == "dir" then
        file = file .. PATHSEP
      end
      if file:lower():find(text:lower(), nil, true) == 1 then
        table.insert(res, file)
      end
    end
  end
  return res
end


function common.match_pattern(text, pattern, ...)
  if type(pattern) == "string" then
    return text:find(pattern, ...)
  end
  for _, p in ipairs(pattern) do
    local s, e = common.match_pattern(text, p, ...)
    if s then return s, e end
  end
  return false
end


function common.draw_text(font, color, text, align, x,y,w,h)
  local tw, th = font:get_width(text), font:get_height(text)
  if align == "center" then
    x = x + (w - tw) / 2
  elseif align == "right" then
    x = x + (w - tw)
  end
  y = common.round(y + (h - th) / 2)
  return renderer.draw_text(font, text, x, y, color), y + th
end


function common.bench(name, fn, ...)
  local start = system.get_time()
  local res = fn(...)
  local t = system.get_time() - start
  local ms = t * 1000
  local per = (t / (1 / 60)) * 100
  print(string.format("*** %-16s : %8.3fms %6.2f%%", name, ms, per))
  return res
end


return common


================================================
FILE: data/core/config.lua
================================================
local config = {}

config.project_scan_rate = 5
config.fps = 60
config.max_log_items = 80
config.message_timeout = 3
config.mouse_wheel_scroll = 50 * SCALE
config.file_size_limit = 10
config.ignore_files = "^%."
config.symbol_pattern = "[%a_][%w_]*"
config.non_word_chars = " \t\n/\\()\"':,.;<>~!@#$%^&*|+=[]{}`?-"
config.undo_merge_timeout = 0.3
config.max_undos = 10000
config.highlight_current_line = true
config.line_height = 1.2
config.indent_size = 2
config.tab_type = "soft"
config.line_limit = 80

return config


================================================
FILE: data/core/doc/highlighter.lua
================================================
local core = require "core"
local config = require "core.config"
local tokenizer = require "core.tokenizer"
local Object = require "core.object"


local Highlighter = Object:extend()


function Highlighter:new(doc)
  self.doc = doc
  self:reset()

  -- init incremental syntax highlighting
  core.add_thread(function()
    while true do
      if self.first_invalid_line > self.max_wanted_line then
        self.max_wanted_line = 0
        coroutine.yield(1 / config.fps)

      else
        local max = math.min(self.first_invalid_line + 40, self.max_wanted_line)

        for i = self.first_invalid_line, max do
          local state = (i > 1) and self.lines[i - 1].state
          local line = self.lines[i]
          if not (line and line.init_state == state) then
            self.lines[i] = self:tokenize_line(i, state)
          end
        end

        self.first_invalid_line = max + 1
        core.redraw = true
        coroutine.yield()
      end
    end
  end, self)
end


function Highlighter:reset()
  self.lines = {}
  self.first_invalid_line = 1
  self.max_wanted_line = 0
end


function Highlighter:invalidate(idx)
  self.first_invalid_line = math.min(self.first_invalid_line, idx)
  self.max_wanted_line = math.min(self.max_wanted_line, #self.doc.lines)
end


function Highlighter:tokenize_line(idx, state)
  local res = {}
  res.init_state = state
  res.text = self.doc.lines[idx]
  res.tokens, res.state = tokenizer.tokenize(self.doc.syntax, res.text, state)
  return res
end


function Highlighter:get_line(idx)
  local line = self.lines[idx]
  if not line or line.text ~= self.doc.lines[idx] then
    local prev = self.lines[idx - 1]
    line = self:tokenize_line(idx, prev and prev.state)
    self.lines[idx] = line
  end
  self.max_wanted_line = math.max(self.max_wanted_line, idx)
  return line
end


function Highlighter:each_token(idx)
  return tokenizer.each_token(self:get_line(idx).tokens)
end


return Highlighter


================================================
FILE: data/core/doc/init.lua
================================================
local Object = require "core.object"
local Highlighter = require "core.doc.highlighter"
local syntax = require "core.syntax"
local config = require "core.config"
local common = require "core.common"


local Doc = Object:extend()


local function split_lines(text)
  local res = {}
  for line in (text .. "\n"):gmatch("(.-)\n") do
    table.insert(res, line)
  end
  return res
end


local function splice(t, at, remove, insert)
  insert = insert or {}
  local offset = #insert - remove
  local old_len = #t
  if offset < 0 then
    for i = at - offset, old_len - offset do
      t[i + offset] = t[i]
    end
  elseif offset > 0 then
    for i = old_len, at, -1 do
      t[i + offset] = t[i]
    end
  end
  for i, item in ipairs(insert) do
    t[at + i - 1] = item
  end
end


function Doc:new(filename)
  self:reset()
  if filename then
    self:load(filename)
  end
end


function Doc:reset()
  self.lines = { "\n" }
  self.selection = { a = { line=1, col=1 }, b = { line=1, col=1 } }
  self.undo_stack = { idx = 1 }
  self.redo_stack = { idx = 1 }
  self.clean_change_id = 1
  self.highlighter = Highlighter(self)
  self:reset_syntax()
end


function Doc:reset_syntax()
  local header = self:get_text(1, 1, self:position_offset(1, 1, 128))
  local syn = syntax.get(self.filename or "", header)
  if self.syntax ~= syn then
    self.syntax = syn
    self.highlighter:reset()
  end
end


function Doc:load(filename)
  local fp = assert( io.open(filename, "rb") )
  self:reset()
  self.filename = filename
  self.lines = {}
  for line in fp:lines() do
    if line:byte(-1) == 13 then
      line = line:sub(1, -2)
      self.crlf = true
    end
    table.insert(self.lines, line .. "\n")
  end
  if #self.lines == 0 then
    table.insert(self.lines, "\n")
  end
  fp:close()
  self:reset_syntax()
end


function Doc:save(filename)
  filename = filename or assert(self.filename, "no filename set to default to")
  local fp = assert( io.open(filename, "wb") )
  for _, line in ipairs(self.lines) do
    if self.crlf then line = line:gsub("\n", "\r\n") end
    fp:write(line)
  end
  fp:close()
  self.filename = filename or self.filename
  self:reset_syntax()
  self:clean()
end


function Doc:get_name()
  return self.filename or "unsaved"
end


function Doc:is_dirty()
  return self.clean_change_id ~= self:get_change_id()
end


function Doc:clean()
  self.clean_change_id = self:get_change_id()
end


function Doc:get_change_id()
  return self.undo_stack.idx
end


function Doc:set_selection(line1, col1, line2, col2, swap)
  assert(not line2 == not col2, "expected 2 or 4 arguments")
  if swap then line1, col1, line2, col2 = line2, col2, line1, col1 end
  line1, col1 = self:sanitize_position(line1, col1)
  line2, col2 = self:sanitize_position(line2 or line1, col2 or col1)
  self.selection.a.line, self.selection.a.col = line1, col1
  self.selection.b.line, self.selection.b.col = line2, col2
end


local function sort_positions(line1, col1, line2, col2)
  if line1 > line2
  or line1 == line2 and col1 > col2 then
    return line2, col2, line1, col1, true
  end
  return line1, col1, line2, col2, false
end


function Doc:get_selection(sort)
  local a, b = self.selection.a, self.selection.b
  if sort then
    return sort_positions(a.line, a.col, b.line, b.col)
  end
  return a.line, a.col, b.line, b.col
end


function Doc:has_selection()
  local a, b = self.selection.a, self.selection.b
  return not (a.line == b.line and a.col == b.col)
end


function Doc:sanitize_selection()
  self:set_selection(self:get_selection())
end


function Doc:sanitize_position(line, col)
  line = common.clamp(line, 1, #self.lines)
  col = common.clamp(col, 1, #self.lines[line])
  return line, col
end


local function position_offset_func(self, line, col, fn, ...)
  line, col = self:sanitize_position(line, col)
  return fn(self, line, col, ...)
end


local function position_offset_byte(self, line, col, offset)
  line, col = self:sanitize_position(line, col)
  col = col + offset
  while line > 1 and col < 1 do
    line = line - 1
    col = col + #self.lines[line]
  end
  while line < #self.lines and col > #self.lines[line] do
    col = col - #self.lines[line]
    line = line + 1
  end
  return self:sanitize_position(line, col)
end


local function position_offset_linecol(self, line, col, lineoffset, coloffset)
  return self:sanitize_position(line + lineoffset, col + coloffset)
end


function Doc:position_offset(line, col, ...)
  if type(...) ~= "number" then
    return position_offset_func(self, line, col, ...)
  elseif select("#", ...) == 1 then
    return position_offset_byte(self, line, col, ...)
  elseif select("#", ...) == 2 then
    return position_offset_linecol(self, line, col, ...)
  else
    error("bad number of arguments")
  end
end


function Doc:get_text(line1, col1, line2, col2)
  line1, col1 = self:sanitize_position(line1, col1)
  line2, col2 = self:sanitize_position(line2, col2)
  line1, col1, line2, col2 = sort_positions(line1, col1, line2, col2)
  if line1 == line2 then
    return self.lines[line1]:sub(col1, col2 - 1)
  end
  local lines = { self.lines[line1]:sub(col1) }
  for i = line1 + 1, line2 - 1 do
    table.insert(lines, self.lines[i])
  end
  table.insert(lines, self.lines[line2]:sub(1, col2 - 1))
  return table.concat(lines)
end


function Doc:get_char(line, col)
  line, col = self:sanitize_position(line, col)
  return self.lines[line]:sub(col, col)
end


local function push_undo(undo_stack, time, type, ...)
  undo_stack[undo_stack.idx] = { type = type, time = time, ... }
  undo_stack[undo_stack.idx - config.max_undos] = nil
  undo_stack.idx = undo_stack.idx + 1
end


local function pop_undo(self, undo_stack, redo_stack)
  -- pop command
  local cmd = undo_stack[undo_stack.idx - 1]
  if not cmd then return end
  undo_stack.idx = undo_stack.idx - 1

  -- handle command
  if cmd.type == "insert" then
    local line, col, text = table.unpack(cmd)
    self:raw_insert(line, col, text, redo_stack, cmd.time)

  elseif cmd.type == "remove" then
    local line1, col1, line2, col2 = table.unpack(cmd)
    self:raw_remove(line1, col1, line2, col2, redo_stack, cmd.time)

  elseif cmd.type == "selection" then
    self.selection.a.line, self.selection.a.col = cmd[1], cmd[2]
    self.selection.b.line, self.selection.b.col = cmd[3], cmd[4]
  end

  -- if next undo command is within the merge timeout then treat as a single
  -- command and continue to execute it
  local next = undo_stack[undo_stack.idx - 1]
  if next and math.abs(cmd.time - next.time) < config.undo_merge_timeout then
    return pop_undo(self, undo_stack, redo_stack)
  end
end


function Doc:raw_insert(line, col, text, undo_stack, time)
  -- split text into lines and merge with line at insertion point
  local lines = split_lines(text)
  local before = self.lines[line]:sub(1, col - 1)
  local after = self.lines[line]:sub(col)
  for i = 1, #lines - 1 do
    lines[i] = lines[i] .. "\n"
  end
  lines[1] = before .. lines[1]
  lines[#lines] = lines[#lines] .. after

  -- splice lines into line array
  splice(self.lines, line, 1, lines)

  -- push undo
  local line2, col2 = self:position_offset(line, col, #text)
  push_undo(undo_stack, time, "selection", self:get_selection())
  push_undo(undo_stack, time, "remove", line, col, line2, col2)

  -- update highlighter and assure selection is in bounds
  self.highlighter:invalidate(line)
  self:sanitize_selection()
end


function Doc:raw_remove(line1, col1, line2, col2, undo_stack, time)
  -- push undo
  local text = self:get_text(line1, col1, line2, col2)
  push_undo(undo_stack, time, "selection", self:get_selection())
  push_undo(undo_stack, time, "insert", line1, col1, text)

  -- get line content before/after removed text
  local before = self.lines[line1]:sub(1, col1 - 1)
  local after = self.lines[line2]:sub(col2)

  -- splice line into line array
  splice(self.lines, line1, line2 - line1 + 1, { before .. after })

  -- update highlighter and assure selection is in bounds
  self.highlighter:invalidate(line1)
  self:sanitize_selection()
end


function Doc:insert(line, col, text)
  self.redo_stack = { idx = 1 }
  line, col = self:sanitize_position(line, col)
  self:raw_insert(line, col, text, self.undo_stack, system.get_time())
end


function Doc:remove(line1, col1, line2, col2)
  self.redo_stack = { idx = 1 }
  line1, col1 = self:sanitize_position(line1, col1)
  line2, col2 = self:sanitize_position(line2, col2)
  line1, col1, line2, col2 = sort_positions(line1, col1, line2, col2)
  self:raw_remove(line1, col1, line2, col2, self.undo_stack, system.get_time())
end


function Doc:undo()
  pop_undo(self, self.undo_stack, self.redo_stack)
end


function Doc:redo()
  pop_undo(self, self.redo_stack, self.undo_stack)
end


function Doc:text_input(text)
  if self:has_selection() then
    self:delete_to()
  end
  local line, col = self:get_selection()
  self:insert(line, col, text)
  self:move_to(#text)
end


function Doc:replace(fn)
  local line1, col1, line2, col2, swap
  local had_selection = self:has_selection()
  if had_selection then
    line1, col1, line2, col2, swap = self:get_selection(true)
  else
    line1, col1, line2, col2 = 1, 1, #self.lines, #self.lines[#self.lines]
  end
  local old_text = self:get_text(line1, col1, line2, col2)
  local new_text, n = fn(old_text)
  if old_text ~= new_text then
    self:insert(line2, col2, new_text)
    self:remove(line1, col1, line2, col2)
    if had_selection then
      line2, col2 = self:position_offset(line1, col1, #new_text)
      self:set_selection(line1, col1, line2, col2, swap)
    end
  end
  return n
end


function Doc:delete_to(...)
  local line, col = self:get_selection(true)
  if self:has_selection() then
    self:remove(self:get_selection())
  else
    local line2, col2 = self:position_offset(line, col, ...)
    self:remove(line, col, line2, col2)
    line, col = sort_positions(line, col, line2, col2)
  end
  self:set_selection(line, col)
end


function Doc:move_to(...)
  local line, col = self:get_selection()
  self:set_selection(self:position_offset(line, col, ...))
end


function Doc:select_to(...)
  local line, col, line2, col2 = self:get_selection()
  line, col = self:position_offset(line, col, ...)
  self:set_selection(line, col, line2, col2)
end


return Doc


================================================
FILE: data/core/doc/search.lua
================================================
local search = {}

local default_opt = {}


local function pattern_lower(str)
  if str:sub(1, 1) == "%" then
    return str
  end
  return str:lower()
end


local function init_args(doc, line, col, text, opt)
  opt = opt or default_opt
  line, col = doc:sanitize_position(line, col)

  if opt.no_case then
    if opt.pattern then
      text = text:gsub("%%?.", pattern_lower)
    else
      text = text:lower()
    end
  end

  return doc, line, col, text, opt
end


function search.find(doc, line, col, text, opt)
  doc, line, col, text, opt = init_args(doc, line, col, text, opt)

  for line = line, #doc.lines do
    local line_text = doc.lines[line]
    if opt.no_case then
      line_text = line_text:lower()
    end
    local s, e = line_text:find(text, col, not opt.pattern)
    if s then
      return line, s, line, e + 1
    end
    col = 1
  end

  if opt.wrap then
    opt = { no_case = opt.no_case, pattern = opt.pattern }
    return search.find(doc, 1, 1, text, opt)
  end
end


return search


================================================
FILE: data/core/doc/translate.lua
================================================
local common = require "core.common"
local config = require "core.config"

-- functions for translating a Doc position to another position these functions
-- can be passed to Doc:move_to|select_to|delete_to()

local translate = {}


local function is_non_word(char)
  return config.non_word_chars:find(char, nil, true)
end


function translate.previous_char(doc, line, col)
  repeat
    line, col = doc:position_offset(line, col, -1)
  until not common.is_utf8_cont(doc:get_char(line, col))
  return line, col
end


function translate.next_char(doc, line, col)
  repeat
    line, col = doc:position_offset(line, col, 1)
  until not common.is_utf8_cont(doc:get_char(line, col))
  return line, col
end


function translate.previous_word_start(doc, line, col)
  local prev
  while line > 1 or col > 1 do
    local l, c = doc:position_offset(line, col, -1)
    local char = doc:get_char(l, c)
    if prev and prev ~= char or not is_non_word(char) then
      break
    end
    prev, line, col = char, l, c
  end
  return translate.start_of_word(doc, line, col)
end


function translate.next_word_end(doc, line, col)
  local prev
  local end_line, end_col = translate.end_of_doc(doc, line, col)
  while line < end_line or col < end_col do
    local char = doc:get_char(line, col)
    if prev and prev ~= char or not is_non_word(char) then
      break
    end
    line, col = doc:position_offset(line, col, 1)
    prev = char
  end
  return translate.end_of_word(doc, line, col)
end


function translate.start_of_word(doc, line, col)
  while true do
    local line2, col2 = doc:position_offset(line, col, -1)
    local char = doc:get_char(line2, col2)
    if is_non_word(char)
    or line == line2 and col == col2 then
      break
    end
    line, col = line2, col2
  end
  return line, col
end


function translate.end_of_word(doc, line, col)
  while true do
    local line2, col2 = doc:position_offset(line, col, 1)
    local char = doc:get_char(line, col)
    if is_non_word(char)
    or line == line2 and col == col2 then
      break
    end
    line, col = line2, col2
  end
  return line, col
end


function translate.previous_block_start(doc, line, col)
  while true do
    line = line - 1
    if line <= 1 then
      return 1, 1
    end
    if doc.lines[line-1]:find("^%s*$")
    and not doc.lines[line]:find("^%s*$") then
      return line, (doc.lines[line]:find("%S"))
    end
  end
end


function translate.next_block_end(doc, line, col)
  while true do
    if line >= #doc.lines then
      return #doc.lines, 1
    end
    if doc.lines[line+1]:find("^%s*$")
    and not doc.lines[line]:find("^%s*$") then
      return line+1, #doc.lines[line+1]
    end
    line = line + 1
  end
end


function translate.start_of_line(doc, line, col)
  return line, 1
end


function translate.end_of_line(doc, line, col)
  return line, math.huge
end


function translate.start_of_doc(doc, line, col)
  return 1, 1
end


function translate.end_of_doc(doc, line, col)
  return #doc.lines, #doc.lines[#doc.lines]
end


return translate


================================================
FILE: data/core/docview.lua
================================================
local core = require "core"
local common = require "core.common"
local config = require "core.config"
local style = require "core.style"
local keymap = require "core.keymap"
local translate = require "core.doc.translate"
local View = require "core.view"


local DocView = View:extend()


local function move_to_line_offset(dv, line, col, offset)
  local xo = dv.last_x_offset
  if xo.line ~= line or xo.col ~= col then
    xo.offset = dv:get_col_x_offset(line, col)
  end
  xo.line = line + offset
  xo.col = dv:get_x_offset_col(line + offset, xo.offset)
  return xo.line, xo.col
end


DocView.translate = {
  ["previous_page"] = function(doc, line, col, dv)
    local min, max = dv:get_visible_line_range()
    return line - (max - min), 1
  end,

  ["next_page"] = function(doc, line, col, dv)
    local min, max = dv:get_visible_line_range()
    return line + (max - min), 1
  end,

  ["previous_line"] = function(doc, line, col, dv)
    if line == 1 then
      return 1, 1
    end
    return move_to_line_offset(dv, line, col, -1)
  end,

  ["next_line"] = function(doc, line, col, dv)
    if line == #doc.lines then
      return #doc.lines, math.huge
    end
    return move_to_line_offset(dv, line, col, 1)
  end,
}

local blink_period = 0.8


function DocView:new(doc)
  DocView.super.new(self)
  self.cursor = "ibeam"
  self.scrollable = true
  self.doc = assert(doc)
  self.font = "code_font"
  self.last_x_offset = {}
  self.blink_timer = 0
end


function DocView:try_close(do_close)
  if self.doc:is_dirty()
  and #core.get_views_referencing_doc(self.doc) == 1 then
    core.command_view:enter("Unsaved Changes; Confirm Close", function(_, item)
      if item.text:match("^[cC]") then
        do_close()
      elseif item.text:match("^[sS]") then
        self.doc:save()
        do_close()
      end
    end, function(text)
      local items = {}
      if not text:find("^[^cC]") then table.insert(items, "Close Without Saving") end
      if not text:find("^[^sS]") then table.insert(items, "Save And Close") end
      return items
    end)
  else
    do_close()
  end
end


function DocView:get_name()
  local post = self.doc:is_dirty() and "*" or ""
  local name = self.doc:get_name()
  return name:match("[^/%\\]*$") .. post
end


function DocView:get_scrollable_size()
  return self:get_line_height() * (#self.doc.lines - 1) + self.size.y
end


function DocView:get_font()
  return style[self.font]
end


function DocView:get_line_height()
  return math.floor(self:get_font():get_height() * config.line_height)
end


function DocView:get_gutter_width()
  return self:get_font():get_width(#self.doc.lines) + style.padding.x * 2
end


function DocView:get_line_screen_position(idx)
  local x, y = self:get_content_offset()
  local lh = self:get_line_height()
  local gw = self:get_gutter_width()
  return x + gw, y + (idx-1) * lh + style.padding.y
end


function DocView:get_line_text_y_offset()
  local lh = self:get_line_height()
  local th = self:get_font():get_height()
  return (lh - th) / 2
end


function DocView:get_visible_line_range()
  local x, y, x2, y2 = self:get_content_bounds()
  local lh = self:get_line_height()
  local minline = math.max(1, math.floor(y / lh))
  local maxline = math.min(#self.doc.lines, math.floor(y2 / lh) + 1)
  return minline, maxline
end


function DocView:get_col_x_offset(line, col)
  local text = self.doc.lines[line]
  if not text then return 0 end
  return self:get_font():get_width(text:sub(1, col - 1))
end


function DocView:get_x_offset_col(line, x)
  local text = self.doc.lines[line]

  local xoffset, last_i, i = 0, 1, 1
  for char in common.utf8_chars(text) do
    local w = self:get_font():get_width(char)
    if xoffset >= x then
      return (xoffset - x > w / 2) and last_i or i
    end
    xoffset = xoffset + w
    last_i = i
    i = i + #char
  end

  return #text
end


function DocView:resolve_screen_position(x, y)
  local ox, oy = self:get_line_screen_position(1)
  local line = math.floor((y - oy) / self:get_line_height()) + 1
  line = common.clamp(line, 1, #self.doc.lines)
  local col = self:get_x_offset_col(line, x - ox)
  return line, col
end


function DocView:scroll_to_line(line, ignore_if_visible, instant)
  local min, max = self:get_visible_line_range()
  if not (ignore_if_visible and line > min and line < max) then
    local lh = self:get_line_height()
    self.scroll.to.y = math.max(0, lh * (line - 1) - self.size.y / 2)
    if instant then
      self.scroll.y = self.scroll.to.y
    end
  end
end


function DocView:scroll_to_make_visible(line, col)
  local min = self:get_line_height() * (line - 1)
  local max = self:get_line_height() * (line + 2) - self.size.y
  self.scroll.to.y = math.min(self.scroll.to.y, min)
  self.scroll.to.y = math.max(self.scroll.to.y, max)
  local gw = self:get_gutter_width()
  local xoffset = self:get_col_x_offset(line, col)
  local max = xoffset - self.size.x + gw + self.size.x / 5
  self.scroll.to.x = math.max(0, max)
end


local function mouse_selection(doc, clicks, line1, col1, line2, col2)
  local swap = line2 < line1 or line2 == line1 and col2 <= col1
  if swap then
    line1, col1, line2, col2 = line2, col2, line1, col1
  end
  if clicks == 2 then
    line1, col1 = translate.start_of_word(doc, line1, col1)
    line2, col2 = translate.end_of_word(doc, line2, col2)
  elseif clicks == 3 then
    if line2 == #doc.lines and doc.lines[#doc.lines] ~= "\n" then
      doc:insert(math.huge, math.huge, "\n")
    end
    line1, col1, line2, col2 = line1, 1, line2 + 1, 1
  end
  if swap then
    return line2, col2, line1, col1
  end
  return line1, col1, line2, col2
end


function DocView:on_mouse_pressed(button, x, y, clicks)
  local caught = DocView.super.on_mouse_pressed(self, button, x, y, clicks)
  if caught then
    return
  end
  if keymap.modkeys["shift"] then
    if clicks == 1 then
      local line1, col1 = select(3, self.doc:get_selection())
      local line2, col2 = self:resolve_screen_position(x, y)
      self.doc:set_selection(line2, col2, line1, col1)
    end
  else
    local line, col = self:resolve_screen_position(x, y)
    self.doc:set_selection(mouse_selection(self.doc, clicks, line, col, line, col))
    self.mouse_selecting = { line, col, clicks = clicks }
  end
  self.blink_timer = 0
end


function DocView:on_mouse_moved(x, y, ...)
  DocView.super.on_mouse_moved(self, x, y, ...)

  if self:scrollbar_overlaps_point(x, y) or self.dragging_scrollbar then
    self.cursor = "arrow"
  else
    self.cursor = "ibeam"
  end

  if self.mouse_selecting then
    local l1, c1 = self:resolve_screen_position(x, y)
    local l2, c2 = table.unpack(self.mouse_selecting)
    local clicks = self.mouse_selecting.clicks
    self.doc:set_selection(mouse_selection(self.doc, clicks, l1, c1, l2, c2))
  end
end


function DocView:on_mouse_released(button)
  DocView.super.on_mouse_released(self, button)
  self.mouse_selecting = nil
end


function DocView:on_text_input(text)
  self.doc:text_input(text)
end


function DocView:update()
  -- scroll to make caret visible and reset blink timer if it moved
  local line, col = self.doc:get_selection()
  if (line ~= self.last_line or col ~= self.last_col) and self.size.x > 0 then
    if core.active_view == self then
      self:scroll_to_make_visible(line, col)
    end
    self.blink_timer = 0
    self.last_line, self.last_col = line, col
  end

  -- update blink timer
  if self == core.active_view and not self.mouse_selecting then
    local n = blink_period / 2
    local prev = self.blink_timer
    self.blink_timer = (self.blink_timer + 1 / config.fps) % blink_period
    if (self.blink_timer > n) ~= (prev > n) then
      core.redraw = true
    end
  end

  DocView.super.update(self)
end


function DocView:draw_line_highlight(x, y)
  local lh = self:get_line_height()
  renderer.draw_rect(x, y, self.size.x, lh, style.line_highlight)
end


function DocView:draw_line_text(idx, x, y)
  local tx, ty = x, y + self:get_line_text_y_offset()
  local font = self:get_font()
  for _, type, text in self.doc.highlighter:each_token(idx) do
    local color = style.syntax[type]
    tx = renderer.draw_text(font, text, tx, ty, color)
  end
end


function DocView:draw_line_body(idx, x, y)
  local line, col = self.doc:get_selection()

  -- draw selection if it overlaps this line
  local line1, col1, line2, col2 = self.doc:get_selection(true)
  if idx >= line1 and idx <= line2 then
    local text = self.doc.lines[idx]
    if line1 ~= idx then col1 = 1 end
    if line2 ~= idx then col2 = #text + 1 end
    local x1 = x + self:get_col_x_offset(idx, col1)
    local x2 = x + self:get_col_x_offset(idx, col2)
    local lh = self:get_line_height()
    renderer.draw_rect(x1, y, x2 - x1, lh, style.selection)
  end

  -- draw line highlight if caret is on this line
  if config.highlight_current_line and not self.doc:has_selection()
  and line == idx and core.active_view == self then
    self:draw_line_highlight(x + self.scroll.x, y)
  end

  -- draw line's text
  self:draw_line_text(idx, x, y)

  -- draw caret if it overlaps this line
  if line == idx and core.active_view == self
  and self.blink_timer < blink_period / 2
  and system.window_has_focus() then
    local lh = self:get_line_height()
    local x1 = x + self:get_col_x_offset(line, col)
    renderer.draw_rect(x1, y, style.caret_width, lh, style.caret)
  end
end


function DocView:draw_line_gutter(idx, x, y)
  local color = style.line_number
  local line1, _, line2, _ = self.doc:get_selection(true)
  if idx >= line1 and idx <= line2 then
    color = style.line_number2
  end
  local yoffset = self:get_line_text_y_offset()
  x = x + style.padding.x
  renderer.draw_text(self:get_font(), idx, x, y + yoffset, color)
end


function DocView:draw()
  self:draw_background(style.background)

  local font = self:get_font()
  font:set_tab_width(font:get_width(" ") * config.indent_size)

  local minline, maxline = self:get_visible_line_range()
  local lh = self:get_line_height()

  local _, y = self:get_line_screen_position(minline)
  local x = self.position.x
  for i = minline, maxline do
    self:draw_line_gutter(i, x, y)
    y = y + lh
  end

  local x, y = self:get_line_screen_position(minline)
  local gw = self:get_gutter_width()
  local pos = self.position
  core.push_clip_rect(pos.x + gw, pos.y, self.size.x, self.size.y)
  for i = minline, maxline do
    self:draw_line_body(i, x, y)
    y = y + lh
  end
  core.pop_clip_rect()

  self:draw_scrollbar()
end


return DocView


================================================
FILE: data/core/init.lua
================================================
require "core.strict"
local common = require "core.common"
local config = require "core.config"
local style = require "core.style"
local command
local keymap
local RootView
local StatusView
local CommandView
local Doc

local core = {}


local function project_scan_thread()
  local function diff_files(a, b)
    if #a ~= #b then return true end
    for i, v in ipairs(a) do
      if b[i].filename ~= v.filename
      or b[i].modified ~= v.modified then
        return true
      end
    end
  end

  local function compare_file(a, b)
    return a.filename < b.filename
  end

  local function get_files(path, t)
    coroutine.yield()
    t = t or {}
    local size_limit = config.file_size_limit * 10e5
    local all = system.list_dir(path) or {}
    local dirs, files = {}, {}

    for _, file in ipairs(all) do
      if not common.match_pattern(file, config.ignore_files) then
        local file = (path ~= "." and path .. PATHSEP or "") .. file
        local info = system.get_file_info(file)
        if info and info.size < size_limit then
          info.filename = file
          table.insert(info.type == "dir" and dirs or files, info)
        end
      end
    end

    table.sort(dirs, compare_file)
    for _, f in ipairs(dirs) do
      table.insert(t, f)
      get_files(f.filename, t)
    end

    table.sort(files, compare_file)
    for _, f in ipairs(files) do
      table.insert(t, f)
    end

    return t
  end

  while true do
    -- get project files and replace previous table if the new table is
    -- different
    local t = get_files(".")
    if diff_files(core.project_files, t) then
      core.project_files = t
      core.redraw = true
    end

    -- wait for next scan
    coroutine.yield(config.project_scan_rate)
  end
end


function core.init()
  command = require "core.command"
  keymap = require "core.keymap"
  RootView = require "core.rootview"
  StatusView = require "core.statusview"
  CommandView = require "core.commandview"
  Doc = require "core.doc"

  local project_dir = EXEDIR
  local files = {}
  for i = 2, #ARGS do
    local info = system.get_file_info(ARGS[i]) or {}
    if info.type == "file" then
      table.insert(files, system.absolute_path(ARGS[i]))
    elseif info.type == "dir" then
      project_dir = ARGS[i]
    end
  end

  system.chdir(project_dir)

  core.frame_start = 0
  core.clip_rect_stack = {{ 0,0,0,0 }}
  core.log_items = {}
  core.docs = {}
  core.threads = setmetatable({}, { __mode = "k" })
  core.project_files = {}
  core.redraw = true

  core.root_view = RootView()
  core.command_view = CommandView()
  core.status_view = StatusView()

  core.root_view.root_node:split("down", core.command_view, true)
  core.root_view.root_node.b:split("down", core.status_view, true)

  core.add_thread(project_scan_thread)
  command.add_defaults()
  local got_plugin_error = not core.load_plugins()
  local got_user_error = not core.try(require, "user")
  local got_project_error = not core.load_project_module()

  for _, filename in ipairs(files) do
    core.root_view:open_doc(core.open_doc(filename))
  end

  if got_plugin_error or got_user_error or got_project_error then
    command.perform("core:open-log")
  end
end


local temp_uid = (system.get_time() * 1000) % 0xffffffff
local temp_file_prefix = string.format(".lite_temp_%08x", temp_uid)
local temp_file_counter = 0

local function delete_temp_files()
  for _, filename in ipairs(system.list_dir(EXEDIR)) do
    if filename:find(temp_file_prefix, 1, true) == 1 then
      os.remove(EXEDIR .. PATHSEP .. filename)
    end
  end
end

function core.temp_filename(ext)
  temp_file_counter = temp_file_counter + 1
  return EXEDIR .. PATHSEP .. temp_file_prefix
      .. string.format("%06x", temp_file_counter) .. (ext or "")
end


function core.quit(force)
  if force then
    delete_temp_files()
    os.exit()
  end
  local dirty_count = 0
  local dirty_name
  for _, doc in ipairs(core.docs) do
    if doc:is_dirty() then
      dirty_count = dirty_count + 1
      dirty_name = doc:get_name()
    end
  end
  if dirty_count > 0 then
    local text
    if dirty_count == 1 then
      text = string.format("\"%s\" has unsaved changes. Quit anyway?", dirty_name)
    else
      text = string.format("%d docs have unsaved changes. Quit anyway?", dirty_count)
    end
    local confirm = system.show_confirm_dialog("Unsaved Changes", text)
    if not confirm then return end
  end
  core.quit(true)
end


function core.load_plugins()
  local no_errors = true
  local files = system.list_dir(EXEDIR .. "/data/plugins")
  for _, filename in ipairs(files) do
    local modname = "plugins." .. filename:gsub(".lua$", "")
    local ok = core.try(require, modname)
    if ok then
      core.log_quiet("Loaded plugin %q", modname)
    else
      no_errors = false
    end
  end
  return no_errors
end


function core.load_project_module()
  local filename = ".lite_project.lua"
  if system.get_file_info(filename) then
    return core.try(function()
      local fn, err = loadfile(filename)
      if not fn then error("Error when loading project module:\n\t" .. err) end
      fn()
      core.log_quiet("Loaded project module")
    end)
  end
  return true
end


function core.reload_module(name)
  local old = package.loaded[name]
  package.loaded[name] = nil
  local new = require(name)
  if type(old) == "table" then
    for k, v in pairs(new) do old[k] = v end
    package.loaded[name] = old
  end
end


function core.set_active_view(view)
  assert(view, "Tried to set active view to nil")
  if view ~= core.active_view then
    core.last_active_view = core.active_view
    core.active_view = view
  end
end


function core.add_thread(f, weak_ref)
  local key = weak_ref or #core.threads + 1
  local fn = function() return core.try(f) end
  core.threads[key] = { cr = coroutine.create(fn), wake = 0 }
end


function core.push_clip_rect(x, y, w, h)
  local x2, y2, w2, h2 = table.unpack(core.clip_rect_stack[#core.clip_rect_stack])
  local r, b, r2, b2 = x+w, y+h, x2+w2, y2+h2
  x, y = math.max(x, x2), math.max(y, y2)
  b, r = math.min(b, b2), math.min(r, r2)
  w, h = r-x, b-y
  table.insert(core.clip_rect_stack, { x, y, w, h })
  renderer.set_clip_rect(x, y, w, h)
end


function core.pop_clip_rect()
  table.remove(core.clip_rect_stack)
  local x, y, w, h = table.unpack(core.clip_rect_stack[#core.clip_rect_stack])
  renderer.set_clip_rect(x, y, w, h)
end


function core.open_doc(filename)
  if filename then
    -- try to find existing doc for filename
    local abs_filename = system.absolute_path(filename)
    for _, doc in ipairs(core.docs) do
      if doc.filename
      and abs_filename == system.absolute_path(doc.filename) then
        return doc
      end
    end
  end
  -- no existing doc for filename; create new
  local doc = Doc(filename)
  table.insert(core.docs, doc)
  core.log_quiet(filename and "Opened doc \"%s\"" or "Opened new doc", filename)
  return doc
end


function core.get_views_referencing_doc(doc)
  local res = {}
  local views = core.root_view.root_node:get_children()
  for _, view in ipairs(views) do
    if view.doc == doc then table.insert(res, view) end
  end
  return res
end


local function log(icon, icon_color, fmt, ...)
  local text = string.format(fmt, ...)
  if icon then
    core.status_view:show_message(icon, icon_color, text)
  end

  local info = debug.getinfo(2, "Sl")
  local at = string.format("%s:%d", info.short_src, info.currentline)
  local item = { text = text, time = os.time(), at = at }
  table.insert(core.log_items, item)
  if #core.log_items > config.max_log_items then
    table.remove(core.log_items, 1)
  end
  return item
end


function core.log(...)
  return log("i", style.text, ...)
end


function core.log_quiet(...)
  return log(nil, nil, ...)
end


function core.error(...)
  return log("!", style.accent, ...)
end


function core.try(fn, ...)
  local err
  local ok, res = xpcall(fn, function(msg)
    local item = core.error("%s", msg)
    item.info = debug.traceback(nil, 2):gsub("\t", "")
    err = msg
  end, ...)
  if ok then
    return true, res
  end
  return false, err
end


function core.on_event(type, ...)
  local did_keymap = false
  if type == "textinput" then
    core.root_view:on_text_input(...)
  elseif type == "keypressed" then
    did_keymap = keymap.on_key_pressed(...)
  elseif type == "keyreleased" then
    keymap.on_key_released(...)
  elseif type == "mousemoved" then
    core.root_view:on_mouse_moved(...)
  elseif type == "mousepressed" then
    core.root_view:on_mouse_pressed(...)
  elseif type == "mousereleased" then
    core.root_view:on_mouse_released(...)
  elseif type == "mousewheel" then
    core.root_view:on_mouse_wheel(...)
  elseif type == "filedropped" then
    local filename, mx, my = ...
    local info = system.get_file_info(filename)
    if info and info.type == "dir" then
      system.exec(string.format("%q %q", EXEFILE, filename))
    else
      local ok, doc = core.try(core.open_doc, filename)
      if ok then
        local node = core.root_view.root_node:get_child_overlapping_point(mx, my)
        node:set_active_view(node.active_view)
        core.root_view:open_doc(doc)
      end
    end
  elseif type == "quit" then
    core.quit()
  end
  return did_keymap
end


function core.step()
  -- handle events
  local did_keymap = false
  local mouse_moved = false
  local mouse = { x = 0, y = 0, dx = 0, dy = 0 }

  for type, a,b,c,d in system.poll_event do
    if type == "mousemoved" then
      mouse_moved = true
      mouse.x, mouse.y = a, b
      mouse.dx, mouse.dy = mouse.dx + c, mouse.dy + d
    elseif type == "textinput" and did_keymap then
      did_keymap = false
    else
      local _, res = core.try(core.on_event, type, a, b, c, d)
      did_keymap = res or did_keymap
    end
    core.redraw = true
  end
  if mouse_moved then
    core.try(core.on_event, "mousemoved", mouse.x, mouse.y, mouse.dx, mouse.dy)
  end

  local width, height = renderer.get_size()

  -- update
  core.root_view.size.x, core.root_view.size.y = width, height
  core.root_view:update()
  if not core.redraw then return false end
  core.redraw = false

  -- close unreferenced docs
  for i = #core.docs, 1, -1 do
    local doc = core.docs[i]
    if #core.get_views_referencing_doc(doc) == 0 then
      table.remove(core.docs, i)
      core.log_quiet("Closed doc \"%s\"", doc:get_name())
    end
  end

  -- update window title
  local name = core.active_view:get_name()
  local title = (name ~= "---") and (name .. " - lite") or  "lite"
  if title ~= core.window_title then
    system.set_window_title(title)
    core.window_title = title
  end

  -- draw
  renderer.begin_frame()
  core.clip_rect_stack[1] = { 0, 0, width, height }
  renderer.set_clip_rect(table.unpack(core.clip_rect_stack[1]))
  core.root_view:draw()
  renderer.end_frame()
  return true
end


local run_threads = coroutine.wrap(function()
  while true do
    local max_time = 1 / config.fps - 0.004
    local ran_any_threads = false

    for k, thread in pairs(core.threads) do
      -- run thread
      if thread.wake < system.get_time() then
        local _, wait = assert(coroutine.resume(thread.cr))
        if coroutine.status(thread.cr) == "dead" then
          if type(k) == "number" then
            table.remove(core.threads, k)
          else
            core.threads[k] = nil
          end
        elseif wait then
          thread.wake = system.get_time() + wait
        end
        ran_any_threads = true
      end

      -- stop running threads if we're about to hit the end of frame
      if system.get_time() - core.frame_start > max_time then
        coroutine.yield()
      end
    end

    if not ran_any_threads then coroutine.yield() end
  end
end)


function core.run()
  while true do
    core.frame_start = system.get_time()
    local did_redraw = core.step()
    run_threads()
    if not did_redraw and not system.window_has_focus() then
      system.wait_event(0.25)
    end
    local elapsed = system.get_time() - core.frame_start
    system.sleep(math.max(0, 1 / config.fps - elapsed))
  end
end


function core.on_error(err)
  -- write error to file
  local fp = io.open(EXEDIR .. "/error.txt", "wb")
  fp:write("Error: " .. tostring(err) .. "\n")
  fp:write(debug.traceback(nil, 4))
  fp:close()
  -- save copy of all unsaved documents
  for _, doc in ipairs(core.docs) do
    if doc:is_dirty() and doc.filename then
      doc:save(doc.filename .. "~")
    end
  end
end


return core


================================================
FILE: data/core/keymap.lua
================================================
local command = require "core.command"
local keymap = {}

keymap.modkeys = {}
keymap.map = {}
keymap.reverse_map = {}

local modkey_map = {
  ["left ctrl"]   = "ctrl",
  ["right ctrl"]  = "ctrl",
  ["left shift"]  = "shift",
  ["right shift"] = "shift",
  ["left alt"]    = "alt",
  ["right alt"]   = "altgr",
}

local modkeys = { "ctrl", "alt", "altgr", "shift" }

local function key_to_stroke(k)
  local stroke = ""
  for _, mk in ipairs(modkeys) do
    if keymap.modkeys[mk] then
      stroke = stroke .. mk .. "+"
    end
  end
  return stroke .. k
end


function keymap.add(map, overwrite)
  for stroke, commands in pairs(map) do
    if type(commands) == "string" then
      commands = { commands }
    end
    if overwrite then
      keymap.map[stroke] = commands
    else
      keymap.map[stroke] = keymap.map[stroke] or {}
      for i = #commands, 1, -1 do
        table.insert(keymap.map[stroke], 1, commands[i])
      end
    end
    for _, cmd in ipairs(commands) do
      keymap.reverse_map[cmd] = stroke
    end
  end
end


function keymap.get_binding(cmd)
  return keymap.reverse_map[cmd]
end


function keymap.on_key_pressed(k)
  local mk = modkey_map[k]
  if mk then
    keymap.modkeys[mk] = true
    -- work-around for windows where `altgr` is treated as `ctrl+alt`
    if mk == "altgr" then
      keymap.modkeys["ctrl"] = false
    end
  else
    local stroke = key_to_stroke(k)
    local commands = keymap.map[stroke]
    if commands then
      for _, cmd in ipairs(commands) do
        local performed = command.perform(cmd)
        if performed then break end
      end
      return true
    end
  end
  return false
end


function keymap.on_key_released(k)
  local mk = modkey_map[k]
  if mk then
    keymap.modkeys[mk] = false
  end
end


keymap.add {
  ["ctrl+shift+p"] = "core:find-command",
  ["ctrl+p"] = "core:find-file",
  ["ctrl+o"] = "core:open-file",
  ["ctrl+n"] = "core:new-doc",
  ["alt+return"] = "core:toggle-fullscreen",

  ["alt+shift+j"] = "root:split-left",
  ["alt+shift+l"] = "root:split-right",
  ["alt+shift+i"] = "root:split-up",
  ["alt+shift+k"] = "root:split-down",
  ["alt+j"] = "root:switch-to-left",
  ["alt+l"] = "root:switch-to-right",
  ["alt+i"] = "root:switch-to-up",
  ["alt+k"] = "root:switch-to-down",

  ["ctrl+w"] = "root:close",
  ["ctrl+tab"] = "root:switch-to-next-tab",
  ["ctrl+shift+tab"] = "root:switch-to-previous-tab",
  ["ctrl+pageup"] = "root:move-tab-left",
  ["ctrl+pagedown"] = "root:move-tab-right",
  ["alt+1"] = "root:switch-to-tab-1",
  ["alt+2"] = "root:switch-to-tab-2",
  ["alt+3"] = "root:switch-to-tab-3",
  ["alt+4"] = "root:switch-to-tab-4",
  ["alt+5"] = "root:switch-to-tab-5",
  ["alt+6"] = "root:switch-to-tab-6",
  ["alt+7"] = "root:switch-to-tab-7",
  ["alt+8"] = "root:switch-to-tab-8",
  ["alt+9"] = "root:switch-to-tab-9",

  ["ctrl+f"] = "find-replace:find",
  ["ctrl+r"] = "find-replace:replace",
  ["f3"] = "find-replace:repeat-find",
  ["shift+f3"] = "find-replace:previous-find",
  ["ctrl+g"] = "doc:go-to-line",
  ["ctrl+s"] = "doc:save",
  ["ctrl+shift+s"] = "doc:save-as",

  ["ctrl+z"] = "doc:undo",
  ["ctrl+y"] = "doc:redo",
  ["ctrl+x"] = "doc:cut",
  ["ctrl+c"] = "doc:copy",
  ["ctrl+v"] = "doc:paste",
  ["escape"] = { "command:escape", "doc:select-none" },
  ["tab"] = { "command:complete", "doc:indent" },
  ["shift+tab"] = "doc:unindent",
  ["backspace"] = "doc:backspace",
  ["shift+backspace"] = "doc:backspace",
  ["ctrl+backspace"] = "doc:delete-to-previous-word-start",
  ["ctrl+shift+backspace"] = "doc:delete-to-previous-word-start",
  ["delete"] = "doc:delete",
  ["shift+delete"] = "doc:delete",
  ["ctrl+delete"] = "doc:delete-to-next-word-end",
  ["ctrl+shift+delete"] = "doc:delete-to-next-word-end",
  ["return"] = { "command:submit", "doc:newline" },
  ["keypad enter"] = { "command:submit", "doc:newline" },
  ["ctrl+return"] = "doc:newline-below",
  ["ctrl+shift+return"] = "doc:newline-above",
  ["ctrl+j"] = "doc:join-lines",
  ["ctrl+a"] = "doc:select-all",
  ["ctrl+d"] = { "find-replace:select-next", "doc:select-word" },
  ["ctrl+l"] = "doc:select-lines",
  ["ctrl+/"] = "doc:toggle-line-comments",
  ["ctrl+up"] = "doc:move-lines-up",
  ["ctrl+down"] = "doc:move-lines-down",
  ["ctrl+shift+d"] = "doc:duplicate-lines",
  ["ctrl+shift+k"] = "doc:delete-lines",

  ["left"] = "doc:move-to-previous-char",
  ["right"] = "doc:move-to-next-char",
  ["up"] = { "command:select-previous", "doc:move-to-previous-line" },
  ["down"] = { "command:select-next", "doc:move-to-next-line" },
  ["ctrl+left"] = "doc:move-to-previous-word-start",
  ["ctrl+right"] = "doc:move-to-next-word-end",
  ["ctrl+["] = "doc:move-to-previous-block-start",
  ["ctrl+]"] = "doc:move-to-next-block-end",
  ["home"] = "doc:move-to-start-of-line",
  ["end"] = "doc:move-to-end-of-line",
  ["ctrl+home"] = "doc:move-to-start-of-doc",
  ["ctrl+end"] = "doc:move-to-end-of-doc",
  ["pageup"] = "doc:move-to-previous-page",
  ["pagedown"] = "doc:move-to-next-page",

  ["shift+left"] = "doc:select-to-previous-char",
  ["shift+right"] = "doc:select-to-next-char",
  ["shift+up"] = "doc:select-to-previous-line",
  ["shift+down"] = "doc:select-to-next-line",
  ["ctrl+shift+left"] = "doc:select-to-previous-word-start",
  ["ctrl+shift+right"] = "doc:select-to-next-word-end",
  ["ctrl+shift+["] = "doc:select-to-previous-block-start",
  ["ctrl+shift+]"] = "doc:select-to-next-block-end",
  ["shift+home"] = "doc:select-to-start-of-line",
  ["shift+end"] = "doc:select-to-end-of-line",
  ["ctrl+shift+home"] = "doc:select-to-start-of-doc",
  ["ctrl+shift+end"] = "doc:select-to-end-of-doc",
  ["shift+pageup"] = "doc:select-to-previous-page",
  ["shift+pagedown"] = "doc:select-to-next-page",
}

return keymap


================================================
FILE: data/core/logview.lua
================================================
local core = require "core"
local style = require "core.style"
local View = require "core.view"


local LogView = View:extend()


function LogView:new()
  LogView.super.new(self)
  self.last_item = core.log_items[#core.log_items]
  self.scrollable = true
  self.yoffset = 0
end


function LogView:get_name()
  return "Log"
end


function LogView:update()
  local item = core.log_items[#core.log_items]
  if self.last_item ~= item then
    self.last_item = item
    self.scroll.to.y = 0
    self.yoffset = -(style.font:get_height() + style.padding.y)
  end

  self:move_towards("yoffset", 0)

  LogView.super.update(self)
end


local function draw_text_multiline(font, text, x, y, color)
  local th = font:get_height()
  local resx, resy = x, y
  for line in text:gmatch("[^\n]+") do
    resy = y
    resx = renderer.draw_text(style.font, line, x, y, color)
    y = y + th
  end
  return resx, resy
end


function LogView:draw()
  self:draw_background(style.background)

  local ox, oy = self:get_content_offset()
  local th = style.font:get_height()
  local y = oy + style.padding.y + self.yoffset

  for i = #core.log_items, 1, -1 do
    local x = ox + style.padding.x
    local item = core.log_items[i]
    local time = os.date(nil, item.time)
    x = renderer.draw_text(style.font, time, x, y, style.dim)
    x = x + style.padding.x
    local subx = x
    x, y = draw_text_multiline(style.font, item.text, x, y, style.text)
    renderer.draw_text(style.font, " at " .. item.at, x, y, style.dim)
    y = y + th
    if item.info then
      subx, y = draw_text_multiline(style.font, item.info, subx, y, style.dim)
      y = y + th
    end
    y = y + style.padding.y
  end
end


return LogView


================================================
FILE: data/core/object.lua
================================================
local Object = {}
Object.__index = Object


function Object:new()
end


function Object:extend()
  local cls = {}
  for k, v in pairs(self) do
    if k:find("__") == 1 then
      cls[k] = v
    end
  end
  cls.__index = cls
  cls.super = self
  setmetatable(cls, self)
  return cls
end


function Object:implement(...)
  for _, cls in pairs({...}) do
    for k, v in pairs(cls) do
      if self[k] == nil and type(v) == "function" then
        self[k] = v
      end
    end
  end
end


function Object:is(T)
  local mt = getmetatable(self)
  while mt do
    if mt == T then
      return true
    end
    mt = getmetatable(mt)
  end
  return false
end


function Object:__tostring()
  return "Object"
end


function Object:__call(...)
  local obj = setmetatable({}, self)
  obj:new(...)
  return obj
end


return Object


================================================
FILE: data/core/rootview.lua
================================================
local core = require "core"
local common = require "core.common"
local style = require "core.style"
local keymap = require "core.keymap"
local Object = require "core.object"
local View = require "core.view"
local DocView = require "core.docview"


local EmptyView = View:extend()

local function draw_text(x, y, color)
  local th = style.big_font:get_height()
  local dh = th + style.padding.y * 2
  x = renderer.draw_text(style.big_font, "lite", x, y + (dh - th) / 2, color)
  x = x + style.padding.x
  renderer.draw_rect(x, y, math.ceil(1 * SCALE), dh, color)
  local lines = {
    { fmt = "%s to run a command", cmd = "core:find-command" },
    { fmt = "%s to open a file from the project", cmd = "core:find-file" },
  }
  th = style.font:get_height()
  y = y + (dh - th * 2 - style.padding.y) / 2
  local w = 0
  for _, line in ipairs(lines) do
    local text = string.format(line.fmt, keymap.get_binding(line.cmd))
    w = math.max(w, renderer.draw_text(style.font, text, x + style.padding.x, y, color))
    y = y + th + style.padding.y
  end
  return w, dh
end

function EmptyView:draw()
  self:draw_background(style.background)
  local w, h = draw_text(0, 0, { 0, 0, 0, 0 })
  local x = self.position.x + math.max(style.padding.x, (self.size.x - w) / 2)
  local y = self.position.y + (self.size.y - h) / 2
  draw_text(x, y, style.dim)
end



local Node = Object:extend()

function Node:new(type)
  self.type = type or "leaf"
  self.position = { x = 0, y = 0 }
  self.size = { x = 0, y = 0 }
  self.views = {}
  self.divider = 0.5
  if self.type == "leaf" then
    self:add_view(EmptyView())
  end
end


function Node:propagate(fn, ...)
  self.a[fn](self.a, ...)
  self.b[fn](self.b, ...)
end


function Node:on_mouse_moved(x, y, ...)
  self.hovered_tab = self:get_tab_overlapping_point(x, y)
  if self.type == "leaf" then
    self.active_view:on_mouse_moved(x, y, ...)
  else
    self:propagate("on_mouse_moved", x, y, ...)
  end
end


function Node:on_mouse_released(...)
  if self.type == "leaf" then
    self.active_view:on_mouse_released(...)
  else
    self:propagate("on_mouse_released", ...)
  end
end


function Node:consume(node)
  for k, _ in pairs(self) do self[k] = nil end
  for k, v in pairs(node) do self[k] = v   end
end


local type_map = { up="vsplit", down="vsplit", left="hsplit", right="hsplit" }

function Node:split(dir, view, locked)
  assert(self.type == "leaf", "Tried to split non-leaf node")
  local type = assert(type_map[dir], "Invalid direction")
  local last_active = core.active_view
  local child = Node()
  child:consume(self)
  self:consume(Node(type))
  self.a = child
  self.b = Node()
  if view then self.b:add_view(view) end
  if locked then
    self.b.locked = locked
    core.set_active_view(last_active)
  end
  if dir == "up" or dir == "left" then
    self.a, self.b = self.b, self.a
  end
  return child
end


function Node:close_active_view(root)
  local do_close = function()
    if #self.views > 1 then
      local idx = self:get_view_idx(self.active_view)
      table.remove(self.views, idx)
      self:set_active_view(self.views[idx] or self.views[#self.views])
    else
      local parent = self:get_parent_node(root)
      local is_a = (parent.a == self)
      local other = parent[is_a and "b" or "a"]
      if other:get_locked_size() then
        self.views = {}
        self:add_view(EmptyView())
      else
        parent:consume(other)
        local p = parent
        while p.type ~= "leaf" do
          p = p[is_a and "a" or "b"]
        end
        p:set_active_view(p.active_view)
      end
    end
    core.last_active_view = nil
  end
  self.active_view:try_close(do_close)
end


function Node:add_view(view)
  assert(self.type == "leaf", "Tried to add view to non-leaf node")
  assert(not self.locked, "Tried to add view to locked node")
  if self.views[1] and self.views[1]:is(EmptyView) then
    table.remove(self.views)
  end
  table.insert(self.views, view)
  self:set_active_view(view)
end


function Node:set_active_view(view)
  assert(self.type == "leaf", "Tried to set active view on non-leaf node")
  self.active_view = view
  core.set_active_view(view)
end


function Node:get_view_idx(view)
  for i, v in ipairs(self.views) do
    if v == view then return i end
  end
end


function Node:get_node_for_view(view)
  for _, v in ipairs(self.views) do
    if v == view then return self end
  end
  if self.type ~= "leaf" then
    return self.a:get_node_for_view(view) or self.b:get_node_for_view(view)
  end
end


function Node:get_parent_node(root)
  if root.a == self or root.b == self then
    return root
  elseif root.type ~= "leaf" then
    return self:get_parent_node(root.a) or self:get_parent_node(root.b)
  end
end


function Node:get_children(t)
  t = t or {}
  for _, view in ipairs(self.views) do
    table.insert(t, view)
  end
  if self.a then self.a:get_children(t) end
  if self.b then self.b:get_children(t) end
  return t
end


function Node:get_divider_overlapping_point(px, py)
  if self.type ~= "leaf" then
    local p = 6
    local x, y, w, h = self:get_divider_rect()
    x, y = x - p, y - p
    w, h = w + p * 2, h + p * 2
    if px > x and py > y and px < x + w and py < y + h then
      return self
    end
    return self.a:get_divider_overlapping_point(px, py)
        or self.b:get_divider_overlapping_point(px, py)
  end
end


function Node:get_tab_overlapping_point(px, py)
  if #self.views == 1 then return nil end
  local x, y, w, h = self:get_tab_rect(1)
  if px >= x and py >= y and px < x + w * #self.views and py < y + h then
    return math.floor((px - x) / w) + 1
  end
end


function Node:get_child_overlapping_point(x, y)
  local child
  if self.type == "leaf" then
    return self
  elseif self.type == "hsplit" then
    child = (x < self.b.position.x) and self.a or self.b
  elseif self.type == "vsplit" then
    child = (y < self.b.position.y) and self.a or self.b
  end
  return child:get_child_overlapping_point(x, y)
end


function Node:get_tab_rect(idx)
  local tw = math.min(style.tab_width, math.ceil(self.size.x / #self.views))
  local h = style.font:get_height() + style.padding.y * 2
  return self.position.x + (idx-1) * tw, self.position.y, tw, h
end


function Node:get_divider_rect()
  local x, y = self.position.x, self.position.y
  if self.type == "hsplit" then
    return x + self.a.size.x, y, style.divider_size, self.size.y
  elseif self.type == "vsplit" then
    return x, y + self.a.size.y, self.size.x, style.divider_size
  end
end


function Node:get_locked_size()
  if self.type == "leaf" then
    if self.locked then
      local size = self.active_view.size
      return size.x, size.y
    end
  else
    local x1, y1 = self.a:get_locked_size()
    local x2, y2 = self.b:get_locked_size()
    if x1 and x2 then
      local dsx = (x1 < 1 or x2 < 1) and 0 or style.divider_size
      local dsy = (y1 < 1 or y2 < 1) and 0 or style.divider_size
      return x1 + x2 + dsx, y1 + y2 + dsy
    end
  end
end


local function copy_position_and_size(dst, src)
  dst.position.x, dst.position.y = src.position.x, src.position.y
  dst.size.x, dst.size.y = src.size.x, src.size.y
end


-- calculating the sizes is the same for hsplits and vsplits, except the x/y
-- axis are swapped; this function lets us use the same code for both
local function calc_split_sizes(self, x, y, x1, x2)
  local n
  local ds = (x1 and x1 < 1 or x2 and x2 < 1) and 0 or style.divider_size
  if x1 then
    n = x1 + ds
  elseif x2 then
    n = self.size[x] - x2
  else
    n = math.floor(self.size[x] * self.divider)
  end
  self.a.position[x] = self.position[x]
  self.a.position[y] = self.position[y]
  self.a.size[x] = n - ds
  self.a.size[y] = self.size[y]
  self.b.position[x] = self.position[x] + n
  self.b.position[y] = self.position[y]
  self.b.size[x] = self.size[x] - n
  self.b.size[y] = self.size[y]
end


function Node:update_layout()
  if self.type == "leaf" then
    local av = self.active_view
    if #self.views > 1 then
      local _, _, _, th = self:get_tab_rect(1)
      av.position.x, av.position.y = self.position.x, self.position.y + th
      av.size.x, av.size.y = self.size.x, self.size.y - th
    else
      copy_position_and_size(av, self)
    end
  else
    local x1, y1 = self.a:get_locked_size()
    local x2, y2 = self.b:get_locked_size()
    if self.type == "hsplit" then
      calc_split_sizes(self, "x", "y", x1, x2)
    elseif self.type == "vsplit" then
      calc_split_sizes(self, "y", "x", y1, y2)
    end
    self.a:update_layout()
    self.b:update_layout()
  end
end


function Node:update()
  if self.type == "leaf" then
    for _, view in ipairs(self.views) do
      view:update()
    end
  else
    self.a:update()
    self.b:update()
  end
end


function Node:draw_tabs()
  local x, y, _, h = self:get_tab_rect(1)
  local ds = style.divider_size
  core.push_clip_rect(x, y, self.size.x, h)
  renderer.draw_rect(x, y, self.size.x, h, style.background2)
  renderer.draw_rect(x, y + h - ds, self.size.x, ds, style.divider)

  for i, view in ipairs(self.views) do
    local x, y, w, h = self:get_tab_rect(i)
    local text = view:get_name()
    local color = style.dim
    if view == self.active_view then
      color = style.text
      renderer.draw_rect(x, y, w, h, style.background)
      renderer.draw_rect(x + w, y, ds, h, style.divider)
      renderer.draw_rect(x - ds, y, ds, h, style.divider)
    end
    if i == self.hovered_tab then
      color = style.text
    end
    core.push_clip_rect(x, y, w, h)
    x, w = x + style.padding.x, w - style.padding.x * 2
    local align = style.font:get_width(text) > w and "left" or "center"
    common.draw_text(style.font, color, text, align, x, y, w, h)
    core.pop_clip_rect()
  end

  core.pop_clip_rect()
end


function Node:draw()
  if self.type == "leaf" then
    if #self.views > 1 then
      self:draw_tabs()
    end
    local pos, size = self.active_view.position, self.active_view.size
    core.push_clip_rect(pos.x, pos.y, size.x + pos.x % 1, size.y + pos.y % 1)
    self.active_view:draw()
    core.pop_clip_rect()
  else
    local x, y, w, h = self:get_divider_rect()
    renderer.draw_rect(x, y, w, h, style.divider)
    self:propagate("draw")
  end
end



local RootView = View:extend()

function RootView:new()
  RootView.super.new(self)
  self.root_node = Node()
  self.deferred_draws = {}
  self.mouse = { x = 0, y = 0 }
end


function RootView:defer_draw(fn, ...)
  table.insert(self.deferred_draws, 1, { fn = fn, ... })
end


function RootView:get_active_node()
  return self.root_node:get_node_for_view(core.active_view)
end


function RootView:open_doc(doc)
  local node = self:get_active_node()
  if node.locked and core.last_active_view then
    core.set_active_view(core.last_active_view)
    node = self:get_active_node()
  end
  assert(not node.locked, "Cannot open doc on locked node")
  for i, view in ipairs(node.views) do
    if view.doc == doc then
      node:set_active_view(node.views[i])
      return view
    end
  end
  local view = DocView(doc)
  node:add_view(view)
  self.root_node:update_layout()
  view:scroll_to_line(view.doc:get_selection(), true, true)
  return view
end


function RootView:on_mouse_pressed(button, x, y, clicks)
  local div = self.root_node:get_divider_overlapping_point(x, y)
  if div then
    self.dragged_divider = div
    return
  end
  local node = self.root_node:get_child_overlapping_point(x, y)
  local idx = node:get_tab_overlapping_point(x, y)
  if idx then
    node:set_active_view(node.views[idx])
    if button == "middle" then
      node:close_active_view(self.root_node)
    end
  else
    core.set_active_view(node.active_view)
    node.active_view:on_mouse_pressed(button, x, y, clicks)
  end
end


function RootView:on_mouse_released(...)
  if self.dragged_divider then
    self.dragged_divider = nil
  end
  self.root_node:on_mouse_released(...)
end


function RootView:on_mouse_moved(x, y, dx, dy)
  if self.dragged_divider then
    local node = self.dragged_divider
    if node.type == "hsplit" then
      node.divider = node.divider + dx / node.size.x
    else
      node.divider = node.divider + dy / node.size.y
    end
    node.divider = common.clamp(node.divider, 0.01, 0.99)
    return
  end

  self.mouse.x, self.mouse.y = x, y
  self.root_node:on_mouse_moved(x, y, dx, dy)

  local node = self.root_node:get_child_overlapping_point(x, y)
  local div = self.root_node:get_divider_overlapping_point(x, y)
  if div then
    system.set_cursor(div.type == "hsplit" and "sizeh" or "sizev")
  elseif node:get_tab_overlapping_point(x, y) then
    system.set_cursor("arrow")
  else
    system.set_cursor(node.active_view.cursor)
  end
end


function RootView:on_mouse_wheel(...)
  local x, y = self.mouse.x, self.mouse.y
  local node = self.root_node:get_child_overlapping_point(x, y)
  node.active_view:on_mouse_wheel(...)
end


function RootView:on_text_input(...)
  core.active_view:on_text_input(...)
end


function RootView:update()
  copy_position_and_size(self.root_node, self)
  self.root_node:update()
  self.root_node:update_layout()
end


function RootView:draw()
  self.root_node:draw()
  while #self.deferred_draws > 0 do
    local t = table.remove(self.deferred_draws)
    t.fn(table.unpack(t))
  end
end


return RootView


================================================
FILE: data/core/statusview.lua
================================================
local core = require "core"
local common = require "core.common"
local command = require "core.command"
local config = require "core.config"
local style = require "core.style"
local DocView = require "core.docview"
local LogView = require "core.logview"
local View = require "core.view"


local StatusView = View:extend()

StatusView.separator  = "      "
StatusView.separator2 = "   |   "


function StatusView:new()
  StatusView.super.new(self)
  self.message_timeout = 0
  self.message = {}
end


function StatusView:on_mouse_pressed()
  core.set_active_view(core.last_active_view)
  if system.get_time() < self.message_timeout
  and not core.active_view:is(LogView) then
    command.perform "core:open-log"
  end
end


function StatusView:show_message(icon, icon_color, text)
  self.message = {
    icon_color, style.icon_font, icon,
    style.dim, style.font, StatusView.separator2, style.text, text
  }
  self.message_timeout = system.get_time() + config.message_timeout
end


function StatusView:update()
  self.size.y = style.font:get_height() + style.padding.y * 2

  if system.get_time() < self.message_timeout then
    self.scroll.to.y = self.size.y
  else
    self.scroll.to.y = 0
  end

  StatusView.super.update(self)
end


local function draw_items(self, items, x, y, draw_fn)
  local font = style.font
  local color = style.text

  for _, item in ipairs(items) do
    if type(item) == "userdata" then
      font = item
    elseif type(item) == "table" then
      color = item
    else
      x = draw_fn(font, color, item, nil, x, y, 0, self.size.y)
    end
  end

  return x
end


local function text_width(font, _, text, _, x)
  return x + font:get_width(text)
end


function StatusView:draw_items(items, right_align, yoffset)
  local x, y = self:get_content_offset()
  y = y + (yoffset or 0)
  if right_align then
    local w = draw_items(self, items, 0, 0, text_width)
    x = x + self.size.x - w - style.padding.x
    draw_items(self, items, x, y, common.draw_text)
  else
    x = x + style.padding.x
    draw_items(self, items, x, y, common.draw_text)
  end
end


function StatusView:get_items()
  if getmetatable(core.active_view) == DocView then
    local dv = core.active_view
    local line, col = dv.doc:get_selection()
    local dirty = dv.doc:is_dirty()

    return {
      dirty and style.accent or style.text, style.icon_font, "f",
      style.dim, style.font, self.separator2, style.text,
      dv.doc.filename and style.text or style.dim, dv.doc:get_name(),
      style.text,
      self.separator,
      "line: ", line,
      self.separator,
      col > config.line_limit and style.accent or style.text, "col: ", col,
      style.text,
      self.separator,
      string.format("%d%%", line / #dv.doc.lines * 100),
    }, {
      style.icon_font, "g",
      style.font, style.dim, self.separator2, style.text,
      #dv.doc.lines, " lines",
      self.separator,
      dv.doc.crlf and "CRLF" or "LF"
    }
  end

  return {}, {
    style.icon_font, "g",
    style.font, style.dim, self.separator2,
    #core.docs, style.text, " / ",
    #core.project_files, " files"
  }
end


function StatusView:draw()
  self:draw_background(style.background2)

  if self.message then
    self:draw_items(self.message, false, self.size.y)
  end

  local left, right = self:get_items()
  self:draw_items(left)
  self:draw_items(right, true)
end


return StatusView


================================================
FILE: data/core/strict.lua
================================================
local strict = {}
strict.defined = {}


-- used to define a global variable
function global(t)
  for k, v in pairs(t) do
    strict.defined[k] = true
    rawset(_G, k, v)
  end
end


function strict.__newindex(t, k, v)
  error("cannot set undefined variable: " .. k, 2)
end


function strict.__index(t, k)
  if not strict.defined[k] then
    error("cannot get undefined variable: " .. k, 2)
  end
end


setmetatable(_G, strict)


================================================
FILE: data/core/style.lua
================================================
local common = require "core.common"
local style = {}

style.padding = { x = common.round(14 * SCALE), y = common.round(7 * SCALE) }
style.divider_size = common.round(1 * SCALE)
style.scrollbar_size = common.round(4 * SCALE)
style.caret_width = common.round(2 * SCALE)
style.tab_width = common.round(170 * SCALE)

style.font = renderer.font.load(EXEDIR .. "/data/fonts/font.ttf", 14 * SCALE)
style.big_font = renderer.font.load(EXEDIR .. "/data/fonts/font.ttf", 34 * SCALE)
style.icon_font = renderer.font.load(EXEDIR .. "/data/fonts/icons.ttf", 14 * SCALE)
style.code_font = renderer.font.load(EXEDIR .. "/data/fonts/monospace.ttf", 13.5 * SCALE)

style.background = { common.color "#2e2e32" }
style.background2 = { common.color "#252529" }
style.background3 = { common.color "#252529" }
style.text = { common.color "#97979c" }
style.caret = { common.color "#93DDFA" }
style.accent = { common.color "#e1e1e6" }
style.dim = { common.color "#525257" }
style.divider = { common.color "#202024" }
style.selection = { common.color "#48484f" }
style.line_number = { common.color "#525259" }
style.line_number2 = { common.color "#83838f" }
style.line_highlight = { common.color "#343438" }
style.scrollbar = { common.color "#414146" }
style.scrollbar2 = { common.color "#4b4b52" }

style.syntax = {}
style.syntax["normal"] = { common.color "#e1e1e6" }
style.syntax["symbol"] = { common.color "#e1e1e6" }
style.syntax["comment"] = { common.color "#676b6f" }
style.syntax["keyword"] = { common.color "#E58AC9" }
style.syntax["keyword2"] = { common.color "#F77483" }
style.syntax["number"] = { common.color "#FFA94D" }
style.syntax["literal"] = { common.color "#FFA94D" }
style.syntax["string"] = { common.color "#f7c95c" }
style.syntax["operator"] = { common.color "#93DDFA" }
style.syntax["function"] = { common.color "#93DDFA" }

return style


================================================
FILE: data/core/syntax.lua
================================================
local common = require "core.common"

local syntax = {}
syntax.items = {}

local plain_text_syntax = { patterns = {}, symbols = {} }


function syntax.add(t)
  table.insert(syntax.items, t)
end


local function find(string, field)
  for i = #syntax.items, 1, -1 do
    local t = syntax.items[i]
    if common.match_pattern(string, t[field] or {}) then
      return t
    end
  end
end

function syntax.get(filename, header)
  return find(filename, "files")
      or find(header, "headers")
      or plain_text_syntax
end


return syntax


================================================
FILE: data/core/tokenizer.lua
================================================
local tokenizer = {}


local function push_token(t, type, text)
  local prev_type = t[#t-1]
  local prev_text = t[#t]
  if prev_type and (prev_type == type or prev_text:find("^%s*$")) then
    t[#t-1] = type
    t[#t] = prev_text .. text
  else
    table.insert(t, type)
    table.insert(t, text)
  end
end


local function is_escaped(text, idx, esc)
  local byte = esc:byte()
  local count = 0
  for i = idx - 1, 1, -1 do
    if text:byte(i) ~= byte then break end
    count = count + 1
  end
  return count % 2 == 1
end


local function find_non_escaped(text, pattern, offset, esc)
  while true do
    local s, e = text:find(pattern, offset)
    if not s then break end
    if esc and is_escaped(text, s, esc) then
      offset = e + 1
    else
      return s, e
    end
  end
end


function tokenizer.tokenize(syntax, text, state)
  local res = {}
  local i = 1

  if #syntax.patterns == 0 then
    return { "normal", text }
  end

  while i <= #text do
    -- continue trying to match the end pattern of a pair if we have a state set
    if state then
      local p = syntax.patterns[state]
      local s, e = find_non_escaped(text, p.pattern[2], i, p.pattern[3])

      if s then
        push_token(res, p.type, text:sub(i, e))
        state = nil
        i = e + 1
      else
        push_token(res, p.type, text:sub(i))
        break
      end
    end

    -- find matching pattern
    local matched = false
    for n, p in ipairs(syntax.patterns) do
      local pattern = (type(p.pattern) == "table") and p.pattern[1] or p.pattern
      local s, e = text:find("^" .. pattern, i)

      if s then
        -- matched pattern; make and add token
        local t = text:sub(s, e)
        push_token(res, syntax.symbols[t] or p.type, t)

        -- update state if this was a start|end pattern pair
        if type(p.pattern) == "table" then
          state = n
        end

        -- move cursor past this token
        i = e + 1
        matched = true
        break
      end
    end

    -- consume character if we didn't match
    if not matched then
      push_token(res, "normal", text:sub(i, i))
      i = i + 1
    end
  end

  return res, state
end


local function iter(t, i)
  i = i + 2
  local type, text = t[i], t[i+1]
  if type then
    return i, type, text
  end
end

function tokenizer.each_token(t)
  return iter, t, -1
end


return tokenizer


================================================
FILE: data/core/view.lua
================================================
local core = require "core"
local config = require "core.config"
local style = require "core.style"
local common = require "core.common"
local Object = require "core.object"


local View = Object:extend()


function View:new()
  self.position = { x = 0, y = 0 }
  self.size = { x = 0, y = 0 }
  self.scroll = { x = 0, y = 0, to = { x = 0, y = 0 } }
  self.cursor = "arrow"
  self.scrollable = false
end


function View:move_towards(t, k, dest, rate)
  if type(t) ~= "table" then
    return self:move_towards(self, t, k, dest, rate)
  end
  local val = t[k]
  if math.abs(val - dest) < 0.5 then
    t[k] = dest
  else
    t[k] = common.lerp(val, dest, rate or 0.5)
  end
  if val ~= dest then
    core.redraw = true
  end
end


function View:try_close(do_close)
  do_close()
end


function View:get_name()
  return "---"
end


function View:get_scrollable_size()
  return math.huge
end


function View:get_scrollbar_rect()
  local sz = self:get_scrollable_size()
  if sz <= self.size.y or sz == math.huge then
    return 0, 0, 0, 0
  end
  local h = math.max(20, self.size.y * self.size.y / sz)
  return
    self.position.x + self.size.x - style.scrollbar_size,
    self.position.y + self.scroll.y * (self.size.y - h) / (sz - self.size.y),
    style.scrollbar_size,
    h
end


function View:scrollbar_overlaps_point(x, y)
  local sx, sy, sw, sh = self:get_scrollbar_rect()
  return x >= sx - sw * 3 and x < sx + sw and y >= sy and y < sy + sh
end


function View:on_mouse_pressed(button, x, y, clicks)
  if self:scrollbar_overlaps_point(x, y) then
    self.dragging_scrollbar = true
    return true
  end
end


function View:on_mouse_released(button, x, y)
  self.dragging_scrollbar = false
end


function View:on_mouse_moved(x, y, dx, dy)
  if self.dragging_scrollbar then
    local delta = self:get_scrollable_size() / self.size.y * dy
    self.scroll.to.y = self.scroll.to.y + delta
  end
  self.hovered_scrollbar = self:scrollbar_overlaps_point(x, y)
end


function View:on_text_input(text)
  -- no-op
end


function View:on_mouse_wheel(y)
  if self.scrollable then
    self.scroll.to.y = self.scroll.to.y + y * -config.mouse_wheel_scroll
  end
end


function View:get_content_bounds()
  local x = self.scroll.x
  local y = self.scroll.y
  return x, y, x + self.size.x, y + self.size.y
end


function View:get_content_offset()
  local x = common.round(self.position.x - self.scroll.x)
  local y = common.round(self.position.y - self.scroll.y)
  return x, y
end


function View:clamp_scroll_position()
  local max = self:get_scrollable_size() - self.size.y
  self.scroll.to.y = common.clamp(self.scroll.to.y, 0, max)
end


function View:update()
  self:clamp_scroll_position()
  self:move_towards(self.scroll, "x", self.scroll.to.x, 0.3)
  self:move_towards(self.scroll, "y", self.scroll.to.y, 0.3)
end


function View:draw_background(color)
  local x, y = self.position.x, self.position.y
  local w, h = self.size.x, self.size.y
  renderer.draw_rect(x, y, w + x % 1, h + y % 1, color)
end


function View:draw_scrollbar()
  local x, y, w, h = self:get_scrollbar_rect()
  local highlight = self.hovered_scrollbar or self.dragging_scrollbar
  local color = highlight and style.scrollbar2 or style.scrollbar
  renderer.draw_rect(x, y, w, h, color)
end


function View:draw()
end


return View


================================================
FILE: data/plugins/autocomplete.lua
================================================
local core = require "core"
local common = require "core.common"
local config = require "core.config"
local command = require "core.command"
local style = require "core.style"
local keymap = require "core.keymap"
local translate = require "core.doc.translate"
local RootView = require "core.rootview"
local DocView = require "core.docview"

config.autocomplete_max_suggestions = 6

local autocomplete = {}
autocomplete.map = {}


local mt = { __tostring = function(t) return t.text end }

function autocomplete.add(t)
  local items = {}
  for text, info in pairs(t.items) do
    info = (type(info) == "string") and info
    table.insert(items, setmetatable({ text = text, info = info }, mt))
  end
  autocomplete.map[t.name] =  { files = t.files or ".*", items = items }
end


core.add_thread(function()
  local cache = setmetatable({}, { __mode = "k" })

  local function get_symbols(doc)
    local i = 1
    local s = {}
    while i < #doc.lines do
      for sym in doc.lines[i]:gmatch(config.symbol_pattern) do
        s[sym] = true
      end
      i = i + 1
      if i % 100 == 0 then coroutine.yield() end
    end
    return s
  end

  local function cache_is_valid(doc)
    local c = cache[doc]
    return c and c.last_change_id == doc:get_change_id()
  end

  while true do
    local symbols = {}

    -- lift all symbols from all docs
    for _, doc in ipairs(core.docs) do
      -- update the cache if the doc has changed since the last iteration
      if not cache_is_valid(doc) then
        cache[doc] = {
          last_change_id = doc:get_change_id(),
          symbols = get_symbols(doc)
        }
      end
      -- update symbol set with doc's symbol set
      for sym in pairs(cache[doc].symbols) do
        symbols[sym] = true
      end
      coroutine.yield()
    end

    -- update symbols list
    autocomplete.add { name = "open-docs", items = symbols }

    -- wait for next scan
    local valid = true
    while valid do
      coroutine.yield(1)
      for _, doc in ipairs(core.docs) do
        if not cache_is_valid(doc) then
          valid = false
        end
      end
    end

  end
end)


local partial = ""
local suggestions_idx = 1
local suggestions = {}
local last_line, last_col


local function reset_suggestions()
  suggestions_idx = 1
  suggestions = {}
end


local function update_suggestions()
  local doc = core.active_view.doc
  local filename = doc and doc.filename or ""

  -- get all relevant suggestions for given filename
  local items = {}
  for _, v in pairs(autocomplete.map) do
    if common.match_pattern(filename, v.files) then
      for _, item in pairs(v.items) do
        table.insert(items, item)
      end
    end
  end

  -- fuzzy match, remove duplicates and store
  items = common.fuzzy_match(items, partial)
  local j = 1
  for i = 1, config.autocomplete_max_suggestions do
    suggestions[i] = items[j]
    while items[j] and items[i].text == items[j].text do
      items[i].info = items[i].info or items[j].info
      j = j + 1
    end
  end
end


local function get_partial_symbol()
  local doc = core.active_view.doc
  local line2, col2 = doc:get_selection()
  local line1, col1 = doc:position_offset(line2, col2, translate.start_of_word)
  return doc:get_text(line1, col1, line2, col2)
end


local function get_active_view()
  if getmetatable(core.active_view) == DocView then
    return core.active_view
  end
end


local function get_suggestions_rect(av)
  if #suggestions == 0 then
    return 0, 0, 0, 0
  end

  local line, col = av.doc:get_selection()
  local x, y = av:get_line_screen_position(line)
  x = x + av:get_col_x_offset(line, col - #partial)
  y = y + av:get_line_height() + style.padding.y
  local font = av:get_font()
  local th = font:get_height()

  local max_width = 0
  for _, s in ipairs(suggestions) do
    local w = font:get_width(s.text)
    if s.info then
      w = w + style.font:get_width(s.info) + style.padding.x
    end
    max_width = math.max(max_width, w)
  end

  return
    x - style.padding.x,
    y - style.padding.y,
    max_width + style.padding.x * 2,
    #suggestions * (th + style.padding.y) + style.padding.y
end


local function draw_suggestions_box(av)
  -- draw background rect
  local rx, ry, rw, rh = get_suggestions_rect(av)
  renderer.draw_rect(rx, ry, rw, rh, style.background3)

  -- draw text
  local font = av:get_font()
  local lh = font:get_height() + style.padding.y
  local y = ry + style.padding.y / 2
  for i, s in ipairs(suggestions) do
    local color = (i == suggestions_idx) and style.accent or style.text
    common.draw_text(font, color, s.text, "left", rx + style.padding.x, y, rw, lh)
    if s.info then
      color = (i == suggestions_idx) and style.text or style.dim
      common.draw_text(style.font, color, s.info, "right", rx, y, rw - style.padding.x, lh)
    end
    y = y + lh
  end
end


-- patch event logic into RootView
local on_text_input = RootView.on_text_input
local update = RootView.update
local draw = RootView.draw


RootView.on_text_input = function(...)
  on_text_input(...)

  local av = get_active_view()
  if av then
    -- update partial symbol and suggestions
    partial = get_partial_symbol()
    if #partial >= 3 then
      update_suggestions()
      last_line, last_col = av.doc:get_selection()
    else
      reset_suggestions()
    end

    -- scroll if rect is out of bounds of view
    local _, y, _, h = get_suggestions_rect(av)
    local limit = av.position.y + av.size.y
    if y + h > limit then
      av.scroll.to.y = av.scroll.y + y + h - limit
    end
  end
end


RootView.update = function(...)
  update(...)

  local av = get_active_view()
  if av then
    -- reset suggestions if caret was moved
    local line, col = av.doc:get_selection()
    if line ~= last_line or col ~= last_col then
      reset_suggestions()
    end
  end
end


RootView.draw = function(...)
  draw(...)

  local av = get_active_view()
  if av then
    -- draw suggestions box after everything else
    core.root_view:defer_draw(draw_suggestions_box, av)
  end
end


local function predicate()
  return get_active_view() and #suggestions > 0
end


command.add(predicate, {
  ["autocomplete:complete"] = function()
    local doc = core.active_view.doc
    local line, col = doc:get_selection()
    local text = suggestions[suggestions_idx].text
    doc:insert(line, col, text)
    doc:remove(line, col, line, col - #partial)
    doc:set_selection(line, col + #text - #partial)
    reset_suggestions()
  end,

  ["autocomplete:previous"] = function()
    suggestions_idx = math.max(suggestions_idx - 1, 1)
  end,

  ["autocomplete:next"] = function()
    suggestions_idx = math.min(suggestions_idx + 1, #suggestions)
  end,

  ["autocomplete:cancel"] = function()
    reset_suggestions()
  end,
})


keymap.add {
  ["tab"]    = "autocomplete:complete",
  ["up"]     = "autocomplete:previous",
  ["down"]   = "autocomplete:next",
  ["escape"] = "autocomplete:cancel",
}


return autocomplete


================================================
FILE: data/plugins/autoreload.lua
================================================
local core = require "core"
local config = require "core.config"
local Doc = require "core.doc"


local times = setmetatable({}, { __mode = "k" })

local function update_time(doc)
  local info = system.get_file_info(doc.filename)
  times[doc] = info.modified
end


local function reload_doc(doc)
  local fp = io.open(doc.filename, "r")
  local text = fp:read("*a")
  fp:close()

  local sel = { doc:get_selection() }
  doc:remove(1, 1, math.huge, math.huge)
  doc:insert(1, 1, text:gsub("\r", ""):gsub("\n$", ""))
  doc:set_selection(table.unpack(sel))

  update_time(doc)
  doc:clean()
  core.log_quiet("Auto-reloaded doc \"%s\"", doc.filename)
end


core.add_thread(function()
  while true do
    -- check all doc modified times
    for _, doc in ipairs(core.docs) do
      local info = system.get_file_info(doc.filename or "")
      if info and times[doc] ~= info.modified then
        reload_doc(doc)
      end
      coroutine.yield()
    end

    -- wait for next scan
    coroutine.yield(config.project_scan_rate)
  end
end)


-- patch `Doc.save|load` to store modified time
local load = Doc.load
local save = Doc.save

Doc.load = function(self, ...)
  local res = load(self, ...)
  update_time(self)
  return res
end

Doc.save = function(self, ...)
  local res = save(self, ...)
  update_time(self)
  return res
end


================================================
FILE: data/plugins/language_c.lua
================================================
local syntax = require "core.syntax"

syntax.add {
  files = { "%.c$", "%.h$", "%.inl$", "%.cpp$", "%.hpp$" },
  comment = "//",
  patterns = {
    { pattern = "//.-\n",               type = "comment"  },
    { pattern = { "/%*", "%*/" },       type = "comment"  },
    { pattern = { "#", "[^\\]\n" },     type = "comment"  },
    { pattern = { '"', '"', '\\' },     type = "string"   },
    { pattern = { "'", "'", '\\' },     type = "string"   },
    { pattern = "-?0x%x+",              type = "number"   },
    { pattern = "-?%d+[%d%.eE]*f?",     type = "number"   },
    { pattern = "-?%.?%d+f?",           type = "number"   },
    { pattern = "[%+%-=/%*%^%%<>!~|&]", type = "operator" },
    { pattern = "[%a_][%w_]*%f[(]",     type = "function" },
    { pattern = "[%a_][%w_]*",          type = "symbol"   },
  },
  symbols = {
    ["if"]       = "keyword",
    ["then"]     = "keyword",
    ["else"]     = "keyword",
    ["elseif"]   = "keyword",
    ["do"]       = "keyword",
    ["while"]    = "keyword",
    ["for"]      = "keyword",
    ["break"]    = "keyword",
    ["continue"] = "keyword",
    ["return"]   = "keyword",
    ["goto"]     = "keyword",
    ["struct"]   = "keyword",
    ["union"]    = "keyword",
    ["typedef"]  = "keyword",
    ["enum"]     = "keyword",
    ["extern"]   = "keyword",
    ["static"]   = "keyword",
    ["volatile"] = "keyword",
    ["const"]    = "keyword",
    ["inline"]   = "keyword",
    ["switch"]   = "keyword",
    ["case"]     = "keyword",
    ["default"]  = "keyword",
    ["auto"]     = "keyword",
    ["const"]    = "keyword",
    ["void"]     = "keyword",
    ["int"]      = "keyword2",
    ["short"]    = "keyword2",
    ["long"]     = "keyword2",
    ["float"]    = "keyword2",
    ["double"]   = "keyword2",
    ["char"]     = "keyword2",
    ["unsigned"] = "keyword2",
    ["bool"]     = "keyword2",
    ["true"]     = "literal",
    ["false"]    = "literal",
    ["NULL"]     = "literal",
  },
}



================================================
FILE: data/plugins/language_css.lua
================================================
local syntax = require "core.syntax"

syntax.add {
  files = { "%.css$" },
  patterns = {
    { pattern = "\\.",                type = "normal"   },
    { pattern = "//.-\n",             type = "comment"  },
    { pattern = { "/%*", "%*/" },     type = "comment"  },
    { pattern = { '"', '"', '\\' },   type = "string"   },
    { pattern = { "'", "'", '\\' },   type = "string"   },
    { pattern = "[%a][%w-]*%s*%f[:]", type = "keyword"  },
    { pattern = "#%x+",               type = "string"   },
    { pattern = "-?%d+[%d%.]*p[xt]",  type = "number"   },
    { pattern = "-?%d+[%d%.]*deg",    type = "number"   },
    { pattern = "-?%d+[%d%.]*",       type = "number"   },
    { pattern = "[%a_][%w_]*",        type = "symbol"   },
    { pattern = "#[%a][%w_-]*",       type = "keyword2" },
    { pattern = "@[%a][%w_-]*",       type = "keyword2" },
    { pattern = "%.[%a][%w_-]*",      type = "keyword2" },
    { pattern = "[{}:]",              type = "operator" },
  },
  symbols = {},
}


================================================
FILE: data/plugins/language_js.lua
================================================
local syntax = require "core.syntax"

syntax.add {
  files = { "%.js$", "%.json$", "%.cson$" },
  comment = "//",
  patterns = {
    { pattern = "//.-\n",               type = "comment"  },
    { pattern = { "/%*", "%*/" },       type = "comment"  },
    { pattern = { '"', '"', '\\' },     type = "string"   },
    { pattern = { "'", "'", '\\' },     type = "string"   },
    { pattern = { "`", "`", '\\' },     type = "string"   },
    { pattern = "0x[%da-fA-F]+",        type = "number"   },
    { pattern = "-?%d+[%d%.eE]*",       type = "number"   },
    { pattern = "-?%.?%d+",             type = "number"   },
    { pattern = "[%+%-=/%*%^%%<>!~|&]", type = "operator" },
    { pattern = "[%a_][%w_]*%f[(]",     type = "function" },
    { pattern = "[%a_][%w_]*",          type = "symbol"   },
  },
  symbols = {
    ["async"]      = "keyword",
    ["await"]      = "keyword",
    ["break"]      = "keyword",
    ["case"]       = "keyword",
    ["catch"]      = "keyword",
    ["class"]      = "keyword",
    ["const"]      = "keyword",
    ["continue"]   = "keyword",
    ["debugger"]   = "keyword",
    ["default"]    = "keyword",
    ["delete"]     = "keyword",
    ["do"]         = "keyword",
    ["else"]       = "keyword",
    ["export"]     = "keyword",
    ["extends"]    = "keyword",
    ["finally"]    = "keyword",
    ["for"]        = "keyword",
    ["function"]   = "keyword",
    ["get"]        = "keyword",
    ["if"]         = "keyword",
    ["import"]     = "keyword",
    ["in"]         = "keyword",
    ["instanceof"] = "keyword",
    ["let"]        = "keyword",
    ["new"]        = "keyword",
    ["return"]     = "keyword",
    ["set"]        = "keyword",
    ["static"]     = "keyword",
    ["super"]      = "keyword",
    ["switch"]     = "keyword",
    ["throw"]      = "keyword",
    ["try"]        = "keyword",
    ["typeof"]     = "keyword",
    ["var"]        = "keyword",
    ["void"]       = "keyword",
    ["while"]      = "keyword",
    ["with"]       = "keyword",
    ["yield"]      = "keyword",
    ["true"]       = "literal",
    ["false"]      = "literal",
    ["null"]       = "literal",
    ["undefined"]  = "literal",
    ["arguments"]  = "keyword2",
    ["Infinity"]   = "keyword2",
    ["NaN"]        = "keyword2",
    ["this"]       = "keyword2",
  },
}


================================================
FILE: data/plugins/language_lua.lua
================================================
local syntax = require "core.syntax"

syntax.add {
  files = "%.lua$",
  headers = "^#!.*[ /]lua",
  comment = "--",
  patterns = {
    { pattern = { '"', '"', '\\' },       type = "string"   },
    { pattern = { "'", "'", '\\' },       type = "string"   },
    { pattern = { "%[%[", "%]%]" },       type = "string"   },
    { pattern = { "%-%-%[%[", "%]%]"},    type = "comment"  },
    { pattern = "%-%-.-\n",               type = "comment"  },
    { pattern = "-?0x%x+",                type = "number"   },
    { pattern = "-?%d+[%d%.eE]*",         type = "number"   },
    { pattern = "-?%.?%d+",               type = "number"   },
    { pattern = "<%a+>",                  type = "keyword2" },
    { pattern = "%.%.%.?",                type = "operator" },
    { pattern = "[<>~=]=",                type = "operator" },
    { pattern = "[%+%-=/%*%^%%#<>]",      type = "operator" },
    { pattern = "[%a_][%w_]*%s*%f[(\"{]", type = "function" },
    { pattern = "[%a_][%w_]*",            type = "symbol"   },
    { pattern = "::[%a_][%w_]*::",        type = "function" },
  },
  symbols = {
    ["if"]       = "keyword",
    ["then"]     = "keyword",
    ["else"]     = "keyword",
    ["elseif"]   = "keyword",
    ["end"]      = "keyword",
    ["do"]       = "keyword",
    ["function"] = "keyword",
    ["repeat"]   = "keyword",
    ["until"]    = "keyword",
    ["while"]    = "keyword",
    ["for"]      = "keyword",
    ["break"]    = "keyword",
    ["return"]   = "keyword",
    ["local"]    = "keyword",
    ["in"]       = "keyword",
    ["not"]      = "keyword",
    ["and"]      = "keyword",
    ["or"]       = "keyword",
    ["goto"]     = "keyword",
    ["self"]     = "keyword2",
    ["true"]     = "literal",
    ["false"]    = "literal",
    ["nil"]      = "literal",
  },
}



================================================
FILE: data/plugins/language_md.lua
================================================
local syntax = require "core.syntax"

syntax.add {
  files = { "%.md$", "%.markdown$" },
  patterns = {
    { pattern = "\\.",                    type = "normal"   },
    { pattern = { "<!%-%-", "%-%->" },    type = "comment"  },
    { pattern = { "```", "```" },         type = "string"   },
    { pattern = { "``", "``", "\\" },     type = "string"   },
    { pattern = { "`", "`", "\\" },       type = "string"   },
    { pattern = { "~~", "~~", "\\" },     type = "keyword2" },
    { pattern = "%-%-%-+",                type = "comment" },
    { pattern = "%*%s+",                  type = "operator" },
    { pattern = { "%*", "[%*\n]", "\\" }, type = "operator" },
    { pattern = { "%_", "[%_\n]", "\\" }, type = "keyword2" },
    { pattern = "#.-\n",                  type = "keyword"  },
    { pattern = "!?%[.-%]%(.-%)",         type = "function" },
    { pattern = "https?://%S+",           type = "function" },
  },
  symbols = { },
}


================================================
FILE: data/plugins/language_python.lua
================================================
local syntax = require "core.syntax"

syntax.add {
  files = { "%.py$", "%.pyw$" },
  headers = "^#!.*[ /]python",
  comment = "#",
  patterns = {
    { pattern = { "#", "\n" },            type = "comment"  },
    { pattern = { '[ruU]?"', '"', '\\' }, type = "string"   },
    { pattern = { "[ruU]?'", "'", '\\' }, type = "string"   },
    { pattern = { '"""', '"""' },         type = "string"   },
    { pattern = "0x[%da-fA-F]+",          type = "number"   },
    { pattern = "-?%d+[%d%.eE]*",         type = "number"   },
    { pattern = "-?%.?%d+",               type = "number"   },
    { pattern = "[%+%-=/%*%^%%<>!~|&]",   type = "operator" },
    { pattern = "[%a_][%w_]*%f[(]",       type = "function" },
    { pattern = "[%a_][%w_]*",            type = "symbol"   },
  },
  symbols = {
    ["class"]    = "keyword",
    ["finally"]  = "keyword",
    ["is"]       = "keyword",
    ["return"]   = "keyword",
    ["continue"] = "keyword",
    ["for"]      = "keyword",
    ["lambda"]   = "keyword",
    ["try"]      = "keyword",
    ["def"]      = "keyword",
    ["from"]     = "keyword",
    ["nonlocal"] = "keyword",
    ["while"]    = "keyword",
    ["and"]      = "keyword",
    ["global"]   = "keyword",
    ["not"]      = "keyword",
    ["with"]     = "keyword",
    ["as"]       = "keyword",
    ["elif"]     = "keyword",
    ["if"]       = "keyword",
    ["or"]       = "keyword",
    ["else"]     = "keyword",
    ["import"]   = "keyword",
    ["pass"]     = "keyword",
    ["break"]    = "keyword",
    ["except"]   = "keyword",
    ["in"]       = "keyword",
    ["del"]      = "keyword",
    ["raise"]    = "keyword",
    ["yield"]    = "keyword",
    ["assert"]   = "keyword",
    ["self"]     = "keyword2",
    ["None"]     = "literal",
    ["True"]     = "literal",
    ["False"]    = "literal",
  }
}


================================================
FILE: data/plugins/language_xml.lua
================================================
local syntax = require "core.syntax"

syntax.add {
  files = { "%.xml$", "%.html?$" },
  headers = "<%?xml",
  patterns = {
    { pattern = { "<!%-%-", "%-%->" },     type = "comment"  },
    { pattern = { '%f[^>][^<]', '%f[<]' }, type = "normal"   },
    { pattern = { '"', '"', '\\' },        type = "string"   },
    { pattern = { "'", "'", '\\' },        type = "string"   },
    { pattern = "0x[%da-fA-F]+",           type = "number"   },
    { pattern = "-?%d+[%d%.]*f?",          type = "number"   },
    { pattern = "-?%.?%d+f?",              type = "number"   },
    { pattern = "%f[^<]![%a_][%w_]*",      type = "keyword2" },
    { pattern = "%f[^<][%a_][%w_]*",       type = "function" },
    { pattern = "%f[^<]/[%a_][%w_]*",      type = "function" },
    { pattern = "[%a_][%w_]*",             type = "keyword"  },
    { pattern = "[/<>=]",                  type = "operator" },
  },
  symbols = {},
}


================================================
FILE: data/plugins/macro.lua
================================================
local core = require "core"
local command = require "core.command"
local keymap = require "core.keymap"

local handled_events = {
  ["keypressed"]  = true,
  ["keyreleased"] = true,
  ["textinput"]   = true,
}

local state = "stopped"
local event_buffer = {}
local modkeys = {}

local on_event = core.on_event

core.on_event = function(type, ...)
  local res = on_event(type, ...)
  if state == "recording" and handled_events[type] then
    table.insert(event_buffer, { type, ... })
  end
  return res
end


local function clone(t)
  local res = {}
  for k, v in pairs(t) do res[k] = v end
  return res
end


local function predicate()
  return state ~= "playing"
end


command.add(predicate, {
  ["macro:toggle-record"] = function()
    if state == "stopped" then
      state = "recording"
      event_buffer = {}
      modkeys = clone(keymap.modkeys)
      core.log("Recording macro...")
    else
      state = "stopped"
      core.log("Stopped recording macro (%d events)", #event_buffer)
    end
  end,

  ["macro:play"] = function()
    state = "playing"
    core.log("Playing macro... (%d events)", #event_buffer)
    local mk = keymap.modkeys
    keymap.modkeys = clone(modkeys)
    for _, ev in ipairs(event_buffer) do
      on_event(table.unpack(ev))
      core.root_view:update()
    end
    keymap.modkeys = mk
    state = "stopped"
  end,
})


keymap.add {
  ["ctrl+shift+;"] = "macro:toggle-record",
  ["ctrl+;"] = "macro:play",
}


================================================
FILE: data/plugins/projectsearch.lua
================================================
local core = require "core"
local common = require "core.common"
local keymap = require "core.keymap"
local command = require "core.command"
local style = require "core.style"
local View = require "core.view"


local ResultsView = View:extend()


function ResultsView:new(text, fn)
  ResultsView.super.new(self)
  self.scrollable = true
  self.brightness = 0
  self:begin_search(text, fn)
end


function ResultsView:get_name()
  return "Search Results"
end


local function find_all_matches_in_file(t, filename, fn)
  local fp = io.open(filename)
  if not fp then return t end
  local n = 1
  for line in fp:lines() do
    local s = fn(line)
    if s then
      table.insert(t, { file = filename, text = line, line = n, col = s })
      core.redraw = true
    end
    if n % 100 == 0 then coroutine.yield() end
    n = n + 1
    core.redraw = true
  end
  fp:close()
end


function ResultsView:begin_search(text, fn)
  self.search_args = { text, fn }
  self.results = {}
  self.last_file_idx = 1
  self.query = text
  self.searching = true
  self.selected_idx = 0

  core.add_thread(function()
    for i, file in ipairs(core.project_files) do
      if file.type == "file" then
        find_all_matches_in_file(self.results, file.filename, fn)
      end
      self.last_file_idx = i
    end
    self.searching = false
    self.brightness = 100
    core.redraw = true
  end, self.results)

  self.scroll.to.y = 0
end


function ResultsView:refresh()
  self:begin_search(table.unpack(self.search_args))
end


function ResultsView:on_mouse_moved(mx, my, ...)
  ResultsView.super.on_mouse_moved(self, mx, my, ...)
  self.selected_idx = 0
  for i, item, x,y,w,h in self:each_visible_result() do
    if mx >= x and my >= y and mx < x + w and my < y + h then
      self.selected_idx = i
      break
    end
  end
end


function ResultsView:on_mouse_pressed(...)
  local caught = ResultsView.super.on_mouse_pressed(self, ...)
  if not caught then
    self:open_selected_result()
  end
end


function ResultsView:open_selected_result()
  local res = self.results[self.selected_idx]
  if not res then
    return
  end
  core.try(function()
    local dv = core.root_view:open_doc(core.open_doc(res.file))
    core.root_view.root_node:update_layout()
    dv.doc:set_selection(res.line, res.col)
    dv:scroll_to_line(res.line, false, true)
  end)
end


function ResultsView:update()
  self:move_towards("brightness", 0, 0.1)
  ResultsView.super.update(self)
end


function ResultsView:get_results_yoffset()
  return style.font:get_height() + style.padding.y * 3
end


function ResultsView:get_line_height()
  return style.padding.y + style.font:get_height()
end


function ResultsView:get_scrollable_size()
  return self:get_results_yoffset() + #self.results * self:get_line_height()
end


function ResultsView:get_visible_results_range()
  local lh = self:get_line_height()
  local oy = self:get_results_yoffset()
  local min = math.max(1, math.floor((self.scroll.y - oy) / lh))
  return min, min + math.floor(self.size.y / lh) + 1
end


function ResultsView:each_visible_result()
  return coroutine.wrap(function()
    local lh = self:get_line_height()
    local x, y = self:get_content_offset()
    local min, max = self:get_visible_results_range()
    y = y + self:get_results_yoffset() + lh * (min - 1)
    for i = min, max do
      local item = self.results[i]
      if not item then break end
      coroutine.yield(i, item, x, y, self.size.x, lh)
      y = y + lh
    end
  end)
end


function ResultsView:scroll_to_make_selected_visible()
  local h = self:get_line_height()
  local y = self:get_results_yoffset() + h * (self.selected_idx - 1)
  self.scroll.to.y = math.min(self.scroll.to.y, y)
  self.scroll.to.y = math.max(self.scroll.to.y, y + h - self.size.y)
end


function ResultsView:draw()
  self:draw_background(style.background)

  -- status
  local ox, oy = self:get_content_offset()
  local x, y = ox + style.padding.x, oy + style.padding.y
  local per = self.last_file_idx / #core.project_files
  local text
  if self.searching then
    text = string.format("Searching %d%% (%d of %d files, %d matches) for %q...",
      per * 100, self.last_file_idx, #core.project_files,
      #self.results, self.query)
  else
    text = string.format("Found %d matches for %q",
      #self.results, self.query)
  end
  local color = common.lerp(style.text, style.accent, self.brightness / 100)
  renderer.draw_text(style.font, text, x, y, color)

  -- horizontal line
  local yoffset = self:get_results_yoffset()
  local x = ox + style.padding.x
  local w = self.size.x - style.padding.x * 2
  local h = style.divider_size
  local color = common.lerp(style.dim, style.text, self.brightness / 100)
  renderer.draw_rect(x, oy + yoffset - style.padding.y, w, h, color)
  if self.searching then
    renderer.draw_rect(x, oy + yoffset - style.padding.y, w * per, h, style.text)
  end

  -- results
  local y1, y2 = self.position.y, self.position.y + self.size.y
  for i, item, x,y,w,h in self:each_visible_result() do
    local color = style.text
    if i == self.selected_idx then
      color = style.accent
      renderer.draw_rect(x, y, w, h, style.line_highlight)
    end
    x = x + style.padding.x
    local text = string.format("%s at line %d (col %d): ", item.file, item.line, item.col)
    x = common.draw_text(style.font, style.dim, text, "left", x, y, w, h)
    x = common.draw_text(style.code_font, color, item.text, "left", x, y, w, h)
  end

  self:draw_scrollbar()
end


local function begin_search(text, fn)
  if text == "" then
    core.error("Expected non-empty string")
    return
  end
  local rv = ResultsView(text, fn)
  core.root_view:get_active_node():add_view(rv)
end


command.add(nil, {
  ["project-search:find"] = function()
    core.command_view:enter("Find Text In Project", function(text)
      text = text:lower()
      begin_search(text, function(line_text)
        return line_text:lower():find(text, nil, true)
      end)
    end)
  end,

  ["project-search:find-pattern"] = function()
    core.command_view:enter("Find Pattern In Project", function(text)
      begin_search(text, function(line_text) return line_text:find(text) end)
    end)
  end,

  ["project-search:fuzzy-find"] = function()
    core.command_view:enter("Fuzzy Find Text In Project", function(text)
      begin_search(text, function(line_text)
        return common.fuzzy_match(line_text, text) and 1
      end)
    end)
  end,
})


command.add(ResultsView, {
  ["project-search:select-previous"] = function()
    local view = core.active_view
    view.selected_idx = math.max(view.selected_idx - 1, 1)
    view:scroll_to_make_selected_visible()
  end,

  ["project-search:select-next"] = function()
    local view = core.active_view
    view.selected_idx = math.min(view.selected_idx + 1, #view.results)
    view:scroll_to_make_selected_visible()
  end,

  ["project-search:open-selected"] = function()
    core.active_view:open_selected_result()
  end,

  ["project-search:refresh"] = function()
    core.active_view:refresh()
  end,
})

keymap.add {
  ["f5"]           = "project-search:refresh",
  ["ctrl+shift+f"] = "project-search:find",
  ["up"]           = "project-search:select-previous",
  ["down"]         = "project-search:select-next",
  ["return"]       = "project-search:open-selected",
}


================================================
FILE: data/plugins/quote.lua
================================================
local core = require "core"
local command = require "core.command"
local keymap = require "core.keymap"


local escapes = {
  ["\\"] = "\\\\",
  ["\""] = "\\\"",
  ["\n"] = "\\n",
  ["\r"] = "\\r",
  ["\t"] = "\\t",
  ["\b"] = "\\b",
}

local function replace(chr)
  return escapes[chr] or string.format("\\x%02x", chr:byte())
end


command.add("core.docview", {
  ["quote:quote"] = function()
    core.active_view.doc:replace(function(text)
      return '"' .. text:gsub("[\0-\31\\\"]", replace) .. '"'
    end)
  end,
})

keymap.add {
  ["ctrl+'"] = "quote:quote",
}


================================================
FILE: data/plugins/reflow.lua
================================================
local core = require "core"
local config = require "core.config"
local command = require "core.command"
local keymap = require "core.keymap"


local function wordwrap_text(text, limit)
  local t = {}
  local n = 0

  for word in text:gmatch("%S+") do
    if n + #word > limit then
      table.insert(t, "\n")
      n = 0
    elseif #t > 0 then
      table.insert(t, " ")
    end
    table.insert(t, word)
    n = n + #word + 1
  end

  return table.concat(t)
end


command.add("core.docview", {
  ["reflow:reflow"] = function()
    local doc = core.active_view.doc
    doc:replace(function(text)
      local prefix_set = "[^%w\n%[%](){}`'\"]*"

      -- get line prefix and trailing whitespace
      local prefix1 = text:match("^\n*" .. prefix_set)
      local prefix2 = text:match("\n(" .. prefix_set .. ")", #prefix1+1)
      local trailing = text:match("%s*$")
      if not prefix2 or prefix2 == "" then
        prefix2 = prefix1
      end

      -- strip all line prefixes and trailing whitespace
      text = text:sub(#prefix1+1, -#trailing - 1):gsub("\n" .. prefix_set, "\n")

      -- split into blocks, wordwrap and join
      local line_limit = config.line_limit - #prefix1
      local blocks = {}
      text = text:gsub("\n\n", "\0")
      for block in text:gmatch("%Z+") do
        table.insert(blocks, wordwrap_text(block, line_limit))
      end
      text = table.concat(blocks, "\n\n")

      -- add prefix to start of lines
      text = prefix1 .. text:gsub("\n", "\n" .. prefix2) .. trailing

      return text
    end)
  end,
})


keymap.add {
  ["ctrl+shift+q"] = "reflow:reflow"
}


================================================
FILE: data/plugins/tabularize.lua
================================================
local core = require "core"
local command = require "core.command"
local translate = require "core.doc.translate"


local function gmatch_to_array(text, ptn)
  local res = {}
  for x in text:gmatch(ptn) do
    table.insert(res, x)
  end
  return res
end


local function tabularize_lines(lines, delim)
  local rows = {}
  local cols = {}

  -- split lines at delimiters and get maximum width of columns
  local ptn = "[^" .. delim:sub(1,1):gsub("%W", "%%%1") .. "]+"
  for i, line in ipairs(lines) do
    rows[i] = gmatch_to_array(line, ptn)
    for j, col in ipairs(rows[i]) do
      cols[j] = math.max(#col, cols[j] or 0)
    end
  end

  -- pad columns with space
  for _, row in ipairs(rows) do
    for i = 1, #row - 1 do
      row[i] = row[i] .. string.rep(" ", cols[i] - #row[i])
    end
  end

  -- write columns back to lines array
  for i, line in ipairs(lines) do
    lines[i] = table.concat(rows[i], delim)
  end
end


command.add("core.docview", {
  ["tabularize:tabularize"] = function()
    core.command_view:enter("Tabularize On Delimiter", function(delim)
      if delim == "" then delim = " " end

      local doc = core.active_view.doc
      local line1, col1, line2, col2, swap = doc:get_selection(true)
      line1, col1 = doc:position_offset(line1, col1, translate.start_of_line)
      line2, col2 = doc:position_offset(line2, col2, translate.end_of_line)
      doc:set_selection(line1, col1, line2, col2, swap)

      doc:replace(function(text)
        local lines = gmatch_to_array(text, "[^\n]*\n?")
        tabularize_lines(lines, delim)
        return table.concat(lines)
      end)
    end)
  end,
})


================================================
FILE: data/plugins/treeview.lua
================================================
local core = require "core"
local common = require "core.common"
local command = require "core.command"
local config = require "core.config"
local keymap = require "core.keymap"
local style = require "core.style"
local View = require "core.view"

config.treeview_size = 200 * SCALE

local function get_depth(filename)
  local n = 0
  for sep in filename:gmatch("[\\/]") do
    n = n + 1
  end
  return n
end


local TreeView = View:extend()

function TreeView:new()
  TreeView.super.new(self)
  self.scrollable = true
  self.visible = true
  self.init_size = true
  self.cache = {}
end


function TreeView:get_cached(item)
  local t = self.cache[item.filename]
  if not t then
    t = {}
    t.filename = item.filename
    t.abs_filename = system.absolute_path(item.filename)
    t.name = t.filename:match("[^\\/]+$")
    t.depth = get_depth(t.filename)
    t.type = item.type
    self.cache[t.filename] = t
  end
  return t
end


function TreeView:get_name()
  return "Project"
end


function TreeView:get_item_height()
  return style.font:get_height() + style.padding.y
end


function TreeView:check_cache()
  -- invalidate cache's skip values if project_files has changed
  if core.project_files ~= self.last_project_files then
    for _, v in pairs(self.cache) do
      v.skip = nil
    end
    self.last_project_files = core.project_files
  end
end


function TreeView:each_item()
  return coroutine.wrap(function()
    self:check_cache()
    local ox, oy = self:get_content_offset()
    local y = oy + style.padding.y
    local w = self.size.x
    local h = self:get_item_height()

    local i = 1
    while i <= #core.project_files do
      local item = core.project_files[i]
      local cached = self:get_cached(item)

      coroutine.yield(cached, ox, y, w, h)
      y = y + h
      i = i + 1

      if not cached.expanded then
        if cached.skip then
          i = cached.skip
        else
          local depth = cached.depth
          while i <= #core.project_files do
            local filename = core.project_files[i].filename
            if get_depth(filename) <= depth then break end
            i = i + 1
          end
          cached.skip = i
        end
      end
    end
  end)
end


function TreeView:on_mouse_moved(px, py)
  self.hovered_item = nil
  for item, x,y,w,h in self:each_item() do
    if px > x and py > y and px <= x + w and py <= y + h then
      self.hovered_item = item
      break
    end
  end
end


function TreeView:on_mouse_pressed(button, x, y)
  if not self.hovered_item then
    return
  elseif self.hovered_item.type == "dir" then
    self.hovered_item.expanded = not self.hovered_item.expanded
  else
    core.try(function()
      core.root_view:open_doc(core.open_doc(self.hovered_item.filename))
    end)
  end
end


function TreeView:update()
  -- update width
  local dest = self.visible and config.treeview_size or 0
  if self.init_size then
    self.size.x = dest
    self.init_size = false
  else
    self:move_towards(self.size, "x", dest)
  end

  TreeView.super.update(self)
end


function TreeView:draw()
  self:draw_background(style.background2)

  local icon_width = style.icon_font:get_width("D")
  local spacing = style.font:get_width(" ") * 2

  local doc = core.active_view.doc
  local active_filename = doc and system.absolute_path(doc.filename or "")

  for item, x,y,w,h in self:each_item() do
    local color = style.text

    -- highlight active_view doc
    if item.abs_filename == active_filename then
      color = style.accent
    end

    -- hovered item background
    if item == self.hovered_item then
      renderer.draw_rect(x, y, w, h, style.line_highlight)
      color = style.accent
    end

    -- icons
    x = x + item.depth * style.padding.x + style.padding.x
    if item.type == "dir" then
      local icon1 = item.expanded and "-" or "+"
      local icon2 = item.expanded and "D" or "d"
      common.draw_text(style.icon_font, color, icon1, nil, x, y, 0, h)
      x = x + style.padding.x
      common.draw_text(style.icon_font, color, icon2, nil, x, y, 0, h)
      x = x + icon_width
    else
      x = x + style.padding.x
      common.draw_text(style.icon_font, color, "f", nil, x, y, 0, h)
      x = x + icon_width
    end

    -- text
    x = x + spacing
    x = common.draw_text(style.font, color, item.name, nil, x, y, 0, h)
  end
end


-- init
local view = TreeView()
local node = core.root_view:get_active_node()
node:split("left", view, true)

-- register commands and keymap
command.add(nil, {
  ["treeview:toggle"] = function()
    view.visible = not view.visible
  end,
})

keymap.add { ["ctrl+\\"] = "treeview:toggle" }


================================================
FILE: data/plugins/trimwhitespace.lua
================================================
local core = require "core"
local command = require "core.command"
local Doc = require "core.doc"


local function trim_trailing_whitespace(doc)
  local cline, ccol = doc:get_selection()
  for i = 1, #doc.lines do
    local old_text = doc:get_text(i, 1, i, math.huge)
    local new_text = old_text:gsub("%s*$", "")

    -- don't remove whitespace which would cause the caret to reposition
    if cline == i and ccol > #new_text then
      new_text = old_text:sub(1, ccol - 1)
    end

    if old_text ~= new_text then
      doc:insert(i, 1, new_text)
      doc:remove(i, #new_text + 1, i, math.huge)
    end
  end
end


command.add("core.docview", {
  ["trim-whitespace:trim-trailing-whitespace"] = function()
    trim_trailing_whitespace(core.active_view.doc)
  end,
})


local save = Doc.save
Doc.save = function(self, ...)
  trim_trailing_whitespace(self)
  save(self, ...)
end


================================================
FILE: data/user/colors/fall.lua
================================================
local style = require "core.style"
local common = require "core.common"

style.background = { common.color "#343233" }
style.background2 = { common.color "#2c2a2b" }
style.background3 = { common.color "#2c2a2b" }
style.text = { common.color "#c4b398" }
style.caret = { common.color "#61efce" }
style.accent = { common.color "#ffd152" }
style.dim = { common.color "#615d5f" }
style.divider = { common.color "#242223" }
style.selection = { common.color "#454244" }
style.line_number = { common.color "#454244" }
style.line_number2 = { common.color "#615d5f" }
style.line_highlight = { common.color "#383637" }
style.scrollbar = { common.color "#454344" }
style.scrollbar2 = { common.color "#524F50" }

style.syntax["normal"] = { common.color "#efdab9" }
style.syntax["symbol"] = { common.color "#efdab9" }
style.syntax["comment"] = { common.color "#615d5f" }
style.syntax["keyword"] = { common.color "#d36e2d" }
style.syntax["keyword2"] = { common.color "#ef6179" }
style.syntax["number"] = { common.color "#ffd152" }
style.syntax["literal"] = { common.color "#ffd152" }
style.syntax["string"] = { common.color "#ffd152" }
style.syntax["operator"] = { common.color "#efdab9" }
style.syntax["function"] = { common.color "#61efce" }


================================================
FILE: data/user/colors/summer.lua
================================================
local style = require "core.style"
local common = require "core.common"

style.background = { common.color "#fbfbfb" }
style.background2 = { common.color "#f2f2f2" }
style.background3 = { common.color "#f2f2f2" }
style.text = { common.color "#404040" }
style.caret = { common.color "#fc1785" }
style.accent = { common.color "#fc1785" }
style.dim = { common.color "#b0b0b0" }
style.divider = { common.color "#e8e8e8" }
style.selection = { common.color "#b7dce8" }
style.line_number = { common.color "#d0d0d0" }
style.line_number2 = { common.color "#808080" }
style.line_highlight = { common.color "#f2f2f2" }
style.scrollbar = { common.color "#e0e0e0" }
style.scrollbar2 = { common.color "#c0c0c0" }

style.syntax["normal"] = { common.color "#181818" }
style.syntax["symbol"] = { common.color "#181818" }
style.syntax["comment"] = { common.color "#22a21f" }
style.syntax["keyword"] = { common.color "#fb6620" }
style.syntax["keyword2"] = { common.color "#fc1785" }
style.syntax["number"] = { common.color "#1586d2" }
style.syntax["literal"] = { common.color "#1586d2" }
style.syntax["string"] = { common.color "#1586d2" }
style.syntax["operator"] = { common.color "#fb6620" }
style.syntax["function"] = { common.color "#fc1785" }


================================================
FILE: data/user/init.lua
================================================
-- put user settings here
-- this module will be loaded after everything else when the application starts

local keymap = require "core.keymap"
local config = require "core.config"
local style = require "core.style"

-- light theme:
-- require "user.colors.summer"

-- key binding:
-- keymap.add { ["ctrl+escape"] = "core:quit" }



================================================
FILE: doc/usage.md
================================================
# lite

![screenshot](https://user-images.githubusercontent.com/3920290/81471642-6c165880-91ea-11ea-8cd1-fae7ae8f0bc4.png)

## Overview
lite is a lightweight text editor written mostly in Lua — it aims to provide
something practical, pretty, *small* and fast, implemented as simply as
possible; easy to modify and extend, or to use without doing either.


## Getting Started
When lite is started it's typically opened with a *project directory* — this
is the directory where your project's code and other data resides. The project
directory is set once when lite is started and, for the duration of the
session, cannot be changed.

To open lite with a specific project directory the directory name can be passed
as a command-line argument *(`.` can be passed to use the current directory)* or
the directory can be dragged onto either the lite executable or a running
instance of lite.

The main way of opening files in lite is through the `core:find-file` command
— this provides a fuzzy finder over all of the project's files and can be
opened using the **`ctrl+p`** shortcut by default.

Commands can be run using keyboard shortcuts, or by using the `core:find-command`
command bound to **`ctrl+shift+p`** by default. For example, pressing
`ctrl+shift+p` and typing `newdoc` then pressing `return` would open a new
document. The current keyboard shortcut for a command can be seen to the right
of the command name on the command finder, thus to find the shortcut for a command
`ctrl+shift+p` can be pressed and the command name typed.


## User Module
lite can be configured through use of the user module. The user module can be
used for changing options in the config module, adding additional key bindings,
loading custom color themes, modifying the style or changing any other part of
lite to your personal preference.

The user module is loaded by lite when the application starts, after the plugins
have been loaded.

The user module can be modified by running the `core:open-user-module` command
or otherwise directly opening the `data/user/init.lua` file.


## Project Module
The project module is an optional module which is loaded from the current
project's directory when lite is started. Project modules can be useful for
things like adding custom commands for project-specific build systems, or
loading project-specific plugins.

The project module is loaded by lite when the application starts, after both the
plugins and user module have been loaded.

The project module can be edited by running the `core:open-project-module`
command — if the module does not exist for the current project when the
command is run it will be created.


## Commands
Commands in lite are used both through the command finder (`ctrl+shift+p`) and
by lite's keyboard shortcut system. Commands consist of 3 components:
* **Name** — The command name in the form of `namespace:action-name`, for
  example: `doc:select-all`
* **Predicate** — A function that returns true if the command can be ran, for
  example, for any document commands the predicate checks whether the active
  view is a document
* **Function** — The function which performs the command itself

Commands can be added using the `command.add` function provided by the
`core.command` module:
```lua
local core = require "core"
local command = require "core.command"

command.add("core.docview", {
  ["doc:save"] = function()
    core.active_view.doc:save()
    core.log("Saved '%s', core.active_view.doc.filename)
  end
})
```

Commands can be performed programatically (eg. from another command or by your
user module) by calling the `command.perform` function after requiring the
`command` module:
```lua
local command = require "core.command"
command.perform "core:quit"
```


## Keymap
All keyboard shortcuts in lite are handled by the `core.keymap` module. A key
binding in lite maps a "stroke" (eg. `ctrl+q`) to one or more commands (eg.
`core:quit`). When the shortcut is pressed lite will iterate each command
assigned to that key and run the *predicate function* for that command — if the
predicate passes it stops iterating and runs the command.

An example of where this used is the default binding of the `tab` key:
``` lua
  ["tab"] = { "command:complete", "doc:indent" },
```
When tab is pressed the `command:complete` command is attempted which will only
succeed if the command-input at the bottom of the window is active. Otherwise
the `doc:indent` command is attempted which will only succeed if we have a
document as our active view.

A new mapping can be added by your user module as follows:
```lua
local keymap = require "core.keymap"
keymap.add { ["ctrl+q"] = "core:quit" }
```


## Plugins
Plugins in lite are normal lua modules and are treated as such — no
complicated plugin manager is provided, and, once a plugin is loaded, it is never
expected be to have to unload itself.

To install a plugin simply drop it in the `data/plugins` directory — installed
plugins will be automatically loaded when lite starts. To uninstall a plugin the
plugin file can be deleted — any plugin (including those included with lite's
default installation) can be deleted to remove its functionality.

If you want to load a plugin only under a certain circumstance (for example,
only on a given project) the plugin can be placed somewhere other than the
`data/plugins` directory so that it is not automatically loaded. The plugin can
then be loaded manually as needed by using the `require` function.

Plugins can be downloaded from the [plugins repository](https://github.com/rxi/lite-plugins).


## Color Themes
Colors themes in lite are lua modules which overwrite the color fields of lite's
`core.style` module. Color themes should be placed in the `data/user/colors`
directory.

A color theme can be set by requiring it in your user module:
```lua
require "user.colors.winter"
```

Color themes can be downloaded from the [color themes repository](https://github.com/rxi/lite-colors).



================================================
FILE: icon.inl
================================================
static unsigned char icon_rgba[] = {
  0x2e, 0x2e, 0x32, 0x6d, 0x2e, 0x2e, 0x32, 0xe4, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xe4,
  0x2e, 0x2e, 0x32, 0x6d, 0x2e, 0x2e, 0x32, 0xe4, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xe4, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2d, 0x2e, 0x31, 0xff, 0x2d, 0x2d, 0x31, 0xff, 0x2d, 0x2d, 0x31, 0xff,
  0x2d, 0x2d, 0x31, 0xff, 0x2d, 0x2d, 0x31, 0xff, 0x2d, 0x2d, 0x31, 0xff,
  0x2d, 0x2d, 0x31, 0xff, 0x2d, 0x2d, 0x31, 0xff, 0x2d, 0x2d, 0x31, 0xff,
  0x2d, 0x2d, 0x31, 0xff, 0x2d, 0x2d, 0x31, 0xff, 0x2d, 0x2d, 0x31, 0xff,
  0x2d, 0x2d, 0x31, 0xff, 0x2d, 0x2d, 0x31, 0xff, 0x2d, 0x2d, 0x31, 0xff,
  0x2d, 0x2d, 0x31, 0xff, 0x2d, 0x2d, 0x31, 0xff, 0x2d, 0x2d, 0x31, 0xff,
  0x2d, 0x2d, 0x31, 0xff, 0x2d, 0x2d, 0x31, 0xff, 0x2d, 0x2d, 0x31, 0xff,
  0x2d, 0x2d, 0x31, 0xff, 0x2d, 0x2d, 0x31, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2d, 0x2d, 0x31, 0xff, 0x2d, 0x2d, 0x31, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2d, 0x2e, 0x32, 0xff, 0x2c, 0x2d, 0x32, 0xff, 0x2c, 0x2d, 0x32, 0xff,
  0x2c, 0x2d, 0x32, 0xff, 0x2c, 0x2d, 0x32, 0xff, 0x2c, 0x2d, 0x32, 0xff,
  0x2c, 0x2d, 0x32, 0xff, 0x2d, 0x2d, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x31, 0x31, 0x36, 0xff,
  0x32, 0x32, 0x36, 0xff, 0x32, 0x32, 0x36, 0xff, 0x32, 0x32, 0x36, 0xff,
  0x30, 0x30, 0x34, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x30, 0x2f, 0x33, 0xff, 0x42, 0x35, 0x3a, 0xff, 0x44, 0x36, 0x3b, 0xff,
  0x44, 0x36, 0x3b, 0xff, 0x44, 0x36, 0x3b, 0xff, 0x44, 0x36, 0x3b, 0xff,
  0x44, 0x36, 0x3b, 0xff, 0x44, 0x37, 0x3c, 0xff, 0x42, 0x40, 0x44, 0xff,
  0x41, 0x42, 0x46, 0xff, 0x42, 0x42, 0x46, 0xff, 0x42, 0x42, 0x46, 0xff,
  0x42, 0x42, 0x46, 0xff, 0x42, 0x42, 0x46, 0xff, 0x42, 0x42, 0x46, 0xff,
  0x42, 0x42, 0x46, 0xff, 0x42, 0x42, 0x46, 0xff, 0x42, 0x42, 0x46, 0xff,
  0x42, 0x42, 0x46, 0xff, 0x42, 0x42, 0x46, 0xff, 0x42, 0x42, 0x46, 0xff,
  0x42, 0x42, 0x46, 0xff, 0x42, 0x42, 0x46, 0xff, 0x38, 0x38, 0x3c, 0xff,
  0x2f, 0x30, 0x34, 0xff, 0x38, 0x3f, 0x46, 0xff, 0x38, 0x3f, 0x46, 0xff,
  0x2f, 0x30, 0x34, 0xff, 0x39, 0x35, 0x33, 0xff, 0x45, 0x3c, 0x35, 0xff,
  0x45, 0x3b, 0x35, 0xff, 0x45, 0x3b, 0x35, 0xff, 0x45, 0x3b, 0x35, 0xff,
  0x45, 0x3b, 0x35, 0xff, 0x45, 0x3b, 0x35, 0xff, 0x42, 0x3a, 0x35, 0xff,
  0x30, 0x2f, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x31, 0x31, 0x36, 0xff,
  0x4b, 0x4b, 0x51, 0xff, 0x4e, 0x4e, 0x55, 0xff, 0x4e, 0x4e, 0x55, 0xff,
  0x4f, 0x4f, 0x55, 0xff, 0x3e, 0x3e, 0x43, 0xff, 0x2d, 0x2d, 0x31, 0xff,
  0x2d, 0x2e, 0x31, 0xff, 0x42, 0x35, 0x3a, 0xff, 0xce, 0x66, 0x72, 0xff,
  0xe2, 0x6d, 0x7b, 0xff, 0xe1, 0x6c, 0x7a, 0xff, 0xe1, 0x6c, 0x7a, 0xff,
  0xe1, 0x6c, 0x7a, 0xff, 0xe1, 0x6c, 0x7a, 0xff, 0xdf, 0x77, 0x84, 0xff,
  0xd0, 0xc3, 0xc9, 0xff, 0xcd, 0xce, 0xd3, 0xff, 0xcd, 0xcd, 0xd2, 0xff,
  0xcd, 0xcd, 0xd2, 0xff, 0xcd, 0xcd, 0xd2, 0xff, 0xcd, 0xcd, 0xd2, 0xff,
  0xcd, 0xcd, 0xd2, 0xff, 0xcd, 0xcd, 0xd2, 0xff, 0xcd, 0xcd, 0xd2, 0xff,
  0xcd, 0xcd, 0xd2, 0xff, 0xcd, 0xcd, 0xd2, 0xff, 0xcd, 0xcd, 0xd2, 0xff,
  0xcd, 0xcd, 0xd2, 0xff, 0xcd, 0xcd, 0xd2, 0xff, 0xd1, 0xd1, 0xd5, 0xff,
  0x7d, 0x7d, 0x81, 0xff, 0x35, 0x3c, 0x42, 0xff, 0x7f, 0xba, 0xd2, 0xff,
  0x7f, 0xba, 0xd2, 0xff, 0x34, 0x3d, 0x45, 0xff, 0x8a, 0x64, 0x3d, 0xff,
  0xec, 0x9e, 0x4b, 0xff, 0xe8, 0x9c, 0x4a, 0xff, 0xe8, 0x9c, 0x4a, 0xff,
  0xe8, 0x9c, 0x4a, 0xff, 0xe8, 0x9c, 0x4a, 0xff, 0xea, 0x9c, 0x4a, 0xff,
  0xd4, 0x90, 0x47, 0xff, 0x42, 0x3a, 0x35, 0xff, 0x2d, 0x2d, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x32, 0x32, 0x36, 0xff, 0x4f, 0x4f, 0x55, 0xff, 0x53, 0x53, 0x5a, 0xff,
  0x53, 0x53, 0x5a, 0xff, 0x53, 0x53, 0x5a, 0xff, 0x40, 0x40, 0x46, 0xff,
  0x2d, 0x2d, 0x31, 0xff, 0x2c, 0x2d, 0x31, 0xff, 0x44, 0x36, 0x3b, 0xff,
  0xe4, 0x6d, 0x7b, 0xff, 0xfb, 0x76, 0x85, 0xff, 0xfa, 0x75, 0x84, 0xff,
  0xfa, 0x75, 0x84, 0xff, 0xfa, 0x75, 0x84, 0xff, 0xfa, 0x74, 0x83, 0xff,
  0xf8, 0x81, 0x8f, 0xff, 0xe6, 0xd8, 0xde, 0xff, 0xe3, 0xe4, 0xe9, 0xff,
  0xe4, 0xe4, 0xe9, 0xff, 0xe4, 0xe4, 0xe9, 0xff, 0xe4, 0xe4, 0xe9, 0xff,
  0xe4, 0xe4, 0xe9, 0xff, 0xe4, 0xe4, 0xe9, 0xff, 0xe4, 0xe4, 0xe9, 0xff,
  0xe4, 0xe4, 0xe9, 0xff, 0xe4, 0xe4, 0xe9, 0xff, 0xe4, 0xe4, 0xe9, 0xff,
  0xe4, 0xe4, 0xe9, 0xff, 0xe4, 0xe4, 0xe9, 0xff, 0xe4, 0xe4, 0xe9, 0xff,
  0xe7, 0xe7, 0xec, 0xff, 0x88, 0x88, 0x8c, 0xff, 0x36, 0x3e, 0x45, 0xff,
  0x8a, 0xce, 0xe8, 0xff, 0x8a, 0xce, 0xe8, 0xff, 0x35, 0x3f, 0x48, 0xff,
  0x96, 0x6b, 0x3e, 0xff, 0xff, 0xad, 0x4e, 0xff, 0xff, 0xab, 0x4d, 0xff,
  0xff, 0xab, 0x4d, 0xff, 0xff, 0xab, 0x4d, 0xff, 0xff, 0xab, 0x4d, 0xff,
  0xff, 0xac, 0x4e, 0xff, 0xe8, 0x9d, 0x4a, 0xff, 0x45, 0x3c, 0x35, 0xff,
  0x2c, 0x2d, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x31, 0x31, 0x36, 0xff, 0x4b, 0x4b, 0x51, 0xff,
  0x4e, 0x4e, 0x55, 0xff, 0x4e, 0x4e, 0x55, 0xff, 0x4f, 0x4f, 0x55, 0xff,
  0x3e, 0x3e, 0x43, 0xff, 0x2d, 0x2d, 0x31, 0xff, 0x2d, 0x2e, 0x31, 0xff,
  0x42, 0x35, 0x3a, 0xff, 0xce, 0x66, 0x72, 0xff, 0xe2, 0x6d, 0x7b, 0xff,
  0xe1, 0x6c, 0x7a, 0xff, 0xe1, 0x6c, 0x7a, 0xff, 0xe1, 0x6c, 0x7a, 0xff,
  0xe1, 0x6c, 0x7a, 0xff, 0xdf, 0x77, 0x84, 0xff, 0xd0, 0xc3, 0xc9, 0xff,
  0xcd, 0xce, 0xd3, 0xff, 0xcd, 0xcd, 0xd2, 0xff, 0xcd, 0xcd, 0xd2, 0xff,
  0xcd, 0xcd, 0xd2, 0xff, 0xcd, 0xcd, 0xd2, 0xff, 0xcd, 0xcd, 0xd2, 0xff,
  0xcd, 0xcd, 0xd2, 0xff, 0xcd, 0xcd, 0xd2, 0xff, 0xcd, 0xcd, 0xd2, 0xff,
  0xcd, 0xcd, 0xd2, 0xff, 0xcd, 0xcd, 0xd2, 0xff, 0xcd, 0xcd, 0xd2, 0xff,
  0xcd, 0xcd, 0xd2, 0xff, 0xd1, 0xd1, 0xd5, 0xff, 0x7d, 0x7d, 0x81, 0xff,
  0x35, 0x3c, 0x42, 0xff, 0x7f, 0xba, 0xd2, 0xff, 0x7f, 0xba, 0xd2, 0xff,
  0x34, 0x3d, 0x45, 0xff, 0x8a, 0x64, 0x3d, 0xff, 0xec, 0x9e, 0x4b, 0xff,
  0xe8, 0x9c, 0x4a, 0xff, 0xe8, 0x9c, 0x4a, 0xff, 0xe8, 0x9c, 0x4a, 0xff,
  0xe8, 0x9c, 0x4a, 0xff, 0xea, 0x9c, 0x4a, 0xff, 0xd4, 0x90, 0x47, 0xff,
  0x42, 0x3a, 0x35, 0xff, 0x2d, 0x2d, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x31, 0x31, 0x36, 0xff, 0x32, 0x32, 0x36, 0xff, 0x32, 0x32, 0x36, 0xff,
  0x32, 0x32, 0x36, 0xff, 0x30, 0x30, 0x34, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x30, 0x2f, 0x33, 0xff, 0x42, 0x35, 0x3a, 0xff,
  0x44, 0x36, 0x3b, 0xff, 0x44, 0x36, 0x3b, 0xff, 0x44, 0x36, 0x3b, 0xff,
  0x44, 0x36, 0x3b, 0xff, 0x44, 0x36, 0x3b, 0xff, 0x44, 0x37, 0x3c, 0xff,
  0x42, 0x40, 0x44, 0xff, 0x41, 0x42, 0x46, 0xff, 0x42, 0x42, 0x46, 0xff,
  0x42, 0x42, 0x46, 0xff, 0x42, 0x42, 0x46, 0xff, 0x42, 0x42, 0x46, 0xff,
  0x42, 0x42, 0x46, 0xff, 0x42, 0x42, 0x46, 0xff, 0x42, 0x42, 0x46, 0xff,
  0x42, 0x42, 0x46, 0xff, 0x42, 0x42, 0x46, 0xff, 0x42, 0x42, 0x46, 0xff,
  0x42, 0x42, 0x46, 0xff, 0x42, 0x42, 0x46, 0xff, 0x42, 0x42, 0x46, 0xff,
  0x38, 0x38, 0x3c, 0xff, 0x2f, 0x30, 0x34, 0xff, 0x38, 0x3f, 0x46, 0xff,
  0x38, 0x3f, 0x46, 0xff, 0x2f, 0x30, 0x34, 0xff, 0x39, 0x35, 0x33, 0xff,
  0x45, 0x3c, 0x35, 0xff, 0x45, 0x3b, 0x35, 0xff, 0x45, 0x3b, 0x35, 0xff,
  0x45, 0x3b, 0x35, 0xff, 0x45, 0x3b, 0x35, 0xff, 0x45, 0x3b, 0x35, 0xff,
  0x42, 0x3a, 0x35, 0xff, 0x30, 0x2f, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x31, 0x31, 0x36, 0xff, 0x32, 0x32, 0x36, 0xff,
  0x32, 0x32, 0x36, 0xff, 0x32, 0x32, 0x36, 0xff, 0x30, 0x30, 0x34, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2d, 0x2e, 0x31, 0xff, 0x2d, 0x2d, 0x31, 0xff, 0x2d, 0x2d, 0x31, 0xff,
  0x2d, 0x2d, 0x31, 0xff, 0x2d, 0x2d, 0x31, 0xff, 0x2d, 0x2d, 0x31, 0xff,
  0x2d, 0x2d, 0x31, 0xff, 0x2d, 0x2d, 0x31, 0xff, 0x2d, 0x2d, 0x31, 0xff,
  0x2d, 0x2d, 0x31, 0xff, 0x2d, 0x2d, 0x31, 0xff, 0x2d, 0x2d, 0x31, 0xff,
  0x2d, 0x2d, 0x31, 0xff, 0x2d, 0x2d, 0x31, 0xff, 0x2d, 0x2d, 0x31, 0xff,
  0x2d, 0x2d, 0x31, 0xff, 0x2d, 0x2d, 0x31, 0xff, 0x2d, 0x2d, 0x31, 0xff,
  0x2d, 0x2d, 0x31, 0xff, 0x2d, 0x2d, 0x31, 0xff, 0x2d, 0x2d, 0x31, 0xff,
  0x2d, 0x2d, 0x31, 0xff, 0x2d, 0x2d, 0x31, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2d, 0x2d, 0x31, 0xff, 0x2d, 0x2d, 0x31, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2d, 0x2e, 0x32, 0xff, 0x2c, 0x2d, 0x32, 0xff, 0x2c, 0x2d, 0x32, 0xff,
  0x2c, 0x2d, 0x32, 0xff, 0x2c, 0x2d, 0x32, 0xff, 0x2c, 0x2d, 0x32, 0xff,
  0x2c, 0x2d, 0x32, 0xff, 0x2d, 0x2d, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x31, 0x31, 0x36, 0xff, 0x4b, 0x4b, 0x51, 0xff,
  0x4e, 0x4e, 0x55, 0xff, 0x4e, 0x4e, 0x55, 0xff, 0x4f, 0x4f, 0x55, 0xff,
  0x3e, 0x3e, 0x43, 0xff, 0x2d, 0x2d, 0x31, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x32, 0x32, 0x36, 0xff,
  0x4f, 0x4f, 0x55, 0xff, 0x53, 0x53, 0x5a, 0xff, 0x53, 0x53, 0x5a, 0xff,
  0x53, 0x53, 0x5a, 0xff, 0x40, 0x40, 0x46, 0xff, 0x2d, 0x2d, 0x31, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x31, 0x31, 0x36, 0xff, 0x4b, 0x4b, 0x51, 0xff, 0x4e, 0x4e, 0x55, 0xff,
  0x4e, 0x4e, 0x55, 0xff, 0x4f, 0x4f, 0x55, 0xff, 0x3e, 0x3e, 0x43, 0xff,
  0x2d, 0x2d, 0x31, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x31, 0x31, 0x36, 0xff,
  0x32, 0x32, 0x36, 0xff, 0x32, 0x32, 0x36, 0xff, 0x32, 0x32, 0x36, 0xff,
  0x30, 0x30, 0x34, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x31, 0x31, 0x36, 0xff, 0x32, 0x32, 0x36, 0xff, 0x32, 0x32, 0x36, 0xff,
  0x32, 0x32, 0x36, 0xff, 0x30, 0x30, 0x34, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x31, 0x31, 0x35, 0xff, 0x34, 0x35, 0x39, 0xff,
  0x34, 0x35, 0x39, 0xff, 0x34, 0x35, 0x39, 0xff, 0x31, 0x31, 0x35, 0xff,
  0x2f, 0x2f, 0x33, 0xff, 0x33, 0x34, 0x38, 0xff, 0x34, 0x35, 0x39, 0xff,
  0x34, 0x35, 0x39, 0xff, 0x34, 0x35, 0x39, 0xff, 0x34, 0x35, 0x39, 0xff,
  0x34, 0x35, 0x39, 0xff, 0x31, 0x31, 0x35, 0xff, 0x2f, 0x2f, 0x33, 0xff,
  0x33, 0x34, 0x38, 0xff, 0x34, 0x35, 0x39, 0xff, 0x34, 0x35, 0x39, 0xff,
  0x34, 0x35, 0x39, 0xff, 0x34, 0x35, 0x39, 0xff, 0x34, 0x35, 0x39, 0xff,
  0x34, 0x35, 0x39, 0xff, 0x33, 0x34, 0x38, 0xff, 0x2f, 0x2f, 0x33, 0xff,
  0x31, 0x31, 0x35, 0xff, 0x34, 0x35, 0x39, 0xff, 0x34, 0x35, 0x39, 0xff,
  0x34, 0x35, 0x39, 0xff, 0x34, 0x35, 0x39, 0xff, 0x31, 0x31, 0x35, 0xff,
  0x2f, 0x2f, 0x33, 0xff, 0x33, 0x34, 0x38, 0xff, 0x34, 0x35, 0x39, 0xff,
  0x34, 0x35, 0x39, 0xff, 0x34, 0x35, 0x39, 0xff, 0x34, 0x35, 0x39, 0xff,
  0x33, 0x34, 0x38, 0xff, 0x2f, 0x2f, 0x33, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff, 0x2e, 0x2e, 0x32, 0xff,
  0x31, 0x31, 0x36, 0xff, 0x4b, 0x4b, 0x51, 0xff, 0x4e, 0x4e, 0x55, 0xff,
  0x4e, 0x4e, 0x55, 0xff, 0x4f, 0x4f, 0x55, 0xff, 0x3e, 0x3e, 0x43, 0xff,
  0x2d, 0x2d, 0x31, 0xff, 0x2d, 0x2d, 0x31, 0xff, 0x47, 0x49, 0x4d, 0xff,
  0x61, 0x64, 0x68, 0xff, 0x60, 0x63, 0x67, 0xff, 0x61, 0x64, 0x68, 0xff,
  0x47, 0x48, 0x4c, 0xff, 0x32, 0x33, 0x37, 0xff, 0x5a, 0x5e, 0x62, 0xff,
  0x60, 0x64, 0x68, 0xff, 0x60, 0x63, 0x67, 0xff, 0x60, 0x63, 0x67, 0xff,
  0x60, 0x63, 0x67, 0xff, 0x61, 0x64, 0x68, 0xff, 0x47, 0x48, 0x4c, 0xff,
  0x32, 0x33, 0x37, 0xff, 0x5a, 0x5e, 0x62, 0xff, 0x60, 0x64, 0x68, 0xff,
  0x60, 0x63, 0x67, 0xff, 0x60, 0x63, 0x67, 0xff, 0x60, 0x63, 0x67, 0xff,
  0x60, 0x63, 0x67, 0xff, 0x60, 0x64, 0x68, 0xff, 0x5a, 0x5e, 0x62, 0xff,
  0x32, 0x33, 0x37, 0xff, 0x47, 0x48, 0x4c, 0xff, 0x61, 0x64, 0x68, 0xff,
  0x60, 0x63, 0x67, 0xff
Download .txt
gitextract_u_nu9sbi/

├── .gitattributes
├── .github/
│   └── FUNDING.yml
├── LICENSE
├── README.md
├── build.bat
├── build.sh
├── build_release.sh
├── data/
│   ├── core/
│   │   ├── command.lua
│   │   ├── commands/
│   │   │   ├── command.lua
│   │   │   ├── core.lua
│   │   │   ├── doc.lua
│   │   │   ├── findreplace.lua
│   │   │   └── root.lua
│   │   ├── commandview.lua
│   │   ├── common.lua
│   │   ├── config.lua
│   │   ├── doc/
│   │   │   ├── highlighter.lua
│   │   │   ├── init.lua
│   │   │   ├── search.lua
│   │   │   └── translate.lua
│   │   ├── docview.lua
│   │   ├── init.lua
│   │   ├── keymap.lua
│   │   ├── logview.lua
│   │   ├── object.lua
│   │   ├── rootview.lua
│   │   ├── statusview.lua
│   │   ├── strict.lua
│   │   ├── style.lua
│   │   ├── syntax.lua
│   │   ├── tokenizer.lua
│   │   └── view.lua
│   ├── plugins/
│   │   ├── autocomplete.lua
│   │   ├── autoreload.lua
│   │   ├── language_c.lua
│   │   ├── language_css.lua
│   │   ├── language_js.lua
│   │   ├── language_lua.lua
│   │   ├── language_md.lua
│   │   ├── language_python.lua
│   │   ├── language_xml.lua
│   │   ├── macro.lua
│   │   ├── projectsearch.lua
│   │   ├── quote.lua
│   │   ├── reflow.lua
│   │   ├── tabularize.lua
│   │   ├── treeview.lua
│   │   └── trimwhitespace.lua
│   └── user/
│       ├── colors/
│       │   ├── fall.lua
│       │   └── summer.lua
│       └── init.lua
├── doc/
│   └── usage.md
├── icon.inl
├── res.rc
├── src/
│   ├── api/
│   │   ├── api.c
│   │   ├── api.h
│   │   ├── renderer.c
│   │   ├── renderer_font.c
│   │   └── system.c
│   ├── lib/
│   │   ├── lua52/
│   │   │   ├── lapi.c
│   │   │   ├── lapi.h
│   │   │   ├── lauxlib.c
│   │   │   ├── lauxlib.h
│   │   │   ├── lbaselib.c
│   │   │   ├── lbitlib.c
│   │   │   ├── lcode.c
│   │   │   ├── lcode.h
│   │   │   ├── lcorolib.c
│   │   │   ├── lctype.c
│   │   │   ├── lctype.h
│   │   │   ├── ldblib.c
│   │   │   ├── ldebug.c
│   │   │   ├── ldebug.h
│   │   │   ├── ldo.c
│   │   │   ├── ldo.h
│   │   │   ├── ldump.c
│   │   │   ├── lfunc.c
│   │   │   ├── lfunc.h
│   │   │   ├── lgc.c
│   │   │   ├── lgc.h
│   │   │   ├── linit.c
│   │   │   ├── liolib.c
│   │   │   ├── llex.c
│   │   │   ├── llex.h
│   │   │   ├── llimits.h
│   │   │   ├── lmathlib.c
│   │   │   ├── lmem.c
│   │   │   ├── lmem.h
│   │   │   ├── loadlib.c
│   │   │   ├── lobject.c
│   │   │   ├── lobject.h
│   │   │   ├── lopcodes.c
│   │   │   ├── lopcodes.h
│   │   │   ├── loslib.c
│   │   │   ├── lparser.c
│   │   │   ├── lparser.h
│   │   │   ├── lstate.c
│   │   │   ├── lstate.h
│   │   │   ├── lstring.c
│   │   │   ├── lstring.h
│   │   │   ├── lstrlib.c
│   │   │   ├── ltable.c
│   │   │   ├── ltable.h
│   │   │   ├── ltablib.c
│   │   │   ├── ltm.c
│   │   │   ├── ltm.h
│   │   │   ├── lua.c_
│   │   │   ├── lua.h
│   │   │   ├── lua.hpp
│   │   │   ├── luac.c_
│   │   │   ├── luaconf.h
│   │   │   ├── lualib.h
│   │   │   ├── lundump.c
│   │   │   ├── lundump.h
│   │   │   ├── lvm.c
│   │   │   ├── lvm.h
│   │   │   ├── lzio.c
│   │   │   └── lzio.h
│   │   └── stb/
│   │       ├── stb_truetype.c
│   │       └── stb_truetype.h
│   ├── main.c
│   ├── rencache.c
│   ├── rencache.h
│   ├── renderer.c
│   └── renderer.h
└── winlib/
    └── SDL2-2.0.10/
        ├── BUGS.txt
        ├── COPYING.txt
        ├── CREDITS.txt
        ├── INSTALL.txt
        ├── Makefile
        ├── README-SDL.txt
        ├── README.txt
        ├── WhatsNew.txt
        ├── docs/
        │   ├── README-android.md
        │   ├── README-cmake.md
        │   ├── README-directfb.md
        │   ├── README-dynapi.md
        │   ├── README-emscripten.md
        │   ├── README-gesture.md
        │   ├── README-hg.md
        │   ├── README-ios.md
        │   ├── README-linux.md
        │   ├── README-macosx.md
        │   ├── README-nacl.md
        │   ├── README-pandora.md
        │   ├── README-platforms.md
        │   ├── README-porting.md
        │   ├── README-psp.md
        │   ├── README-raspberrypi.md
        │   ├── README-touch.md
        │   ├── README-wince.md
        │   ├── README-windows.md
        │   ├── README-winrt.md
        │   ├── README.md
        │   └── doxyfile
        ├── i686-w64-mingw32/
        │   ├── bin/
        │   │   └── sdl2-config
        │   ├── include/
        │   │   └── SDL2/
        │   │       ├── SDL.h
        │   │       ├── SDL_assert.h
        │   │       ├── SDL_atomic.h
        │   │       ├── SDL_audio.h
        │   │       ├── SDL_bits.h
        │   │       ├── SDL_blendmode.h
        │   │       ├── SDL_clipboard.h
        │   │       ├── SDL_config.h
        │   │       ├── SDL_cpuinfo.h
        │   │       ├── SDL_egl.h
        │   │       ├── SDL_endian.h
        │   │       ├── SDL_error.h
        │   │       ├── SDL_events.h
        │   │       ├── SDL_filesystem.h
        │   │       ├── SDL_gamecontroller.h
        │   │       ├── SDL_gesture.h
        │   │       ├── SDL_haptic.h
        │   │       ├── SDL_hints.h
        │   │       ├── SDL_joystick.h
        │   │       ├── SDL_keyboard.h
        │   │       ├── SDL_keycode.h
        │   │       ├── SDL_loadso.h
        │   │       ├── SDL_log.h
        │   │       ├── SDL_main.h
        │   │       ├── SDL_messagebox.h
        │   │       ├── SDL_mouse.h
        │   │       ├── SDL_mutex.h
        │   │       ├── SDL_name.h
        │   │       ├── SDL_opengl.h
        │   │       ├── SDL_opengl_glext.h
        │   │       ├── SDL_opengles.h
        │   │       ├── SDL_opengles2.h
        │   │       ├── SDL_opengles2_gl2.h
        │   │       ├── SDL_opengles2_gl2ext.h
        │   │       ├── SDL_opengles2_gl2platform.h
        │   │       ├── SDL_opengles2_khrplatform.h
        │   │       ├── SDL_pixels.h
        │   │       ├── SDL_platform.h
        │   │       ├── SDL_power.h
        │   │       ├── SDL_quit.h
        │   │       ├── SDL_rect.h
        │   │       ├── SDL_render.h
        │   │       ├── SDL_revision.h
        │   │       ├── SDL_rwops.h
        │   │       ├── SDL_scancode.h
        │   │       ├── SDL_sensor.h
        │   │       ├── SDL_shape.h
        │   │       ├── SDL_stdinc.h
        │   │       ├── SDL_surface.h
        │   │       ├── SDL_system.h
        │   │       ├── SDL_syswm.h
        │   │       ├── SDL_test.h
        │   │       ├── SDL_test_assert.h
        │   │       ├── SDL_test_common.h
        │   │       ├── SDL_test_compare.h
        │   │       ├── SDL_test_crc32.h
        │   │       ├── SDL_test_font.h
        │   │       ├── SDL_test_fuzzer.h
        │   │       ├── SDL_test_harness.h
        │   │       ├── SDL_test_images.h
        │   │       ├── SDL_test_log.h
        │   │       ├── SDL_test_md5.h
        │   │       ├── SDL_test_memory.h
        │   │       ├── SDL_test_random.h
        │   │       ├── SDL_thread.h
        │   │       ├── SDL_timer.h
        │   │       ├── SDL_touch.h
        │   │       ├── SDL_types.h
        │   │       ├── SDL_version.h
        │   │       ├── SDL_video.h
        │   │       ├── SDL_vulkan.h
        │   │       ├── begin_code.h
        │   │       └── close_code.h
        │   ├── lib/
        │   │   ├── cmake/
        │   │   │   └── SDL2/
        │   │   │       └── sdl2-config.cmake
        │   │   ├── libSDL2.a
        │   │   ├── libSDL2.dll.a
        │   │   ├── libSDL2.la
        │   │   ├── libSDL2_test.a
        │   │   ├── libSDL2_test.la
        │   │   ├── libSDL2main.a
        │   │   ├── libSDL2main.la
        │   │   └── pkgconfig/
        │   │       └── sdl2.pc
        │   └── share/
        │       └── aclocal/
        │           └── sdl2.m4
        ├── test/
        │   ├── CMakeLists.txt
        │   ├── COPYING
        │   ├── Makefile.in
        │   ├── Makefile.os2
        │   ├── README
        │   ├── acinclude.m4
        │   ├── aclocal.m4
        │   ├── autogen.sh
        │   ├── checkkeys.c
        │   ├── configure
        │   ├── configure.ac
        │   ├── controllermap.c
        │   ├── emscripten/
        │   │   └── joystick-pre.js
        │   ├── gcc-fat.sh
        │   ├── loopwave.c
        │   ├── loopwavequeue.c
        │   ├── nacl/
        │   │   ├── Makefile
        │   │   ├── background.js
        │   │   ├── common.js
        │   │   ├── index.html
        │   │   └── manifest.json
        │   ├── picture.xbm
        │   ├── relative_mode.markdown
        │   ├── testatomic.c
        │   ├── testaudiocapture.c
        │   ├── testaudiohotplug.c
        │   ├── testaudioinfo.c
        │   ├── testautomation.c
        │   ├── testautomation_audio.c
        │   ├── testautomation_clipboard.c
        │   ├── testautomation_events.c
        │   ├── testautomation_hints.c
        │   ├── testautomation_keyboard.c
        │   ├── testautomation_main.c
        │   ├── testautomation_mouse.c
        │   ├── testautomation_pixels.c
        │   ├── testautomation_platform.c
        │   ├── testautomation_rect.c
        │   ├── testautomation_render.c
        │   ├── testautomation_rwops.c
        │   ├── testautomation_sdltest.c
        │   ├── testautomation_stdlib.c
        │   ├── testautomation_suites.h
        │   ├── testautomation_surface.c
        │   ├── testautomation_syswm.c
        │   ├── testautomation_timer.c
        │   ├── testautomation_video.c
        │   ├── testbounds.c
        │   ├── testcustomcursor.c
        │   ├── testdisplayinfo.c
        │   ├── testdraw2.c
        │   ├── testdrawchessboard.c
        │   ├── testdropfile.c
        │   ├── testerror.c
        │   ├── testfile.c
        │   ├── testfilesystem.c
        │   ├── testgamecontroller.c
        │   ├── testgesture.c
        │   ├── testgl2.c
        │   ├── testgles.c
        │   ├── testgles2.c
        │   ├── testhaptic.c
        │   ├── testhittesting.c
        │   ├── testhotplug.c
        │   ├── testiconv.c
        │   ├── testime.c
        │   ├── testintersections.c
        │   ├── testjoystick.c
        │   ├── testkeys.c
        │   ├── testloadso.c
        │   ├── testlock.c
        │   ├── testmessage.c
        │   ├── testmultiaudio.c
        │   ├── testnative.c
        │   ├── testnative.h
        │   ├── testnativecocoa.m
        │   ├── testnativew32.c
        │   ├── testnativex11.c
        │   ├── testoverlay2.c
        │   ├── testplatform.c
        │   ├── testpower.c
        │   ├── testqsort.c
        │   ├── testrelative.c
        │   ├── testrendercopyex.c
        │   ├── testrendertarget.c
        │   ├── testresample.c
        │   ├── testrumble.c
        │   ├── testscale.c
        │   ├── testsem.c
        │   ├── testsensor.c
        │   ├── testshader.c
        │   ├── testshape.c
        │   ├── testsprite2.c
        │   ├── testspriteminimal.c
        │   ├── teststreaming.c
        │   ├── testthread.c
        │   ├── testtimer.c
        │   ├── testver.c
        │   ├── testviewport.c
        │   ├── testvulkan.c
        │   ├── testwm2.c
        │   ├── testyuv.c
        │   ├── testyuv_cvt.c
        │   ├── testyuv_cvt.h
        │   ├── torturethread.c
        │   └── utf8.txt
        └── x86_64-w64-mingw32/
            ├── bin/
            │   └── sdl2-config
            ├── include/
            │   └── SDL2/
            │       ├── SDL.h
            │       ├── SDL_assert.h
            │       ├── SDL_atomic.h
            │       ├── SDL_audio.h
            │       ├── SDL_bits.h
            │       ├── SDL_blendmode.h
            │       ├── SDL_clipboard.h
            │       ├── SDL_config.h
            │       ├── SDL_cpuinfo.h
            │       ├── SDL_egl.h
            │       ├── SDL_endian.h
            │       ├── SDL_error.h
            │       ├── SDL_events.h
            │       ├── SDL_filesystem.h
            │       ├── SDL_gamecontroller.h
            │       ├── SDL_gesture.h
            │       ├── SDL_haptic.h
            │       ├── SDL_hints.h
            │       ├── SDL_joystick.h
            │       ├── SDL_keyboard.h
            │       ├── SDL_keycode.h
            │       ├── SDL_loadso.h
            │       ├── SDL_log.h
            │       ├── SDL_main.h
            │       ├── SDL_messagebox.h
            │       ├── SDL_mouse.h
            │       ├── SDL_mutex.h
            │       ├── SDL_name.h
            │       ├── SDL_opengl.h
            │       ├── SDL_opengl_glext.h
            │       ├── SDL_opengles.h
            │       ├── SDL_opengles2.h
            │       ├── SDL_opengles2_gl2.h
            │       ├── SDL_opengles2_gl2ext.h
            │       ├── SDL_opengles2_gl2platform.h
            │       ├── SDL_opengles2_khrplatform.h
            │       ├── SDL_pixels.h
            │       ├── SDL_platform.h
            │       ├── SDL_power.h
            │       ├── SDL_quit.h
            │       ├── SDL_rect.h
            │       ├── SDL_render.h
            │       ├── SDL_revision.h
            │       ├── SDL_rwops.h
            │       ├── SDL_scancode.h
            │       ├── SDL_sensor.h
            │       ├── SDL_shape.h
            │       ├── SDL_stdinc.h
            │       ├── SDL_surface.h
            │       ├── SDL_system.h
            │       ├── SDL_syswm.h
            │       ├── SDL_test.h
            │       ├── SDL_test_assert.h
            │       ├── SDL_test_common.h
            │       ├── SDL_test_compare.h
            │       ├── SDL_test_crc32.h
            │       ├── SDL_test_font.h
            │       ├── SDL_test_fuzzer.h
            │       ├── SDL_test_harness.h
            │       ├── SDL_test_images.h
            │       ├── SDL_test_log.h
            │       ├── SDL_test_md5.h
            │       ├── SDL_test_memory.h
            │       ├── SDL_test_random.h
            │       ├── SDL_thread.h
            │       ├── SDL_timer.h
            │       ├── SDL_touch.h
            │       ├── SDL_types.h
            │       ├── SDL_version.h
            │       ├── SDL_video.h
            │       ├── SDL_vulkan.h
            │       ├── begin_code.h
            │       └── close_code.h
            ├── lib/
            │   ├── cmake/
            │   │   └── SDL2/
            │   │       └── sdl2-config.cmake
            │   ├── libSDL2.a
            │   ├── libSDL2.dll.a
            │   ├── libSDL2.la
            │   ├── libSDL2_test.a
            │   ├── libSDL2_test.la
            │   ├── libSDL2main.a
            │   ├── libSDL2main.la
            │   └── pkgconfig/
            │       └── sdl2.pc
            └── share/
                └── aclocal/
                    └── sdl2.m4
Download .txt
SYMBOL INDEX (2474 symbols across 233 files)

FILE: src/api/api.c
  function api_load_libs (line 14) | void api_load_libs(lua_State *L) {

FILE: src/api/renderer.c
  function RenColor (line 6) | static RenColor checkcolor(lua_State *L, int idx, int def) {
  function f_show_debug (line 24) | static int f_show_debug(lua_State *L) {
  function f_get_size (line 31) | static int f_get_size(lua_State *L) {
  function f_begin_frame (line 40) | static int f_begin_frame(lua_State *L) {
  function f_end_frame (line 46) | static int f_end_frame(lua_State *L) {
  function f_set_clip_rect (line 52) | static int f_set_clip_rect(lua_State *L) {
  function f_draw_rect (line 63) | static int f_draw_rect(lua_State *L) {
  function f_draw_text (line 75) | static int f_draw_text(lua_State *L) {
  function luaopen_renderer (line 101) | int luaopen_renderer(lua_State *L) {

FILE: src/api/renderer_font.c
  function f_load (line 6) | static int f_load(lua_State *L) {
  function f_set_tab_width (line 17) | static int f_set_tab_width(lua_State *L) {
  function f_gc (line 25) | static int f_gc(lua_State *L) {
  function f_get_width (line 32) | static int f_get_width(lua_State *L) {
  function f_get_height (line 40) | static int f_get_height(lua_State *L) {
  function luaopen_renderer_font (line 56) | int luaopen_renderer_font(lua_State *L) {

FILE: src/api/system.c
  function f_poll_event (line 38) | static int f_poll_event(lua_State *L) {
  function f_wait_event (line 135) | static int f_wait_event(lua_State *L) {
  function f_set_cursor (line 161) | static int f_set_cursor(lua_State *L) {
  function f_set_window_title (line 174) | static int f_set_window_title(lua_State *L) {
  function f_set_window_mode (line 184) | static int f_set_window_mode(lua_State *L) {
  function f_window_has_focus (line 194) | static int f_window_has_focus(lua_State *L) {
  function f_show_confirm_dialog (line 201) | static int f_show_confirm_dialog(lua_State *L) {
  function f_chdir (line 228) | static int f_chdir(lua_State *L) {
  function f_list_dir (line 236) | static int f_list_dir(lua_State *L) {
  function f_absolute_path (line 267) | static int f_absolute_path(lua_State *L) {
  function f_get_file_info (line 277) | static int f_get_file_info(lua_State *L) {
  function f_get_clipboard (line 308) | static int f_get_clipboard(lua_State *L) {
  function f_set_clipboard (line 317) | static int f_set_clipboard(lua_State *L) {
  function f_get_time (line 324) | static int f_get_time(lua_State *L) {
  function f_sleep (line 331) | static int f_sleep(lua_State *L) {
  function f_exec (line 338) | static int f_exec(lua_State *L) {
  function f_fuzzy_match (line 356) | static int f_fuzzy_match(lua_State *L) {
  function luaopen_system (line 404) | int luaopen_system(lua_State *L) {

FILE: src/lib/lua52/lapi.c
  function TValue (line 55) | static TValue *index2addr (lua_State *L, int idx) {
  function growstack (line 86) | static void growstack (lua_State *L, void *ud) {
  function LUA_API (line 92) | LUA_API int lua_checkstack (lua_State *L, int size) {
  function LUA_API (line 112) | LUA_API void lua_xmove (lua_State *from, lua_State *to, int n) {
  function LUA_API (line 127) | LUA_API lua_CFunction lua_atpanic (lua_State *L, lua_CFunction panicf) {
  function LUA_API (line 137) | LUA_API const lua_Number *lua_version (lua_State *L) {
  function LUA_API (line 153) | LUA_API int lua_absindex (lua_State *L, int idx) {
  function LUA_API (line 160) | LUA_API int lua_gettop (lua_State *L) {
  function LUA_API (line 165) | LUA_API void lua_settop (lua_State *L, int idx) {
  function LUA_API (line 182) | LUA_API void lua_remove (lua_State *L, int idx) {
  function LUA_API (line 193) | LUA_API void lua_insert (lua_State *L, int idx) {
  function moveto (line 206) | static void moveto (lua_State *L, TValue *fr, int idx) {
  function LUA_API (line 217) | LUA_API void lua_replace (lua_State *L, int idx) {
  function LUA_API (line 226) | LUA_API void lua_copy (lua_State *L, int fromidx, int toidx) {
  function LUA_API (line 235) | LUA_API void lua_pushvalue (lua_State *L, int idx) {
  function LUA_API (line 249) | LUA_API int lua_type (lua_State *L, int idx) {
  function LUA_API (line 255) | LUA_API const char *lua_typename (lua_State *L, int t) {
  function LUA_API (line 261) | LUA_API int lua_iscfunction (lua_State *L, int idx) {
  function LUA_API (line 267) | LUA_API int lua_isnumber (lua_State *L, int idx) {
  function LUA_API (line 274) | LUA_API int lua_isstring (lua_State *L, int idx) {
  function LUA_API (line 280) | LUA_API int lua_isuserdata (lua_State *L, int idx) {
  function LUA_API (line 286) | LUA_API int lua_rawequal (lua_State *L, int index1, int index2) {
  function LUA_API (line 293) | LUA_API void lua_arith (lua_State *L, int op) {
  function LUA_API (line 316) | LUA_API int lua_compare (lua_State *L, int index1, int index2, int op) {
  function LUA_API (line 335) | LUA_API lua_Number lua_tonumberx (lua_State *L, int idx, int *isnum) {
  function LUA_API (line 349) | LUA_API lua_Integer lua_tointegerx (lua_State *L, int idx, int *isnum) {
  function LUA_API (line 366) | LUA_API lua_Unsigned lua_tounsignedx (lua_State *L, int idx, int *isnum) {
  function LUA_API (line 383) | LUA_API int lua_toboolean (lua_State *L, int idx) {
  function LUA_API (line 389) | LUA_API const char *lua_tolstring (lua_State *L, int idx, size_t *len) {
  function LUA_API (line 407) | LUA_API size_t lua_rawlen (lua_State *L, int idx) {
  function LUA_API (line 418) | LUA_API lua_CFunction lua_tocfunction (lua_State *L, int idx) {
  function LUA_API (line 427) | LUA_API void *lua_touserdata (lua_State *L, int idx) {
  function LUA_API (line 437) | LUA_API lua_State *lua_tothread (lua_State *L, int idx) {
  function LUA_API (line 443) | LUA_API const void *lua_topointer (lua_State *L, int idx) {
  function LUA_API (line 465) | LUA_API void lua_pushnil (lua_State *L) {
  function LUA_API (line 473) | LUA_API void lua_pushnumber (lua_State *L, lua_Number n) {
  function LUA_API (line 483) | LUA_API void lua_pushinteger (lua_State *L, lua_Integer n) {
  function LUA_API (line 491) | LUA_API void lua_pushunsigned (lua_State *L, lua_Unsigned u) {
  function LUA_API (line 501) | LUA_API const char *lua_pushlstring (lua_State *L, const char *s, size_t...
  function LUA_API (line 513) | LUA_API const char *lua_pushstring (lua_State *L, const char *s) {
  function LUA_API (line 531) | LUA_API const char *lua_pushvfstring (lua_State *L, const char *fmt,
  function LUA_API (line 542) | LUA_API const char *lua_pushfstring (lua_State *L, const char *fmt, ...) {
  function LUA_API (line 555) | LUA_API void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n) {
  function LUA_API (line 577) | LUA_API void lua_pushboolean (lua_State *L, int b) {
  function LUA_API (line 585) | LUA_API void lua_pushlightuserdata (lua_State *L, void *p) {
  function LUA_API (line 593) | LUA_API int lua_pushthread (lua_State *L) {
  function LUA_API (line 608) | LUA_API void lua_getglobal (lua_State *L, const char *var) {
  function LUA_API (line 619) | LUA_API void lua_gettable (lua_State *L, int idx) {
  function LUA_API (line 628) | LUA_API void lua_getfield (lua_State *L, int idx, const char *k) {
  function LUA_API (line 639) | LUA_API void lua_rawget (lua_State *L, int idx) {
  function LUA_API (line 649) | LUA_API void lua_rawgeti (lua_State *L, int idx, int n) {
  function LUA_API (line 660) | LUA_API void lua_rawgetp (lua_State *L, int idx, const void *p) {
  function LUA_API (line 673) | LUA_API void lua_createtable (lua_State *L, int narray, int nrec) {
  function LUA_API (line 686) | LUA_API int lua_getmetatable (lua_State *L, int objindex) {
  function LUA_API (line 715) | LUA_API void lua_getuservalue (lua_State *L, int idx) {
  function LUA_API (line 734) | LUA_API void lua_setglobal (lua_State *L, const char *var) {
  function LUA_API (line 747) | LUA_API void lua_settable (lua_State *L, int idx) {
  function LUA_API (line 758) | LUA_API void lua_setfield (lua_State *L, int idx, const char *k) {
  function LUA_API (line 770) | LUA_API void lua_rawset (lua_State *L, int idx) {
  function LUA_API (line 784) | LUA_API void lua_rawseti (lua_State *L, int idx, int n) {
  function LUA_API (line 797) | LUA_API void lua_rawsetp (lua_State *L, int idx, const void *p) {
  function LUA_API (line 812) | LUA_API int lua_setmetatable (lua_State *L, int objindex) {
  function LUA_API (line 852) | LUA_API void lua_setuservalue (lua_State *L, int idx) {
  function LUA_API (line 880) | LUA_API int lua_getctx (lua_State *L, int *ctx) {
  function LUA_API (line 889) | LUA_API void lua_callk (lua_State *L, int nargs, int nresults, int ctx,
  type CallS (line 915) | struct CallS {  /* data to `f_call' */
  function f_call (line 921) | static void f_call (lua_State *L, void *ud) {
  function LUA_API (line 928) | LUA_API int lua_pcallk (lua_State *L, int nargs, int nresults, int errfunc,
  function LUA_API (line 973) | LUA_API int lua_load (lua_State *L, lua_Reader reader, void *data,
  function LUA_API (line 997) | LUA_API int lua_dump (lua_State *L, lua_Writer writer, void *data) {
  function LUA_API (line 1012) | LUA_API int lua_status (lua_State *L) {
  function LUA_API (line 1021) | LUA_API int lua_gc (lua_State *L, int what, int data) {
  function LUA_API (line 1105) | LUA_API int lua_error (lua_State *L) {
  function LUA_API (line 1114) | LUA_API int lua_next (lua_State *L, int idx) {
  function LUA_API (line 1131) | LUA_API void lua_concat (lua_State *L, int n) {
  function LUA_API (line 1147) | LUA_API void lua_len (lua_State *L, int idx) {
  function LUA_API (line 1157) | LUA_API lua_Alloc lua_getallocf (lua_State *L, void **ud) {
  function LUA_API (line 1167) | LUA_API void lua_setallocf (lua_State *L, lua_Alloc f, void *ud) {
  function LUA_API (line 1175) | LUA_API void *lua_newuserdata (lua_State *L, size_t size) {
  function LUA_API (line 1213) | LUA_API const char *lua_getupvalue (lua_State *L, int funcindex, int n) {
  function LUA_API (line 1227) | LUA_API const char *lua_setupvalue (lua_State *L, int funcindex, int n) {
  function UpVal (line 1246) | static UpVal **getupvalref (lua_State *L, int fidx, int n, LClosure **pf) {
  function LUA_API (line 1257) | LUA_API void *lua_upvalueid (lua_State *L, int fidx, int n) {
  function LUA_API (line 1276) | LUA_API void lua_upvaluejoin (lua_State *L, int fidx1, int n1,

FILE: src/lib/lua52/lauxlib.c
  function findfield (line 43) | static int findfield (lua_State *L, int objidx, int level) {
  function pushglobalfuncname (line 67) | static int pushglobalfuncname (lua_State *L, lua_Debug *ar) {
  function pushfuncname (line 83) | static void pushfuncname (lua_State *L, lua_Debug *ar) {
  function countlevels (line 101) | static int countlevels (lua_State *L) {
  function LUALIB_API (line 116) | LUALIB_API void luaL_traceback (lua_State *L, lua_State *L1,
  function LUALIB_API (line 153) | LUALIB_API int luaL_argerror (lua_State *L, int narg, const char *extram...
  function typeerror (line 171) | static int typeerror (lua_State *L, int narg, const char *tname) {
  function tag_error (line 178) | static void tag_error (lua_State *L, int narg, int tag) {
  function LUALIB_API (line 183) | LUALIB_API void luaL_where (lua_State *L, int level) {
  function LUALIB_API (line 196) | LUALIB_API int luaL_error (lua_State *L, const char *fmt, ...) {
  function LUALIB_API (line 207) | LUALIB_API int luaL_fileresult (lua_State *L, int stat, const char *fnam...
  function LUALIB_API (line 247) | LUALIB_API int luaL_execresult (lua_State *L, int stat) {
  function LUALIB_API (line 272) | LUALIB_API int luaL_newmetatable (lua_State *L, const char *tname) {
  function LUALIB_API (line 284) | LUALIB_API void luaL_setmetatable (lua_State *L, const char *tname) {
  function LUALIB_API (line 290) | LUALIB_API void *luaL_testudata (lua_State *L, int ud, const char *tname) {
  function LUALIB_API (line 305) | LUALIB_API void *luaL_checkudata (lua_State *L, int ud, const char *tnam...
  function LUALIB_API (line 320) | LUALIB_API int luaL_checkoption (lua_State *L, int narg, const char *def,
  function LUALIB_API (line 333) | LUALIB_API void luaL_checkstack (lua_State *L, int space, const char *ms...
  function LUALIB_API (line 345) | LUALIB_API void luaL_checktype (lua_State *L, int narg, int t) {
  function LUALIB_API (line 351) | LUALIB_API void luaL_checkany (lua_State *L, int narg) {
  function LUALIB_API (line 357) | LUALIB_API const char *luaL_checklstring (lua_State *L, int narg, size_t...
  function LUALIB_API (line 364) | LUALIB_API const char *luaL_optlstring (lua_State *L, int narg,
  function LUALIB_API (line 375) | LUALIB_API lua_Number luaL_checknumber (lua_State *L, int narg) {
  function LUALIB_API (line 384) | LUALIB_API lua_Number luaL_optnumber (lua_State *L, int narg, lua_Number...
  function LUALIB_API (line 389) | LUALIB_API lua_Integer luaL_checkinteger (lua_State *L, int narg) {
  function LUALIB_API (line 398) | LUALIB_API lua_Unsigned luaL_checkunsigned (lua_State *L, int narg) {
  function LUALIB_API (line 407) | LUALIB_API lua_Integer luaL_optinteger (lua_State *L, int narg,
  function LUALIB_API (line 413) | LUALIB_API lua_Unsigned luaL_optunsigned (lua_State *L, int narg,
  function LUALIB_API (line 437) | LUALIB_API char *luaL_prepbuffsize (luaL_Buffer *B, size_t sz) {
  function LUALIB_API (line 459) | LUALIB_API void luaL_addlstring (luaL_Buffer *B, const char *s, size_t l) {
  function LUALIB_API (line 466) | LUALIB_API void luaL_addstring (luaL_Buffer *B, const char *s) {
  function LUALIB_API (line 471) | LUALIB_API void luaL_pushresult (luaL_Buffer *B) {
  function LUALIB_API (line 479) | LUALIB_API void luaL_pushresultsize (luaL_Buffer *B, size_t sz) {
  function LUALIB_API (line 485) | LUALIB_API void luaL_addvalue (luaL_Buffer *B) {
  function LUALIB_API (line 496) | LUALIB_API void luaL_buffinit (lua_State *L, luaL_Buffer *B) {
  function LUALIB_API (line 504) | LUALIB_API char *luaL_buffinitsize (lua_State *L, luaL_Buffer *B, size_t...
  function LUALIB_API (line 522) | LUALIB_API int luaL_ref (lua_State *L, int t) {
  function LUALIB_API (line 543) | LUALIB_API void luaL_unref (lua_State *L, int t, int ref) {
  type LoadF (line 562) | typedef struct LoadF {
  function errfile (line 587) | static int errfile (lua_State *L, const char *what, int fnameindex) {
  function skipBOM (line 596) | static int skipBOM (LoadF *lf) {
  function skipcomment (line 617) | static int skipcomment (LoadF *lf, int *cp) {
  function LUALIB_API (line 630) | LUALIB_API int luaL_loadfilex (lua_State *L, const char *filename,
  type LoadS (line 666) | typedef struct LoadS {
  function LUALIB_API (line 682) | LUALIB_API int luaL_loadbufferx (lua_State *L, const char *buff, size_t ...
  function LUALIB_API (line 691) | LUALIB_API int luaL_loadstring (lua_State *L, const char *s) {
  function LUALIB_API (line 699) | LUALIB_API int luaL_getmetafield (lua_State *L, int obj, const char *eve...
  function LUALIB_API (line 715) | LUALIB_API int luaL_callmeta (lua_State *L, int obj, const char *event) {
  function LUALIB_API (line 725) | LUALIB_API int luaL_len (lua_State *L, int idx) {
  function LUALIB_API (line 737) | LUALIB_API const char *luaL_tolstring (lua_State *L, int idx, size_t *le...
  function libsize (line 797) | static int libsize (const luaL_Reg *l) {
  function LUALIB_API (line 810) | LUALIB_API void luaL_pushmodule (lua_State *L, const char *modname,
  function LUALIB_API (line 827) | LUALIB_API void luaL_openlib (lua_State *L, const char *libname,
  function LUALIB_API (line 848) | LUALIB_API void luaL_setfuncs (lua_State *L, const luaL_Reg *l, int nup) {
  function LUALIB_API (line 866) | LUALIB_API int luaL_getsubtable (lua_State *L, int idx, const char *fnam...
  function LUALIB_API (line 886) | LUALIB_API void luaL_requiref (lua_State *L, const char *modname,
  function LUALIB_API (line 902) | LUALIB_API const char *luaL_gsub (lua_State *L, const char *s, const cha...
  function panic (line 930) | static int panic (lua_State *L) {
  function LUALIB_API (line 937) | LUALIB_API lua_State *luaL_newstate (void) {
  function LUALIB_API (line 944) | LUALIB_API void luaL_checkversion_ (lua_State *L, lua_Number ver) {

FILE: src/lib/lua52/lauxlib.h
  type luaL_Reg (line 23) | typedef struct luaL_Reg {
  type luaL_Buffer (line 143) | typedef struct luaL_Buffer {
  type luaL_Stream (line 188) | typedef struct luaL_Stream {

FILE: src/lib/lua52/lbaselib.c
  function luaB_print (line 23) | static int luaB_print (lua_State *L) {
  function luaB_tonumber (line 48) | static int luaB_tonumber (lua_State *L) {
  function luaB_error (line 89) | static int luaB_error (lua_State *L) {
  function luaB_getmetatable (line 101) | static int luaB_getmetatable (lua_State *L) {
  function luaB_setmetatable (line 112) | static int luaB_setmetatable (lua_State *L) {
  function luaB_rawequal (line 125) | static int luaB_rawequal (lua_State *L) {
  function luaB_rawlen (line 133) | static int luaB_rawlen (lua_State *L) {
  function luaB_rawget (line 142) | static int luaB_rawget (lua_State *L) {
  function luaB_rawset (line 150) | static int luaB_rawset (lua_State *L) {
  function luaB_collectgarbage (line 160) | static int luaB_collectgarbage (lua_State *L) {
  function luaB_type (line 189) | static int luaB_type (lua_State *L) {
  function pairsmeta (line 196) | static int pairsmeta (lua_State *L, const char *method, int iszero,
  function luaB_next (line 213) | static int luaB_next (lua_State *L) {
  function luaB_pairs (line 225) | static int luaB_pairs (lua_State *L) {
  function ipairsaux (line 230) | static int ipairsaux (lua_State *L) {
  function luaB_ipairs (line 240) | static int luaB_ipairs (lua_State *L) {
  function load_aux (line 245) | static int load_aux (lua_State *L, int status, int envidx) {
  function luaB_loadfile (line 262) | static int luaB_loadfile (lua_State *L) {
  function luaB_load (line 309) | static int luaB_load (lua_State *L) {
  function dofilecont (line 331) | static int dofilecont (lua_State *L) {
  function luaB_dofile (line 336) | static int luaB_dofile (lua_State *L) {
  function luaB_assert (line 346) | static int luaB_assert (lua_State *L) {
  function luaB_select (line 353) | static int luaB_select (lua_State *L) {
  function finishpcall (line 369) | static int finishpcall (lua_State *L, int status) {
  function pcallcont (line 382) | static int pcallcont (lua_State *L) {
  function luaB_pcall (line 388) | static int luaB_pcall (lua_State *L) {
  function luaB_xpcall (line 398) | static int luaB_xpcall (lua_State *L) {
  function luaB_tostring (line 410) | static int luaB_tostring (lua_State *L) {
  function LUAMOD_API (line 447) | LUAMOD_API int luaopen_base (lua_State *L) {

FILE: src/lib/lua52/lbitlib.c
  type lua_Unsigned (line 32) | typedef lua_Unsigned b_uint;
  function b_uint (line 36) | static b_uint andaux (lua_State *L) {
  function b_and (line 45) | static int b_and (lua_State *L) {
  function b_test (line 52) | static int b_test (lua_State *L) {
  function b_or (line 59) | static int b_or (lua_State *L) {
  function b_xor (line 69) | static int b_xor (lua_State *L) {
  function b_not (line 79) | static int b_not (lua_State *L) {
  function b_shift (line 86) | static int b_shift (lua_State *L, b_uint r, int i) {
  function b_lshift (line 103) | static int b_lshift (lua_State *L) {
  function b_rshift (line 108) | static int b_rshift (lua_State *L) {
  function b_arshift (line 113) | static int b_arshift (lua_State *L) {
  function b_rot (line 128) | static int b_rot (lua_State *L, int i) {
  function b_lrot (line 139) | static int b_lrot (lua_State *L) {
  function b_rrot (line 144) | static int b_rrot (lua_State *L) {
  function fieldargs (line 155) | static int fieldargs (lua_State *L, int farg, int *width) {
  function b_extract (line 167) | static int b_extract (lua_State *L) {
  function b_replace (line 177) | static int b_replace (lua_State *L) {
  function LUAMOD_API (line 208) | LUAMOD_API int luaopen_bit32 (lua_State *L) {

FILE: src/lib/lua52/lcode.c
  function isnumeral (line 32) | static int isnumeral(expdesc *e) {
  function luaK_nil (line 37) | void luaK_nil (FuncState *fs, int from, int n) {
  function luaK_jump (line 59) | int luaK_jump (FuncState *fs) {
  function luaK_ret (line 69) | void luaK_ret (FuncState *fs, int first, int nret) {
  function condjump (line 74) | static int condjump (FuncState *fs, OpCode op, int A, int B, int C) {
  function fixjump (line 80) | static void fixjump (FuncState *fs, int pc, int dest) {
  function luaK_getlabel (line 94) | int luaK_getlabel (FuncState *fs) {
  function getjump (line 100) | static int getjump (FuncState *fs, int pc) {
  function Instruction (line 109) | static Instruction *getjumpcontrol (FuncState *fs, int pc) {
  function need_value (line 122) | static int need_value (FuncState *fs, int list) {
  function patchtestreg (line 131) | static int patchtestreg (FuncState *fs, int node, int reg) {
  function removevalues (line 144) | static void removevalues (FuncState *fs, int list) {
  function patchlistaux (line 150) | static void patchlistaux (FuncState *fs, int list, int vtarget, int reg,
  function dischargejpc (line 163) | static void dischargejpc (FuncState *fs) {
  function luaK_patchlist (line 169) | void luaK_patchlist (FuncState *fs, int list, int target) {
  function LUAI_FUNC (line 179) | LUAI_FUNC void luaK_patchclose (FuncState *fs, int list, int level) {
  function luaK_patchtohere (line 192) | void luaK_patchtohere (FuncState *fs, int list) {
  function luaK_concat (line 198) | void luaK_concat (FuncState *fs, int *l1, int l2) {
  function luaK_code (line 212) | static int luaK_code (FuncState *fs, Instruction i) {
  function luaK_codeABC (line 227) | int luaK_codeABC (FuncState *fs, OpCode o, int a, int b, int c) {
  function luaK_codeABx (line 236) | int luaK_codeABx (FuncState *fs, OpCode o, int a, unsigned int bc) {
  function codeextraarg (line 244) | static int codeextraarg (FuncState *fs, int a) {
  function luaK_codek (line 250) | int luaK_codek (FuncState *fs, int reg, int k) {
  function luaK_checkstack (line 261) | void luaK_checkstack (FuncState *fs, int n) {
  function luaK_reserveregs (line 271) | void luaK_reserveregs (FuncState *fs, int n) {
  function freereg (line 277) | static void freereg (FuncState *fs, int reg) {
  function freeexp (line 285) | static void freeexp (FuncState *fs, expdesc *e) {
  function addk (line 291) | static int addk (FuncState *fs, TValue *key, TValue *v) {
  function luaK_stringK (line 319) | int luaK_stringK (FuncState *fs, TString *s) {
  function luaK_numberK (line 326) | int luaK_numberK (FuncState *fs, lua_Number r) {
  function boolK (line 343) | static int boolK (FuncState *fs, int b) {
  function nilK (line 350) | static int nilK (FuncState *fs) {
  function luaK_setreturns (line 359) | void luaK_setreturns (FuncState *fs, expdesc *e, int nresults) {
  function luaK_setoneret (line 371) | void luaK_setoneret (FuncState *fs, expdesc *e) {
  function luaK_dischargevars (line 383) | void luaK_dischargevars (FuncState *fs, expdesc *e) {
  function code_label (line 415) | static int code_label (FuncState *fs, int A, int b, int jump) {
  function discharge2reg (line 421) | static void discharge2reg (FuncState *fs, expdesc *e, int reg) {
  function discharge2anyreg (line 460) | static void discharge2anyreg (FuncState *fs, expdesc *e) {
  function exp2reg (line 468) | static void exp2reg (FuncState *fs, expdesc *e, int reg) {
  function luaK_exp2nextreg (line 492) | void luaK_exp2nextreg (FuncState *fs, expdesc *e) {
  function luaK_exp2anyreg (line 500) | int luaK_exp2anyreg (FuncState *fs, expdesc *e) {
  function luaK_exp2anyregup (line 514) | void luaK_exp2anyregup (FuncState *fs, expdesc *e) {
  function luaK_exp2val (line 520) | void luaK_exp2val (FuncState *fs, expdesc *e) {
  function luaK_exp2RK (line 528) | int luaK_exp2RK (FuncState *fs, expdesc *e) {
  function luaK_storevar (line 558) | void luaK_storevar (FuncState *fs, expdesc *var, expdesc *ex) {
  function luaK_self (line 585) | void luaK_self (FuncState *fs, expdesc *e, expdesc *key) {
  function invertjump (line 598) | static void invertjump (FuncState *fs, expdesc *e) {
  function jumponcond (line 606) | static int jumponcond (FuncState *fs, expdesc *e, int cond) {
  function luaK_goiftrue (line 621) | void luaK_goiftrue (FuncState *fs, expdesc *e) {
  function luaK_goiffalse (line 645) | void luaK_goiffalse (FuncState *fs, expdesc *e) {
  function codenot (line 668) | static void codenot (FuncState *fs, expdesc *e) {
  function luaK_indexed (line 703) | void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k) {
  function constfolding (line 713) | static int constfolding (OpCode op, expdesc *e1, expdesc *e2) {
  function codearith (line 724) | static void codearith (FuncState *fs, OpCode op,
  function codecomp (line 746) | static void codecomp (FuncState *fs, OpCode op, int cond, expdesc *e1,
  function luaK_prefix (line 762) | void luaK_prefix (FuncState *fs, UnOpr op, expdesc *e, int line) {
  function luaK_infix (line 786) | void luaK_infix (FuncState *fs, BinOpr op, expdesc *v) {
  function luaK_posfix (line 813) | void luaK_posfix (FuncState *fs, BinOpr op,
  function luaK_fixline (line 862) | void luaK_fixline (FuncState *fs, int line) {
  function luaK_setlist (line 867) | void luaK_setlist (FuncState *fs, int base, int nelems, int tostore) {

FILE: src/lib/lua52/lcode.h
  type BinOpr (line 26) | typedef enum BinOpr {
  type UnOpr (line 36) | typedef enum UnOpr { OPR_MINUS, OPR_NOT, OPR_LEN, OPR_NOUNOPR } UnOpr;

FILE: src/lib/lua52/lcorolib.c
  function auxresume (line 20) | static int auxresume (lua_State *L, lua_State *co, int narg) {
  function luaB_coresume (line 49) | static int luaB_coresume (lua_State *L) {
  function luaB_auxwrap (line 67) | static int luaB_auxwrap (lua_State *L) {
  function luaB_cocreate (line 82) | static int luaB_cocreate (lua_State *L) {
  function luaB_cowrap (line 92) | static int luaB_cowrap (lua_State *L) {
  function luaB_yield (line 99) | static int luaB_yield (lua_State *L) {
  function luaB_costatus (line 104) | static int luaB_costatus (lua_State *L) {
  function luaB_corunning (line 132) | static int luaB_corunning (lua_State *L) {
  function LUAMOD_API (line 151) | LUAMOD_API int luaopen_coroutine (lua_State *L) {

FILE: src/lib/lua52/ldblib.c
  function checkstack (line 24) | static void checkstack (lua_State *L, lua_State *L1, int n) {
  function db_getregistry (line 30) | static int db_getregistry (lua_State *L) {
  function db_getmetatable (line 36) | static int db_getmetatable (lua_State *L) {
  function db_setmetatable (line 45) | static int db_setmetatable (lua_State *L) {
  function db_getuservalue (line 55) | static int db_getuservalue (lua_State *L) {
  function db_setuservalue (line 64) | static int db_setuservalue (lua_State *L) {
  function settabss (line 76) | static void settabss (lua_State *L, const char *i, const char *v) {
  function settabsi (line 82) | static void settabsi (lua_State *L, const char *i, int v) {
  function settabsb (line 88) | static void settabsb (lua_State *L, const char *i, int v) {
  function lua_State (line 94) | static lua_State *getthread (lua_State *L, int *arg) {
  function treatstackoption (line 106) | static void treatstackoption (lua_State *L, lua_State *L1, const char *f...
  function db_getinfo (line 117) | static int db_getinfo (lua_State *L) {
  function db_getlocal (line 168) | static int db_getlocal (lua_State *L) {
  function db_setlocal (line 198) | static int db_setlocal (lua_State *L) {
  function auxupvalue (line 213) | static int auxupvalue (lua_State *L, int get) {
  function db_getupvalue (line 225) | static int db_getupvalue (lua_State *L) {
  function db_setupvalue (line 230) | static int db_setupvalue (lua_State *L) {
  function checkupval (line 236) | static int checkupval (lua_State *L, int argf, int argnup) {
  function db_upvalueid (line 247) | static int db_upvalueid (lua_State *L) {
  function db_upvaluejoin (line 254) | static int db_upvaluejoin (lua_State *L) {
  function hookf (line 267) | static void hookf (lua_State *L, lua_Debug *ar) {
  function makemask (line 284) | static int makemask (const char *smask, int count) {
  function db_sethook (line 304) | static int db_sethook (lua_State *L) {
  function db_gethook (line 333) | static int db_gethook (lua_State *L) {
  function db_debug (line 354) | static int db_debug (lua_State *L) {
  function db_traceback (line 369) | static int db_traceback (lua_State *L) {
  function LUAMOD_API (line 404) | LUAMOD_API int luaopen_debug (lua_State *L) {

FILE: src/lib/lua52/ldebug.c
  function currentpc (line 39) | static int currentpc (CallInfo *ci) {
  function currentline (line 45) | static int currentline (CallInfo *ci) {
  function swapextra (line 50) | static void swapextra (lua_State *L) {
  function LUA_API (line 63) | LUA_API int lua_sethook (lua_State *L, lua_Hook func, int mask, int coun...
  function LUA_API (line 78) | LUA_API lua_Hook lua_gethook (lua_State *L) {
  function LUA_API (line 83) | LUA_API int lua_gethookmask (lua_State *L) {
  function LUA_API (line 88) | LUA_API int lua_gethookcount (lua_State *L) {
  function LUA_API (line 93) | LUA_API int lua_getstack (lua_State *L, int level, lua_Debug *ar) {
  function LUA_API (line 154) | LUA_API const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int...
  function LUA_API (line 178) | LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int...
  function funcinfo (line 193) | static void funcinfo (lua_Debug *ar, Closure *cl) {
  function collectvalidlines (line 211) | static void collectvalidlines (lua_State *L, Closure *f) {
  function auxgetinfo (line 230) | static int auxgetinfo (lua_State *L, const char *what, lua_Debug *ar,
  function LUA_API (line 281) | LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar) {
  function kname (line 327) | static void kname (Proto *p, int pc, int c, const char **name) {
  function filterpc (line 347) | static int filterpc (int pc, int jmptarget) {
  function findsetreg (line 357) | static int findsetreg (Proto *p, int lastpc, int reg) {
  function isinstack (line 508) | static int isinstack (CallInfo *ci, const TValue *o) {
  function l_noret (line 530) | l_noret luaG_typeerror (lua_State *L, const TValue *o, const char *op) {
  function l_noret (line 549) | l_noret luaG_concaterror (lua_State *L, StkId p1, StkId p2) {
  function l_noret (line 556) | l_noret luaG_aritherror (lua_State *L, const TValue *p1, const TValue *p...
  function l_noret (line 564) | l_noret luaG_ordererror (lua_State *L, const TValue *p1, const TValue *p...
  function addinfo (line 574) | static void addinfo (lua_State *L, const char *msg) {
  function l_noret (line 590) | l_noret luaG_errormsg (lua_State *L) {
  function l_noret (line 603) | l_noret luaG_runerror (lua_State *L, const char *fmt, ...) {

FILE: src/lib/lua52/ldo.c
  type lua_longjmp (line 77) | struct lua_longjmp {
  function seterrorobj (line 84) | static void seterrorobj (lua_State *L, int errcode, StkId oldtop) {
  function l_noret (line 103) | l_noret luaD_throw (lua_State *L, int errcode) {
  function luaD_rawrunprotected (line 125) | int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud) {
  function correctstack (line 142) | static void correctstack (lua_State *L, TValue *oldstack) {
  function luaD_reallocstack (line 161) | void luaD_reallocstack (lua_State *L, int newsize) {
  function luaD_growstack (line 175) | void luaD_growstack (lua_State *L, int n) {
  function stackinuse (line 194) | static int stackinuse (lua_State *L) {
  function luaD_shrinkstack (line 205) | void luaD_shrinkstack (lua_State *L) {
  function luaD_hook (line 217) | void luaD_hook (lua_State *L, int event, int line) {
  function callhook (line 244) | static void callhook (lua_State *L, CallInfo *ci) {
  function StkId (line 257) | static StkId adjust_varargs (lua_State *L, Proto *p, int actual) {
  function StkId (line 274) | static StkId tryfuncTM (lua_State *L, StkId func) {
  function luaD_precall (line 296) | int luaD_precall (lua_State *L, StkId func, int nresults) {
  function luaD_poscall (line 362) | int luaD_poscall (lua_State *L, StkId firstResult) {
  function luaD_call (line 393) | void luaD_call (lua_State *L, StkId func, int nResults, int allowyield) {
  function finishCcall (line 408) | static void finishCcall (lua_State *L) {
  function unroll (line 433) | static void unroll (lua_State *L, void *ud) {
  function CallInfo (line 451) | static CallInfo *findpcall (lua_State *L) {
  function recover (line 461) | static int recover (lua_State *L, int status) {
  function l_noret (line 485) | static l_noret resume_error (lua_State *L, const char *msg, StkId firstA...
  function resume (line 496) | static void resume (lua_State *L, void *ud) {
  function LUA_API (line 535) | LUA_API int lua_resume (lua_State *L, lua_State *from, int nargs) {
  function LUA_API (line 567) | LUA_API int lua_yieldk (lua_State *L, int nresults, int ctx, lua_CFuncti...
  function luaD_pcall (line 595) | int luaD_pcall (lua_State *L, Pfunc func, void *u,
  type SParser (line 622) | struct SParser {  /* data to `f_parser' */
  function checkmode (line 631) | static void checkmode (lua_State *L, const char *mode, const char *x) {
  function f_parser (line 640) | static void f_parser (lua_State *L, void *ud) {
  function luaD_protectedparser (line 662) | int luaD_protectedparser (lua_State *L, ZIO *z, const char *name,

FILE: src/lib/lua52/ldump.c
  type DumpState (line 18) | typedef struct {
  function DumpBlock (line 29) | static void DumpBlock(const void* b, size_t size, DumpState* D)
  function DumpChar (line 39) | static void DumpChar(int y, DumpState* D)
  function DumpInt (line 45) | static void DumpInt(int x, DumpState* D)
  function DumpNumber (line 50) | static void DumpNumber(lua_Number x, DumpState* D)
  function DumpVector (line 55) | static void DumpVector(const void* b, int n, size_t size, DumpState* D)
  function DumpString (line 61) | static void DumpString(const TString* s, DumpState* D)
  function DumpConstants (line 80) | static void DumpConstants(const Proto* f, DumpState* D)
  function DumpUpvalues (line 109) | static void DumpUpvalues(const Proto* f, DumpState* D)
  function DumpDebug (line 120) | static void DumpDebug(const Proto* f, DumpState* D)
  function DumpFunction (line 139) | static void DumpFunction(const Proto* f, DumpState* D)
  function DumpHeader (line 152) | static void DumpHeader(DumpState* D)
  function luaU_dump (line 162) | int luaU_dump (lua_State* L, const Proto* f, lua_Writer w, void* data, i...

FILE: src/lib/lua52/lfunc.c
  function Closure (line 23) | Closure *luaF_newCclosure (lua_State *L, int n) {
  function Closure (line 30) | Closure *luaF_newLclosure (lua_State *L, int n) {
  function UpVal (line 39) | UpVal *luaF_newupval (lua_State *L) {
  function UpVal (line 47) | UpVal *luaF_findupval (lua_State *L, StkId level) {
  function unlinkupval (line 75) | static void unlinkupval (UpVal *uv) {
  function luaF_freeupval (line 82) | void luaF_freeupval (lua_State *L, UpVal *uv) {
  function luaF_close (line 89) | void luaF_close (lua_State *L, StkId level) {
  function Proto (line 110) | Proto *luaF_newproto (lua_State *L) {
  function luaF_freeproto (line 135) | void luaF_freeproto (lua_State *L, Proto *f) {

FILE: src/lib/lua52/lgc.c
  function removeentry (line 107) | static void removeentry (Node *n) {
  function iscleared (line 121) | static int iscleared (global_State *g, const TValue *o) {
  function luaC_barrier_ (line 135) | void luaC_barrier_ (lua_State *L, GCObject *o, GCObject *v) {
  function luaC_barrierback_ (line 155) | void luaC_barrierback_ (lua_State *L, GCObject *o) {
  function LUAI_FUNC (line 172) | LUAI_FUNC void luaC_barrierproto_ (lua_State *L, Proto *p, Closure *c) {
  function luaC_checkupvalcolor (line 190) | void luaC_checkupvalcolor (global_State *g, UpVal *uv) {
  function GCObject (line 212) | GCObject *luaC_newobj (lua_State *L, int tt, size_t sz, GCObject **list,
  function reallymarkobject (line 243) | static void reallymarkobject (global_State *g, GCObject *o) {
  function markmt (line 301) | static void markmt (global_State *g) {
  function markbeingfnz (line 311) | static void markbeingfnz (global_State *g) {
  function remarkupvals (line 324) | static void remarkupvals (global_State *g) {
  function restartcollection (line 337) | static void restartcollection (global_State *g) {
  function traverseweakvalue (line 355) | static void traverseweakvalue (global_State *g, Table *h) {
  function traverseephemeron (line 378) | static int traverseephemeron (global_State *g, Table *h) {
  function traversestrongtable (line 416) | static void traversestrongtable (global_State *g, Table *h) {
  function lu_mem (line 434) | static lu_mem traversetable (global_State *g, Table *h) {
  function traverseproto (line 457) | static int traverseproto (global_State *g, Proto *f) {
  function lu_mem (line 479) | static lu_mem traverseCclosure (global_State *g, CClosure *cl) {
  function lu_mem (line 486) | static lu_mem traverseLclosure (global_State *g, LClosure *cl) {
  function lu_mem (line 495) | static lu_mem traversestack (global_State *g, lua_State *th) {
  function propagatemark (line 521) | static void propagatemark (global_State *g) {
  function propagateall (line 566) | static void propagateall (global_State *g) {
  function propagatelist (line 571) | static void propagatelist (global_State *g, GCObject *l) {
  function retraversegrays (line 582) | static void retraversegrays (global_State *g) {
  function convergeephemerons (line 594) | static void convergeephemerons (global_State *g) {
  function clearkeys (line 625) | static void clearkeys (global_State *g, GCObject *l, GCObject *f) {
  function clearvalues (line 643) | static void clearvalues (global_State *g, GCObject *l, GCObject *f) {
  function freeobj (line 663) | static void freeobj (lua_State *L, GCObject *o) {
  function sweepthread (line 698) | static void sweepthread (lua_State *L, lua_State *L1) {
  function GCObject (line 719) | static GCObject **sweeplist (lua_State *L, GCObject **p, lu_mem count) {
  function GCObject (line 758) | static GCObject **sweeptolive (lua_State *L, GCObject **p, int *n) {
  function checkSizes (line 778) | static void checkSizes (lua_State *L) {
  function GCObject (line 789) | static GCObject *udata2finalize (global_State *g) {
  function dothecall (line 803) | static void dothecall (lua_State *L, void *ud) {
  function GCTM (line 809) | static void GCTM (lua_State *L, int propagateerrors) {
  function separatetobefnz (line 845) | static void separatetobefnz (lua_State *L, int all) {
  function luaC_checkfinalizer (line 873) | void luaC_checkfinalizer (lua_State *L, GCObject *o, Table *mt) {
  function setpause (line 913) | static void setpause (global_State *g, l_mem estimate) {
  function entersweep (line 936) | static int entersweep (lua_State *L) {
  function luaC_changemode (line 952) | void luaC_changemode (lua_State *L, int mode) {
  function callallpendingfinalizers (line 974) | static void callallpendingfinalizers (lua_State *L, int propagateerrors) {
  function luaC_freeallobjects (line 983) | void luaC_freeallobjects (lua_State *L) {
  function l_mem (line 999) | static l_mem atomic (lua_State *L) {
  function lu_mem (line 1040) | static lu_mem singlestep (lua_State *L) {
  function luaC_runtilstate (line 1110) | void luaC_runtilstate (lua_State *L, int statesmask) {
  function generationalcollection (line 1117) | static void generationalcollection (lua_State *L) {
  function incstep (line 1139) | static void incstep (lua_State *L) {
  function luaC_forcestep (line 1163) | void luaC_forcestep (lua_State *L) {
  function luaC_step (line 1177) | void luaC_step (lua_State *L) {
  function luaC_fullgc (line 1189) | void luaC_fullgc (lua_State *L, int isemergency) {

FILE: src/lib/lua52/linit.c
  function LUALIB_API (line 52) | LUALIB_API void luaL_openlibs (lua_State *L) {

FILE: src/lib/lua52/liolib.c
  type luaL_Stream (line 122) | typedef luaL_Stream LStream;
  function io_type (line 130) | static int io_type (lua_State *L) {
  function f_tostring (line 144) | static int f_tostring (lua_State *L) {
  function FILE (line 154) | static FILE *tofile (lua_State *L) {
  function LStream (line 168) | static LStream *newprefile (lua_State *L) {
  function aux_close (line 176) | static int aux_close (lua_State *L) {
  function io_close (line 184) | static int io_close (lua_State *L) {
  function f_gc (line 192) | static int f_gc (lua_State *L) {
  function io_fclose (line 203) | static int io_fclose (lua_State *L) {
  function LStream (line 210) | static LStream *newfile (lua_State *L) {
  function opencheck (line 218) | static void opencheck (lua_State *L, const char *fname, const char *mode) {
  function io_open (line 226) | static int io_open (lua_State *L) {
  function io_pclose (line 240) | static int io_pclose (lua_State *L) {
  function io_popen (line 246) | static int io_popen (lua_State *L) {
  function io_tmpfile (line 256) | static int io_tmpfile (lua_State *L) {
  function FILE (line 263) | static FILE *getiofile (lua_State *L, const char *findex) {
  function g_iofile (line 273) | static int g_iofile (lua_State *L, const char *f, const char *mode) {
  function io_input (line 290) | static int io_input (lua_State *L) {
  function io_output (line 295) | static int io_output (lua_State *L) {
  function aux_lines (line 303) | static void aux_lines (lua_State *L, int toclose) {
  function f_lines (line 316) | static int f_lines (lua_State *L) {
  function io_lines (line 323) | static int io_lines (lua_State *L) {
  function read_number (line 350) | static int read_number (lua_State *L, FILE *f) {
  function test_eof (line 363) | static int test_eof (lua_State *L, FILE *f) {
  function read_line (line 371) | static int read_line (lua_State *L, FILE *f, int chop) {
  function read_all (line 395) | static void read_all (lua_State *L, FILE *f) {
  function read_chars (line 411) | static int read_chars (lua_State *L, FILE *f, size_t n) {
  function g_read (line 424) | static int g_read (lua_State *L, FILE *f, int first) {
  function io_read (line 474) | static int io_read (lua_State *L) {
  function f_read (line 479) | static int f_read (lua_State *L) {
  function io_readline (line 484) | static int io_readline (lua_State *L) {
  function g_write (line 514) | static int g_write (lua_State *L, FILE *f, int arg) {
  function io_write (line 534) | static int io_write (lua_State *L) {
  function f_write (line 539) | static int f_write (lua_State *L) {
  function f_seek (line 546) | static int f_seek (lua_State *L) {
  function f_setvbuf (line 565) | static int f_setvbuf (lua_State *L) {
  function io_flush (line 577) | static int io_flush (lua_State *L) {
  function f_flush (line 582) | static int f_flush (lua_State *L) {
  function createmeta (line 623) | static void createmeta (lua_State *L) {
  function io_noclose (line 635) | static int io_noclose (lua_State *L) {
  function createstdfile (line 644) | static void createstdfile (lua_State *L, FILE *f, const char *k,
  function LUAMOD_API (line 657) | LUAMOD_API int luaopen_io (lua_State *L) {

FILE: src/lib/lua52/llex.c
  function save (line 52) | static void save (LexState *ls, int c) {
  function luaX_init (line 65) | void luaX_init (lua_State *L) {
  function l_noret (line 104) | static l_noret lexerror (LexState *ls, const char *msg, int token) {
  function l_noret (line 114) | l_noret luaX_syntaxerror (LexState *ls, const char *msg) {
  function TString (line 124) | TString *luaX_newstring (LexState *ls, const char *str, size_t l) {
  function inclinenumber (line 148) | static void inclinenumber (LexState *ls) {
  function luaX_setinput (line 159) | void luaX_setinput (lua_State *L, LexState *ls, ZIO *z, TString *source,
  function check_next (line 185) | static int check_next (LexState *ls, const char *set) {
  function buffreplace (line 196) | static void buffreplace (LexState *ls, char from, char to) {
  function trydecpoint (line 215) | static void trydecpoint (LexState *ls, SemInfo *seminfo) {
  function read_numeral (line 232) | static void read_numeral (LexState *ls, SemInfo *seminfo) {
  function skip_sep (line 257) | static int skip_sep (LexState *ls) {
  function read_long_string (line 270) | static void read_long_string (LexState *ls, SemInfo *seminfo, int sep) {
  function escerror (line 305) | static void escerror (LexState *ls, int *c, int n, const char *msg) {
  function readhexaesc (line 315) | static int readhexaesc (LexState *ls) {
  function readdecesc (line 329) | static int readdecesc (LexState *ls) {
  function read_string (line 343) | static void read_string (LexState *ls, int del, SemInfo *seminfo) {
  function llex (line 401) | static int llex (LexState *ls, SemInfo *seminfo) {
  function luaX_next (line 514) | void luaX_next (LexState *ls) {
  function luaX_lookahead (line 525) | int luaX_lookahead (LexState *ls) {

FILE: src/lib/lua52/llex.h
  type RESERVED (line 22) | enum RESERVED {
  type SemInfo (line 37) | typedef union {
  type Token (line 43) | typedef struct Token {
  type LexState (line 51) | typedef struct LexState {

FILE: src/lib/lua52/llimits.h
  type lu_int32 (line 18) | typedef unsigned LUA_INT32 lu_int32;
  type LUAI_UMEM (line 20) | typedef LUAI_UMEM lu_mem;
  type LUAI_MEM (line 22) | typedef LUAI_MEM l_mem;
  type lu_byte (line 27) | typedef unsigned char lu_byte;
  type LUAI_USER_ALIGNMENT_T (line 53) | typedef LUAI_USER_ALIGNMENT_T L_Umaxalign;
  type LUAI_UACNUMBER (line 57) | typedef LUAI_UACNUMBER l_uacNumber;
  type lu_int32 (line 133) | typedef lu_int32 Instruction;

FILE: src/lib/lua52/lmathlib.c
  function math_abs (line 26) | static int math_abs (lua_State *L) {
  function math_sin (line 31) | static int math_sin (lua_State *L) {
  function math_sinh (line 36) | static int math_sinh (lua_State *L) {
  function math_cos (line 41) | static int math_cos (lua_State *L) {
  function math_cosh (line 46) | static int math_cosh (lua_State *L) {
  function math_tan (line 51) | static int math_tan (lua_State *L) {
  function math_tanh (line 56) | static int math_tanh (lua_State *L) {
  function math_asin (line 61) | static int math_asin (lua_State *L) {
  function math_acos (line 66) | static int math_acos (lua_State *L) {
  function math_atan (line 71) | static int math_atan (lua_State *L) {
  function math_atan2 (line 76) | static int math_atan2 (lua_State *L) {
  function math_ceil (line 82) | static int math_ceil (lua_State *L) {
  function math_floor (line 87) | static int math_floor (lua_State *L) {
  function math_fmod (line 92) | static int math_fmod (lua_State *L) {
  function math_modf (line 98) | static int math_modf (lua_State *L) {
  function math_sqrt (line 106) | static int math_sqrt (lua_State *L) {
  function math_pow (line 111) | static int math_pow (lua_State *L) {
  function math_log (line 118) | static int math_log (lua_State *L) {
  function math_log10 (line 133) | static int math_log10 (lua_State *L) {
  function math_exp (line 139) | static int math_exp (lua_State *L) {
  function math_deg (line 144) | static int math_deg (lua_State *L) {
  function math_rad (line 149) | static int math_rad (lua_State *L) {
  function math_frexp (line 154) | static int math_frexp (lua_State *L) {
  function math_ldexp (line 161) | static int math_ldexp (lua_State *L) {
  function math_min (line 170) | static int math_min (lua_State *L) {
  function math_max (line 184) | static int math_max (lua_State *L) {
  function math_random (line 198) | static int math_random (lua_State *L) {
  function math_randomseed (line 226) | static int math_randomseed (lua_State *L) {
  function LUAMOD_API (line 271) | LUAMOD_API int luaopen_math (lua_State *L) {

FILE: src/lib/lua52/lmem.c
  function l_noret (line 66) | l_noret luaM_toobig (lua_State *L) {

FILE: src/lib/lua52/loadlib.c
  function ll_unloadlib (line 129) | static void ll_unloadlib (void *lib) {
  function lua_CFunction (line 141) | static lua_CFunction ll_sym (lua_State *L, void *lib, const char *sym) {
  function setprogdir (line 168) | static void setprogdir (lua_State *L) {
  function pusherror (line 183) | static void pusherror (lua_State *L) {
  function ll_unloadlib (line 193) | static void ll_unloadlib (void *lib) {
  function lua_CFunction (line 206) | static lua_CFunction ll_sym (lua_State *L, void *lib, const char *sym) {
  function ll_unloadlib (line 229) | static void ll_unloadlib (void *lib) {
  function lua_CFunction (line 241) | static lua_CFunction ll_sym (lua_State *L, void *lib, const char *sym) {
  function ll_addtoclib (line 261) | static void ll_addtoclib (lua_State *L, const char *path, void *plib) {
  function gctm (line 275) | static int gctm (lua_State *L) {
  function ll_loadfunc (line 286) | static int ll_loadfunc (lua_State *L, const char *path, const char *sym) {
  function ll_loadlib (line 307) | static int ll_loadlib (lua_State *L) {
  function readable (line 330) | static int readable (const char *filename) {
  function ll_searchpath (line 372) | static int ll_searchpath (lua_State *L) {
  function checkload (line 398) | static int checkload (lua_State *L, int stat, const char *filename) {
  function searcher_Lua (line 410) | static int searcher_Lua (lua_State *L) {
  function loadfunc (line 419) | static int loadfunc (lua_State *L, const char *filename, const char *mod...
  function searcher_C (line 437) | static int searcher_C (lua_State *L) {
  function searcher_Croot (line 445) | static int searcher_Croot (lua_State *L) {
  function searcher_preload (line 468) | static int searcher_preload (lua_State *L) {
  function findloader (line 478) | static void findloader (lua_State *L, const char *name) {
  function ll_require (line 508) | static int ll_require (lua_State *L) {
  function set_env (line 546) | static void set_env (lua_State *L) {
  function dooptions (line 558) | static void dooptions (lua_State *L, int n) {
  function modinit (line 570) | static void modinit (lua_State *L, const char *modname) {
  function ll_module (line 585) | static int ll_module (lua_State *L) {
  function ll_seeall (line 604) | static int ll_seeall (lua_State *L) {
  function noenv (line 628) | static int noenv (lua_State *L) {
  function setpath (line 637) | static void setpath (lua_State *L, const char *fieldname, const char *en...
  function createsearcherstable (line 675) | static void createsearcherstable (lua_State *L) {
  function LUAMOD_API (line 690) | LUAMOD_API int luaopen_package (lua_State *L) {

FILE: src/lib/lua52/lobject.c
  function luaO_int2fb (line 36) | int luaO_int2fb (unsigned int x) {
  function luaO_fb2int (line 48) | int luaO_fb2int (int x) {
  function luaO_ceillog2 (line 55) | int luaO_ceillog2 (unsigned int x) {
  function lua_Number (line 73) | lua_Number luaO_arith (int op, lua_Number v1, lua_Number v2) {
  function luaO_hexavalue (line 87) | int luaO_hexavalue (int c) {
  function isneg (line 98) | static int isneg (const char **s) {
  function lua_Number (line 105) | static lua_Number readhexa (const char **s, lua_Number r, int *count) {
  function lua_Number (line 118) | static lua_Number lua_strx2number (const char *s, char **endptr) {
  function luaO_str2d (line 158) | int luaO_str2d (const char *s, size_t len, lua_Number *result) {
  function pushstr (line 173) | static void pushstr (lua_State *L, const char *str, size_t l) {
  function luaO_chunkid (line 252) | void luaO_chunkid (char *out, const char *source, size_t bufflen) {

FILE: src/lib/lua52/lobject.h
  type GCObject (line 70) | typedef union GCObject GCObject;
  type GCheader (line 83) | typedef struct GCheader {
  type Value (line 92) | typedef union Value Value;
  type TValue (line 106) | typedef struct lua_TValue TValue;
  type lua_TValue (line 397) | struct lua_TValue {
  type TValue (line 402) | typedef TValue *StkId;
  type TString (line 410) | typedef union TString {
  type Udata (line 431) | typedef union Udata {
  type Upvaldesc (line 446) | typedef struct Upvaldesc {
  type LocVar (line 457) | typedef struct LocVar {
  type Proto (line 467) | typedef struct Proto {
  type UpVal (line 496) | typedef struct UpVal {
  type CClosure (line 516) | typedef struct CClosure {
  type LClosure (line 523) | typedef struct LClosure {
  type Closure (line 530) | typedef union Closure {
  type TKey (line 545) | typedef union TKey {
  type Node (line 554) | typedef struct Node {
  type Table (line 560) | typedef struct Table {

FILE: src/lib/lua52/lopcodes.h
  type OpMode (line 32) | enum OpMode {iABC, iABx, iAsBx, iAx}
  type OpCode (line 165) | typedef enum {
  type OpArgMask (line 265) | enum OpArgMask {

FILE: src/lib/lua52/loslib.c
  function os_execute (line 80) | static int os_execute (lua_State *L) {
  function os_remove (line 92) | static int os_remove (lua_State *L) {
  function os_rename (line 98) | static int os_rename (lua_State *L) {
  function os_tmpname (line 105) | static int os_tmpname (lua_State *L) {
  function os_getenv (line 116) | static int os_getenv (lua_State *L) {
  function os_clock (line 122) | static int os_clock (lua_State *L) {
  function setfield (line 136) | static void setfield (lua_State *L, const char *key, int value) {
  function setboolfield (line 141) | static void setboolfield (lua_State *L, const char *key, int value) {
  function getboolfield (line 148) | static int getboolfield (lua_State *L, const char *key) {
  function getfield (line 157) | static int getfield (lua_State *L, const char *key, int d) {
  function os_date (line 195) | static int os_date (lua_State *L) {
  function os_time (line 241) | static int os_time (lua_State *L) {
  function os_difftime (line 266) | static int os_difftime (lua_State *L) {
  function os_setlocale (line 275) | static int os_setlocale (lua_State *L) {
  function os_exit (line 287) | static int os_exit (lua_State *L) {
  function LUAMOD_API (line 319) | LUAMOD_API int luaopen_os (lua_State *L) {

FILE: src/lib/lua52/lparser.c
  type BlockCnt (line 42) | typedef struct BlockCnt {
  function anchor_token (line 60) | static void anchor_token (LexState *ls) {
  function l_noret (line 71) | static l_noret semerror (LexState *ls, const char *msg) {
  function l_noret (line 77) | static l_noret error_expected (LexState *ls, int token) {
  function l_noret (line 83) | static l_noret errorlimit (FuncState *fs, int limit, const char *what) {
  function checklimit (line 96) | static void checklimit (FuncState *fs, int v, int l, const char *what) {
  function testnext (line 101) | static int testnext (LexState *ls, int c) {
  function check (line 110) | static void check (LexState *ls, int c) {
  function checknext (line 116) | static void checknext (LexState *ls, int c) {
  function check_match (line 126) | static void check_match (LexState *ls, int what, int who, int where) {
  function TString (line 139) | static TString *str_checkname (LexState *ls) {
  function init_exp (line 148) | static void init_exp (expdesc *e, expkind k, int i) {
  function codestring (line 155) | static void codestring (LexState *ls, expdesc *e, TString *s) {
  function checkname (line 160) | static void checkname (LexState *ls, expdesc *e) {
  function registerlocalvar (line 165) | static int registerlocalvar (LexState *ls, TString *varname) {
  function new_localvar (line 178) | static void new_localvar (LexState *ls, TString *name) {
  function new_localvarliteral_ (line 190) | static void new_localvarliteral_ (LexState *ls, const char *name, size_t...
  function LocVar (line 198) | static LocVar *getlocvar (FuncState *fs, int i) {
  function adjustlocalvars (line 205) | static void adjustlocalvars (LexState *ls, int nvars) {
  function removevars (line 214) | static void removevars (FuncState *fs, int tolevel) {
  function searchupvalue (line 221) | static int searchupvalue (FuncState *fs, TString *name) {
  function newupvalue (line 231) | static int newupvalue (FuncState *fs, TString *name, expdesc *v) {
  function searchvar (line 246) | static int searchvar (FuncState *fs, TString *n) {
  function markupval (line 260) | static void markupval (FuncState *fs, int level) {
  function singlevaraux (line 271) | static int singlevaraux (FuncState *fs, TString *n, expdesc *var, int ba...
  function singlevar (line 297) | static void singlevar (LexState *ls, expdesc *var) {
  function adjust_assign (line 310) | static void adjust_assign (LexState *ls, int nvars, int nexps, expdesc *...
  function enterlevel (line 330) | static void enterlevel (LexState *ls) {
  function closegoto (line 340) | static void closegoto (LexState *ls, int g, Labeldesc *label) {
  function findlabel (line 364) | static int findlabel (LexState *ls, int g) {
  function newlabelentry (line 384) | static int newlabelentry (LexState *ls, Labellist *l, TString *name,
  function findgotos (line 402) | static void findgotos (LexState *ls, Labeldesc *lb) {
  function movegotosout (line 420) | static void movegotosout (FuncState *fs, BlockCnt *bl) {
  function enterblock (line 438) | static void enterblock (FuncState *fs, BlockCnt *bl, lu_byte isloop) {
  function breaklabel (line 453) | static void breaklabel (LexState *ls) {
  function l_noret (line 463) | static l_noret undefgoto (LexState *ls, Labeldesc *gt) {
  function leaveblock (line 472) | static void leaveblock (FuncState *fs) {
  function Proto (line 498) | static Proto *addprototype (LexState *ls) {
  function codeclosure (line 520) | static void codeclosure (LexState *ls, expdesc *v) {
  function open_func (line 527) | static void open_func (LexState *ls, FuncState *fs, BlockCnt *bl) {
  function close_func (line 555) | static void close_func (LexState *ls) {
  function block_follow (line 593) | static int block_follow (LexState *ls, int withuntil) {
  function statlist (line 604) | static void statlist (LexState *ls) {
  function fieldsel (line 616) | static void fieldsel (LexState *ls, expdesc *v) {
  function yindex (line 627) | static void yindex (LexState *ls, expdesc *v) {
  type ConsControl (line 643) | struct ConsControl {
  function recfield (line 652) | static void recfield (LexState *ls, struct ConsControl *cc) {
  function closelistfield (line 673) | static void closelistfield (FuncState *fs, struct ConsControl *cc) {
  function lastlistfield (line 684) | static void lastlistfield (FuncState *fs, struct ConsControl *cc) {
  function listfield (line 699) | static void listfield (LexState *ls, struct ConsControl *cc) {
  function field (line 708) | static void field (LexState *ls, struct ConsControl *cc) {
  function constructor (line 730) | static void constructor (LexState *ls, expdesc *t) {
  function parlist (line 759) | static void parlist (LexState *ls) {
  function body (line 788) | static void body (LexState *ls, expdesc *e, int ismethod, int line) {
  function explist (line 810) | static int explist (LexState *ls, expdesc *v) {
  function funcargs (line 823) | static void funcargs (LexState *ls, expdesc *f, int line) {
  function primaryexp (line 877) | static void primaryexp (LexState *ls, expdesc *v) {
  function suffixedexp (line 899) | static void suffixedexp (LexState *ls, expdesc *v) {
  function simpleexp (line 937) | static void simpleexp (LexState *ls, expdesc *v) {
  function UnOpr (line 987) | static UnOpr getunopr (int op) {
  function BinOpr (line 997) | static BinOpr getbinopr (int op) {
  function BinOpr (line 1037) | static BinOpr subexpr (LexState *ls, expdesc *v, int limit) {
  function expr (line 1067) | static void expr (LexState *ls, expdesc *v) {
  function block (line 1082) | static void block (LexState *ls) {
  type LHS_assign (line 1096) | struct LHS_assign {
  function check_conflict (line 1108) | static void check_conflict (LexState *ls, struct LHS_assign *lh, expdesc...
  function assignment (line 1136) | static void assignment (LexState *ls, struct LHS_assign *lh, int nvars) {
  function cond (line 1169) | static int cond (LexState *ls) {
  function gotostat (line 1179) | static void gotostat (LexState *ls, int pc) {
  function checkrepeated (line 1195) | static void checkrepeated (FuncState *fs, Labellist *ll, TString *label) {
  function skipnoopstat (line 1209) | static void skipnoopstat (LexState *ls) {
  function labelstat (line 1215) | static void labelstat (LexState *ls, TString *label, int line) {
  function whilestat (line 1233) | static void whilestat (LexState *ls, int line) {
  function repeatstat (line 1252) | static void repeatstat (LexState *ls, int line) {
  function exp1 (line 1272) | static int exp1 (LexState *ls) {
  function forbody (line 1283) | static void forbody (LexState *ls, int base, int line, int nvars, int is...
  function fornum (line 1309) | static void fornum (LexState *ls, TString *varname, int line) {
  function forlist (line 1331) | static void forlist (LexState *ls, TString *indexname) {
  function forstat (line 1356) | static void forstat (LexState *ls, int line) {

FILE: src/lib/lua52/lparser.h
  type expkind (line 19) | typedef enum {
  type expdesc (line 40) | typedef struct expdesc {
  type Vardesc (line 57) | typedef struct Vardesc {
  type Labeldesc (line 63) | typedef struct Labeldesc {
  type Labellist (line 72) | typedef struct Labellist {
  type Dyndata (line 80) | typedef struct Dyndata {
  type BlockCnt (line 92) | struct BlockCnt
  type FuncState (line 96) | typedef struct FuncState {

FILE: src/lib/lua52/lstate.c
  type LX (line 59) | typedef struct LX {
  type LG (line 70) | typedef struct LG {
  function makeseed (line 89) | static unsigned int makeseed (lua_State *L) {
  function luaE_setdebt (line 106) | void luaE_setdebt (global_State *g, l_mem debt) {
  function CallInfo (line 112) | CallInfo *luaE_extendCI (lua_State *L) {
  function luaE_freeCI (line 122) | void luaE_freeCI (lua_State *L) {
  function stack_init (line 133) | static void stack_init (lua_State *L1, lua_State *L) {
  function freestack (line 153) | static void freestack (lua_State *L) {
  function init_registry (line 165) | static void init_registry (lua_State *L, global_State *g) {
  function f_luaopen (line 183) | static void f_luaopen (lua_State *L, void *ud) {
  function preinit_state (line 204) | static void preinit_state (lua_State *L, global_State *g) {
  function close_state (line 223) | static void close_state (lua_State *L) {
  function LUA_API (line 237) | LUA_API lua_State *lua_newthread (lua_State *L) {
  function luaE_freethread (line 256) | void luaE_freethread (lua_State *L, lua_State *L1) {
  function LUA_API (line 266) | LUA_API lua_State *lua_newstate (lua_Alloc f, void *ud) {
  function LUA_API (line 317) | LUA_API void lua_close (lua_State *L) {

FILE: src/lib/lua52/lstate.h
  type lua_longjmp (line 42) | struct lua_longjmp
  type stringtable (line 59) | typedef struct stringtable {
  type CallInfo (line 69) | typedef struct CallInfo {
  type global_State (line 112) | typedef struct global_State {
  type lua_State (line 154) | struct lua_State {
  type Table (line 190) | struct Table
  type Proto (line 191) | struct Proto
  type UpVal (line 192) | struct UpVal
  type lua_State (line 193) | struct lua_State

FILE: src/lib/lua52/lstring.c
  function luaS_eqlngstr (line 33) | int luaS_eqlngstr (TString *a, TString *b) {
  function luaS_eqstr (line 45) | int luaS_eqstr (TString *a, TString *b) {
  function luaS_hash (line 51) | unsigned int luaS_hash (const char *str, size_t l, unsigned int seed) {
  function luaS_resize (line 64) | void luaS_resize (lua_State *L, int newsize) {
  function TString (line 98) | static TString *createstrobj (lua_State *L, const char *str, size_t l,
  function TString (line 116) | static TString *newshrstr (lua_State *L, const char *str, size_t l,
  function TString (line 133) | static TString *internshrstr (lua_State *L, const char *str, size_t l) {
  function TString (line 156) | TString *luaS_newlstr (lua_State *L, const char *str, size_t l) {
  function TString (line 170) | TString *luaS_new (lua_State *L, const char *str) {
  function Udata (line 175) | Udata *luaS_newudata (lua_State *L, size_t s, Table *e) {

FILE: src/lib/lua52/lstrlib.c
  function str_len (line 37) | static int str_len (lua_State *L) {
  function posrelat (line 46) | static size_t posrelat (ptrdiff_t pos, size_t len) {
  function str_sub (line 53) | static int str_sub (lua_State *L) {
  function str_reverse (line 67) | static int str_reverse (lua_State *L) {
  function str_lower (line 79) | static int str_lower (lua_State *L) {
  function str_upper (line 92) | static int str_upper (lua_State *L) {
  function str_rep (line 108) | static int str_rep (lua_State *L) {
  function str_byte (line 133) | static int str_byte (lua_State *L) {
  function str_char (line 152) | static int str_char (lua_State *L) {
  function writer (line 167) | static int writer (lua_State *L, const void* b, size_t size, void* B) {
  function str_dump (line 174) | static int str_dump (lua_State *L) {
  type MatchState (line 198) | typedef struct MatchState {
  function check_capture (line 226) | static int check_capture (MatchState *ms, int l) {
  function capture_to_close (line 234) | static int capture_to_close (MatchState *ms) {
  function match_class (line 266) | static int match_class (int c, int cl) {
  function matchbracketclass (line 286) | static int matchbracketclass (int c, const char *p, const char *ec) {
  function singlematch (line 309) | static int singlematch (MatchState *ms, const char *s, const char *p,
  function push_onecapture (line 536) | static void push_onecapture (MatchState *ms, int i, const char *s,
  function push_captures (line 555) | static int push_captures (MatchState *ms, const char *s, const char *e) {
  function nospecials (line 566) | static int nospecials (const char *p, size_t l) {
  function str_find_aux (line 577) | static int str_find_aux (lua_State *L, int find) {
  function str_find (line 629) | static int str_find (lua_State *L) {
  function str_match (line 634) | static int str_match (lua_State *L) {
  function gmatch_aux (line 639) | static int gmatch_aux (lua_State *L) {
  function gmatch (line 668) | static int gmatch (lua_State *L) {
  function add_s (line 678) | static void add_s (MatchState *ms, luaL_Buffer *b, const char *s,
  function add_value (line 704) | static void add_value (MatchState *ms, luaL_Buffer *b, const char *s,
  function str_gsub (line 735) | static int str_gsub (lua_State *L) {
  function addquoted (line 833) | static void addquoted (lua_State *L, luaL_Buffer *b, int arg) {
  function addlenmod (line 882) | static void addlenmod (char *form, const char *lenmod) {
  function str_format (line 892) | static int str_format (lua_State *L) {
  function createmetatable (line 999) | static void createmetatable (lua_State *L) {
  function LUAMOD_API (line 1014) | LUAMOD_API int luaopen_string (lua_State *L) {

FILE: src/lib/lua52/ltable.c
  function Node (line 80) | static Node *hashnum (const Table *t, lua_Number n) {
  function Node (line 97) | static Node *mainposition (const Table *t, const TValue *key) {
  function arrayindex (line 127) | static int arrayindex (const TValue *key) {
  function findindex (line 144) | static int findindex (lua_State *L, Table *t, StkId key) {
  function luaH_next (line 169) | int luaH_next (lua_State *L, Table *t, StkId key) {
  function computesizes (line 196) | static int computesizes (int nums[], int *narray) {
  function countint (line 218) | static int countint (const TValue *key, int *nums) {
  function numusearray (line 229) | static int numusearray (const Table *t, int *nums) {
  function numusehash (line 254) | static int numusehash (const Table *t, int *nums, int *pnasize) {
  function setarrayvector (line 270) | static void setarrayvector (lua_State *L, Table *t, int size) {
  function setnodevector (line 279) | static void setnodevector (lua_State *L, Table *t, int size) {
  function luaH_resize (line 304) | void luaH_resize (lua_State *L, Table *t, int nasize, int nhsize) {
  function luaH_resizearray (line 337) | void luaH_resizearray (lua_State *L, Table *t, int nasize) {
  function rehash (line 343) | static void rehash (lua_State *L, Table *t, const TValue *ek) {
  function Table (line 368) | Table *luaH_new (lua_State *L) {
  function luaH_free (line 379) | void luaH_free (lua_State *L, Table *t) {
  function Node (line 387) | static Node *getfreepos (Table *t) {
  function TValue (line 405) | TValue *luaH_newkey (lua_State *L, Table *t, const TValue *key) {
  function TValue (line 446) | const TValue *luaH_getint (Table *t, int key) {
  function TValue (line 466) | const TValue *luaH_getstr (Table *t, TString *key) {
  function TValue (line 481) | const TValue *luaH_get (Table *t, const TValue *key) {
  function TValue (line 510) | TValue *luaH_set (lua_State *L, Table *t, const TValue *key) {
  function luaH_setint (line 518) | void luaH_setint (lua_State *L, Table *t, int key, TValue *value) {
  function unbound_search (line 532) | static int unbound_search (Table *t, unsigned int j) {
  function luaH_getn (line 560) | int luaH_getn (Table *t) {
  function Node (line 582) | Node *luaH_mainposition (const Table *t, const TValue *key) {
  function luaH_isdummy (line 586) | int luaH_isdummy (Node *n) { return isdummy(n); }

FILE: src/lib/lua52/ltablib.c
  function maxn (line 25) | static int maxn (lua_State *L) {
  function tinsert (line 42) | static int tinsert (lua_State *L) {
  function tremove (line 69) | static int tremove (lua_State *L) {
  function addfield (line 85) | static void addfield (lua_State *L, luaL_Buffer *b, int i) {
  function tconcat (line 94) | static int tconcat (lua_State *L) {
  function pack (line 120) | static int pack (lua_State *L) {
  function unpack (line 137) | static int unpack (lua_State *L) {
  function set2 (line 166) | static void set2 (lua_State *L, int i, int j) {
  function sort_comp (line 171) | static int sort_comp (lua_State *L, int a, int b) {
  function auxsort (line 186) | static void auxsort (lua_State *L, int l, int u) {
  function sort (line 249) | static int sort (lua_State *L) {
  function LUAMOD_API (line 276) | LUAMOD_API int luaopen_table (lua_State *L) {

FILE: src/lib/lua52/ltm.c
  function luaT_init (line 32) | void luaT_init (lua_State *L) {
  function TValue (line 52) | const TValue *luaT_gettm (Table *events, TMS event, TString *ename) {
  function TValue (line 63) | const TValue *luaT_gettmbyobj (lua_State *L, const TValue *o, TMS event) {

FILE: src/lib/lua52/ltm.h
  type TMS (line 18) | typedef enum {

FILE: src/lib/lua52/lua.h
  type lua_State (line 54) | typedef struct lua_State lua_State;
  type LUA_NUMBER (line 103) | typedef LUA_NUMBER lua_Number;
  type LUA_INTEGER (line 107) | typedef LUA_INTEGER lua_Integer;
  type LUA_UNSIGNED (line 110) | typedef LUA_UNSIGNED lua_Unsigned;
  type lua_Debug (line 375) | typedef struct lua_Debug lua_Debug;
  type lua_Debug (line 399) | struct lua_Debug {

FILE: src/lib/lua52/lundump.c
  type LoadState (line 23) | typedef struct {
  function l_noret (line 30) | static l_noret error(LoadState* S, const char* why)
  function LoadBlock (line 45) | static void LoadBlock(LoadState* S, void* b, size_t size)
  function LoadChar (line 50) | static int LoadChar(LoadState* S)
  function LoadInt (line 57) | static int LoadInt(LoadState* S)
  function lua_Number (line 65) | static lua_Number LoadNumber(LoadState* S)
  function TString (line 72) | static TString* LoadString(LoadState* S)
  function LoadCode (line 86) | static void LoadCode(LoadState* S, Proto* f)
  function LoadConstants (line 96) | static void LoadConstants(LoadState* S, Proto* f)
  function LoadUpvalues (line 135) | static void LoadUpvalues(LoadState* S, Proto* f)
  function LoadDebug (line 149) | static void LoadDebug(LoadState* S, Proto* f)
  function LoadFunction (line 171) | static void LoadFunction(LoadState* S, Proto* f)
  function LoadHeader (line 190) | static void LoadHeader(LoadState* S)
  function Closure (line 206) | Closure* luaU_undump (lua_State* L, ZIO* Z, Mbuffer* buff, const char* n...
  function luaU_header (line 244) | void luaU_header (lu_byte* h)

FILE: src/lib/lua52/lvm.c
  function TValue (line 35) | const TValue *luaV_tonumber (const TValue *obj, TValue *n) {
  function luaV_tostring (line 47) | int luaV_tostring (lua_State *L, StkId obj) {
  function traceexec (line 60) | static void traceexec (lua_State *L) {
  function callTM (line 93) | static void callTM (lua_State *L, const TValue *f, const TValue *p1,
  function luaV_gettable (line 110) | void luaV_gettable (lua_State *L, const TValue *t, TValue *key, StkId va...
  function luaV_settable (line 136) | void luaV_settable (lua_State *L, const TValue *t, TValue *key, StkId va...
  function call_binTM (line 175) | static int call_binTM (lua_State *L, const TValue *p1, const TValue *p2,
  function TValue (line 186) | static const TValue *get_equalTM (lua_State *L, Table *mt1, Table *mt2,
  function call_orderTM (line 200) | static int call_orderTM (lua_State *L, const TValue *p1, const TValue *p2,
  function l_strcmp (line 209) | static int l_strcmp (const TString *ls, const TString *rs) {
  function luaV_lessthan (line 231) | int luaV_lessthan (lua_State *L, const TValue *l, const TValue *r) {
  function luaV_lessequal (line 243) | int luaV_lessequal (lua_State *L, const TValue *l, const TValue *r) {
  function luaV_equalobj_ (line 260) | int luaV_equalobj_ (lua_State *L, const TValue *t1, const TValue *t2) {
  function luaV_concat (line 293) | void luaV_concat (lua_State *L, int total) {
  function luaV_objlen (line 335) | void luaV_objlen (lua_State *L, StkId ra, const TValue *rb) {
  function luaV_arith (line 360) | void luaV_arith (lua_State *L, StkId ra, const TValue *rb,
  function Closure (line 379) | static Closure *getcached (Proto *p, UpVal **encup, StkId base) {
  function pushclosure (line 401) | static void pushclosure (lua_State *L, Proto *p, UpVal **encup, StkId base,
  function luaV_finishOp (line 423) | void luaV_finishOp (lua_State *L) {
  function luaV_execute (line 534) | void luaV_execute (lua_State *L) {

FILE: src/lib/lua52/lzio.c
  function luaZ_fill (line 21) | int luaZ_fill (ZIO *z) {
  function luaZ_init (line 36) | void luaZ_init (lua_State *L, ZIO *z, lua_Reader reader, void *data) {
  function luaZ_read (line 46) | size_t luaZ_read (ZIO *z, void *b, size_t n) {

FILE: src/lib/lua52/lzio.h
  type ZIO (line 18) | typedef struct Zio ZIO;
  type Mbuffer (line 23) | typedef struct Mbuffer {
  type Zio (line 54) | struct Zio {

FILE: src/lib/stb/stb_truetype.h
  function my_stbtt_initfont (line 285) | void my_stbtt_initfont(void)
  function my_stbtt_print (line 297) | void my_stbtt_print(float x, float y, char *text)
  function main (line 330) | int main(int argc, char **argv)
  function main (line 371) | int main(int arg, char **argv)
  type stbtt_uint8 (line 424) | typedef unsigned char   stbtt_uint8;
  type stbtt_int8 (line 425) | typedef signed   char   stbtt_int8;
  type stbtt_uint16 (line 426) | typedef unsigned short  stbtt_uint16;
  type stbtt_int16 (line 427) | typedef signed   short  stbtt_int16;
  type stbtt_uint32 (line 428) | typedef unsigned int    stbtt_uint32;
  type stbtt_int32 (line 429) | typedef signed   int    stbtt_int32;
  type stbtt__buf (line 509) | typedef struct
  type stbtt_bakedchar (line 523) | typedef struct
  type stbtt_aligned_quad (line 539) | typedef struct
  type stbtt_packedchar (line 571) | typedef struct
  type stbtt_pack_context (line 578) | typedef struct stbtt_pack_context stbtt_pack_context;
  type stbtt_fontinfo (line 579) | typedef struct stbtt_fontinfo stbtt_fontinfo;
  type stbrp_rect (line 581) | typedef struct stbrp_rect stbrp_rect;
  type stbtt_pack_range (line 615) | typedef struct
  type stbtt_pack_context (line 674) | struct stbtt_pack_context {
  type stbtt_fontinfo (line 709) | struct stbtt_fontinfo
  type stbtt_kerningentry (line 800) | typedef struct stbtt_kerningentry
  type stbtt_vertex (line 831) | typedef struct
  type stbtt__bitmap (line 919) | typedef struct
  function stbtt_uint8 (line 1128) | static stbtt_uint8 stbtt__buf_get8(stbtt__buf *b)
  function stbtt_uint8 (line 1135) | static stbtt_uint8 stbtt__buf_peek8(stbtt__buf *b)
  function stbtt__buf_seek (line 1142) | static void stbtt__buf_seek(stbtt__buf *b, int o)
  function stbtt__buf_skip (line 1148) | static void stbtt__buf_skip(stbtt__buf *b, int o)
  function stbtt_uint32 (line 1153) | static stbtt_uint32 stbtt__buf_get(stbtt__buf *b, int n)
  function stbtt__buf (line 1163) | static stbtt__buf stbtt__new_buf(const void *p, size_t size)
  function stbtt__buf (line 1176) | static stbtt__buf stbtt__buf_range(const stbtt__buf *b, int o, int s)
  function stbtt__buf (line 1185) | static stbtt__buf stbtt__cff_get_index(stbtt__buf *b)
  function stbtt_uint32 (line 1199) | static stbtt_uint32 stbtt__cff_int(stbtt__buf *b)
  function stbtt__cff_skip_operand (line 1211) | static void stbtt__cff_skip_operand(stbtt__buf *b) {
  function stbtt__buf (line 1226) | static stbtt__buf stbtt__dict_get(stbtt__buf *b, int key)
  function stbtt__dict_get_ints (line 1241) | static void stbtt__dict_get_ints(stbtt__buf *b, int key, int outcount, s...
  function stbtt__cff_index_count (line 1249) | static int stbtt__cff_index_count(stbtt__buf *b)
  function stbtt__buf (line 1255) | static stbtt__buf stbtt__cff_index_get(stbtt__buf b, int i)
  function stbtt_uint16 (line 1281) | static stbtt_uint16 ttUSHORT(stbtt_uint8 *p) { return p[0]*256 + p[1]; }
  function stbtt_int16 (line 1282) | static stbtt_int16 ttSHORT(stbtt_uint8 *p)   { return p[0]*256 + p[1]; }
  function stbtt_uint32 (line 1283) | static stbtt_uint32 ttULONG(stbtt_uint8 *p)  { return (p[0]<<24) + (p[1]...
  function stbtt_int32 (line 1284) | static stbtt_int32 ttLONG(stbtt_uint8 *p)    { return (p[0]<<24) + (p[1]...
  function stbtt__isfont (line 1289) | static int stbtt__isfont(stbtt_uint8 *font)
  function stbtt_uint32 (line 1301) | static stbtt_uint32 stbtt__find_table(stbtt_uint8 *data, stbtt_uint32 fo...
  function stbtt_GetFontOffsetForIndex_internal (line 1314) | static int stbtt_GetFontOffsetForIndex_internal(unsigned char *font_coll...
  function stbtt_GetNumberOfFonts_internal (line 1333) | static int stbtt_GetNumberOfFonts_internal(unsigned char *font_collection)
  function stbtt__buf (line 1349) | static stbtt__buf stbtt__get_subrs(stbtt__buf cff, stbtt__buf fontdict)
  function stbtt__get_svg (line 1363) | static int stbtt__get_svg(stbtt_fontinfo *info)
  function stbtt_InitFont_internal (line 1378) | static int stbtt_InitFont_internal(stbtt_fontinfo *info, unsigned char *...
  function STBTT_DEF (line 1491) | STBTT_DEF int stbtt_FindGlyphIndex(const stbtt_fontinfo *info, int unico...
  function STBTT_DEF (line 1584) | STBTT_DEF int stbtt_GetCodepointShape(const stbtt_fontinfo *info, int un...
  function stbtt_setvertex (line 1589) | static void stbtt_setvertex(stbtt_vertex *v, stbtt_uint8 type, stbtt_int...
  function stbtt__GetGlyfOffset (line 1598) | static int stbtt__GetGlyfOffset(const stbtt_fontinfo *info, int glyph_in...
  function STBTT_DEF (line 1620) | STBTT_DEF int stbtt_GetGlyphBox(const stbtt_fontinfo *info, int glyph_in...
  function STBTT_DEF (line 1636) | STBTT_DEF int stbtt_GetCodepointBox(const stbtt_fontinfo *info, int code...
  function STBTT_DEF (line 1641) | STBTT_DEF int stbtt_IsGlyphEmpty(const stbtt_fontinfo *info, int glyph_i...
  function stbtt__close_shape (line 1653) | static int stbtt__close_shape(stbtt_vertex *vertices, int num_vertices, ...
  function stbtt__GetGlyphShapeTT (line 1669) | static int stbtt__GetGlyphShapeTT(const stbtt_fontinfo *info, int glyph_...
  type stbtt__csctx (line 1892) | typedef struct
  function stbtt__track_vertex (line 1906) | static void stbtt__track_vertex(stbtt__csctx *c, stbtt_int32 x, stbtt_in...
  function stbtt__csctx_v (line 1915) | static void stbtt__csctx_v(stbtt__csctx *c, stbtt_uint8 type, stbtt_int3...
  function stbtt__csctx_close_shape (line 1931) | static void stbtt__csctx_close_shape(stbtt__csctx *ctx)
  function stbtt__csctx_rmove_to (line 1937) | static void stbtt__csctx_rmove_to(stbtt__csctx *ctx, float dx, float dy)
  function stbtt__csctx_rline_to (line 1945) | static void stbtt__csctx_rline_to(stbtt__csctx *ctx, float dx, float dy)
  function stbtt__csctx_rccurve_to (line 1952) | static void stbtt__csctx_rccurve_to(stbtt__csctx *ctx, float dx1, float ...
  function stbtt__buf (line 1963) | static stbtt__buf stbtt__get_subr(stbtt__buf idx, int n)
  function stbtt__buf (line 1977) | static stbtt__buf stbtt__cid_get_glyph_subrs(const stbtt_fontinfo *info,...
  function stbtt__run_charstring (line 2005) | static int stbtt__run_charstring(const stbtt_fontinfo *info, int glyph_i...
  function stbtt__GetGlyphShapeT2 (line 2264) | static int stbtt__GetGlyphShapeT2(const stbtt_fontinfo *info, int glyph_...
  function stbtt__GetGlyphInfoT2 (line 2281) | static int stbtt__GetGlyphInfoT2(const stbtt_fontinfo *info, int glyph_i...
  function STBTT_DEF (line 2292) | STBTT_DEF int stbtt_GetGlyphShape(const stbtt_fontinfo *info, int glyph_...
  function STBTT_DEF (line 2300) | STBTT_DEF void stbtt_GetGlyphHMetrics(const stbtt_fontinfo *info, int gl...
  function STBTT_DEF (line 2312) | STBTT_DEF int  stbtt_GetKerningTableLength(const stbtt_fontinfo *info)
  function STBTT_DEF (line 2327) | STBTT_DEF int stbtt_GetKerningTable(const stbtt_fontinfo *info, stbtt_ke...
  function stbtt__GetGlyphKernInfoAdvance (line 2354) | static int  stbtt__GetGlyphKernInfoAdvance(const stbtt_fontinfo *info, i...
  function stbtt_int32 (line 2384) | static stbtt_int32  stbtt__GetCoverageIndex(stbtt_uint8 *coverageTable, ...
  function stbtt_int32 (line 2443) | static stbtt_int32  stbtt__GetGlyphClass(stbtt_uint8 *classDefTable, int...
  function stbtt_int32 (line 2495) | static stbtt_int32  stbtt__GetGlyphGPOSInfoAdvance(const stbtt_fontinfo ...
  function STBTT_DEF (line 2623) | STBTT_DEF int  stbtt_GetGlyphKernAdvance(const stbtt_fontinfo *info, int...
  function STBTT_DEF (line 2635) | STBTT_DEF int  stbtt_GetCodepointKernAdvance(const stbtt_fontinfo *info,...
  function STBTT_DEF (line 2642) | STBTT_DEF void stbtt_GetCodepointHMetrics(const stbtt_fontinfo *info, in...
  function STBTT_DEF (line 2647) | STBTT_DEF void stbtt_GetFontVMetrics(const stbtt_fontinfo *info, int *as...
  function STBTT_DEF (line 2654) | STBTT_DEF int  stbtt_GetFontVMetricsOS2(const stbtt_fontinfo *info, int ...
  function STBTT_DEF (line 2665) | STBTT_DEF void stbtt_GetFontBoundingBox(const stbtt_fontinfo *info, int ...
  function STBTT_DEF (line 2673) | STBTT_DEF float stbtt_ScaleForPixelHeight(const stbtt_fontinfo *info, fl...
  function STBTT_DEF (line 2679) | STBTT_DEF float stbtt_ScaleForMappingEmToPixels(const stbtt_fontinfo *in...
  function STBTT_DEF (line 2685) | STBTT_DEF void stbtt_FreeShape(const stbtt_fontinfo *info, stbtt_vertex *v)
  function STBTT_DEF (line 2690) | STBTT_DEF stbtt_uint8 *stbtt_FindSVGDoc(const stbtt_fontinfo *info, int gl)
  function STBTT_DEF (line 2707) | STBTT_DEF int stbtt_GetGlyphSVG(const stbtt_fontinfo *info, int gl, cons...
  function STBTT_DEF (line 2724) | STBTT_DEF int stbtt_GetCodepointSVG(const stbtt_fontinfo *info, int unic...
  function STBTT_DEF (line 2734) | STBTT_DEF void stbtt_GetGlyphBitmapBoxSubpixel(const stbtt_fontinfo *fon...
  function STBTT_DEF (line 2752) | STBTT_DEF void stbtt_GetGlyphBitmapBox(const stbtt_fontinfo *font, int g...
  function STBTT_DEF (line 2757) | STBTT_DEF void stbtt_GetCodepointBitmapBoxSubpixel(const stbtt_fontinfo ...
  function STBTT_DEF (line 2762) | STBTT_DEF void stbtt_GetCodepointBitmapBox(const stbtt_fontinfo *font, i...
  type stbtt__hheap_chunk (line 2771) | typedef struct stbtt__hheap_chunk
  type stbtt__hheap (line 2776) | typedef struct stbtt__hheap
  function stbtt__hheap_free (line 2804) | static void stbtt__hheap_free(stbtt__hheap *hh, void *p)
  function stbtt__hheap_cleanup (line 2810) | static void stbtt__hheap_cleanup(stbtt__hheap *hh, void *userdata)
  type stbtt__edge (line 2820) | typedef struct stbtt__edge {
  type stbtt__active_edge (line 2826) | typedef struct stbtt__active_edge
  function stbtt__active_edge (line 2848) | static stbtt__active_edge *stbtt__new_active(stbtt__hheap *hh, stbtt__ed...
  function stbtt__active_edge (line 2870) | static stbtt__active_edge *stbtt__new_active(stbtt__hheap *hh, stbtt__ed...
  function stbtt__fill_active_edges (line 2895) | static void stbtt__fill_active_edges(unsigned char *scanline, int len, s...
  function stbtt__rasterize_sorted_edges (line 2937) | static void stbtt__rasterize_sorted_edges(stbtt__bitmap *result, stbtt__...
  function stbtt__handle_clipped_edge (line 3041) | static void stbtt__handle_clipped_edge(float *scanline, int x, stbtt__ac...
  function stbtt__fill_active_edges_new (line 3078) | static void stbtt__fill_active_edges_new(float *scanline, float *scanlin...
  function stbtt__rasterize_sorted_edges (line 3240) | static void stbtt__rasterize_sorted_edges(stbtt__bitmap *result, stbtt__...
  function stbtt__sort_edges_ins_sort (line 3342) | static void stbtt__sort_edges_ins_sort(stbtt__edge *p, int n)
  function stbtt__sort_edges_quicksort (line 3360) | static void stbtt__sort_edges_quicksort(stbtt__edge *p, int n)
  function stbtt__sort_edges (line 3422) | static void stbtt__sort_edges(stbtt__edge *p, int n)
  type stbtt__point (line 3428) | typedef struct
  function stbtt__rasterize (line 3433) | static void stbtt__rasterize(stbtt__bitmap *result, stbtt__point *pts, i...
  function stbtt__add_point (line 3490) | static void stbtt__add_point(stbtt__point *points, int n, float x, float y)
  function stbtt__tesselate_curve (line 3498) | static int stbtt__tesselate_curve(stbtt__point *points, int *num_points,...
  function stbtt__tesselate_cubic (line 3518) | static void stbtt__tesselate_cubic(stbtt__point *points, int *num_points...
  function stbtt__point (line 3561) | static stbtt__point *stbtt_FlattenCurves(stbtt_vertex *vertices, int num...
  function STBTT_DEF (line 3638) | STBTT_DEF void stbtt_Rasterize(stbtt__bitmap *result, float flatness_in_...
  function STBTT_DEF (line 3651) | STBTT_DEF void stbtt_FreeBitmap(unsigned char *bitmap, void *userdata)
  function STBTT_DEF (line 3701) | STBTT_DEF void stbtt_MakeGlyphBitmapSubpixel(const stbtt_fontinfo *info,...
  function STBTT_DEF (line 3720) | STBTT_DEF void stbtt_MakeGlyphBitmap(const stbtt_fontinfo *info, unsigne...
  function STBTT_DEF (line 3730) | STBTT_DEF void stbtt_MakeCodepointBitmapSubpixelPrefilter(const stbtt_fo...
  function STBTT_DEF (line 3735) | STBTT_DEF void stbtt_MakeCodepointBitmapSubpixel(const stbtt_fontinfo *i...
  function STBTT_DEF (line 3745) | STBTT_DEF void stbtt_MakeCodepointBitmap(const stbtt_fontinfo *info, uns...
  function stbtt_BakeFontBitmap_internal (line 3756) | static int stbtt_BakeFontBitmap_internal(unsigned char *data, int offset...
  function STBTT_DEF (line 3802) | STBTT_DEF void stbtt_GetBakedQuad(const stbtt_bakedchar *chardata, int p...
  type stbrp_coord (line 3830) | typedef int stbrp_coord;
  type stbrp_context (line 3843) | typedef struct
  type stbrp_node (line 3849) | typedef struct
  type stbrp_rect (line 3854) | struct stbrp_rect
  function stbrp_init_target (line 3860) | static void stbrp_init_target(stbrp_context *con, int pw, int ph, stbrp_...
  function stbrp_pack_rects (line 3871) | static void stbrp_pack_rects(stbrp_context *con, stbrp_rect *rects, int ...
  function STBTT_DEF (line 3900) | STBTT_DEF int stbtt_PackBegin(stbtt_pack_context *spc, unsigned char *pi...
  function STBTT_DEF (line 3932) | STBTT_DEF void stbtt_PackEnd  (stbtt_pack_context *spc)
  function STBTT_DEF (line 3938) | STBTT_DEF void stbtt_PackSetOversampling(stbtt_pack_context *spc, unsign...
  function STBTT_DEF (line 3948) | STBTT_DEF void stbtt_PackSetSkipMissingCodepoints(stbtt_pack_context *sp...
  function stbtt__h_prefilter (line 3955) | static void stbtt__h_prefilter(unsigned char *pixels, int w, int h, int ...
  function stbtt__v_prefilter (line 4017) | static void stbtt__v_prefilter(unsigned char *pixels, int w, int h, int ...
  function stbtt__oversample_shift (line 4079) | static float stbtt__oversample_shift(int oversample)
  function STBTT_DEF (line 4092) | STBTT_DEF int stbtt_PackFontRangesGatherRects(stbtt_pack_context *spc, c...
  function STBTT_DEF (line 4127) | STBTT_DEF void stbtt_MakeGlyphBitmapSubpixelPrefilter(const stbtt_fontin...
  function STBTT_DEF (line 4151) | STBTT_DEF int stbtt_PackFontRangesRenderIntoRects(stbtt_pack_context *sp...
  function STBTT_DEF (line 4240) | STBTT_DEF void stbtt_PackFontRangesPackRects(stbtt_pack_context *spc, st...
  function STBTT_DEF (line 4245) | STBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context *spc, const unsign...
  function STBTT_DEF (line 4281) | STBTT_DEF int stbtt_PackFontRange(stbtt_pack_context *spc, const unsigne...
  function STBTT_DEF (line 4293) | STBTT_DEF void stbtt_GetScaledFontVMetrics(const unsigned char *fontdata...
  function STBTT_DEF (line 4306) | STBTT_DEF void stbtt_GetPackedQuad(const stbtt_packedchar *chardata, int...
  function stbtt__ray_intersect_bezier (line 4341) | static int stbtt__ray_intersect_bezier(float orig[2], float ray[2], floa...
  function equal (line 4405) | static int equal(float *a, float *b)
  function stbtt__compute_crossings_x (line 4410) | static int stbtt__compute_crossings_x(float x, float y, int nverts, stbt...
  function stbtt__cuberoot (line 4479) | static float stbtt__cuberoot( float x )
  function stbtt__solve_cubic (line 4488) | static int stbtt__solve_cubic(float a, float b, float c, float* r)
  function STBTT_DEF (line 4705) | STBTT_DEF void stbtt_FreeSDF(unsigned char *bitmap, void *userdata)
  function stbtt_int32 (line 4716) | static stbtt_int32 stbtt__CompareUTF8toUTF16_bigendian_prefix(stbtt_uint...
  function stbtt_CompareUTF8toUTF16_bigendian_internal (line 4755) | static int stbtt_CompareUTF8toUTF16_bigendian_internal(char *s1, int len...
  function STBTT_DEF (line 4762) | STBTT_DEF const char *stbtt_GetFontNameString(const stbtt_fontinfo *font...
  function stbtt__matchpair (line 4783) | static int stbtt__matchpair(stbtt_uint8 *fc, stbtt_uint32 nm, stbtt_uint...
  function stbtt__matches (line 4830) | static int stbtt__matches(stbtt_uint8 *fc, stbtt_uint32 offset, stbtt_ui...
  function stbtt_FindMatchingFont_internal (line 4859) | static int stbtt_FindMatchingFont_internal(unsigned char *font_collectio...
  function STBTT_DEF (line 4875) | STBTT_DEF int stbtt_BakeFontBitmap(const unsigned char *data, int offset,
  function STBTT_DEF (line 4882) | STBTT_DEF int stbtt_GetFontOffsetForIndex(const unsigned char *data, int...
  function STBTT_DEF (line 4887) | STBTT_DEF int stbtt_GetNumberOfFonts(const unsigned char *data)
  function STBTT_DEF (line 4892) | STBTT_DEF int stbtt_InitFont(stbtt_fontinfo *info, const unsigned char *...
  function STBTT_DEF (line 4897) | STBTT_DEF int stbtt_FindMatchingFont(const unsigned char *fontdata, cons...
  function STBTT_DEF (line 4902) | STBTT_DEF int stbtt_CompareUTF8toUTF16_bigendian(const char *s1, int len...

FILE: src/main.c
  function get_scale (line 18) | static double get_scale(void) {
  function get_exe_filename (line 29) | static void get_exe_filename(char *buf, int sz) {
  function init_window_icon (line 47) | static void init_window_icon(void) {
  function main (line 64) | int main(int argc, char **argv) {

FILE: src/rencache.c
  type Command (line 16) | typedef struct {
  function min (line 37) | static inline int min(int a, int b) { return a < b ? a : b; }
  function max (line 38) | static inline int max(int a, int b) { return a > b ? a : b; }
  function hash (line 43) | static void hash(unsigned *h, const void *data, int size) {
  function cell_idx (line 51) | static inline int cell_idx(int x, int y) {
  function rects_overlap (line 56) | static inline bool rects_overlap(RenRect a, RenRect b) {
  function RenRect (line 62) | static RenRect intersect_rects(RenRect a, RenRect b) {
  function RenRect (line 71) | static RenRect merge_rects(RenRect a, RenRect b) {
  function Command (line 80) | static Command* push_command(int type, int size) {
  function next_command (line 95) | static bool next_command(Command **prev) {
  function rencache_show_debug (line 105) | void rencache_show_debug(bool enable) {
  function rencache_free_font (line 110) | void rencache_free_font(RenFont *font) {
  function rencache_set_clip_rect (line 116) | void rencache_set_clip_rect(RenRect rect) {
  function rencache_draw_rect (line 122) | void rencache_draw_rect(RenRect rect, RenColor color) {
  function rencache_draw_text (line 132) | int rencache_draw_text(RenFont *font, const char *text, int x, int y, Re...
  function rencache_invalidate (line 155) | void rencache_invalidate(void) {
  function rencache_begin_frame (line 160) | void rencache_begin_frame(void) {
  function update_overlapping_cells (line 172) | static void update_overlapping_cells(RenRect r, unsigned h) {
  function push_rect (line 187) | static void push_rect(RenRect r, int *count) {
  function rencache_end_frame (line 201) | void rencache_end_frame(void) {

FILE: src/renderer.c
  type RenImage (line 10) | struct RenImage {
  type GlyphSet (line 15) | typedef struct {
  type RenFont (line 20) | struct RenFont {
  function ren_init (line 59) | void ren_init(SDL_Window *win) {
  function ren_update_rects (line 67) | void ren_update_rects(RenRect *rects, int count) {
  function ren_set_clip_rect (line 77) | void ren_set_clip_rect(RenRect rect) {
  function ren_get_size (line 85) | void ren_get_size(int *x, int *y) {
  function RenImage (line 92) | RenImage* ren_new_image(int width, int height) {
  function ren_free_image (line 103) | void ren_free_image(RenImage *image) {
  function GlyphSet (line 108) | static GlyphSet* load_glyphset(RenFont *font, int idx) {
  function GlyphSet (line 153) | static GlyphSet* get_glyphset(RenFont *font, int codepoint) {
  function RenFont (line 162) | RenFont* ren_load_font(const char *filename, float size) {
  function ren_free_font (line 206) | void ren_free_font(RenFont *font) {
  function ren_set_font_tab_width (line 219) | void ren_set_font_tab_width(RenFont *font, int n) {
  function ren_get_font_tab_width (line 225) | int ren_get_font_tab_width(RenFont *font) {
  function ren_get_font_width (line 231) | int ren_get_font_width(RenFont *font, const char *text) {
  function ren_get_font_height (line 245) | int ren_get_font_height(RenFont *font) {
  function RenColor (line 250) | static inline RenColor blend_pixel(RenColor dst, RenColor src) {
  function RenColor (line 259) | static inline RenColor blend_pixel2(RenColor dst, RenColor src, RenColor...
  function ren_draw_rect (line 278) | void ren_draw_rect(RenRect rect, RenColor color) {
  function ren_draw_image (line 301) | void ren_draw_image(RenImage *image, RenRect *sub, int x, int y, RenColo...
  function ren_draw_text (line 336) | int ren_draw_text(RenFont *font, const char *text, int x, int y, RenColo...

FILE: src/renderer.h
  type RenImage (line 7) | typedef struct RenImage RenImage;
  type RenFont (line 8) | typedef struct RenFont RenFont;
  type RenColor (line 10) | typedef struct { uint8_t b, g, r, a; } RenColor;
  type RenRect (line 11) | typedef struct { int x, y, width, height; } RenRect;

FILE: winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_assert.h
  type SDL_AssertState (line 102) | typedef enum
  type SDL_AssertData (line 111) | typedef struct SDL_AssertData

FILE: winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_atomic.h
  type SDL_SpinLock (line 89) | typedef int SDL_SpinLock;
  type SDL_atomic_t (line 216) | typedef struct { int value; } SDL_atomic_t;

FILE: winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_audio.h
  type Uint16 (line 64) | typedef Uint16 SDL_AudioFormat;
  type SDL_AudioSpec (line 178) | typedef struct SDL_AudioSpec
  type SDL_AudioCVT (line 192) | struct SDL_AudioCVT
  type SDL_AudioCVT (line 193) | struct SDL_AudioCVT
  type SDL_AUDIOCVT_PACKED (line 226) | typedef struct SDL_AudioCVT
  type Uint32 (line 330) | typedef Uint32 SDL_AudioDeviceID;
  type SDL_AudioStatus (line 395) | typedef enum
  type _SDL_AudioStream (line 531) | struct _SDL_AudioStream
  type SDL_AudioStream (line 532) | typedef struct _SDL_AudioStream SDL_AudioStream;

FILE: winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_bits.h
  function SDL_FORCE_INLINE (line 60) | SDL_FORCE_INLINE int
  function SDL_FORCE_INLINE (line 104) | SDL_FORCE_INLINE SDL_bool

FILE: winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_blendmode.h
  type SDL_BlendMode (line 40) | typedef enum
  type SDL_BlendOperation (line 62) | typedef enum
  type SDL_BlendFactor (line 75) | typedef enum

FILE: winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_egl.h
  type khronos_int32_t (line 177) | typedef int32_t                 khronos_int32_t;
  type khronos_uint32_t (line 178) | typedef uint32_t                khronos_uint32_t;
  type khronos_int64_t (line 179) | typedef int64_t                 khronos_int64_t;
  type khronos_uint64_t (line 180) | typedef uint64_t                khronos_uint64_t;
  type khronos_int32_t (line 190) | typedef int32_t                 khronos_int32_t;
  type khronos_uint32_t (line 191) | typedef uint32_t                khronos_uint32_t;
  type khronos_int64_t (line 192) | typedef int64_t                 khronos_int64_t;
  type khronos_uint64_t (line 193) | typedef uint64_t                khronos_uint64_t;
  type __int32 (line 202) | typedef __int32                 khronos_int32_t;
  type khronos_uint32_t (line 203) | typedef unsigned __int32        khronos_uint32_t;
  type __int64 (line 204) | typedef __int64                 khronos_int64_t;
  type khronos_uint64_t (line 205) | typedef unsigned __int64        khronos_uint64_t;
  type khronos_int32_t (line 214) | typedef int                     khronos_int32_t;
  type khronos_uint32_t (line 215) | typedef unsigned int            khronos_uint32_t;
  type khronos_int64_t (line 217) | typedef long int                khronos_int64_t;
  type khronos_uint64_t (line 218) | typedef unsigned long int       khronos_uint64_t;
  type khronos_int64_t (line 220) | typedef long long int           khronos_int64_t;
  type khronos_uint64_t (line 221) | typedef unsigned long long int  khronos_uint64_t;
  type khronos_int32_t (line 231) | typedef int                     khronos_int32_t;
  type khronos_uint32_t (line 232) | typedef unsigned int            khronos_uint32_t;
  type khronos_int32_t (line 242) | typedef int32_t                 khronos_int32_t;
  type khronos_uint32_t (line 243) | typedef uint32_t                khronos_uint32_t;
  type khronos_int64_t (line 244) | typedef int64_t                 khronos_int64_t;
  type khronos_uint64_t (line 245) | typedef uint64_t                khronos_uint64_t;
  type khronos_int8_t (line 255) | typedef signed   char          khronos_int8_t;
  type khronos_uint8_t (line 256) | typedef unsigned char          khronos_uint8_t;
  type khronos_int16_t (line 257) | typedef signed   short int     khronos_int16_t;
  type khronos_uint16_t (line 258) | typedef unsigned short int     khronos_uint16_t;
  type khronos_intptr_t (line 266) | typedef signed   long long int khronos_intptr_t;
  type khronos_uintptr_t (line 267) | typedef unsigned long long int khronos_uintptr_t;
  type khronos_ssize_t (line 268) | typedef signed   long long int khronos_ssize_t;
  type khronos_usize_t (line 269) | typedef unsigned long long int khronos_usize_t;
  type khronos_intptr_t (line 271) | typedef signed   long  int     khronos_intptr_t;
  type khronos_uintptr_t (line 272) | typedef unsigned long  int     khronos_uintptr_t;
  type khronos_ssize_t (line 273) | typedef signed   long  int     khronos_ssize_t;
  type khronos_usize_t (line 274) | typedef unsigned long  int     khronos_usize_t;
  type khronos_float_t (line 281) | typedef          float         khronos_float_t;
  type khronos_uint64_t (line 294) | typedef khronos_uint64_t       khronos_utime_nanoseconds_t;
  type khronos_int64_t (line 295) | typedef khronos_int64_t        khronos_stime_nanoseconds_t;
  type khronos_boolean_enum_t (line 311) | typedef enum {
  type IUnknown (line 397) | typedef IUnknown * EGLNativeWindowType;
  type IUnknown (line 398) | typedef IUnknown * EGLNativePixmapType;
  type IUnknown (line 399) | typedef IUnknown * EGLNativeDisplayType;
  type HDC (line 401) | typedef HDC     EGLNativeDisplayType;
  type HBITMAP (line 402) | typedef HBITMAP EGLNativePixmapType;
  type HWND (line 403) | typedef HWND    EGLNativeWindowType;
  type EGLNativeDisplayType (line 408) | typedef int   EGLNativeDisplayType;
  type wl_display (line 414) | struct wl_display
  type wl_egl_pixmap (line 415) | struct wl_egl_pixmap
  type wl_egl_window (line 416) | struct wl_egl_window
  type gbm_device (line 420) | struct gbm_device
  type gbm_bo (line 421) | struct gbm_bo
  type ANativeWindow (line 426) | struct ANativeWindow
  type egl_native_pixmap_t (line 427) | struct egl_native_pixmap_t
  type ANativeWindow (line 429) | struct ANativeWindow
  type egl_native_pixmap_t (line 430) | struct egl_native_pixmap_t
  type MirEGLNativeDisplayType (line 436) | typedef MirEGLNativeDisplayType EGLNativeDisplayType;
  type MirEGLNativeWindowType (line 438) | typedef MirEGLNativeWindowType  EGLNativeWindowType;
  type khronos_uintptr_t (line 445) | typedef khronos_uintptr_t EGLNativePixmapType;
  type khronos_uintptr_t (line 446) | typedef khronos_uintptr_t EGLNativeWindowType;
  type Display (line 454) | typedef Display *EGLNativeDisplayType;
  type Pixmap (line 455) | typedef Pixmap   EGLNativePixmapType;
  type Window (line 456) | typedef Window   EGLNativeWindowType;
  type EGLNativeDisplayType (line 465) | typedef EGLNativeDisplayType NativeDisplayType;
  type EGLNativePixmapType (line 466) | typedef EGLNativePixmapType  NativePixmapType;
  type EGLNativeWindowType (line 467) | typedef EGLNativeWindowType  NativeWindowType;
  type khronos_int32_t (line 477) | typedef khronos_int32_t EGLint;
  type EGLBoolean (line 534) | typedef unsigned int EGLBoolean;
  type EGLenum (line 649) | typedef unsigned int EGLenum;
  type EGLAttrib (line 719) | typedef intptr_t EGLAttrib;
  type khronos_utime_nanoseconds_t (line 720) | typedef khronos_utime_nanoseconds_t EGLTime;
  type EGLAttribKHR (line 846) | typedef intptr_t EGLAttribKHR;
  type EGLAttribKHR (line 847) | typedef EGLSyncKHR (EGLAPIENTRYP PFNEGLCREATESYNC64KHRPROC) (EGLDisplay ...
  type khronos_utime_nanoseconds_t (line 888) | typedef khronos_utime_nanoseconds_t EGLTimeKHR;
  type khronos_uint64_t (line 1063) | typedef khronos_uint64_t EGLuint64KHR;
  type EGLNativeFileDescriptorKHR (line 1110) | typedef int EGLNativeFileDescriptorKHR;
  type khronos_ssize_t (line 1180) | typedef khronos_ssize_t EGLsizeiANDROID;
  type EGLsizeiANDROID (line 1182) | typedef EGLsizeiANDROID (*EGLGetBlobFuncANDROID) (const void *key, EGLsi...
  type EGLAttrib (line 1342) | typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETOUTPUTLAYERSEXTPROC) (EGLDispl...
  type EGLAttrib (line 1343) | typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETOUTPUTPORTSEXTPROC) (EGLDispla...
  type const (line 1377) | typedef EGLDisplay (EGLAPIENTRYP PFNEGLGETPLATFORMDISPLAYEXTPROC) (EGLen...
  type const (line 1378) | typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPRO...
  type const (line 1379) | typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPLATFORMPIXMAPSURFACEEXTPRO...
  type EGLClientPixmapHI (line 1455) | struct EGLClientPixmapHI {
  type EGLClientPixmapHI (line 1462) | struct EGLClientPixmapHI
  type EGLClientPixmapHI (line 1464) | struct EGLClientPixmapHI
  type khronos_utime_nanoseconds_t (line 1611) | typedef khronos_utime_nanoseconds_t EGLTimeNV;
  type khronos_utime_nanoseconds_t (line 1645) | typedef khronos_utime_nanoseconds_t EGLuint64NV;

FILE: winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_endian.h
  function SDL_FORCE_INLINE (line 70) | SDL_FORCE_INLINE Uint16
  function SDL_FORCE_INLINE (line 77) | SDL_FORCE_INLINE Uint16
  function SDL_FORCE_INLINE (line 84) | SDL_FORCE_INLINE Uint16
  function SDL_FORCE_INLINE (line 93) | SDL_FORCE_INLINE Uint16
  function SDL_FORCE_INLINE (line 106) | SDL_FORCE_INLINE Uint16
  function SDL_FORCE_INLINE (line 114) | SDL_FORCE_INLINE Uint32
  function SDL_FORCE_INLINE (line 121) | SDL_FORCE_INLINE Uint32
  function SDL_FORCE_INLINE (line 128) | SDL_FORCE_INLINE Uint32
  function SDL_FORCE_INLINE (line 139) | SDL_FORCE_INLINE Uint32
  function SDL_FORCE_INLINE (line 161) | SDL_FORCE_INLINE Uint32
  function SDL_FORCE_INLINE (line 170) | SDL_FORCE_INLINE Uint64
  function SDL_FORCE_INLINE (line 188) | SDL_FORCE_INLINE Uint64
  function SDL_FORCE_INLINE (line 195) | SDL_FORCE_INLINE Uint64
  function SDL_FORCE_INLINE (line 212) | SDL_FORCE_INLINE float

FILE: winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_error.h
  type SDL_errorcode (line 55) | typedef enum

FILE: winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_events.h
  type SDL_EventType (line 55) | typedef enum
  type SDL_CommonEvent (line 171) | typedef struct SDL_CommonEvent
  type SDL_DisplayEvent (line 180) | typedef struct SDL_DisplayEvent
  type SDL_WindowEvent (line 195) | typedef struct SDL_WindowEvent
  type SDL_KeyboardEvent (line 211) | typedef struct SDL_KeyboardEvent
  type SDL_TextEditingEvent (line 227) | typedef struct SDL_TextEditingEvent
  type SDL_TextInputEvent (line 242) | typedef struct SDL_TextInputEvent
  type SDL_MouseMotionEvent (line 253) | typedef struct SDL_MouseMotionEvent
  type SDL_MouseButtonEvent (line 269) | typedef struct SDL_MouseButtonEvent
  type SDL_MouseWheelEvent (line 286) | typedef struct SDL_MouseWheelEvent
  type SDL_JoyAxisEvent (line 300) | typedef struct SDL_JoyAxisEvent
  type SDL_JoyBallEvent (line 316) | typedef struct SDL_JoyBallEvent
  type SDL_JoyHatEvent (line 332) | typedef struct SDL_JoyHatEvent
  type SDL_JoyButtonEvent (line 352) | typedef struct SDL_JoyButtonEvent
  type SDL_JoyDeviceEvent (line 366) | typedef struct SDL_JoyDeviceEvent
  type SDL_ControllerAxisEvent (line 377) | typedef struct SDL_ControllerAxisEvent
  type SDL_ControllerButtonEvent (line 394) | typedef struct SDL_ControllerButtonEvent
  type SDL_ControllerDeviceEvent (line 409) | typedef struct SDL_ControllerDeviceEvent
  type SDL_AudioDeviceEvent (line 419) | typedef struct SDL_AudioDeviceEvent
  type SDL_TouchFingerEvent (line 434) | typedef struct SDL_TouchFingerEvent
  type SDL_MultiGestureEvent (line 451) | typedef struct SDL_MultiGestureEvent
  type SDL_DollarGestureEvent (line 468) | typedef struct SDL_DollarGestureEvent
  type SDL_DropEvent (line 486) | typedef struct SDL_DropEvent
  type SDL_SensorEvent (line 498) | typedef struct SDL_SensorEvent
  type SDL_QuitEvent (line 509) | typedef struct SDL_QuitEvent
  type SDL_OSEvent (line 518) | typedef struct SDL_OSEvent
  type SDL_UserEvent (line 527) | typedef struct SDL_UserEvent
  type SDL_SysWMmsg (line 538) | struct SDL_SysWMmsg
  type SDL_SysWMmsg (line 539) | typedef struct SDL_SysWMmsg SDL_SysWMmsg;
  type SDL_SysWMEvent (line 547) | typedef struct SDL_SysWMEvent
  type SDL_Event (line 557) | typedef union SDL_Event
  type SDL_eventaction (line 613) | typedef enum

FILE: winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_gamecontroller.h
  type _SDL_GameController (line 57) | struct _SDL_GameController
  type SDL_GameController (line 58) | typedef struct _SDL_GameController SDL_GameController;
  type SDL_GameControllerBindType (line 61) | typedef enum
  type SDL_GameControllerButtonBind (line 72) | typedef struct SDL_GameControllerButtonBind
  type SDL_GameControllerAxis (line 272) | typedef enum
  type SDL_GameControllerButton (line 316) | typedef enum

FILE: winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_gesture.h
  type Sint64 (line 44) | typedef Sint64 SDL_GestureID;

FILE: winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_haptic.h
  type _SDL_Haptic (line 140) | struct _SDL_Haptic
  type SDL_Haptic (line 141) | typedef struct _SDL_Haptic SDL_Haptic;
  type SDL_HapticDirection (line 450) | typedef struct SDL_HapticDirection
  type SDL_HapticConstant (line 468) | typedef struct SDL_HapticConstant
  type SDL_HapticPeriodic (line 549) | typedef struct SDL_HapticPeriodic
  type SDL_HapticCondition (line 602) | typedef struct SDL_HapticCondition
  type SDL_HapticRamp (line 639) | typedef struct SDL_HapticRamp
  type SDL_HapticLeftRight (line 676) | typedef struct SDL_HapticLeftRight
  type SDL_HapticCustom (line 704) | typedef struct SDL_HapticCustom
  type SDL_HapticEffect (line 800) | typedef union SDL_HapticEffect

FILE: winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_hints.h
  type SDL_HintPriority (line 1180) | typedef enum

FILE: winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_joystick.h
  type _SDL_Joystick (line 66) | struct _SDL_Joystick
  type SDL_Joystick (line 67) | typedef struct _SDL_Joystick SDL_Joystick;
  type SDL_JoystickGUID (line 70) | typedef struct {
  type Sint32 (line 81) | typedef Sint32 SDL_JoystickID;
  type SDL_JoystickType (line 83) | typedef enum
  type SDL_JoystickPowerLevel (line 97) | typedef enum

FILE: winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_keyboard.h
  type SDL_Keysym (line 47) | typedef struct SDL_Keysym

FILE: winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_keycode.h
  type Sint32 (line 45) | typedef Sint32 SDL_Keycode;
  type SDL_Keymod (line 325) | typedef enum

FILE: winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_log.h
  type SDL_LogPriority (line 102) | typedef enum

FILE: winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_messagebox.h
  type SDL_MessageBoxFlags (line 37) | typedef enum
  type SDL_MessageBoxButtonFlags (line 47) | typedef enum
  type SDL_MessageBoxButtonData (line 56) | typedef struct
  type SDL_MessageBoxColor (line 66) | typedef struct
  type SDL_MessageBoxColorType (line 71) | typedef enum
  type SDL_MessageBoxColorScheme (line 84) | typedef struct
  type SDL_MessageBoxData (line 92) | typedef struct

FILE: winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_mouse.h
  type SDL_Cursor (line 41) | typedef struct SDL_Cursor SDL_Cursor;
  type SDL_SystemCursor (line 46) | typedef enum
  type SDL_MouseWheelDirection (line 66) | typedef enum

FILE: winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_mutex.h
  type SDL_mutex (line 58) | struct SDL_mutex
  type SDL_mutex (line 59) | typedef struct SDL_mutex SDL_mutex;
  type SDL_semaphore (line 106) | struct SDL_semaphore
  type SDL_sem (line 107) | typedef struct SDL_semaphore SDL_sem;
  type SDL_cond (line 166) | struct SDL_cond
  type SDL_cond (line 167) | typedef struct SDL_cond SDL_cond;

FILE: winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_opengl.h
  type GLenum (line 176) | typedef unsigned int	GLenum;
  type GLboolean (line 177) | typedef unsigned char	GLboolean;
  type GLbitfield (line 178) | typedef unsigned int	GLbitfield;
  type GLvoid (line 179) | typedef void		GLvoid;
  type GLbyte (line 180) | typedef signed char	GLbyte;
  type GLshort (line 181) | typedef short		GLshort;
  type GLint (line 182) | typedef int		GLint;
  type GLubyte (line 183) | typedef unsigned char	GLubyte;
  type GLushort (line 184) | typedef unsigned short	GLushort;
  type GLuint (line 185) | typedef unsigned int	GLuint;
  type GLsizei (line 186) | typedef int		GLsizei;
  type GLfloat (line 187) | typedef float		GLfloat;
  type GLclampf (line 188) | typedef float		GLclampf;
  type GLdouble (line 189) | typedef double		GLdouble;
  type GLclampd (line 190) | typedef double		GLclampd;

FILE: winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_opengl_glext.h
  type GLsizeiptr (line 469) | typedef long GLsizeiptr;
  type GLintptr (line 470) | typedef long GLintptr;
  type GLsizeiptr (line 472) | typedef ptrdiff_t GLsizeiptr;
  type GLintptr (line 473) | typedef ptrdiff_t GLintptr;
  type GLchar (line 569) | typedef char GLchar;
  type GLhalf (line 887) | typedef unsigned short GLhalf;
  type GLubyte (line 1166) | typedef const GLubyte *(APIENTRYP PFNGLGETSTRINGIPROC) (GLenum name, GLu...
  type __GLsync (line 1371) | struct __GLsync
  type __int32 (line 1401) | typedef __int32 int32_t;
  type __int64 (line 1402) | typedef __int64 int64_t;
  type GLuint64 (line 1409) | typedef uint64_t GLuint64;
  type GLint64 (line 1410) | typedef int64_t GLint64;
  type const (line 1759) | typedef GLint (APIENTRYP PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC) (GLuint ...
  type const (line 1760) | typedef GLuint (APIENTRYP PFNGLGETSUBROUTINEINDEXPROC) (GLuint program, ...
  type const (line 2463) | typedef GLuint (APIENTRYP PFNGLGETPROGRAMRESOURCEINDEXPROC) (GLuint prog...
  type const (line 2466) | typedef GLint (APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONPROC) (GLuint pr...
  type const (line 2467) | typedef GLint (APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC) (GLui...
  type GLuint64EXT (line 2597) | typedef uint64_t GLuint64EXT;
  type _cl_context (line 2645) | struct _cl_context
  type _cl_event (line 2646) | struct _cl_event
  type struct (line 2649) | typedef GLsync (APIENTRYP PFNGLCREATESYNCFROMCLEVENTARBPROC) (struct _cl...
  type _cl_context (line 2651) | struct _cl_context
  type _cl_event (line 2651) | struct _cl_event
  type GLhalfARB (line 3042) | typedef unsigned short GLhalfARB;
  type GLhandleARB (line 3575) | typedef unsigned int GLhandleARB;
  type GLcharARB (line 3577) | typedef char GLcharARB;
  type GLchar (line 3731) | typedef GLboolean (APIENTRYP PFNGLISNAMEDSTRINGARBPROC) (GLint namelen, ...
  type GLsizeiptrARB (line 4149) | typedef long GLsizeiptrARB;
  type GLintptrARB (line 4150) | typedef long GLintptrARB;
  type GLsizeiptrARB (line 4152) | typedef ptrdiff_t GLsizeiptrARB;
  type GLintptrARB (line 4153) | typedef ptrdiff_t GLintptrARB;
  type GLint (line 4495) | typedef GLint GLfixed;
  type GLint64EXT (line 4828) | typedef int64_t GLint64EXT;
  type GLenum (line 5629) | typedef GLuint (APIENTRYP PFNGLNEWOBJECTBUFFERATIPROC) (GLsizei size, co...
  type GLuint (line 7587) | typedef GLboolean (APIENTRYP PFNGLARETEXTURESRESIDENTEXTPROC) (GLsizei n...
  type GLhalfNV (line 8856) | typedef unsigned short GLhalfNV;
  type GLintptr (line 9740) | typedef GLintptr GLvdpauSurfaceNV;
  type const (line 9747) | typedef GLvdpauSurfaceNV (APIENTRYP PFNGLVDPAUREGISTERVIDEOSURFACENVPROC...
  type const (line 9748) | typedef GLvdpauSurfaceNV (APIENTRYP PFNGLVDPAUREGISTEROUTPUTSURFACENVPRO...
  type GLuint (line 9973) | typedef GLboolean (APIENTRYP PFNGLAREPROGRAMSRESIDENTNVPROC) (GLsizei n,...

FILE: winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_opengles2_gl2.h
  type GLvoid (line 21) | typedef void             GLvoid;
  type GLchar (line 22) | typedef char             GLchar;
  type GLenum (line 23) | typedef unsigned int     GLenum;
  type GLboolean (line 24) | typedef unsigned char    GLboolean;
  type GLbitfield (line 25) | typedef unsigned int     GLbitfield;
  type khronos_int8_t (line 26) | typedef khronos_int8_t   GLbyte;
  type GLshort (line 27) | typedef short            GLshort;
  type GLint (line 28) | typedef int              GLint;
  type GLsizei (line 29) | typedef int              GLsizei;
  type khronos_uint8_t (line 30) | typedef khronos_uint8_t  GLubyte;
  type GLushort (line 31) | typedef unsigned short   GLushort;
  type GLuint (line 32) | typedef unsigned int     GLuint;
  type khronos_float_t (line 33) | typedef khronos_float_t  GLfloat;
  type khronos_float_t (line 34) | typedef khronos_float_t  GLclampf;
  type khronos_int32_t (line 35) | typedef khronos_int32_t  GLfixed;
  type khronos_intptr_t (line 38) | typedef khronos_intptr_t GLintptr;
  type khronos_ssize_t (line 39) | typedef khronos_ssize_t  GLsizeiptr;

FILE: winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_opengles2_gl2ext.h
  type khronos_int64_t (line 27) | typedef khronos_int64_t GLint64;
  type khronos_uint64_t (line 28) | typedef khronos_uint64_t GLuint64;
  type __GLsync (line 29) | struct __GLsync

FILE: winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_opengles2_khrplatform.h
  type khronos_int32_t (line 142) | typedef int32_t                 khronos_int32_t;
  type khronos_uint32_t (line 143) | typedef uint32_t                khronos_uint32_t;
  type khronos_int64_t (line 144) | typedef int64_t                 khronos_int64_t;
  type khronos_uint64_t (line 145) | typedef uint64_t                khronos_uint64_t;
  type khronos_int32_t (line 155) | typedef int32_t                 khronos_int32_t;
  type khronos_uint32_t (line 156) | typedef uint32_t                khronos_uint32_t;
  type khronos_int64_t (line 157) | typedef int64_t                 khronos_int64_t;
  type khronos_uint64_t (line 158) | typedef uint64_t                khronos_uint64_t;
  type __int32 (line 167) | typedef __int32                 khronos_int32_t;
  type khronos_uint32_t (line 168) | typedef unsigned __int32        khronos_uint32_t;
  type __int64 (line 169) | typedef __int64                 khronos_int64_t;
  type khronos_uint64_t (line 170) | typedef unsigned __int64        khronos_uint64_t;
  type khronos_int32_t (line 179) | typedef int                     khronos_int32_t;
  type khronos_uint32_t (line 180) | typedef unsigned int            khronos_uint32_t;
  type khronos_int64_t (line 182) | typedef long int                khronos_int64_t;
  type khronos_uint64_t (line 183) | typedef unsigned long int       khronos_uint64_t;
  type khronos_int64_t (line 185) | typedef long long int           khronos_int64_t;
  type khronos_uint64_t (line 186) | typedef unsigned long long int  khronos_uint64_t;
  type khronos_int32_t (line 196) | typedef int                     khronos_int32_t;
  type khronos_uint32_t (line 197) | typedef unsigned int            khronos_uint32_t;
  type khronos_int32_t (line 207) | typedef int32_t                 khronos_int32_t;
  type khronos_uint32_t (line 208) | typedef uint32_t                khronos_uint32_t;
  type khronos_int64_t (line 209) | typedef int64_t                 khronos_int64_t;
  type khronos_uint64_t (line 210) | typedef uint64_t                khronos_uint64_t;
  type khronos_int8_t (line 220) | typedef signed   char          khronos_int8_t;
  type khronos_uint8_t (line 221) | typedef unsigned char          khronos_uint8_t;
  type khronos_int16_t (line 222) | typedef signed   short int     khronos_int16_t;
  type khronos_uint16_t (line 223) | typedef unsigned short int     khronos_uint16_t;
  type khronos_intptr_t (line 231) | typedef signed   long long int khronos_intptr_t;
  type khronos_uintptr_t (line 232) | typedef unsigned long long int khronos_uintptr_t;
  type khronos_ssize_t (line 233) | typedef signed   long long int khronos_ssize_t;
  type khronos_usize_t (line 234) | typedef unsigned long long int khronos_usize_t;
  type khronos_intptr_t (line 236) | typedef signed   long  int     khronos_intptr_t;
  type khronos_uintptr_t (line 237) | typedef unsigned long  int     khronos_uintptr_t;
  type khronos_ssize_t (line 238) | typedef signed   long  int     khronos_ssize_t;
  type khronos_usize_t (line 239) | typedef unsigned long  int     khronos_usize_t;
  type khronos_float_t (line 246) | typedef          float         khronos_float_t;
  type khronos_uint64_t (line 259) | typedef khronos_uint64_t       khronos_utime_nanoseconds_t;
  type khronos_int64_t (line 260) | typedef khronos_int64_t        khronos_stime_nanoseconds_t;
  type khronos_boolean_enum_t (line 276) | typedef enum {

FILE: winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_pixels.h
  type SDL_PixelFormatEnum (line 171) | typedef enum
  type SDL_Color (line 295) | typedef struct SDL_Color
  type SDL_Palette (line 304) | typedef struct SDL_Palette
  type SDL_PixelFormat (line 315) | typedef struct SDL_PixelFormat

FILE: winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_power.h
  type SDL_PowerState (line 42) | typedef enum

FILE: winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_rect.h
  type SDL_Point (line 48) | typedef struct SDL_Point
  type SDL_FPoint (line 60) | typedef struct SDL_FPoint
  type SDL_Rect (line 77) | typedef struct SDL_Rect
  type SDL_FRect (line 87) | typedef struct SDL_FRect
  function SDL_FORCE_INLINE (line 99) | SDL_FORCE_INLINE SDL_bool SDL_PointInRect(const SDL_Point *p, const SDL_...
  function SDL_FORCE_INLINE (line 108) | SDL_FORCE_INLINE SDL_bool SDL_RectEmpty(const SDL_Rect *r)
  function SDL_FORCE_INLINE (line 116) | SDL_FORCE_INLINE SDL_bool SDL_RectEquals(const SDL_Rect *a, const SDL_Re...

FILE: winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_render.h
  type SDL_RendererFlags (line 64) | typedef enum
  type SDL_RendererInfo (line 78) | typedef struct SDL_RendererInfo
  type SDL_TextureAccess (line 91) | typedef enum
  type SDL_TextureModulate (line 101) | typedef enum
  type SDL_RendererFlip (line 111) | typedef enum
  type SDL_Renderer (line 121) | struct SDL_Renderer
  type SDL_Renderer (line 122) | typedef struct SDL_Renderer SDL_Renderer;
  type SDL_Texture (line 127) | struct SDL_Texture
  type SDL_Texture (line 128) | typedef struct SDL_Texture SDL_Texture;

FILE: winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_rwops.h
  type SDL_RWops (line 52) | typedef struct SDL_RWops

FILE: winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_scancode.h
  type SDL_Scancode (line 43) | typedef enum

FILE: winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_sensor.h
  type _SDL_Sensor (line 51) | struct _SDL_Sensor
  type SDL_Sensor (line 52) | typedef struct _SDL_Sensor SDL_Sensor;
  type Sint32 (line 60) | typedef Sint32 SDL_SensorID;
  type SDL_SensorType (line 69) | typedef enum

FILE: winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_shape.h
  type WindowShapeMode (line 80) | typedef enum {
  type SDL_WindowShapeParams (line 94) | typedef union {
  type SDL_WindowShapeMode (line 101) | typedef struct SDL_WindowShapeMode {

FILE: winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_stdinc.h
  type SDL_bool (line 159) | typedef int SDL_bool;
  type SDL_bool (line 161) | typedef enum
  type Sint8 (line 173) | typedef int8_t Sint8;
  type Uint8 (line 179) | typedef uint8_t Uint8;
  type Sint16 (line 185) | typedef int16_t Sint16;
  type Uint16 (line 191) | typedef uint16_t Uint16;
  type Sint32 (line 197) | typedef int32_t Sint32;
  type Uint32 (line 203) | typedef uint32_t Uint32;
  type Sint64 (line 210) | typedef int64_t Sint64;
  type Uint64 (line 216) | typedef uint64_t Uint64;
  type SDL_DUMMY_ENUM (line 337) | typedef enum
  function SDL_FORCE_INLINE (line 420) | SDL_FORCE_INLINE void SDL_memset4(void *dst, Uint32 val, size_t dwords)
  type _SDL_iconv_t (line 547) | struct _SDL_iconv_t

FILE: winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_surface.h
  type SDL_Surface (line 70) | typedef struct SDL_Surface
  type SDL_Surface (line 98) | struct SDL_Surface
  type SDL_Surface (line 99) | struct SDL_Surface
  type SDL_YUV_CONVERSION_MODE (line 104) | typedef enum

FILE: winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_system.h
  type IDirect3DDevice9 (line 60) | typedef struct IDirect3DDevice9 IDirect3DDevice9;
  type SDL_WinRT_Path (line 183) | typedef enum
  type SDL_WinRT_DeviceFamily (line 207) | typedef enum

FILE: winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_syswm.h
  type SDL_SysWMinfo (line 44) | struct SDL_SysWMinfo
  type NSWindow (line 84) | typedef struct _NSWindow NSWindow;
  type UIWindow (line 92) | typedef struct _UIWindow UIWindow;
  type UIViewController (line 93) | typedef struct _UIViewController UIViewController;
  type Uint32 (line 95) | typedef Uint32 GLuint;
  type ANativeWindow (line 99) | typedef struct ANativeWindow ANativeWindow;
  type SDL_SYSWM_TYPE (line 119) | typedef enum
  type SDL_SysWMmsg (line 138) | struct SDL_SysWMmsg
  type SDL_SysWMinfo (line 197) | struct SDL_SysWMinfo
  type SDL_SysWMinfo (line 295) | typedef struct SDL_SysWMinfo SDL_SysWMinfo;

FILE: winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_test_common.h
  type SDLTest_CommonState (line 51) | typedef struct

FILE: winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_test_crc32.h
  type SDLTest_Crc32Context (line 66) | typedef struct {

FILE: winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_test_harness.h
  type SDLTest_TestCaseReference (line 75) | typedef struct SDLTest_TestCaseReference {
  type SDLTest_TestSuiteReference (line 89) | typedef struct SDLTest_TestSuiteReference {

FILE: winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_test_images.h
  type SDLTest_SurfaceImage_t (line 50) | typedef struct SDLTest_SurfaceImage_s {

FILE: winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_test_md5.h
  type MD5UINT4 (line 68) | typedef unsigned long int MD5UINT4;
  type SDLTest_Md5Context (line 71) | typedef struct {

FILE: winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_test_random.h
  type SDLTest_RandomContext (line 59) | typedef struct {

FILE: winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_thread.h
  type SDL_Thread (line 45) | struct SDL_Thread
  type SDL_Thread (line 46) | typedef struct SDL_Thread SDL_Thread;
  type SDL_threadID (line 49) | typedef unsigned long SDL_threadID;
  type SDL_TLSID (line 52) | typedef unsigned int SDL_TLSID;
  type SDL_ThreadPriority (line 59) | typedef enum {

FILE: winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_timer.h
  type SDL_TimerID (line 86) | typedef int SDL_TimerID;

FILE: winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_touch.h
  type Sint64 (line 41) | typedef Sint64 SDL_TouchID;
  type Sint64 (line 42) | typedef Sint64 SDL_FingerID;
  type SDL_TouchDeviceType (line 44) | typedef enum
  type SDL_Finger (line 52) | typedef struct SDL_Finger

FILE: winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_version.h
  type SDL_version (line 51) | typedef struct SDL_version

FILE: winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_video.h
  type SDL_DisplayMode (line 53) | typedef struct
  type SDL_Window (line 90) | typedef struct SDL_Window SDL_Window;
  type SDL_WindowFlags (line 97) | typedef enum
  type SDL_WindowEventID (line 146) | typedef enum
  type SDL_DisplayEventID (line 175) | typedef enum
  type SDL_DisplayOrientation (line 181) | typedef enum
  type SDL_GLattr (line 198) | typedef enum
  type SDL_GLprofile (line 229) | typedef enum
  type SDL_GLcontextFlag (line 236) | typedef enum
  type SDL_GLcontextReleaseFlag (line 244) | typedef enum
  type SDL_GLContextResetNotification (line 250) | typedef enum
  type SDL_HitTestResult (line 1020) | typedef enum
  type SDL_Point (line 1039) | typedef SDL_HitTestResult (SDLCALL *SDL_HitTest)(SDL_Window *win,

FILE: winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_vulkan.h
  type VkInstance (line 57) | typedef VkInstance SDL_vulkanInstance;
  type VkSurfaceKHR (line 58) | typedef VkSurfaceKHR SDL_vulkanSurface;

FILE: winlib/SDL2-2.0.10/test/checkkeys.c
  function quit (line 31) | static void
  function print_string (line 38) | static void
  function print_modifiers (line 57) | static void
  function PrintModifierState (line 91) | static void
  function PrintKey (line 105) | static void
  function PrintText (line 137) | static void
  function loop (line 151) | void
  function main (line 198) | int

FILE: winlib/SDL2-2.0.10/test/controllermap.c
  type SDL_GameControllerExtendedBind (line 114) | typedef struct
  type AxisState (line 140) | typedef struct
  function SDL_Texture (line 154) | SDL_Texture *
  function StandardizeAxisValue (line 187) | static int
  function SetCurrentBinding (line 199) | static void
  function SDL_bool (line 226) | static SDL_bool
  function ConfigureBinding (line 255) | static void
  function SDL_bool (line 335) | static SDL_bool
  function WatchJoystick (line 353) | static void
  function main (line 772) | int

FILE: winlib/SDL2-2.0.10/test/loopwave.c
  function quit (line 40) | static void
  function close_audio (line 47) | static void
  function open_audio (line 56) | static void
  function reopen_audio (line 72) | static void reopen_audio()
  function fillerup (line 79) | void SDLCALL
  function loop (line 105) | void
  function main (line 113) | int

FILE: winlib/SDL2-2.0.10/test/loopwavequeue.c
  function quit (line 37) | static void
  function poked (line 45) | void
  function loop (line 51) | void
  function main (line 74) | int

FILE: winlib/SDL2-2.0.10/test/nacl/background.js
  function makeURL (line 5) | function makeURL(toolchain, config) {
  function createWindow (line 9) | function createWindow(url) {
  function onLaunched (line 18) | function onLaunched(launchData) {

FILE: winlib/SDL2-2.0.10/test/nacl/common.js
  function isHostToolchain (line 21) | function isHostToolchain(tool) {
  function mimeTypeForTool (line 32) | function mimeTypeForTool(tool) {
  function browserSupportsNaCl (line 55) | function browserSupportsNaCl(tool) {
  function injectScript (line 73) | function injectScript(url, onload, onerror) {
  function runTests (line 89) | function runTests(moduleEl) {
  function createNaClModule (line 123) | function createNaClModule(name, tool, path, width, height, attrs) {
  function attachDefaultListeners (line 190) | function attachDefaultListeners() {
  function handleError (line 206) | function handleError(event) {
  function handleCrash (line 218) | function handleCrash(event) {
  function moduleDidLoad (line 234) | function moduleDidLoad() {
  function hideModule (line 251) | function hideModule() {
  function removeModule (line 260) | function removeModule() {
  function startsWith (line 271) | function startsWith(s, prefix) {
  function logMessage (line 290) | function logMessage(message) {
  function handleMessage (line 315) | function handleMessage(message_event) {
  function domContentLoaded (line 348) | function domContentLoaded(name, tool, path, width, height, attrs) {
  function updateStatus (line 385) | function updateStatus(opt_message) {

FILE: winlib/SDL2-2.0.10/test/testatomic.c
  function RunBasicTest (line 36) | static
  function adder (line 119) | static
  function runAdder (line 133) | static
  function RunEpicTest (line 158) | static
  type SDL_EventQueueEntry (line 262) | typedef struct
  type SDL_EventQueue (line 268) | typedef struct
  function InitEventQueue (line 297) | static void InitEventQueue(SDL_EventQueue *queue)
  function SDL_bool (line 314) | static SDL_bool EnqueueEvent_LockFree(SDL_EventQueue *queue, const SDL_E...
  function SDL_bool (line 361) | static SDL_bool DequeueEvent_LockFree(SDL_EventQueue *queue, SDL_Event *...
  function SDL_bool (line 408) | static SDL_bool EnqueueEvent_Mutex(SDL_EventQueue *queue, const SDL_Even...
  function SDL_bool (line 441) | static SDL_bool DequeueEvent_Mutex(SDL_EventQueue *queue, SDL_Event *event)
  type WriterData (line 479) | typedef struct
  type ReaderData (line 489) | typedef struct
  function FIFO_Writer (line 498) | static int SDLCALL FIFO_Writer(void* _data)
  function FIFO_Reader (line 533) | static int SDLCALL FIFO_Reader(void* _data)
  function FIFO_Watcher (line 573) | static int SDLCALL FIFO_Watcher(void* _data)
  function RunFIFOTest (line 594) | static void RunFIFOTest(SDL_bool lock_free)
  function main (line 711) | int

FILE: winlib/SDL2-2.0.10/test/testaudiocapture.c
  function loop (line 26) | static void
  function main (line 89) | int

FILE: winlib/SDL2-2.0.10/test/testaudiohotplug.c
  function quit (line 38) | static void
  function fillerup (line 45) | void SDLCALL
  function poked (line 71) | void
  function iteration (line 83) | static void
  function loop (line 126) | void
  function main (line 136) | int

FILE: winlib/SDL2-2.0.10/test/testaudioinfo.c
  function print_devices (line 15) | static void
  function main (line 40) | int

FILE: winlib/SDL2-2.0.10/test/testautomation.c
  function quit (line 25) | static void
  function main (line 32) | int

FILE: winlib/SDL2-2.0.10/test/testautomation_audio.c
  function _audioSetUp (line 19) | void
  function _audioTearDown (line 31) | void
  function _audio_testCallback (line 49) | void SDLCALL _audio_testCallback(void *userdata, Uint8 *stream, int len)
  function audio_quitInitAudioSubSystem (line 65) | int audio_quitInitAudioSubSystem()
  function audio_initQuitAudio (line 83) | int audio_initQuitAudio()
  function audio_initOpenCloseQuitAudio (line 139) | int audio_initOpenCloseQuitAudio()
  function audio_pauseUnpauseAudio (line 225) | int audio_pauseUnpauseAudio()
  function audio_enumerateAndNameAudioDevices (line 346) | int audio_enumerateAndNameAudioDevices()
  function audio_enumerateAndNameAudioDevicesNegativeTests (line 404) | int audio_enumerateAndNameAudioDevicesNegativeTests()
  function audio_printAudioDrivers (line 451) | int audio_printAudioDrivers()
  function audio_printCurrentAudioDriver (line 483) | int audio_printCurrentAudioDriver()
  function audio_buildAudioCVT (line 515) | int audio_buildAudioCVT()
  function audio_buildAudioCVTNegative (line 579) | int audio_buildAudioCVTNegative()
  function audio_getAudioStatus (line 674) | int audio_getAudioStatus()
  function audio_openCloseAndGetAudioStatus (line 695) | int audio_openCloseAndGetAudioStatus()
  function audio_lockUnlockOpenAudioDevice (line 754) | int audio_lockUnlockOpenAudioDevice()
  function audio_convertAudio (line 817) | int audio_convertAudio()
  function audio_openCloseAudioDeviceConnected (line 915) | int audio_openCloseAudioDeviceConnected()

FILE: winlib/SDL2-2.0.10/test/testautomation_clipboard.c
  function clipboard_testHasClipboardText (line 21) | int
  function clipboard_testGetClipboardText (line 37) | int
  function clipboard_testSetClipboardText (line 54) | int
  function clipboard_testClipboardTextFunctions (line 85) | int

FILE: winlib/SDL2-2.0.10/test/testautomation_events.c
  function _events_sampleNullEventFilter (line 28) | int SDLCALL _events_sampleNullEventFilter(void *userdata, SDL_Event *event)
  function events_pushPumpAndPollUserevent (line 48) | int
  function events_addDelEventWatch (line 83) | int
  function events_addDelEventWatchWithUserdata (line 133) | int

FILE: winlib/SDL2-2.0.10/test/testautomation_hints.c
  function hints_getHint (line 75) | int
  function hints_setHint (line 100) | int

FILE: winlib/SDL2-2.0.10/test/testautomation_keyboard.c
  function keyboard_getKeyboardState (line 21) | int
  function keyboard_getKeyboardFocus (line 47) | int
  function keyboard_getKeyFromName (line 64) | int
  function _checkInvalidScancodeError (line 110) | void
  function keyboard_getKeyFromScancode (line 131) | int
  function keyboard_getKeyName (line 170) | int
  function keyboard_getScancodeNameNegative (line 226) | int
  function keyboard_getKeyNameNegative (line 253) | int
  function keyboard_getSetModState (line 291) | int
  function keyboard_startStopTextInput (line 352) | int
  function _testSetTextInputRect (line 379) | void _testSetTextInputRect(SDL_Rect refRect)
  function keyboard_setTextInputRect (line 398) | int
  function keyboard_setTextInputRectNegative (line 478) | int
  function keyboard_getScancodeFromKey (line 517) | int
  function keyboard_getScancodeFromName (line 541) | int
  function _checkInvalidNameError (line 592) | void
  function keyboard_getScancodeFromNameNegative (line 614) | int

FILE: winlib/SDL2-2.0.10/test/testautomation_main.c
  function main_testInitQuitJoystickHaptic (line 19) | static int main_testInitQuitJoystickHaptic (void *arg)
  function main_testInitQuitSubSystem (line 47) | static int main_testInitQuitSubSystem (void *arg)
  function main_testImpliedJoystickInit (line 75) | static int main_testImpliedJoystickInit (void *arg)
  function main_testImpliedJoystickQuit (line 100) | static int main_testImpliedJoystickQuit (void *arg)

FILE: winlib/SDL2-2.0.10/test/testautomation_mouse.c
  function _mouseStateCheck (line 16) | int _mouseStateCheck(Uint32 state)
  function mouse_getMouseState (line 30) | int
  function mouse_getRelativeMouseState (line 76) | int
  function SDL_Cursor (line 157) | static SDL_Cursor *_initArrowCursor(const char *image[])
  function mouse_createFreeCursor (line 198) | int
  function mouse_createFreeColorCursor (line 224) | int
  function _changeCursorVisibility (line 255) | void _changeCursorVisibility(int state)
  function mouse_showCursor (line 280) | int
  function mouse_setCursor (line 310) | int
  function mouse_getCursor (line 343) | int
  function mouse_getSetRelativeMouseMode (line 362) | int
  function SDL_Window (line 418) | SDL_Window *_createMouseSuiteTestWindow()
  function _destroyMouseSuiteTestWindow (line 431) | void _destroyMouseSuiteTestWindow(SDL_Window *window)
  function mouse_warpMouseInWindow (line 445) | int
  function mouse_getMouseFocus (line 507) | int

FILE: winlib/SDL2-2.0.10/test/testautomation_pixels.c
  function pixels_allocFreeFormat (line 125) | int
  function pixels_getPixelFormatName (line 231) | int
  function pixels_allocFreePalette (line 316) | int
  function pixels_calcGammaRamp (line 405) | int

FILE: winlib/SDL2-2.0.10/test/testautomation_platform.c
  function _compareSizeOfType (line 22) | static int _compareSizeOfType( size_t sizeoftype, size_t hardcodetype )
  function platform_testTypes (line 32) | int platform_testTypes(void *arg)
  function platform_testEndianessAndSwap (line 54) | int platform_testEndianessAndSwap(void *arg)
  function platform_testGetFunctions (line 110) | int platform_testGetFunctions (void *arg)
  function platform_testHasFunctions (line 164) | int platform_testHasFunctions (void *arg)
  function platform_testGetVersion (line 208) | int platform_testGetVersion(void *arg)
  function platform_testSDLVersion (line 231) | int platform_testSDLVersion(void *arg)
  function platform_testDefaultInit (line 254) | int platform_testDefaultInit(void *arg)
  function platform_testGetSetClearError (line 280) | int platform_testGetSetClearError(void *arg)
  function platform_testSetErrorEmptyInput (line 332) | int platform_testSetErrorEmptyInput(void *arg)
  function platform_testSetErrorInvalidInput (line 370) | int platform_testSetErrorInvalidInput(void *arg)
  function platform_testGetPowerInfo (line 453) | int platform_testGetPowerInfo(void *arg)

FILE: winlib/SDL2-2.0.10/test/testautomation_rect.c
  function _validateIntersectRectAndLineResults (line 18) | void _validateIntersectRectAndLineResults(
  function rect_testIntersectRectAndLine (line 48) | int
  function rect_testIntersectRectAndLineInside (line 119) | int
  function rect_testIntersectRectAndLineOutside (line 186) | int
  function rect_testIntersectRectAndLineEmpty (line 241) | int
  function rect_testIntersectRectAndLineParam (line 276) | int
  function _validateHasIntersectionResults (line 308) | void _validateHasIntersectionResults(
  function _validateIntersectRectResults (line 331) | void _validateIntersectRectResults(
  function _validateUnionRectResults (line 350) | void _validateUnionRectResults(
  function _validateRectEmptyResults (line 373) | void _validateRectEmptyResults(
  function _validateRectEqualsResults (line 391) | void _validateRectEqualsResults(
  function rect_testIntersectRectInside (line 417) | int rect_testIntersectRectInside (void *arg)
  function rect_testIntersectRectOutside (line 445) | int rect_testIntersectRectOutside (void *arg)
  function rect_testIntersectRectPartial (line 473) | int rect_testIntersectRectPartial (void *arg)
  function rect_testIntersectRectPoint (line 562) | int rect_testIntersectRectPoint (void *arg)
  function rect_testIntersectRectEmpty (line 609) | int rect_testIntersectRectEmpty (void *arg)
  function rect_testIntersectRectParam (line 681) | int rect_testIntersectRectParam(void *arg)
  function rect_testHasIntersectionInside (line 711) | int rect_testHasIntersectionInside (void *arg)
  function rect_testHasIntersectionOutside (line 738) | int rect_testHasIntersectionOutside (void *arg)
  function rect_testHasIntersectionPartial (line 765) | int rect_testHasIntersectionPartial (void *arg)
  function rect_testHasIntersectionPoint (line 832) | int rect_testHasIntersectionPoint (void *arg)
  function rect_testHasIntersectionEmpty (line 878) | int rect_testHasIntersectionEmpty (void *arg)
  function rect_testHasIntersectionParam (line 936) | int rect_testHasIntersectionParam(void *arg)
  function rect_testEnclosePoints (line 959) | int rect_testEnclosePoints(void *arg)
  function rect_testEnclosePointsRepeatedInput (line 1029) | int rect_testEnclosePointsRepeatedInput(void *arg)
  function rect_testEnclosePointsWithClipping (line 1105) | int rect_testEnclosePointsWithClipping(void *arg)
  function rect_testEnclosePointsParam (line 1204) | int rect_testEnclosePointsParam(void *arg)
  function rect_testUnionRectOutside (line 1232) | int rect_testUnionRectOutside(void *arg)
  function rect_testUnionRectEmpty (line 1303) | int rect_testUnionRectEmpty(void *arg)
  function rect_testUnionRectInside (line 1368) | int rect_testUnionRectInside(void *arg)
  function rect_testUnionRectParam (line 1432) | int rect_testUnionRectParam(void *arg)
  function rect_testRectEmpty (line 1460) | int rect_testRectEmpty(void *arg)
  function rect_testRectEmptyParam (line 1503) | int rect_testRectEmptyParam(void *arg)
  function rect_testRectEquals (line 1520) | int rect_testRectEquals(void *arg)
  function rect_testRectEqualsParam (line 1550) | int rect_testRectEqualsParam(void *arg)

FILE: winlib/SDL2-2.0.10/test/testautomation_render.c
  function InitCreateRenderer (line 43) | void InitCreateRenderer(void *arg)
  function CleanupDestroyRenderer (line 66) | void CleanupDestroyRenderer(void *arg)
  function render_testGetNumRenderDrivers (line 88) | int
  function render_testPrimitives (line 107) | int render_testPrimitives (void *arg)
  function render_testPrimitivesBlend (line 213) | int render_testPrimitivesBlend (void *arg)
  function render_testBlit (line 361) | int
  function render_testBlitColor (line 431) | int
  function render_testBlitAlpha (line 505) | int
  function _testBlitBlendMode (line 582) | static void
  function render_testBlitBlend (line 634) | int
  function _isSupported (line 772) | static int
  function _hasDrawColor (line 785) | static int
  function _hasBlendModes (line 823) | static int
  function SDL_Texture (line 879) | static SDL_Texture *
  function _hasTexColor (line 909) | static int
  function _hasTexAlpha (line 949) | static int
  function _compare (line 991) | static void
  function _clearScreen (line 1035) | static int

FILE: winlib/SDL2-2.0.10/test/testautomation_rwops.c
  function RWopsSetUp (line 32) | void
  function RWopsTearDown (line 72) | void
  function _testGenericRWopsValidations (line 94) | void
  function rwops_testParamNegative (line 174) | int
  function rwops_testMem (line 221) | int
  function rwops_testConstMem (line 261) | int
  function rwops_testFileRead (line 297) | int
  function rwops_testFileWrite (line 344) | int
  function rwops_testFPRead (line 393) | int
  function rwops_testFPWrite (line 443) | int
  function rwops_testAllocFree (line 490) | int
  function rwops_testCompareRWFromMemWithRWFromFile (line 517) | int
  function rwops_testFileWriteReadEndian (line 586) | int

FILE: winlib/SDL2-2.0.10/test/testautomation_sdltest.c
  function sdltest_generateRunSeed (line 33) | int
  function sdltest_getFuzzerInvocationCount (line 64) | int
  function sdltest_randomNumber (line 88) | int
  function sdltest_randomBoundaryNumberUint8 (line 157) | int
  function sdltest_randomBoundaryNumberUint16 (line 267) | int
  function sdltest_randomBoundaryNumberUint32 (line 377) | int
  function sdltest_randomBoundaryNumberUint64 (line 487) | int
  function sdltest_randomBoundaryNumberSint8 (line 597) | int
  function sdltest_randomBoundaryNumberSint16 (line 707) | int
  function sdltest_randomBoundaryNumberSint32 (line 817) | int
  function sdltest_randomBoundaryNumberSint64 (line 934) | int
  function sdltest_randomIntegerInRange (line 1044) | int
  function sdltest_randomAsciiString (line 1119) | int
  function sdltest_randomAsciiStringWithMaximumLength (line 1153) | int
  function sdltest_randomAsciiStringOfSize (line 1206) | int

FILE: winlib/SDL2-2.0.10/test/testautomation_stdlib.c
  function stdlib_strlcpy (line 17) | int
  function stdlib_snprintf (line 43) | int
  function stdlib_getsetenv (line 125) | int
  function stdlib_sscanf (line 260) | int

FILE: winlib/SDL2-2.0.10/test/testautomation_surface.c
  function _surfaceSetUp (line 38) | void
  function _surfaceTearDown (line 70) | void
  function _clearTestSurface (line 82) | void _clearTestSurface()
  function _testBlitBlendMode (line 98) | void _testBlitBlendMode(int mode)
  function _AssertFileExist (line 204) | void
  function surface_testSaveLoadBitmap (line 219) | int
  function surface_testSurfaceConversion (line 265) | int
  function surface_testCompleteSurfaceConversion (line 306) | int
  function surface_testLoadFailure (line 396) | int
  function surface_testBlit (line 408) | int
  function surface_testBlitColorMod (line 431) | int
  function surface_testBlitAlphaMod (line 454) | int
  function surface_testBlitBlendNone (line 478) | int
  function surface_testBlitBlendBlend (line 501) | int
  function surface_testBlitBlendAdd (line 524) | int
  function surface_testBlitBlendMod (line 547) | int
  function surface_testBlitBlendLoop (line 570) | int

FILE: winlib/SDL2-2.0.10/test/testautomation_syswm.c
  function syswm_getWindowWMInfo (line 16) | int

FILE: winlib/SDL2-2.0.10/test/testautomation_timer.c
  function _timerSetUp (line 21) | void
  function timer_getPerformanceCounter (line 38) | int
  function timer_getPerformanceFrequency (line 53) | int
  function timer_delayAndGetTicks (line 68) | int
  function Uint32 (line 107) | Uint32 SDLCALL _timerTestCallback(Uint32 interval, void *param)
  function timer_addRemoveTimer (line 124) | int

FILE: winlib/SDL2-2.0.10/test/testautomation_video.c
  function SDL_Window (line 26) | SDL_Window *_createVideoSuiteTestWindow(const char *title)
  function _destroyVideoSuiteTestWindow (line 49) | void _destroyVideoSuiteTestWindow(SDL_Window *window)
  function video_enableDisableScreensaver (line 63) | int
  function video_createWindowVariousPositions (line 115) | int
  function video_createWindowVariousSizes (line 196) | int
  function video_createWindowVariousFlags (line 253) | int
  function video_getWindowFlags (line 330) | int
  function video_getNumDisplayModes (line 358) | int
  function video_getNumDisplayModesNegative (line 382) | int
  function video_getClosestDisplayModeCurrentResolution (line 416) | int
  function video_getClosestDisplayModeRandomResolution (line 472) | int
  function video_getWindowBrightness (line 513) | int
  function video_getWindowBrightnessNegative (line 539) | int
  function video_getWindowDisplayMode (line 568) | int
  function _checkInvalidWindowError (line 599) | void _checkInvalidWindowError()
  function video_getWindowDisplayModeNegative (line 622) | int
  function video_getWindowGammaRamp (line 666) | int
  function video_getWindowGammaRampNegative (line 727) | int
  function _setAndCheckWindowGrabState (line 748) | void
  function video_getSetWindowGrab (line 773) | int
  function video_getWindowId (line 842) | int
  function video_getWindowPixelFormat (line 897) | int
  function video_getSetWindowPosition (line 932) | int
  function _checkInvalidParameterError (line 1051) | void _checkInvalidParameterError()
  function video_getSetWindowSize (line 1075) | int
  function video_getSetWindowMinimumSize (line 1237) | int
  function video_getSetWindowMaximumSize (line 1376) | int
  function video_getSetWindowData (line 1514) | int

FILE: winlib/SDL2-2.0.10/test/testbounds.c
  function main (line 15) | int main(int argc, char **argv)

FILE: winlib/SDL2-2.0.10/test/testcustomcursor.c
  function SDL_Cursor (line 70) | static SDL_Cursor*
  function SDL_Cursor (line 100) | static SDL_Cursor*
  function quit (line 142) | static void
  function loop (line 149) | void
  function main (line 183) | int

FILE: winlib/SDL2-2.0.10/test/testdisplayinfo.c
  function print_mode (line 20) | static void
  function main (line 31) | int

FILE: winlib/SDL2-2.0.10/test/testdraw2.c
  function DrawPoints (line 38) | void
  function DrawLines (line 81) | void
  function DrawRects (line 133) | void
  function loop (line 178) | void
  function main (line 208) | int

FILE: winlib/SDL2-2.0.10/test/testdrawchessboard.c
  function DrawChessBoard (line 31) | void
  function loop (line 58) | void
  function main (line 100) | int

FILE: winlib/SDL2-2.0.10/test/testdropfile.c
  function quit (line 21) | static void
  function main (line 28) | int

FILE: winlib/SDL2-2.0.10/test/testerror.c
  function quit (line 23) | static void
  function ThreadFunc (line 30) | int SDLCALL
  function main (line 44) | int

FILE: winlib/SDL2-2.0.10/test/testfile.c
  function cleanup (line 43) | static void
  function rwops_error_quit (line 50) | static void
  function main (line 65) | int

FILE: winlib/SDL2-2.0.10/test/testfilesystem.c
  function main (line 17) | int

FILE: winlib/SDL2-2.0.10/test/testgamecontroller.c
  function SDL_Texture (line 69) | static SDL_Texture *
  function loop (line 97) | void
  function SDL_bool (line 172) | SDL_bool
  function main (line 250) | int
  function main (line 366) | int

FILE: winlib/SDL2-2.0.10/test/testgesture.c
  type Point (line 44) | typedef struct
  type Knob (line 49) | typedef struct
  function setpix (line 58) | static void
  function drawLine (line 93) | static void
  function drawCircle (line 102) | static void
  function drawKnob (line 119) | static void
  function DrawScreen (line 127) | static void
  function loop (line 171) | static void
  function main (line 269) | int main(int argc, char* argv[])

FILE: winlib/SDL2-2.0.10/test/testgl2.c
  type GL_Context (line 27) | typedef struct GL_Context
  function LoadContext (line 42) | static int LoadContext(GL_Context * data)
  function quit (line 71) | static void
  function Render (line 82) | static void
  function main (line 210) | int
  function main (line 433) | int

FILE: winlib/SDL2-2.0.10/test/testgles.c
  function quit (line 32) | static void
  function Render (line 51) | static void
  function main (line 102) | int
  function main (line 346) | int

FILE: winlib/SDL2-2.0.10/test/testgles2.c
  type GLES2_Context (line 32) | typedef struct GLES2_Context
  function LoadContext (line 45) | static int LoadContext(GLES2_Context * data)
  function quit (line 73) | static void
  function rotate_matrix (line 106) | static void
  function perspective_matrix (line 146) | static void
  function multiply_matrix (line 170) | static void
  function process_shader (line 198) | void
  type shader_data (line 364) | typedef struct shader_data
  function Render (line 375) | static void
  function loop (line 420) | void loop()
  function main (line 477) | int
  function main (line 723) | int

FILE: winlib/SDL2-2.0.10/test/testhaptic.c
  function main (line 40) | int
  function abort_execution (line 301) | static void
  function HapticPrintSupported (line 316) | static void
  function main (line 362) | int

FILE: winlib/SDL2-2.0.10/test/testhittesting.c
  function SDL_HitTestResult (line 17) | static SDL_HitTestResult SDLCALL
  function main (line 60) | int main(int argc, char **argv)

FILE: winlib/SDL2-2.0.10/test/testhotplug.c
  function main (line 23) | int
  function main (line 155) | int

FILE: winlib/SDL2-2.0.10/test/testiconv.c
  function widelen (line 17) | static size_t
  function main (line 28) | int

FILE: winlib/SDL2-2.0.10/test/testime.c
  type UnifontGlyph (line 62) | struct UnifontGlyph {
  function Uint8 (line 71) | static Uint8 dehex(char c)
  function Uint8 (line 82) | static Uint8 dehex2(char c1, char c2)
  function Uint8 (line 87) | static Uint8 validate_hex(const char *cp, size_t len, Uint32 *np)
  function unifont_init (line 102) | static int unifont_init(const char *fontname)
  function unifont_make_rgba (line 227) | static void unifont_make_rgba(Uint8 *src, Uint8 *dst, Uint8 width)
  function unifont_load_texture (line 263) | static int unifont_load_texture(Uint32 textureID)
  function Sint32 (line 320) | static Sint32 unifont_draw_glyph(Uint32 codepoint, int rendererID, SDL_R...
  function unifont_cleanup (line 345) | static void unifont_cleanup()
  function utf8_length (line 371) | size_t utf8_length(unsigned char c)
  function Uint32 (line 412) | Uint32 utf8_decode(char *p, size_t len)
  function usage (line 436) | void usage()
  function InitInput (line 441) | void InitInput()
  function CleanupVideo (line 455) | void CleanupVideo()
  function _Redraw (line 466) | void _Redraw(int rendererID)
  function Redraw (line 615) | void Redraw()
  function main (line 632) | int main(int argc, char *argv[])

FILE: winlib/SDL2-2.0.10/test/testintersections.c
  function DrawPoints (line 40) | void
  function add_line (line 86) | static int
  function DrawLines (line 104) | void
  function add_rect (line 130) | static int
  function DrawRects (line 154) | static void
  function DrawRectLineIntersections (line 161) | static void
  function DrawRectRectIntersections (line 185) | static void
  function loop (line 201) | void
  function main (line 267) | int

FILE: winlib/SDL2-2.0.10/test/testjoystick.c
  function DrawRect (line 39) | static void
  function loop (line 46) | void
  function SDL_bool (line 190) | static SDL_bool
  function main (line 378) | int

FILE: winlib/SDL2-2.0.10/test/testkeys.c
  function main (line 22) | int

FILE: winlib/SDL2-2.0.10/test/testloadso.c
  function main (line 24) | int

FILE: winlib/SDL2-2.0.10/test/testlock.c
  function SDL_Quit_Wrapper (line 32) | static void
  function printid (line 38) | void
  function terminate (line 44) | void
  function closemutex (line 51) | void
  function Run (line 64) | int SDLCALL
  function main (line 92) | int

FILE: winlib/SDL2-2.0.10/test/testmessage.c
  function quit (line 21) | static void
  function button_messagebox (line 28) | static int SDLCALL
  function main (line 83) | int

FILE: winlib/SDL2-2.0.10/test/testmultiaudio.c
  type callback_data (line 24) | typedef struct
  function play_through_once (line 33) | void SDLCALL
  function loop (line 53) | void
  function test_multi_audio (line 67) | static void
  function main (line 163) | int

FILE: winlib/SDL2-2.0.10/test/testnative.c
  function quit (line 42) | static void
  function SDL_Texture (line 52) | SDL_Texture *
  function MoveSprites (line 83) | void
  function main (line 122) | int

FILE: winlib/SDL2-2.0.10/test/testnative.h
  type NativeWindowFactory (line 22) | typedef struct

FILE: winlib/SDL2-2.0.10/test/testnativew32.c
  function LRESULT (line 26) | LRESULT CALLBACK
  function DestroyWindowNative (line 80) | static void

FILE: winlib/SDL2-2.0.10/test/testnativex11.c
  function DestroyWindowX11 (line 44) | static void

FILE: winlib/SDL2-2.0.10/test/testoverlay2.c
  function quit (line 153) | static void
  function PrintUsage (line 160) | static void
  function loop (line 177) | void
  function main (line 235) | int

FILE: winlib/SDL2-2.0.10/test/testplatform.c
  function badsize (line 22) | static int
  function TestTypes (line 28) | int
  function TestEndian (line 83) | int
  function TST_allmul (line 151) | static int TST_allmul (void *a, void *b, int arg, void *result, void *ex...
  function TST_alldiv (line 157) | static int TST_alldiv (void *a, void *b, int arg, void *result, void *ex...
  function TST_allrem (line 163) | static int TST_allrem (void *a, void *b, int arg, void *result, void *ex...
  function TST_ualldiv (line 169) | static int TST_ualldiv (void *a, void *b, int arg, void *result, void *e...
  function TST_uallrem (line 175) | static int TST_uallrem (void *a, void *b, int arg, void *result, void *e...
  function TST_allshl (line 181) | static int TST_allshl (void *a, void *b, int arg, void *result, void *ex...
  function TST_aullshl (line 187) | static int TST_aullshl (void *a, void *b, int arg, void *result, void *e...
  function TST_allshr (line 193) | static int TST_allshr (void *a, void *b, int arg, void *result, void *ex...
  function TST_aullshr (line 199) | static int TST_aullshr (void *a, void *b, int arg, void *result, void *e...
  type LL_Test (line 208) | typedef struct {
  function Test64Bit (line 341) | int
  function TestCPUInfo (line 366) | int
  function TestAssertions (line 390) | int
  function main (line 419) | int

FILE: winlib/SDL2-2.0.10/test/testpower.c
  function report_power (line 17) | static void
  function main (line 63) | int

FILE: winlib/SDL2-2.0.10/test/testqsort.c
  function num_compare (line 15) | static int
  function test_sort (line 23) | static void
  function main (line 44) | int

FILE: winlib/SDL2-2.0.10/test/testrelative.c
  function DrawRects (line 30) | static void
  function loop (line 37) | static void
  function main (line 77) | int

FILE: winlib/SDL2-2.0.10/test/testrendercopyex.c
  type DrawState (line 27) | typedef struct {
  function quit (line 40) | static void
  function SDL_Texture (line 47) | SDL_Texture *
  function Draw (line 97) | void
  function loop (line 140) | void loop()
  function main (line 162) | int

FILE: winlib/SDL2-2.0.10/test/testrendertarget.c
  type DrawState (line 27) | typedef struct {
  function quit (line 41) | static void
  function SDL_Texture (line 48) | SDL_Texture *
  function SDL_bool (line 98) | SDL_bool
  function SDL_bool (line 181) | SDL_bool
  function loop (line 225) | void
  function main (line 251) | int

FILE: winlib/SDL2-2.0.10/test/testresample.c
  function main (line 15) | int

FILE: winlib/SDL2-2.0.10/test/testrumble.c
  function main (line 44) | int
  function main (line 146) | int

FILE: winlib/SDL2-2.0.10/test/testscale.c
  type DrawState (line 29) | typedef struct {
  function quit (line 42) | static void
  function SDL_Texture (line 49) | SDL_Texture *
  function Draw (line 99) | void
  function loop (line 130) | void
  function main (line 152) | int

FILE: winlib/SDL2-2.0.10/test/testsem.c
  function ThreadFunc (line 26) | int SDLCALL
  function killed (line 44) | static void
  function TestWaitTimeout (line 50) | static void
  function main (line 78) | int

FILE: winlib/SDL2-2.0.10/test/testsensor.c
  function HandleSensorEvent (line 37) | static void HandleSensorEvent(SDL_SensorEvent *event)
  function main (line 58) | int

FILE: winlib/SDL2-2.0.10/test/testshader.c
  type ShaderData (line 31) | typedef struct {
  function SDL_bool (line 127) | static SDL_bool CompileShader(GLhandleARB shader, const char *source)
  function SDL_bool (line 150) | static SDL_bool CompileShaderProgram(ShaderData *data)
  function DestroyShaderProgram (line 193) | static void DestroyShaderProgram(ShaderData *data)
  function SDL_bool (line 202) | static SDL_bool InitShaders()
  function QuitShaders (line 256) | static void QuitShaders()
  function power_of_two (line 266) | static int
  function GLuint (line 277) | GLuint
  function InitGL (line 335) | void InitGL(int Width, int Height)                    /* We call this ri...
  function DrawGLScene (line 356) | void DrawGLScene(SDL_Window *window, GLuint texture, GLfloat * texcoord)
  function main (line 416) | int main(int argc, char **argv)
  function main (line 491) | int

FILE: winlib/SDL2-2.0.10/test/testshape.c
  type LoadedPicture (line 22) | typedef struct LoadedPicture {
  function render (line 29) | void render(SDL_Renderer *renderer,SDL_Texture *texture,SDL_Rect texture...
  function main (line 41) | int main(int argc,char** argv)

FILE: winlib/SDL2-2.0.10/test/testsprite2.c
  function quit (line 50) | static void
  function LoadSprite (line 60) | int
  function MoveSprites (line 117) | void
  function loop (line 246) | void
  function main (line 281) | int

FILE: winlib/SDL2-2.0.10/test/testspriteminimal.c
  function quit (line 38) | static void
  function LoadSprite (line 44) | int
  function MoveSprites (line 93) | void
  function loop (line 128) | void loop()
  function main (line 146) | int

FILE: winlib/SDL2-2.0.10/test/teststreaming.c
  function quit (line 64) | void quit(int rc)
  function UpdateTexture (line 70) | void UpdateTexture(SDL_Texture *texture, int frame)
  function loop (line 94) | void
  function main (line 126) | int

FILE: winlib/SDL2-2.0.10/test/testthread.c
  function quit (line 26) | static void
  function ThreadFunc (line 47) | int SDLCALL
  function killed (line 70) | static void
  function main (line 79) | int

FILE: winlib/SDL2-2.0.10/test/testtimer.c
  function Uint32 (line 26) | static Uint32 SDLCALL
  function Uint32 (line 33) | static Uint32 SDLCALL
  function main (line 40) | int

FILE: winlib/SDL2-2.0.10/test/testver.c
  function main (line 23) | int

FILE: winlib/SDL2-2.0.10/test/testviewport.c
  function quit (line 36) | static void
  function DrawOnViewport (line 43) | void
  function loop (line 91) | void
  function main (line 140) | int

FILE: winlib/SDL2-2.0.10/test/testvulkan.c
  function main (line 21) | int main(int argc, char *argv[])
  type VulkanContext (line 176) | typedef struct VulkanContext
  function quit (line 211) | static void quit(int rc)
  function loadGlobalFunctions (line 218) | static void loadGlobalFunctions(void)
  function createInstance (line 245) | static void createInstance(void)
  function loadInstanceFunctions (line 293) | static void loadInstanceFunctions(void)
  function createSurface (line 311) | static void createSurface(void)
  function findPhysicalDevice (line 324) | static void findPhysicalDevice(void)
  function createDevice (line 497) | static void createDevice(void)
  function loadDeviceFunctions (line 529) | static void loadDeviceFunctions(void)
  function getQueues (line 549) | static void getQueues(void)
  function createSemaphore (line 564) | static void createSemaphore(VkSemaphore *semaphore)
  function createSemaphores (line 581) | static void createSemaphores(void)
  function getSurfaceCaps (line 587) | static void getSurfaceCaps(void)
  function getSurfaceFormats (line 608) | static void getSurfaceFormats(void)
  function getSwapchainImages (line 649) | static void getSwapchainImages(void)
  function SDL_bool (line 687) | static SDL_bool createSwapchain(void)
  function destroySwapchain (line 758) | static void destroySwapchain(void)
  function destroyCommandBuffers (line 767) | static void destroyCommandBuffers(void)
  function destroyCommandPool (line 778) | static void destroyCommandPool(void)
  function createCommandPool (line 785) | static void createCommandPool(void)
  function createCommandBuffers (line 806) | static void createCommandBuffers(void)
  function createFences (line 830) | static void createFences(void)
  function destroyFences (line 865) | static void destroyFences(void)
  function recordPipelineImageBarrier (line 879) | static void recordPipelineImageBarrier(VkCommandBuffer commandBuffer,
  function rerecordCommandBuffer (line 912) | static void rerecordCommandBuffer(uint32_t frameIndex, const VkClearColo...
  function destroySwapchainAndSwapchainSpecificStuff (line 966) | static void destroySwapchainAndSwapchainSpecificStuff(SDL_bool doDestroy...
  function SDL_bool (line 975) | static SDL_bool createNewSwapchainAndSwapchainSpecificStuff(void)
  function initVulkan (line 988) | static void initVulkan(void)
  function shutdownVulkan (line 1004) | static void shutdownVulkan(void)
  function SDL_bool (line 1023) | static SDL_bool render(void)
  function main (line 1119) | int main(int argc, char *argv[])

FILE: winlib/SDL2-2.0.10/test/testwm2.c
  function quit (line 43) | static void
  function loop (line 50) | void
  function main (line 117) | int

FILE: winlib/SDL2-2.0.10/test/testyuv.c
  function SDL_bool (line 26) | static SDL_bool is_packed_yuv_format(Uint32 format)
  function SDL_Surface (line 34) | static SDL_Surface *generate_test_pattern(int pattern_size)
  function SDL_bool (line 74) | static SDL_bool verify_yuv_data(Uint32 format, const Uint8 *yuv, int yuv...
  function run_automated_tests (line 114) | static int run_automated_tests(int pattern_size, int extra_pitch)
  function main (line 219) | int

FILE: winlib/SDL2-2.0.10/test/testyuv_cvt.c
  function clip3 (line 18) | static float clip3(float x, float y, float z)
  function RGBtoYUV (line 23) | static void RGBtoYUV(Uint8 * rgb, int *yuv, SDL_YUV_CONVERSION_MODE mode...
  function ConvertRGBtoPlanar2x2 (line 76) | static void ConvertRGBtoPlanar2x2(Uint32 format, Uint8 *src, int pitch, ...
  function ConvertRGBtoPacked4 (line 192) | static void ConvertRGBtoPacked4(Uint32 format, Uint8 *src, int pitch, Ui...
  function SDL_bool (line 262) | SDL_bool ConvertRGBtoYUV(Uint32 format, Uint8 *src, int pitch, Uint8 *ou...
  function CalculateYUVPitch (line 282) | int CalculateYUVPitch(Uint32 format, int width)

FILE: winlib/SDL2-2.0.10/test/torturethread.c
  function quit (line 27) | static void
  function SubThreadFunc (line 34) | int SDLCALL
  function ThreadFunc (line 43) | int SDLCALL
  function main (line 76) | int

FILE: winlib/SDL2-2.0.10/x86_64-w64-mingw32/include/SDL2/SDL_assert.h
  type SDL_AssertState (line 102) | typedef enum
  type SDL_AssertData (line 111) | typedef struct SDL_AssertData

FILE: winlib/SDL2-2.0.10/x86_64-w64-mingw32/include/SDL2/SDL_atomic.h
  type SDL_SpinLock (line 89) | typedef int SDL_SpinLock;
  type SDL_atomic_t (line 216) | typedef struct { int value; } SDL_atomic_t;

FILE: winlib/SDL2-2.0.10/x86_64-w64-mingw32/include/SDL2/SDL_audio.h
  type Uint16 (line 64) | typedef Uint16 SDL_AudioFormat;
  type SDL_AudioSpec (line 178) | typedef struct SDL_AudioSpec
  type SDL_AudioCVT (line 192) | struct SDL_AudioCVT
  type SDL_AudioCVT (line 193) | struct SDL_AudioCVT
  type SDL_AUDIOCVT_PACKED (line 226) | typedef struct SDL_AudioCVT
  type Uint32 (line 330) | typedef Uint32 SDL_AudioDeviceID;
  type SDL_AudioStatus (line 395) | typedef enum
  type _SDL_AudioStream (line 531) | struct _SDL_AudioStream
  type SDL_AudioStream (line 532) | typedef struct _SDL_AudioStream SDL_AudioStream;

FILE: winlib/SDL2-2.0.10/x86_64-w64-mingw32/include/SDL2/SDL_bits.h
  function SDL_FORCE_INLINE (line 60) | SDL_FORCE_INLINE int
  function SDL_FORCE_INLINE (line 104) | SDL_FORCE_INLINE SDL_bool

FILE: winlib/SDL2-2.0.10/x86_64-w64-mingw32/include/SDL2/SDL_blendmode.h
  type SDL_BlendMode (line 40) | typedef enum
  type SDL_BlendOperation (line 62) | typedef enum
  type SDL_BlendFactor (line 75) | typedef enum

FILE: winlib/SDL2-2.0.10/x86_64-w64-mingw32/include/SDL2/SDL_egl.h
  type khronos_int32_t (line 177) | typedef int32_t                 khronos_int32_t;
  type khronos_uint32_t (line 178) | typedef uint32_t                khronos_uint32_t;
  type khronos_int64_t (line 179) | typedef int64_t                 khronos_int64_t;
  type khronos_uint64_t (line 180) | typedef uint64_t                khronos_uint64_t;
  type khronos_int32_t (line 190) | typedef int32_t                 khronos_int32_t;
  type khronos_uint32_t (line 191) | typedef uint32_t                khronos_uint32_t;
  type khronos_int64_t (line 192) | typedef int64_t                 khronos_int64_t;
  type khronos_uint64_t (line 193) | typedef uint64_t                khronos_uint64_t;
  type __int32 (line 202) | typedef __int32                 khronos_int32_t;
  type khronos_uint32_t (line 203) | typedef unsigned __int32        khronos_uint32_t;
  type __int64 (line 204) | typedef __int64                 khronos_int64_t;
  type khronos_uint64_t (line 205) | typedef unsigned __int64        khronos_uint64_t;
  type khronos_int32_t (line 214) | typedef int                     khronos_int32_t;
  type khronos_uint32_t (line 215) | typedef unsigned int            khronos_uint32_t;
  type khronos_int64_t (line 217) | typedef long int                khronos_int64_t;
  type khronos_uint64_t (line 218) | typedef unsigned long int       khronos_uint64_t;
  type khronos_int64_t (line 220) | typedef long long int           khronos_int64_t;
  type khronos_uint64_t (line 221) | typedef unsigned long long int  khronos_uint64_t;
  type khronos_int32_t (line 231) | typedef int                     khronos_int32_t;
  type khronos_uint32_t (line 232) | typedef unsigned int            khronos_uint32_t;
  type khronos_int32_t (line 242) | typedef int32_t                 khronos_int32_t;
  type khronos_uint32_t (line 243) | typedef uint32_t                khronos_uint32_t;
  type khronos_int64_t (line 244) | typedef int64_t                 khronos_int64_t;
  type khronos_uint64_t (line 245) | typedef uint64_t                khronos_uint64_t;
  type khronos_int8_t (line 255) | typedef signed   char          khronos_int8_t;
  type khronos_uint8_t (line 256) | typedef unsigned char          khronos_uint8_t;
  type khronos_int16_t (line 257) | typedef signed   short int     khronos_int16_t;
  type khronos_uint16_t (line 258) | typedef unsigned short int     khronos_uint16_t;
  type khronos_intptr_t (line 266) | typedef signed   long long int khronos_intptr_t;
  type khronos_uintptr_t (line 267) | typedef unsigned long long int khronos_uintptr_t;
  type khronos_ssize_t (line 268) | typedef signed   long long int khronos_ssize_t;
  type khronos_usize_t (line 269) | typedef unsigned long long int khronos_usize_t;
  type khronos_intptr_t (line 271) | typedef signed   long  int     khronos_intptr_t;
  type khronos_uintptr_t (line 272) | typedef unsigned long  int     khronos_uintptr_t;
  type khronos_ssize_t (line 273) | typedef signed   long  int     khronos_ssize_t;
  type khronos_usize_t (line 274) | typedef unsigned long  int     khronos_usize_t;
  type khronos_float_t (line 281) | typedef          float         khronos_float_t;
  type khronos_uint64_t (line 294) | typedef khronos_uint64_t       khronos_utime_nanoseconds_t;
  type khronos_int64_t (line 295) | typedef khronos_int64_t        khronos_stime_nanoseconds_t;
  type khronos_boolean_enum_t (line 311) | typedef enum {
  type IUnknown (line 397) | typedef IUnknown * EGLNativeWindowType;
  type IUnknown (line 398) | typedef IUnknown * EGLNativePixmapType;
  type IUnknown (line 399) | typedef IUnknown * EGLNativeDisplayType;
  type HDC (line 401) | typedef HDC     EGLNativeDisplayType;
  type HBITMAP (line 402) | typedef HBITMAP EGLNativePixmapType;
  type HWND (line 403) | typedef HWND    EGLNativeWindowType;
  type EGLNativeDisplayType (line 408) | typedef int   EGLNativeDisplayType;
  type wl_display (line 414) | struct wl_display
  type wl_egl_pixmap (line 415) | struct wl_egl_pixmap
  type wl_egl_window (line 416) | struct wl_egl_window
  type gbm_device (line 420) | struct gbm_device
  type gbm_bo (line 421) | struct gbm_bo
  type ANativeWindow (line 426) | struct ANativeWindow
  type egl_native_pixmap_t (line 427) | struct egl_native_pixmap_t
  type ANativeWindow (line 429) | struct ANativeWindow
  type egl_native_pixmap_t (line 430) | struct egl_native_pixmap_t
  type MirEGLNativeDisplayType (line 436) | typedef MirEGLNativeDisplayType EGLNativeDisplayType;
  type MirEGLNativeWindowType (line 438) | typedef MirEGLNativeWindowType  EGLNativeWindowType;
  type khronos_uintptr_t (line 445) | typedef khronos_uintptr_t EGLNativePixmapType;
  type khronos_uintptr_t (line 446) | typedef khronos_uintptr_t EGLNativeWindowType;
  type Display (line 454) | typedef Display *EGLNativeDisplayType;
  type Pixmap (line 455) | typedef Pixmap   EGLNativePixmapType;
  type Window (line 456) | typedef Window   EGLNativeWindowType;
  type EGLNativeDisplayType (line 465) | typedef EGLNativeDisplayType NativeDisplayType;
  type EGLNativePixmapType (line 466) | typedef EGLNativePixmapType  NativePixmapType;
  type EGLNativeWindowType (line 467) | typedef EGLNativeWindowType  NativeWindowType;
  type khronos_int32_t (line 477) | typedef khronos_int32_t EGLint;
  type EGLBoolean (line 534) | typedef unsigned int EGLBoolean;
  type EGLenum (line 649) | typedef unsigned int EGLenum;
  type EGLAttrib (line 719) | typedef intptr_t EGLAttrib;
  type khronos_utime_nanoseconds_t (line 720) | typedef khronos_utime_nanoseconds_t EGLTime;
  type EGLAttribKHR (line 846) | typedef intptr_t EGLAttribKHR;
  type EGLAttribKHR (line 847) | typedef EGLSyncKHR (EGLAPIENTRYP PFNEGLCREATESYNC64KHRPROC) (EGLDisplay ...
  type khronos_utime_nanoseconds_t (line 888) | typedef khronos_utime_nanoseconds_t EGLTimeKHR;
  type khronos_uint64_t (line 1063) | typedef khronos_uint64_t EGLuint64KHR;
  type EGLNativeFileDescriptorKHR (line 1110) | typedef int EGLNativeFileDescriptorKHR;
  type khronos_ssize_t (line 1180) | typedef khronos_ssize_t EGLsizeiANDROID;
  type EGLsizeiANDROID (line 1182) | typedef EGLsizeiANDROID (*EGLGetBlobFuncANDROID) (const void *key, EGLsi...
  type EGLAttrib (line 1342) | typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETOUTPUTLAYERSEXTPROC) (EGLDispl...
  type EGLAttrib (line 1343) | typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETOUTPUTPORTSEXTPROC) (EGLDispla...
  type const (line 1377) | typedef EGLDisplay (EGLAPIENTRYP PFNEGLGETPLATFORMDISPLAYEXTPROC) (EGLen...
  type const (line 1378) | typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPRO...
  type const (line 1379) | typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPLATFORMPIXMAPSURFACEEXTPRO...
  type EGLClientPixmapHI (line 1455) | struct EGLClientPixmapHI {
  type EGLClientPixmapHI (line 1462) | struct EGLClientPixmapHI
  type EGLClientPixmapHI (line 1464) | struct EGLClientPixmapHI
  type khronos_utime_nanoseconds_t (line 1611) | typedef khronos_utime_nanoseconds_t EGLTimeNV;
  type khronos_utime_nanoseconds_t (line 1645) | typedef khronos_utime_nanoseconds_t EGLuint64NV;

FILE: winlib/SDL2-2.0.10/x86_64-w64-mingw32/include/SDL2/SDL_endian.h
  function SDL_FORCE_INLINE (line 70) | SDL_FORCE_INLINE Uint16
  function SDL_FORCE_INLINE (line 77) | SDL_FORCE_INLINE Uint16
  function SDL_FORCE_INLINE (line 84) | SDL_FORCE_INLINE Uint16
  function SDL_FORCE_INLINE (line 93) | SDL_FORCE_INLINE Uint16
  function SDL_FORCE_INLINE (line 106) | SDL_FORCE_INLINE Uint16
  function SDL_FORCE_INLINE (line 114) | SDL_FORCE_INLINE Uint32
  function SDL_FORCE_INLINE (line 121) | SDL_FORCE_INLINE Uint32
  function SDL_FORCE_INLINE (line 128) | SDL_FORCE_INLINE Uint32
  function SDL_FORCE_INLINE (line 139) | SDL_FORCE_INLINE Uint32
  function SDL_FORCE_INLINE (line 161) | SDL_FORCE_INLINE Uint32
  function SDL_FORCE_INLINE (line 170) | SDL_FORCE_INLINE Uint64
  function SDL_FORCE_INLINE (line 188) | SDL_FORCE_INLINE Uint64
  function SDL_FORCE_INLINE (line 195) | SDL_FORCE_INLINE Uint64
  function SDL_FORCE_INLINE (line 212) | SDL_FORCE_INLINE float

FILE: winlib/SDL2-2.0.10/x86_64-w64-mingw32/include/SDL2/SDL_error.h
  type SDL_errorcode (line 55) | typedef enum

FILE: winlib/SDL2-2.0.10/x86_64-w64-mingw32/include/SDL2/SDL_events.h
  type SDL_EventType (line 55) | typedef enum
  type SDL_CommonEvent (line 171) | typedef struct SDL_CommonEvent
  type SDL_DisplayEvent (line 180) | typedef struct SDL_DisplayEvent
  type SDL_WindowEvent (line 195) | typedef struct SDL_WindowEvent
  type SDL_KeyboardEvent (line 211) | typedef struct SDL_KeyboardEvent
  type SDL_TextEditingEvent (line 227) | typedef struct SDL_TextEditingEvent
  type SDL_TextInputEvent (line 242) | typedef struct SDL_TextInputEvent
  type SDL_MouseMotionEvent (line 253) | typedef struct SDL_MouseMotionEvent
  type SDL_MouseButtonEvent (line 269) | typedef struct SDL_MouseButtonEvent
  type SDL_MouseWheelEvent (line 286) | typedef struct SDL_MouseWheelEvent
  type SDL_JoyAxisEvent (line 300) | typedef struct SDL_JoyAxisEvent
  type SDL_JoyBallEvent (line 316) | typedef struct SDL_JoyBallEvent
  type SDL_JoyHatEvent (line 332) | typedef struct SDL_JoyHatEvent
  type SDL_JoyButtonEvent (line 352) | typedef struct SDL_JoyButtonEvent
  type SDL_JoyDeviceEvent (line 366) | typedef struct SDL_JoyDeviceEvent
  type SDL_ControllerAxisEvent (line 377) | typedef struct SDL_ControllerAxisEvent
  type SDL_ControllerButtonEvent (line 394) | typedef struct SDL_ControllerButtonEvent
  type SDL_ControllerDeviceEvent (line 409) | typedef struct SDL_ControllerDeviceEvent
  type SDL_AudioDeviceEvent (line 419) | typedef struct SDL_AudioDeviceEvent
  type SDL_TouchFingerEvent (line 434) | typedef struct SDL_TouchFingerEvent
  type SDL_MultiGestureEvent (line 451) | typedef struct SDL_MultiGestureEvent
  type SDL_DollarGestureEvent (line 468) | typedef struct SDL_DollarGestureEvent
  type SDL_DropEvent (line 486) | typedef struct SDL_DropEvent
  type SDL_SensorEvent (line 498) | typedef struct SDL_SensorEvent
  type SDL_QuitEvent (line 509) | typedef struct SDL_QuitEvent
  type SDL_OSEvent (line 518) | typedef struct SDL_OSEvent
  type SDL_UserEvent (line 527) | typedef struct SDL_UserEvent
  type SDL_SysWMmsg (line 538) | struct SDL_SysWMmsg
  type SDL_SysWMmsg (line 539) | typedef struct SDL_SysWMmsg SDL_SysWMmsg;
  type SDL_SysWMEvent (line 547) | typedef struct SDL_SysWMEvent
  type SDL_Event (line 557) | typedef union SDL_Event
  type SDL_eventaction (line 613) | typedef enum

FILE: winlib/SDL2-2.0.10/x86_64-w64-mingw32/include/SDL2/SDL_gamecontroller.h
  type _SDL_GameController (line 57) | struct _SDL_GameController
  type SDL_GameController (line 58) | typedef struct _SDL_GameController SDL_GameController;
  type SDL_GameControllerBindType (line 61) | typedef enum
  type SDL_GameControllerButtonBind (line 72) | typedef struct SDL_GameControllerButtonBind
  type SDL_GameControllerAxis (line 272) | typedef enum
  type SDL_GameControllerButton (line 316) | typedef enum

FILE: winlib/SDL2-2.0.10/x86_64-w64-mingw32/include/SDL2/SDL_gesture.h
  type Sint64 (line 44) | typedef Sint64 SDL_GestureID;

FILE: winlib/SDL2-2.0.10/x86_64-w64-mingw32/include/SDL2/SDL_haptic.h
  type _SDL_Haptic (line 140) | struct _SDL_Haptic
  type SDL_Haptic (line 141) | typedef struct _SDL_Haptic SDL_Haptic;
  type SDL_HapticDirection (line 450) | typedef struct SDL_HapticDirection
  type SDL_HapticConstant (line 468) | typedef struct SDL_HapticConstant
  type SDL_HapticPeriodic (line 549) | typedef struct SDL_HapticPeriodic
  type SDL_HapticCondition (line 602) | typedef struct SDL_HapticCondition
  type SDL_HapticRamp (line 639) | typedef struct SDL_HapticRamp
  type SDL_HapticLeftRight (line 676) | typedef struct SDL_HapticLeftRight
  type SDL_HapticCustom (line 704) | typedef struct SDL_HapticCustom
  type SDL_HapticEffect (line 800) | typedef union SDL_HapticEffect

FILE: winlib/SDL2-2.0.10/x86_64-w64-mingw32/include/SDL2/SDL_hints.h
  type SDL_HintPriority (line 1180) | typedef enum

FILE: winlib/SDL2-2.0.10/x86_64-w64-mingw32/include/SDL2/SDL_joystick.h
  type _SDL_Joystick (line 66) | struct _SDL_Joystick
  type SDL_Joystick (line 67) | typedef struct _SDL_Joystick SDL_Joystick;
  type SDL_JoystickGUID (line 70) | typedef struct {
  type Sint32 (line 81) | typedef Sint32 SDL_JoystickID;
  type SDL_JoystickType (line 83) | typedef enum
  type SDL_JoystickPowerLevel (line 97) | typedef enum

FILE: winlib/SDL2-2.0.10/x86_64-w64-mingw32/include/SDL2/SDL_keyboard.h
  type SDL_Keysym (line 47) | typedef struct SDL_Keysym

FILE: winlib/SDL2-2.0.10/x86_64-w64-mingw32/include/SDL2/SDL_keycode.h
  type Sint32 (line 45) | typedef Sint32 SDL_Keycode;
  type SDL_Keymod (line 325) | typedef enum

FILE: winlib/SDL2-2.0.10/x86_64-w64-mingw32/include/SDL2/SDL_log.h
  type SDL_LogPriority (line 102) | typedef enum

FILE: winlib/SDL2-2.0.10/x86_64-w64-mingw32/include/SDL2/SDL_messagebox.h
  type SDL_MessageBoxFlags (line 37) | typedef enum
  type SDL_MessageBoxButtonFlags (line 47) | typedef enum
  type SDL_MessageBoxButtonData (line 56) | typedef struct
  type SDL_MessageBoxColor (line 66) | typedef struct
  type SDL_MessageBoxColorType (line 71) | typedef enum
  type SDL_MessageBoxColorScheme (line 84) | typedef struct
  type SDL_MessageBoxData (line 92) | typedef struct

FILE: winlib/SDL2-2.0.10/x86_64-w64-mingw32/include/SDL2/SDL_mouse.h
  type SDL_Cursor (line 41) | typedef struct SDL_Cursor SDL_Cursor;
  type SDL_SystemCursor (line 46) | typedef enum
  type SDL_MouseWheelDirection (line 66) | typedef enum

FILE: winlib/SDL2-2.0.10/x86_64-w64-mingw32/include/SDL2/SDL_mutex.h
  type SDL_mutex (line 58) | struct SDL_mutex
  type SDL_mutex (line 59) | typedef struct SDL_mutex SDL_mutex;
  type SDL_semaphore (line 106) | struct SDL_semaphore
  type SDL_sem (line 107) | typedef struct SDL_semaphore SDL_sem;
  type SDL_cond (line 166) | struct SDL_cond
  type SDL_cond (line 167) | typedef struct SDL_cond SDL_cond;

FILE: winlib/SDL2-2.0.10/x86_64-w64-mingw32/include/SDL2/SDL_opengl.h
  type GLenum (line 176) | typedef unsigned int	GLenum;
  type GLboolean (line 177) | typedef unsigned char	GLboolean;
  type GLbitfield (line 178) | typedef unsigned int	GLbitfield;
  type GLvoid (line 179) | typedef void		GLvoid;
  type GLbyte (line 180) | typedef signed char	GLbyte;
  type GLshort (line 181) | typedef short		GLshort;
  type GLint (line 182) | typedef int		GLint;
  type GLubyte (line 183) | typedef unsigned char	GLubyte;
  type GLushort (line 184) | typedef unsigned short	GLushort;
  type GLuint (line 185) | typedef unsigned int	GLuint;
  type GLsizei (line 186) | typedef int		GLsizei;
  type GLfloat (line 187) | typedef float		GLfloat;
  type GLclampf (line 188) | typedef float		GLclampf;
  type GLdouble (line 189) | typedef double		GLdouble;
  type GLclampd (line 190) | typedef double		GLclampd;

FILE: winlib/SDL2-2.0.10/x86_64-w64-mingw32/include/SDL2/SDL_opengl_glext.h
  type GLsizeiptr (line 469) | typedef long GLsizeiptr;
  type GLintptr (line 470) | typedef long GLintptr;
  type GLsizeiptr (line 472) | typedef ptrdiff_t GLsizeiptr;
  type GLintptr (line 473) | typedef ptrdiff_t GLintptr;
  type GLchar (line 569) | typedef char GLchar;
  type GLhalf (line 887) | typedef unsigned short GLhalf;
  type GLubyte (line 1166) | typedef const GLubyte *(APIENTRYP PFNGLGETSTRINGIPROC) (GLenum name, GLu...
  type __GLsync (line 1371) | struct __GLsync
  type __int32 (line 1401) | typedef __int32 int32_t;
  type __int64 (line 1402) | typedef __int64 int64_t;
  type GLuint64 (line 1409) | typedef uint64_t GLuint64;
  type GLint64 (line 1410) | typedef int64_t GLint64;
  type const (line 1759) | typedef GLint (APIENTRYP PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC) (GLuint ...
  type const (line 1760) | typedef GLuint (APIENTRYP PFNGLGETSUBROUTINEINDEXPROC) (GLuint program, ...
  type const (line 2463) | typedef GLuint (APIENTRYP PFNGLGETPROGRAMRESOURCEINDEXPROC) (GLuint prog...
  type const (line 2466) | typedef GLint (APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONPROC) (GLuint pr...
  type const (line 2467) | typedef GLint (APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC) (GLui...
  type GLuint64EXT (line 2597) | typedef uint64_t GLuint64EXT;
  type _cl_context (line 2645) | struct _cl_context
  type _cl_event (line 2646) | struct _cl_event
  type struct (line 2649) | typedef GLsync (APIENTRYP PFNGLCREATESYNCFROMCLEVENTARBPROC) (struct _cl...
  type _cl_context (line 2651) | struct _cl_context
  type _cl_event (line 2651) | struct _cl_event
  type GLhalfARB (line 3042) | typedef unsigned short GLhalfARB;
  type GLhandleARB (line 3575) | typedef unsigned int GLhandleARB;
  type GLcharARB (line 3577) | typedef char GLcharARB;
  type GLchar (line 3731) | typedef GLboolean (APIENTRYP PFNGLISNAMEDSTRINGARBPROC) (GLint namelen, ...
  type GLsizeiptrARB (line 4149) | typedef long GLsizeiptrARB;
  type GLintptrARB (line 4150) | typedef long GLintptrARB;
  type GLsizeiptrARB (line 4152) | typedef ptrdiff_t GLsizeiptrARB;
  type GLintptrARB (line 4153) | typedef ptrdiff_t GLintptrARB;
  type GLint (line 4495) | typedef GLint GLfixed;
  type GLint64EXT (line 4828) | typedef int64_t GLint64EXT;
  type GLenum (line 5629) | typedef GLuint (APIENTRYP PFNGLNEWOBJECTBUFFERATIPROC) (GLsizei size, co...
  type GLuint (line 7587) | typedef GLboolean (APIENTRYP PFNGLARETEXTURESRESIDENTEXTPROC) (GLsizei n...
  type GLhalfNV (line 8856) | typedef unsigned short GLhalfNV;
  type GLintptr (line 9740) | typedef GLintptr GLvdpauSurfaceNV;
  type const (line 9747) | typedef GLvdpauSurfaceNV (APIENTRYP PFNGLVDPAUREGISTERVIDEOSURFACENVPROC...
  type const (line 9748) | typedef GLvdpauSurfaceNV (APIENTRYP PFNGLVDPAUREGISTEROUTPUTSURFACENVPRO...
  type GLuint (line 9973) | typedef GLboolean (APIENTRYP PFNGLAREPROGRAMSRESIDENTNVPROC) (GLsizei n,...

FILE: winlib/SDL2-2.0.10/x86_64-w64-mingw32/include/SDL2/SDL_opengles2_gl2.h
  type GLvoid (line 21) | typedef void             GLvoid;
  type GLchar (line 22) | typedef char             GLchar;
  type GLenum (line 23) | typedef unsigned int     GLenum;
  type GLboolean (line 24) | typedef unsigned char    GLboolean;
  type GLbitfield (line 25) | typedef unsigned int     GLbitfield;
  type khronos_int8_t (line 26) | typedef khronos_int8_t   GLbyte;
  type GLshort (line 27) | typedef short            GLshort;
  type GLint (line 28) | typedef int              GLint;
  type GLsizei (line 29) | typedef int              GLsizei;
  type khronos_uint8_t (line 30) | typedef khronos_uint8_t  GLubyte;
  type GLushort (line 31) | typedef unsigned short   GLushort;
  type GLuint (line 32) | typedef unsigned int     GLuint;
  type khronos_float_t (line 33) | typedef khronos_float_t  GLfloat;
  type khronos_float_t (line 34) | typedef khronos_float_t  GLclampf;
  type khronos_int32_t (line 35) | typedef khronos_int32_t  GLfixed;
  type khronos_intptr_t (line 38) | typedef khronos_intptr_t GLintptr;
  type khronos_ssize_t (line 39) | typedef khronos_ssize_t  GLsizeiptr;

FILE: winlib/SDL2-2.0.10/x86_64-w64-mingw32/include/SDL2/SDL_opengles2_gl2ext.h
  type khronos_int64_t (line 27) | typedef khronos_int64_t GLint64;
  type khronos_uint64_t (line 28) | typedef khronos_uint64_t GLuint64;
  type __GLsync (line 29) | struct __GLsync

FILE: winlib/SDL2-2.0.10/x86_64-w64-mingw32/include/SDL2/SDL_opengles2_khrplatform.h
  type khronos_int32_t (line 142) | typedef int32_t                 khronos_int32_t;
  type khronos_uint32_t (line 143) | typedef uint32_t                khronos_uint32_t;
  type khronos_int64_t (line 144) | typedef int64_t                 khronos_int64_t;
  type khronos_uint64_t (line 145) | typedef uint64_t                khronos_uint64_t;
  type khronos_int32_t (line 155) | typedef int32_t                 khronos_int32_t;
  type khronos_uint32_t (line 156) | typedef uint32_t                khronos_uint32_t;
  type khronos_int64_t (line 157) | typedef int64_t                 khronos_int64_t;
  type khronos_uint64_t (line 158) | typedef uint64_t                khronos_uint64_t;
  type __int32 (line 167) | typedef __int32                 khronos_int32_t;
  type khronos_uint32_t (line 168) | typedef unsigned __int32        khronos_uint32_t;
  type __int64 (line 169) | typedef __int64                 khronos_int64_t;
  type khronos_uint64_t (line 170) | typedef unsigned __int64        khronos_uint64_t;
  type khronos_int32_t (line 179) | typedef int                     khronos_int32_t;
  type khronos_uint32_t (line 180) | typedef unsigned int            khronos_uint32_t;
  type khronos_int64_t (line 182) | typedef long int                khronos_int64_t;
  type khronos_uint64_t (line 183) | typedef unsigned long int       khronos_uint64_t;
  type khronos_int64_t (line 185) | typedef long long int           khronos_int64_t;
  type khronos_uint64_t (line 186) | typedef unsigned long long int  khronos_uint64_t;
  type khronos_int32_t (line 196) | typedef int                     khronos_int32_t;
  type khronos_uint32_t (line 197) | typedef unsigned int            khronos_uint32_t;
  type khronos_int32_t (line 207) | typedef int32_t                 khronos_int32_t;
  type khronos_uint32_t (line 208) | typedef uint32_t                khronos_uint32_t;
  type khronos_int64_t (line 209) | typedef int64_t                 khronos_int64_t;
  type khronos_uint64_t (line 210) | typedef uint64_t                khronos_uint64_t;
  type khronos_int8_t (line 220) | typedef signed   char          khronos_int8_t;
  type khronos_uint8_t (line 221) | typedef unsigned char          khronos_uint8_t;
  type khronos_int16_t (line 222) | typedef signed   short int     khronos_int16_t;
  type khronos_uint16_t (line 223) | typedef unsigned short int     khronos_uint16_t;
  type khronos_intptr_t (line 231) | typedef signed   long long int khronos_intptr_t;
  type khronos_uintptr_t (line 232) | typedef unsigned long long int khronos_uintptr_t;
  type khronos_ssize_t (line 233) | typedef signed   long long int khronos_ssize_t;
  type khronos_usize_t (line 234) | typedef unsigned long long int khronos_usize_t;
  type khronos_intptr_t (line 236) | typedef signed   long  int     khronos_intptr_t;
  type khronos_uintptr_t (line 237) | typedef unsigned long  int     khronos_uintptr_t;
  type khronos_ssize_t (line 238) | typedef signed   long  int     khronos_ssize_t;
  type khronos_usize_t (line 239) | typedef unsigned long  int     khronos_usize_t;
  type khronos_float_t (line 246) | typedef          float         khronos_float_t;
  type khronos_uint64_t (line 259) | typedef khronos_uint64_t       khronos_utime_nanoseconds_t;
  type khronos_int64_t (line 260) | typedef khronos_int64_t        khronos_stime_nanoseconds_t;
  type khronos_boolean_enum_t (line 276) | typedef enum {

FILE: winlib/SDL2-2.0.10/x86_64-w64-mingw32/include/SDL2/SDL_pixels.h
  type SDL_PixelFormatEnum (line 171) | typedef enum
  type SDL_Color (line 295) | typedef struct SDL_Color
  type SDL_Palette (line 304) | typedef struct SDL_Palette
  type SDL_PixelFormat (line 315) | typedef struct SDL_PixelFormat

FILE: winlib/SDL2-2.0.10/x86_64-w64-mingw32/include/SDL2/SDL_power.h
  type SDL_PowerState (line 42) | typedef enum

FILE: winlib/SDL2-2.0.10/x86_64-w64-mingw32/include/SDL2/SDL_rect.h
  type SDL_Point (line 48) | typedef struct SDL_Point
  type SDL_FPoint (line 60) | typedef struct SDL_FPoint
  type SDL_Rect (line 77) | typedef struct SDL_Rect
  type SDL_FRect (line 87) | typedef struct SDL_FRect
  function SDL_FORCE_INLINE (line 99) | SDL_FORCE_INLINE SDL_bool SDL_PointInRect(const SDL_Point *p, const SDL_...
  function SDL_FORCE_INLINE (line 108) | SDL_FORCE_INLINE SDL_bool SDL_RectEmpty(const SDL_Rect *r)
  function SDL_FORCE_INLINE (line 116) | SDL_FORCE_INLINE SDL_bool SDL_RectEquals(const SDL_Rect *a, const SDL_Re...

FILE: winlib/SDL2-2.0.10/x86_64-w64-mingw32/include/SDL2/SDL_render.h
  type SDL_RendererFlags (line 64) | typedef enum
  type SDL_RendererInfo (line 78) | typedef struct SDL_RendererInfo
  type SDL_TextureAccess (line 91) | typedef enum
  type SDL_TextureModulate (line 101) | typedef enum
  type SDL_RendererFlip (line 111) | typedef enum
  type SDL_Renderer (line 121) | struct SDL_Renderer
  type SDL_Renderer (line 122) | typedef struct SDL_Renderer SDL_Renderer;
  type SDL_Texture (line 127) | struct SDL_Texture
  type SDL_Texture (line 128) | typedef struct SDL_Texture SDL_Texture;

FILE: winlib/SDL2-2.0.10/x86_64-w64-mingw32/include/SDL2/SDL_rwops.h
  type SDL_RWops (line 52) | typedef struct SDL_RWops

FILE: winlib/SDL2-2.0.10/x86_64-w64-mingw32/include/SDL2/SDL_scancode.h
  type SDL_Scancode (line 43) | typedef enum

FILE: winlib/SDL2-2.0.10/x86_64-w64-mingw32/include/SDL2/SDL_sensor.h
  type _SDL_Sensor (line 51) | struct _SDL_Sensor
  type SDL_Sensor (line 52) | typedef struct _SDL_Sensor SDL_Sensor;
  type Sint32 (line 60) | typedef Sint32 SDL_SensorID;
  type SDL_SensorType (line 69) | typedef enum

FILE: winlib/SDL2-2.0.10/x86_64-w64-mingw32/include/SDL2/SDL_shape.h
  type WindowShapeMode (line 80) | typedef enum {
  type SDL_WindowShapeParams (line 94) | typedef union {
  type SDL_WindowShapeMode (line 101) | typedef struct SDL_WindowShapeMode {

FILE: winlib/SDL2-2.0.10/x86_64-w64-mingw32/include/SDL2/SDL_stdinc.h
  type SDL_bool (line 159) | typedef int SDL_bool;
  type SDL_bool (line 161) | typedef enum
  type Sint8 (line 173) | typedef int8_t Sint8;
  type Uint8 (line 179) | typedef uint8_t Uint8;
  type Sint16 (line 185) | typedef int16_t Sint16;
  type Uint16 (line 191) | typedef uint16_t Uint16;
  type Sint32 (line 197) | typedef int32_t Sint32;
  type Uint32 (line 203) | typedef uint32_t Uint32;
  type Sint64 (line 210) | typedef int64_t Sint64;
  type Uint64 (line 216) | typedef uint64_t Uint64;
  type SDL_DUMMY_ENUM (line 337) | typedef enum
  function SDL_FORCE_INLINE (line 420) | SDL_FORCE_INLINE void SDL_memset4(void *dst, Uint32 val, size_t dwords)
  type _SDL_iconv_t (line 547) | struct _SDL_iconv_t

FILE: winlib/SDL2-2.0.10/x86_64-w64-mingw32/include/SDL2/SDL_surface.h
  type SDL_Surface (line 70) | typedef struct SDL_Surface
  type SDL_Surface (line 98) | struct SDL_Surface
  type SDL_Surface (line 99) | struct SDL_Surface
  type SDL_YUV_CONVERSION_MODE (line 104) | typedef enum

FILE: winlib/SDL2-2.0.10/x86_64-w64-mingw32/include/SDL2/SDL_system.h
  type IDirect3DDevice9 (line 60) | typedef struct IDirect3DDevice9 IDirect3DDevice9;
  type SDL_WinRT_Path (line 183) | typedef enum
  type SDL_WinRT_DeviceFamily (line 207) | typedef enum

FILE: winlib/SDL2-2.0.10/x86_64-w64-mingw32/include/SDL2/SDL_syswm.h
  type SDL_SysWMinfo (line 44) | struct SDL_SysWMinfo
  type NSWindow (line 84) | typedef struct _NSWindow NSWindow;
  type UIWindow (line 92) | typedef struct _UIWindow UIWindow;
  type UIViewController (line 93) | typedef struct _UIViewController UIViewController;
  type Uint32 (line 95) | typedef Uint32 GLuint;
  type ANativeWindow (line 99) | typedef struct ANativeWindow ANativeWindow;
  type SDL_SYSWM_TYPE (line 119) | typedef enum
  type SDL_SysWMmsg (line 138) | struct SDL_SysWMmsg
  type SDL_SysWMinfo (line 197) | struct SDL_SysWMinfo
  type SDL_SysWMinfo (line 295) | typedef struct SDL_SysWMinfo SDL_SysWMinfo;

FILE: winlib/SDL2-2.0.10/x86_64-w64-mingw32/include/SDL2/SDL_test_common.h
  type SDLTest_CommonState (line 51) | typedef struct

FILE: winlib/SDL2-2.0.10/x86_64-w64-mingw32/include/SDL2/SDL_test_crc32.h
  type SDLTest_Crc32Context (line 66) | typedef struct {

FILE: winlib/SDL2-2.0.10/x86_64-w64-mingw32/include/SDL2/SDL_test_harness.h
  type SDLTest_TestCaseReference (line 75) | typedef struct SDLTest_TestCaseReference {
  type SDLTest_TestSuiteReference (line 89) | typedef struct SDLTest_TestSuiteReference {

FILE: winlib/SDL2-2.0.10/x86_64-w64-mingw32/include/SDL2/SDL_test_images.h
  type SDLTest_SurfaceImage_t (line 50) | typedef struct SDLTest_SurfaceImage_s {

FILE: winlib/SDL2-2.0.10/x86_64-w64-mingw32/include/SDL2/SDL_test_md5.h
  type MD5UINT4 (line 68) | typedef unsigned long int MD5UINT4;
  type SDLTest_Md5Context (line 71) | typedef struct {

FILE: winlib/SDL2-2.0.10/x86_64-w64-mingw32/include/SDL2/SDL_test_random.h
  type SDLTest_RandomContext (line 59) | typedef struct {

FILE: winlib/SDL2-2.0.10/x86_64-w64-mingw32/include/SDL2/SDL_thread.h
  type SDL_Thread (line 45) | struct SDL_Thread
  type SDL_Thread (line 46) | typedef struct SDL_Thread SDL_Thread;
  type SDL_threadID (line 49) | typedef unsigned long SDL_threadID;
  type SDL_TLSID (line 52) | typedef unsigned int SDL_TLSID;
  type SDL_ThreadPriority (line 59) | typedef enum {

FILE: winlib/SDL2-2.0.10/x86_64-w64-mingw32/include/SDL2/SDL_timer.h
  type SDL_TimerID (line 86) | typedef int SDL_TimerID;

FILE: winlib/SDL2-2.0.10/x86_64-w64-mingw32/include/SDL2/SDL_touch.h
  type Sint64 (line 41) | typedef Sint64 SDL_TouchID;
  type Sint64 (line 42) | typedef Sint64 SDL_FingerID;
  type SDL_TouchDeviceType (line 44) | typedef enum
  type SDL_Finger (line 52) | typedef struct SDL_Finger

FILE: winlib/SDL2-2.0.10/x86_64-w64-mingw32/include/SDL2/SDL_version.h
  type SDL_version (line 51) | typedef struct SDL_version

FILE: winlib/SDL2-2.0.10/x86_64-w64-mingw32/include/SDL2/SDL_video.h
  type SDL_DisplayMode (line 53) | typedef struct
  type SDL_Window (line 90) | typedef struct SDL_Window SDL_Window;
  type SDL_WindowFlags (line 97) | typedef enum
  type SDL_WindowEventID (line 146) | typedef enum
  type SDL_DisplayEventID (line 175) | typedef enum
  type SDL_DisplayOrientation (line 181) | typedef enum
  type SDL_GLattr (line 198) | typedef enum
  type SDL_GLprofile (line 229) | typedef enum
  type SDL_GLcontextFlag (line 236) | typedef enum
  type SDL_GLcontextReleaseFlag (line 244) | typedef enum
  type SDL_GLContextResetNotification (line 250) | typedef enum
  type SDL_HitTestResult (line 1020) | typedef enum
  type SDL_Point (line 1039) | typedef SDL_HitTestResult (SDLCALL *SDL_HitTest)(SDL_Window *win,

FILE: winlib/SDL2-2.0.10/x86_64-w64-mingw32/include/SDL2/SDL_vulkan.h
  type VkInstance (line 57) | typedef VkInstance SDL_vulkanInstance;
  type VkSurfaceKHR (line 58) | typedef VkSurfaceKHR SDL_vulkanSurface;
Condensed preview — 429 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (6,028K chars).
[
  {
    "path": ".gitattributes",
    "chars": 84,
    "preview": "winlib/*  linguist-vendored\nsrc/lib/* linguist-vendored\nicon.inl  linguist-vendored\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 59,
    "preview": "# These are supported funding model platforms\n\ngithub: rxi\n"
  },
  {
    "path": "LICENSE",
    "chars": 1047,
    "preview": "Copyright (c) 2020 rxi\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software an"
  },
  {
    "path": "README.md",
    "chars": 1930,
    "preview": "# lite\n![screenshot](https://user-images.githubusercontent.com/3920290/81471642-6c165880-91ea-11ea-8cd1-fae7ae8f0bc4.png"
  },
  {
    "path": "build.bat",
    "chars": 436,
    "preview": "@echo off\n\nrem download this:\nrem https://nuwen.net/mingw.html\n\necho compiling (windows)...\n\nwindres res.rc -O coff -o r"
  },
  {
    "path": "build.sh",
    "chars": 982,
    "preview": "#!/bin/bash\n\ncflags=\"-Wall -O3 -g -std=gnu11 -fno-strict-aliasing -Isrc\"\nlflags=\"-lSDL2 -lm\"\n\nif [[ $* == *windows* ]]; "
  },
  {
    "path": "build_release.sh",
    "chars": 231,
    "preview": "#!/bin/bash\n./build.sh release windows\n./build.sh release\nrm lite.zip 2>/dev/null\ncp winlib/SDL2-2.0.10/x86_64-w64-mingw"
  },
  {
    "path": "data/core/command.lua",
    "chars": 1422,
    "preview": "local core = require \"core\"\nlocal command = {}\n\ncommand.map = {}\n\nlocal always_true = function() return true end\n\n\nfunct"
  },
  {
    "path": "data/core/commands/command.lua",
    "chars": 634,
    "preview": "local core = require \"core\"\nlocal command = require \"core.command\"\nlocal CommandView = require \"core.commandview\"\n\nlocal"
  },
  {
    "path": "data/core/commands/core.lua",
    "chars": 2701,
    "preview": "local core = require \"core\"\nlocal common = require \"core.common\"\nlocal command = require \"core.command\"\nlocal keymap = r"
  },
  {
    "path": "data/core/commands/doc.lua",
    "chars": 10363,
    "preview": "local core = require \"core\"\nlocal command = require \"core.command\"\nlocal common = require \"core.common\"\nlocal config = r"
  },
  {
    "path": "data/core/commands/findreplace.lua",
    "chars": 4625,
    "preview": "local core = require \"core\"\nlocal command = require \"core.command\"\nlocal config = require \"core.config\"\nlocal search = r"
  },
  {
    "path": "data/core/commands/root.lua",
    "chars": 3151,
    "preview": "local core = require \"core\"\nlocal style = require \"core.style\"\nlocal DocView = require \"core.docview\"\nlocal command = re"
  },
  {
    "path": "data/core/commandview.lua",
    "chars": 6364,
    "preview": "local core = require \"core\"\nlocal common = require \"core.common\"\nlocal style = require \"core.style\"\nlocal Doc = require "
  },
  {
    "path": "data/core/common.lua",
    "chars": 3033,
    "preview": "local common = {}\n\n\nfunction common.is_utf8_cont(char)\n  local byte = char:byte()\n  return byte >= 0x80 and byte < 0xc0\n"
  },
  {
    "path": "data/core/config.lua",
    "chars": 520,
    "preview": "local config = {}\n\nconfig.project_scan_rate = 5\nconfig.fps = 60\nconfig.max_log_items = 80\nconfig.message_timeout = 3\ncon"
  },
  {
    "path": "data/core/doc/highlighter.lua",
    "chars": 1944,
    "preview": "local core = require \"core\"\nlocal config = require \"core.config\"\nlocal tokenizer = require \"core.tokenizer\"\nlocal Object"
  },
  {
    "path": "data/core/doc/init.lua",
    "chars": 10255,
    "preview": "local Object = require \"core.object\"\nlocal Highlighter = require \"core.doc.highlighter\"\nlocal syntax = require \"core.syn"
  },
  {
    "path": "data/core/doc/search.lua",
    "chars": 1006,
    "preview": "local search = {}\n\nlocal default_opt = {}\n\n\nlocal function pattern_lower(str)\n  if str:sub(1, 1) == \"%\" then\n    return "
  },
  {
    "path": "data/core/doc/translate.lua",
    "chars": 3022,
    "preview": "local common = require \"core.common\"\nlocal config = require \"core.config\"\n\n-- functions for translating a Doc position t"
  },
  {
    "path": "data/core/docview.lua",
    "chars": 10458,
    "preview": "local core = require \"core\"\nlocal common = require \"core.common\"\nlocal config = require \"core.config\"\nlocal style = requ"
  },
  {
    "path": "data/core/init.lua",
    "chars": 12435,
    "preview": "require \"core.strict\"\nlocal common = require \"core.common\"\nlocal config = require \"core.config\"\nlocal style = require \"c"
  },
  {
    "path": "data/core/keymap.lua",
    "chars": 5711,
    "preview": "local command = require \"core.command\"\nlocal keymap = {}\n\nkeymap.modkeys = {}\nkeymap.map = {}\nkeymap.reverse_map = {}\n\nl"
  },
  {
    "path": "data/core/logview.lua",
    "chars": 1694,
    "preview": "local core = require \"core\"\nlocal style = require \"core.style\"\nlocal View = require \"core.view\"\n\n\nlocal LogView = View:e"
  },
  {
    "path": "data/core/object.lua",
    "chars": 819,
    "preview": "local Object = {}\nObject.__index = Object\n\n\nfunction Object:new()\nend\n\n\nfunction Object:extend()\n  local cls = {}\n  for "
  },
  {
    "path": "data/core/rootview.lua",
    "chars": 13225,
    "preview": "local core = require \"core\"\nlocal common = require \"core.common\"\nlocal style = require \"core.style\"\nlocal keymap = requi"
  },
  {
    "path": "data/core/statusview.lua",
    "chars": 3381,
    "preview": "local core = require \"core\"\nlocal common = require \"core.common\"\nlocal command = require \"core.command\"\nlocal config = r"
  },
  {
    "path": "data/core/strict.lua",
    "chars": 428,
    "preview": "local strict = {}\nstrict.defined = {}\n\n\n-- used to define a global variable\nfunction global(t)\n  for k, v in pairs(t) do"
  },
  {
    "path": "data/core/style.lua",
    "chars": 1837,
    "preview": "local common = require \"core.common\"\nlocal style = {}\n\nstyle.padding = { x = common.round(14 * SCALE), y = common.round("
  },
  {
    "path": "data/core/syntax.lua",
    "chars": 537,
    "preview": "local common = require \"core.common\"\n\nlocal syntax = {}\nsyntax.items = {}\n\nlocal plain_text_syntax = { patterns = {}, sy"
  },
  {
    "path": "data/core/tokenizer.lua",
    "chars": 2364,
    "preview": "local tokenizer = {}\n\n\nlocal function push_token(t, type, text)\n  local prev_type = t[#t-1]\n  local prev_text = t[#t]\n  "
  },
  {
    "path": "data/core/view.lua",
    "chars": 3294,
    "preview": "local core = require \"core\"\nlocal config = require \"core.config\"\nlocal style = require \"core.style\"\nlocal common = requi"
  },
  {
    "path": "data/plugins/autocomplete.lua",
    "chars": 6943,
    "preview": "local core = require \"core\"\nlocal common = require \"core.common\"\nlocal config = require \"core.config\"\nlocal command = re"
  },
  {
    "path": "data/plugins/autoreload.lua",
    "chars": 1323,
    "preview": "local core = require \"core\"\nlocal config = require \"core.config\"\nlocal Doc = require \"core.doc\"\n\n\nlocal times = setmetat"
  },
  {
    "path": "data/plugins/language_c.lua",
    "chars": 1960,
    "preview": "local syntax = require \"core.syntax\"\n\nsyntax.add {\n  files = { \"%.c$\", \"%.h$\", \"%.inl$\", \"%.cpp$\", \"%.hpp$\" },\n  comment"
  },
  {
    "path": "data/plugins/language_css.lua",
    "chars": 998,
    "preview": "local syntax = require \"core.syntax\"\n\nsyntax.add {\n  files = { \"%.css$\" },\n  patterns = {\n    { pattern = \"\\\\.\",        "
  },
  {
    "path": "data/plugins/language_js.lua",
    "chars": 2302,
    "preview": "local syntax = require \"core.syntax\"\n\nsyntax.add {\n  files = { \"%.js$\", \"%.json$\", \"%.cson$\" },\n  comment = \"//\",\n  patt"
  },
  {
    "path": "data/plugins/language_lua.lua",
    "chars": 1795,
    "preview": "local syntax = require \"core.syntax\"\n\nsyntax.add {\n  files = \"%.lua$\",\n  headers = \"^#!.*[ /]lua\",\n  comment = \"--\",\n  p"
  },
  {
    "path": "data/plugins/language_md.lua",
    "chars": 946,
    "preview": "local syntax = require \"core.syntax\"\n\nsyntax.add {\n  files = { \"%.md$\", \"%.markdown$\" },\n  patterns = {\n    { pattern = "
  },
  {
    "path": "data/plugins/language_python.lua",
    "chars": 1823,
    "preview": "local syntax = require \"core.syntax\"\n\nsyntax.add {\n  files = { \"%.py$\", \"%.pyw$\" },\n  headers = \"^#!.*[ /]python\",\n  com"
  },
  {
    "path": "data/plugins/language_xml.lua",
    "chars": 915,
    "preview": "local syntax = require \"core.syntax\"\n\nsyntax.add {\n  files = { \"%.xml$\", \"%.html?$\" },\n  headers = \"<%?xml\",\n  patterns "
  },
  {
    "path": "data/plugins/macro.lua",
    "chars": 1444,
    "preview": "local core = require \"core\"\nlocal command = require \"core.command\"\nlocal keymap = require \"core.keymap\"\n\nlocal handled_e"
  },
  {
    "path": "data/plugins/projectsearch.lua",
    "chars": 7299,
    "preview": "local core = require \"core\"\nlocal common = require \"core.common\"\nlocal keymap = require \"core.keymap\"\nlocal command = re"
  },
  {
    "path": "data/plugins/quote.lua",
    "chars": 569,
    "preview": "local core = require \"core\"\nlocal command = require \"core.command\"\nlocal keymap = require \"core.keymap\"\n\n\nlocal escapes "
  },
  {
    "path": "data/plugins/reflow.lua",
    "chars": 1600,
    "preview": "local core = require \"core\"\nlocal config = require \"core.config\"\nlocal command = require \"core.command\"\nlocal keymap = r"
  },
  {
    "path": "data/plugins/tabularize.lua",
    "chars": 1628,
    "preview": "local core = require \"core\"\nlocal command = require \"core.command\"\nlocal translate = require \"core.doc.translate\"\n\n\nloca"
  },
  {
    "path": "data/plugins/treeview.lua",
    "chars": 4624,
    "preview": "local core = require \"core\"\nlocal common = require \"core.common\"\nlocal command = require \"core.command\"\nlocal config = r"
  },
  {
    "path": "data/plugins/trimwhitespace.lua",
    "chars": 881,
    "preview": "local core = require \"core\"\nlocal command = require \"core.command\"\nlocal Doc = require \"core.doc\"\n\n\nlocal function trim_"
  },
  {
    "path": "data/user/colors/fall.lua",
    "chars": 1229,
    "preview": "local style = require \"core.style\"\nlocal common = require \"core.common\"\n\nstyle.background = { common.color \"#343233\" }\ns"
  },
  {
    "path": "data/user/colors/summer.lua",
    "chars": 1229,
    "preview": "local style = require \"core.style\"\nlocal common = require \"core.common\"\n\nstyle.background = { common.color \"#fbfbfb\" }\ns"
  },
  {
    "path": "data/user/init.lua",
    "chars": 331,
    "preview": "-- put user settings here\n-- this module will be loaded after everything else when the application starts\n\nlocal keymap "
  },
  {
    "path": "doc/usage.md",
    "chars": 5955,
    "preview": "# lite\n\n![screenshot](https://user-images.githubusercontent.com/3920290/81471642-6c165880-91ea-11ea-8cd1-fae7ae8f0bc4.pn"
  },
  {
    "path": "icon.inl",
    "chars": 101118,
    "preview": "static unsigned char icon_rgba[] = {\n  0x2e, 0x2e, 0x32, 0x6d, 0x2e, 0x2e, 0x32, 0xe4, 0x2e, 0x2e, 0x32, 0xff,\n  0x2e, 0"
  },
  {
    "path": "res.rc",
    "chars": 20,
    "preview": "id ICON \"icon.ico\"\n\n"
  },
  {
    "path": "src/api/api.c",
    "chars": 356,
    "preview": "#include \"api.h\"\n\n\nint luaopen_system(lua_State *L);\nint luaopen_renderer(lua_State *L);\n\n\nstatic const luaL_Reg libs[] "
  },
  {
    "path": "src/api/api.h",
    "chars": 190,
    "preview": "#ifndef API_H\n#define API_H\n\n#include \"lib/lua52/lua.h\"\n#include \"lib/lua52/lauxlib.h\"\n#include \"lib/lua52/lualib.h\"\n\n#d"
  },
  {
    "path": "src/api/renderer.c",
    "chars": 2367,
    "preview": "#include \"api.h\"\n#include \"renderer.h\"\n#include \"rencache.h\"\n\n\nstatic RenColor checkcolor(lua_State *L, int idx, int def"
  },
  {
    "path": "src/api/renderer_font.c",
    "chars": 1536,
    "preview": "#include \"api.h\"\n#include \"renderer.h\"\n#include \"rencache.h\"\n\n\nstatic int f_load(lua_State *L) {\n  const char *filename "
  },
  {
    "path": "src/api/system.c",
    "chars": 9511,
    "preview": "#include <SDL2/SDL.h>\n#include <stdbool.h>\n#include <ctype.h>\n#include <dirent.h>\n#include <unistd.h>\n#include <errno.h>"
  },
  {
    "path": "src/lib/lua52/lapi.c",
    "chars": 29910,
    "preview": "/*\n** $Id: lapi.c,v 2.171.1.1 2013/04/12 18:48:47 roberto Exp $\n** Lua API\n** See Copyright Notice in lua.h\n*/\n\n\n#includ"
  },
  {
    "path": "src/lib/lua52/lapi.h",
    "chars": 545,
    "preview": "/*\n** $Id: lapi.h,v 2.7.1.1 2013/04/12 18:48:47 roberto Exp $\n** Auxiliary functions from Lua API\n** See Copyright Notic"
  },
  {
    "path": "src/lib/lua52/lauxlib.c",
    "chars": 27541,
    "preview": "/*\n** $Id: lauxlib.c,v 1.248.1.1 2013/04/12 18:48:47 roberto Exp $\n** Auxiliary functions for building Lua libraries\n** "
  },
  {
    "path": "src/lib/lua52/lauxlib.h",
    "chars": 7344,
    "preview": "/*\n** $Id: lauxlib.h,v 1.120.1.1 2013/04/12 18:48:47 roberto Exp $\n** Auxiliary functions for building Lua libraries\n** "
  },
  {
    "path": "src/lib/lua52/lbaselib.c",
    "chars": 12285,
    "preview": "/*\n** $Id: lbaselib.c,v 1.276.1.1 2013/04/12 18:48:47 roberto Exp $\n** Basic library\n** See Copyright Notice in lua.h\n*/"
  },
  {
    "path": "src/lib/lua52/lbitlib.c",
    "chars": 4374,
    "preview": "/*\n** $Id: lbitlib.c,v 1.18.1.2 2013/07/09 18:01:41 roberto Exp $\n** Standard library for bitwise operations\n** See Copy"
  },
  {
    "path": "src/lib/lua52/lcode.c",
    "chars": 22404,
    "preview": "/*\n** $Id: lcode.c,v 2.62.1.1 2013/04/12 18:48:47 roberto Exp $\n** Code generator for Lua\n** See Copyright Notice in lua"
  },
  {
    "path": "src/lib/lua52/lcode.h",
    "chars": 3120,
    "preview": "/*\n** $Id: lcode.h,v 1.58.1.1 2013/04/12 18:48:47 roberto Exp $\n** Code generator for Lua\n** See Copyright Notice in lua"
  },
  {
    "path": "src/lib/lua52/lcorolib.c",
    "chars": 3575,
    "preview": "/*\n** $Id: lcorolib.c,v 1.5.1.1 2013/04/12 18:48:47 roberto Exp $\n** Coroutine Library\n** See Copyright Notice in lua.h\n"
  },
  {
    "path": "src/lib/lua52/lctype.c",
    "chars": 2299,
    "preview": "/*\n** $Id: lctype.c,v 1.11.1.1 2013/04/12 18:48:47 roberto Exp $\n** 'ctype' functions for Lua\n** See Copyright Notice in"
  },
  {
    "path": "src/lib/lua52/lctype.h",
    "chars": 1841,
    "preview": "/*\n** $Id: lctype.h,v 1.12.1.1 2013/04/12 18:48:47 roberto Exp $\n** 'ctype' functions for Lua\n** See Copyright Notice in"
  },
  {
    "path": "src/lib/lua52/ldblib.c",
    "chars": 10348,
    "preview": "/*\n** $Id: ldblib.c,v 1.132.1.2 2015/02/19 17:16:55 roberto Exp $\n** Interface from Lua to its debug API\n** See Copyrigh"
  },
  {
    "path": "src/lib/lua52/ldebug.c",
    "chars": 16482,
    "preview": "/*\n** $Id: ldebug.c,v 2.90.1.4 2015/02/19 17:05:13 roberto Exp $\n** Debug Interface\n** See Copyright Notice in lua.h\n*/\n"
  },
  {
    "path": "src/lib/lua52/ldebug.h",
    "chars": 1087,
    "preview": "/*\n** $Id: ldebug.h,v 2.7.1.1 2013/04/12 18:48:47 roberto Exp $\n** Auxiliary functions from Debug Interface module\n** Se"
  },
  {
    "path": "src/lib/lua52/ldo.c",
    "chars": 20751,
    "preview": "/*\n** $Id: ldo.c,v 2.108.1.3 2013/11/08 18:22:50 roberto Exp $\n** Stack and Call structure of Lua\n** See Copyright Notic"
  },
  {
    "path": "src/lib/lua52/ldo.h",
    "chars": 1531,
    "preview": "/*\n** $Id: ldo.h,v 2.20.1.1 2013/04/12 18:48:47 roberto Exp $\n** Stack and Call structure of Lua\n** See Copyright Notice"
  },
  {
    "path": "src/lib/lua52/ldump.c",
    "chars": 3221,
    "preview": "/*\n** $Id: ldump.c,v 2.17.1.1 2013/04/12 18:48:47 roberto Exp $\n** save precompiled Lua chunks\n** See Copyright Notice i"
  },
  {
    "path": "src/lib/lua52/lfunc.c",
    "chars": 4270,
    "preview": "/*\n** $Id: lfunc.c,v 2.30.1.1 2013/04/12 18:48:47 roberto Exp $\n** Auxiliary functions to manipulate prototypes and clos"
  },
  {
    "path": "src/lib/lua52/lfunc.h",
    "chars": 1045,
    "preview": "/*\n** $Id: lfunc.h,v 2.8.1.1 2013/04/12 18:48:47 roberto Exp $\n** Auxiliary functions to manipulate prototypes and closu"
  },
  {
    "path": "src/lib/lua52/lgc.c",
    "chars": 37759,
    "preview": "/*\n** $Id: lgc.c,v 2.140.1.3 2014/09/01 16:55:08 roberto Exp $\n** Garbage Collector\n** See Copyright Notice in lua.h\n*/\n"
  },
  {
    "path": "src/lib/lua52/lgc.h",
    "chars": 5404,
    "preview": "/*\n** $Id: lgc.h,v 2.58.1.1 2013/04/12 18:48:47 roberto Exp $\n** Garbage Collector\n** See Copyright Notice in lua.h\n*/\n\n"
  },
  {
    "path": "src/lib/lua52/linit.c",
    "chars": 1689,
    "preview": "/*\n** $Id: linit.c,v 1.32.1.1 2013/04/12 18:48:47 roberto Exp $\n** Initialization of libraries for lua.c and other clien"
  },
  {
    "path": "src/lib/lua52/liolib.c",
    "chars": 17196,
    "preview": "/*\n** $Id: liolib.c,v 2.112.1.1 2013/04/12 18:48:47 roberto Exp $\n** Standard I/O (and system) library\n** See Copyright "
  },
  {
    "path": "src/lib/lua52/llex.c",
    "chars": 15336,
    "preview": "/*\n** $Id: llex.c,v 2.63.1.3 2015/02/09 17:56:34 roberto Exp $\n** Lexical Analyzer\n** See Copyright Notice in lua.h\n*/\n\n"
  },
  {
    "path": "src/lib/lua52/llex.h",
    "chars": 2162,
    "preview": "/*\n** $Id: llex.h,v 1.72.1.1 2013/04/12 18:48:47 roberto Exp $\n** Lexical Analyzer\n** See Copyright Notice in lua.h\n*/\n\n"
  },
  {
    "path": "src/lib/lua52/llimits.h",
    "chars": 7529,
    "preview": "/*\n** $Id: llimits.h,v 1.103.1.1 2013/04/12 18:48:47 roberto Exp $\n** Limits, basic types, and some other `installation-"
  },
  {
    "path": "src/lib/lua52/lmathlib.c",
    "chars": 6586,
    "preview": "/*\n** $Id: lmathlib.c,v 1.83.1.1 2013/04/12 18:48:47 roberto Exp $\n** Standard mathematical library\n** See Copyright Not"
  },
  {
    "path": "src/lib/lua52/lmem.c",
    "chars": 2650,
    "preview": "/*\n** $Id: lmem.c,v 1.84.1.1 2013/04/12 18:48:47 roberto Exp $\n** Interface to Memory Manager\n** See Copyright Notice in"
  },
  {
    "path": "src/lib/lua52/lmem.h",
    "chars": 1806,
    "preview": "/*\n** $Id: lmem.h,v 1.40.1.1 2013/04/12 18:48:47 roberto Exp $\n** Interface to Memory Manager\n** See Copyright Notice in"
  },
  {
    "path": "src/lib/lua52/loadlib.c",
    "chars": 21492,
    "preview": "/*\n** $Id: loadlib.c,v 1.111.1.1 2013/04/12 18:48:47 roberto Exp $\n** Dynamic library loader for Lua\n** See Copyright No"
  },
  {
    "path": "src/lib/lua52/lobject.c",
    "chars": 7905,
    "preview": "/*\n** $Id: lobject.c,v 2.58.1.1 2013/04/12 18:48:47 roberto Exp $\n** Some generic functions over Lua objects\n** See Copy"
  },
  {
    "path": "src/lib/lua52/lobject.h",
    "chars": 14945,
    "preview": "/*\n** $Id: lobject.h,v 2.71.1.2 2014/05/07 14:14:58 roberto Exp $\n** Type definitions for Lua objects\n** See Copyright N"
  },
  {
    "path": "src/lib/lua52/lopcodes.c",
    "chars": 3076,
    "preview": "/*\n** $Id: lopcodes.c,v 1.49.1.1 2013/04/12 18:48:47 roberto Exp $\n** Opcodes for Lua virtual machine\n** See Copyright N"
  },
  {
    "path": "src/lib/lua52/lopcodes.h",
    "chars": 8486,
    "preview": "/*\n** $Id: lopcodes.h,v 1.142.1.2 2014/10/20 18:32:09 roberto Exp $\n** Opcodes for Lua virtual machine\n** See Copyright "
  },
  {
    "path": "src/lib/lua52/loslib.c",
    "chars": 8059,
    "preview": "/*\n** $Id: loslib.c,v 1.40.1.1 2013/04/12 18:48:47 roberto Exp $\n** Standard Operating System library\n** See Copyright N"
  },
  {
    "path": "src/lib/lua52/lparser.c",
    "chars": 45973,
    "preview": "/*\n** $Id: lparser.c,v 2.130.1.1 2013/04/12 18:48:47 roberto Exp $\n** Lua Parser\n** See Copyright Notice in lua.h\n*/\n\n\n#"
  },
  {
    "path": "src/lib/lua52/lparser.h",
    "chars": 3332,
    "preview": "/*\n** $Id: lparser.h,v 1.70.1.1 2013/04/12 18:48:47 roberto Exp $\n** Lua Parser\n** See Copyright Notice in lua.h\n*/\n\n#if"
  },
  {
    "path": "src/lib/lua52/lstate.c",
    "chars": 7716,
    "preview": "/*\n** $Id: lstate.c,v 2.99.1.2 2013/11/08 17:45:31 roberto Exp $\n** Global State\n** See Copyright Notice in lua.h\n*/\n\n\n#"
  },
  {
    "path": "src/lib/lua52/lstate.h",
    "chars": 7543,
    "preview": "/*\n** $Id: lstate.h,v 2.82.1.1 2013/04/12 18:48:47 roberto Exp $\n** Global State\n** See Copyright Notice in lua.h\n*/\n\n#i"
  },
  {
    "path": "src/lib/lua52/lstring.c",
    "chars": 4904,
    "preview": "/*\n** $Id: lstring.c,v 2.26.1.1 2013/04/12 18:48:47 roberto Exp $\n** String table (keeps all strings handled by Lua)\n** "
  },
  {
    "path": "src/lib/lua52/lstring.h",
    "chars": 1272,
    "preview": "/*\n** $Id: lstring.h,v 1.49.1.1 2013/04/12 18:48:47 roberto Exp $\n** String table (keep all strings handled by Lua)\n** S"
  },
  {
    "path": "src/lib/lua52/lstrlib.c",
    "chars": 28355,
    "preview": "/*\n** $Id: lstrlib.c,v 1.178.1.1 2013/04/12 18:48:47 roberto Exp $\n** Standard library for string operations and pattern"
  },
  {
    "path": "src/lib/lua52/ltable.c",
    "chars": 16482,
    "preview": "/*\n** $Id: ltable.c,v 2.72.1.1 2013/04/12 18:48:47 roberto Exp $\n** Lua tables (hash)\n** See Copyright Notice in lua.h\n*"
  },
  {
    "path": "src/lib/lua52/ltable.h",
    "chars": 1410,
    "preview": "/*\n** $Id: ltable.h,v 2.16.1.2 2013/08/30 15:49:41 roberto Exp $\n** Lua tables (hash)\n** See Copyright Notice in lua.h\n*"
  },
  {
    "path": "src/lib/lua52/ltablib.c",
    "chars": 7722,
    "preview": "/*\n** $Id: ltablib.c,v 1.65.1.2 2014/05/07 16:32:55 roberto Exp $\n** Library for Table Manipulation\n** See Copyright Not"
  },
  {
    "path": "src/lib/lua52/ltm.c",
    "chars": 1799,
    "preview": "/*\n** $Id: ltm.c,v 2.14.1.1 2013/04/12 18:48:47 roberto Exp $\n** Tag methods\n** See Copyright Notice in lua.h\n*/\n\n\n#incl"
  },
  {
    "path": "src/lib/lua52/ltm.h",
    "chars": 1125,
    "preview": "/*\n** $Id: ltm.h,v 2.11.1.1 2013/04/12 18:48:47 roberto Exp $\n** Tag methods\n** See Copyright Notice in lua.h\n*/\n\n#ifnde"
  },
  {
    "path": "src/lib/lua52/lua.c_",
    "chars": 14013,
    "preview": "/*\n** $Id: lua.c,v 1.206.1.1 2013/04/12 18:48:47 roberto Exp $\n** Lua stand-alone interpreter\n** See Copyright Notice in"
  },
  {
    "path": "src/lib/lua52/lua.h",
    "chars": 13602,
    "preview": "/*\n** $Id: lua.h,v 1.285.1.4 2015/02/21 14:04:50 roberto Exp $\n** Lua - A Scripting Language\n** Lua.org, PUC-Rio, Brazil"
  },
  {
    "path": "src/lib/lua52/lua.hpp",
    "chars": 191,
    "preview": "// lua.hpp\n// Lua header files for C++\n// <<extern \"C\">> not supplied automatically because Lua also compiles as C++\n\nex"
  },
  {
    "path": "src/lib/lua52/luac.c_",
    "chars": 9964,
    "preview": "/*\n** $Id: luac.c,v 1.69 2011/11/29 17:46:33 lhf Exp $\n** Lua compiler (saves bytecodes to files; also list bytecodes)\n*"
  },
  {
    "path": "src/lib/lua52/luaconf.h",
    "chars": 15439,
    "preview": "/*\n** $Id: luaconf.h,v 1.176.1.2 2013/11/21 17:26:16 roberto Exp $\n** Configuration file for Lua\n** See Copyright Notice"
  },
  {
    "path": "src/lib/lua52/lualib.h",
    "chars": 1099,
    "preview": "/*\n** $Id: lualib.h,v 1.43.1.1 2013/04/12 18:48:47 roberto Exp $\n** Lua standard libraries\n** See Copyright Notice in lu"
  },
  {
    "path": "src/lib/lua52/lundump.c",
    "chars": 5623,
    "preview": "/*\n** $Id: lundump.c,v 2.22.1.1 2013/04/12 18:48:47 roberto Exp $\n** load precompiled Lua chunks\n** See Copyright Notice"
  },
  {
    "path": "src/lib/lua52/lundump.h",
    "chars": 772,
    "preview": "/*\n** $Id: lundump.h,v 1.39.1.1 2013/04/12 18:48:47 roberto Exp $\n** load precompiled Lua chunks\n** See Copyright Notice"
  },
  {
    "path": "src/lib/lua52/lvm.c",
    "chars": 28842,
    "preview": "/*\n** $Id: lvm.c,v 2.155.1.1 2013/04/12 18:48:47 roberto Exp $\n** Lua virtual machine\n** See Copyright Notice in lua.h\n*"
  },
  {
    "path": "src/lib/lua52/lvm.h",
    "chars": 1484,
    "preview": "/*\n** $Id: lvm.h,v 2.18.1.1 2013/04/12 18:48:47 roberto Exp $\n** Lua virtual machine\n** See Copyright Notice in lua.h\n*/"
  },
  {
    "path": "src/lib/lua52/lzio.c",
    "chars": 1625,
    "preview": "/*\n** $Id: lzio.c,v 1.35.1.1 2013/04/12 18:48:47 roberto Exp $\n** Buffered streams\n** See Copyright Notice in lua.h\n*/\n\n"
  },
  {
    "path": "src/lib/lua52/lzio.h",
    "chars": 1486,
    "preview": "/*\n** $Id: lzio.h,v 1.26.1.1 2013/04/12 18:48:47 roberto Exp $\n** Buffered streams\n** See Copyright Notice in lua.h\n*/\n\n"
  },
  {
    "path": "src/lib/stb/stb_truetype.c",
    "chars": 62,
    "preview": "#define STB_TRUETYPE_IMPLEMENTATION\n#include \"stb_truetype.h\"\n"
  },
  {
    "path": "src/lib/stb/stb_truetype.h",
    "chars": 195647,
    "preview": "// stb_truetype.h - v1.24 - public domain\n// authored from 2009-2020 by Sean Barrett / RAD Game Tools\n//\n// ============"
  },
  {
    "path": "src/main.c",
    "chars": 3299,
    "preview": "#include <stdio.h>\n#include <SDL2/SDL.h>\n#include \"api/api.h\"\n#include \"renderer.h\"\n\n#ifdef _WIN32\n  #include <windows.h"
  },
  {
    "path": "src/rencache.c",
    "chars": 7393,
    "preview": "#include <stdio.h>\n#include \"rencache.h\"\n\n/* a cache over the software renderer -- all drawing operations are stored as\n"
  },
  {
    "path": "src/rencache.h",
    "chars": 452,
    "preview": "#ifndef RENCACHE_H\n#define RENCACHE_H\n\n#include <stdbool.h>\n#include \"renderer.h\"\n\nvoid rencache_show_debug(bool enable)"
  },
  {
    "path": "src/renderer.c",
    "chars": 8734,
    "preview": "#include <stdio.h>\n#include <stdbool.h>\n#include <assert.h>\n#include <math.h>\n#include \"lib/stb/stb_truetype.h\"\n#include"
  },
  {
    "path": "src/renderer.h",
    "chars": 1003,
    "preview": "#ifndef RENDERER_H\n#define RENDERER_H\n\n#include <SDL2/SDL.h>\n#include <stdint.h>\n\ntypedef struct RenImage RenImage;\ntype"
  },
  {
    "path": "winlib/SDL2-2.0.10/BUGS.txt",
    "chars": 463,
    "preview": "\r\nBugs are now managed in the SDL bug tracker, here:\r\n\r\n    https://bugzilla.libsdl.org/\r\n\r\nYou may report bugs there, a"
  },
  {
    "path": "winlib/SDL2-2.0.10/COPYING.txt",
    "chars": 930,
    "preview": "\r\nSimple DirectMedia Layer\r\nCopyright (C) 1997-2019 Sam Lantinga <slouken@libsdl.org>\r\n  \r\nThis software is provided 'as"
  },
  {
    "path": "winlib/SDL2-2.0.10/CREDITS.txt",
    "chars": 1918,
    "preview": "\r\nSimple DirectMedia Layer CREDITS\r\nThanks to everyone who made this possible, including:\r\n\r\n* Cliff Matthews, for givin"
  },
  {
    "path": "winlib/SDL2-2.0.10/INSTALL.txt",
    "chars": 489,
    "preview": "\r\nThe 32-bit files are in i686-w64-mingw32\r\nThe 64-bit files are in x86_64-w64-mingw32\r\n\r\nTo install SDL for native deve"
  },
  {
    "path": "winlib/SDL2-2.0.10/Makefile",
    "chars": 1161,
    "preview": "#\n# Makefile for installing the mingw32 version of the SDL library\n\nCROSS_PATH := /usr/local\nARCHITECTURES := i686-w64-m"
  },
  {
    "path": "winlib/SDL2-2.0.10/README-SDL.txt",
    "chars": 433,
    "preview": "\r\nPlease distribute this file with the SDL runtime environment:\r\n\r\nThe Simple DirectMedia Layer (SDL for short) is a cro"
  },
  {
    "path": "winlib/SDL2-2.0.10/README.txt",
    "chars": 648,
    "preview": "\r\n                         Simple DirectMedia Layer\r\n\r\n                                  (SDL)\r\n\r\n                      "
  },
  {
    "path": "winlib/SDL2-2.0.10/WhatsNew.txt",
    "chars": 28273,
    "preview": "\r\nThis is a list of major changes in SDL's version history.\r\n\r\n---------------------------------------------------------"
  },
  {
    "path": "winlib/SDL2-2.0.10/docs/README-android.md",
    "chars": 19139,
    "preview": "Android\r\n================================================================================\r\n\r\nMatt Styles wrote a tutoria"
  },
  {
    "path": "winlib/SDL2-2.0.10/docs/README-cmake.md",
    "chars": 997,
    "preview": "CMake\r\n================================================================================\r\n(www.cmake.org)\r\n\r\nSDL's build "
  },
  {
    "path": "winlib/SDL2-2.0.10/docs/README-directfb.md",
    "chars": 2660,
    "preview": "DirectFB\r\n========\r\n\r\nSupports:\r\n\r\n- Hardware YUV overlays\r\n- OpenGL - software only\r\n- 2D/3D accelerations (depends on "
  },
  {
    "path": "winlib/SDL2-2.0.10/docs/README-dynapi.md",
    "chars": 7111,
    "preview": "Dynamic API\r\n================================================================================\r\nOriginally posted by Ryan"
  },
  {
    "path": "winlib/SDL2-2.0.10/docs/README-emscripten.md",
    "chars": 966,
    "preview": "Emscripten\r\n================================================================================\r\n\r\nBuild:\r\n\r\n    $ mkdir bu"
  },
  {
    "path": "winlib/SDL2-2.0.10/docs/README-gesture.md",
    "chars": 4074,
    "preview": "Dollar Gestures\r\n===========================================================================\r\nSDL provides an implementa"
  },
  {
    "path": "winlib/SDL2-2.0.10/docs/README-hg.md",
    "chars": 809,
    "preview": "Mercurial\r\n=========\r\n\r\nThe latest development version of SDL is available via Mercurial.\r\nMercurial allows you to get u"
  },
  {
    "path": "winlib/SDL2-2.0.10/docs/README-ios.md",
    "chars": 15124,
    "preview": "iOS\r\n======\r\n\r\n==============================================================================\r\nBuilding the Simple Direc"
  },
  {
    "path": "winlib/SDL2-2.0.10/docs/README-linux.md",
    "chars": 3801,
    "preview": "Linux\r\n================================================================================\r\n\r\nBy default SDL will only link"
  },
  {
    "path": "winlib/SDL2-2.0.10/docs/README-macosx.md",
    "chars": 10088,
    "preview": "Mac OS X\r\n==============================================================================\r\n\r\nThese instructions are for p"
  },
  {
    "path": "winlib/SDL2-2.0.10/docs/README-nacl.md",
    "chars": 4428,
    "preview": "Native Client\r\n================================================================================\r\n\r\nRequirements: \r\n\r\n* N"
  },
  {
    "path": "winlib/SDL2-2.0.10/docs/README-pandora.md",
    "chars": 752,
    "preview": "Pandora \r\n=====================================================================\r\n\r\n( http://openpandora.org/ )\r\n- A pand"
  },
  {
    "path": "winlib/SDL2-2.0.10/docs/README-platforms.md",
    "chars": 187,
    "preview": "Platforms\r\n=========\r\n\r\nWe maintain the list of supported platforms on our wiki now, and how to\r\nbuild and install SDL f"
  },
  {
    "path": "winlib/SDL2-2.0.10/docs/README-porting.md",
    "chars": 2029,
    "preview": "Porting\r\n=======\r\n\r\n* Porting To A New Platform\r\n\r\n  The first thing you have to do when porting to a new platform, is l"
  },
  {
    "path": "winlib/SDL2-2.0.10/docs/README-psp.md",
    "chars": 354,
    "preview": "PSP\r\n======\r\nSDL port for the Sony PSP contributed by \r\n   Captian Lex \r\n\r\nCredit to\r\n   Marcus R.Brown,Jim Paris,Matthe"
  },
  {
    "path": "winlib/SDL2-2.0.10/docs/README-raspberrypi.md",
    "chars": 8051,
    "preview": "Raspberry Pi\r\n================================================================================\r\n\r\nRequirements:\r\n\r\nRaspb"
  },
  {
    "path": "winlib/SDL2-2.0.10/docs/README-touch.md",
    "chars": 4111,
    "preview": "Touch\r\n===========================================================================\r\nSystem Specific Notes\r\n============="
  },
  {
    "path": "winlib/SDL2-2.0.10/docs/README-wince.md",
    "chars": 220,
    "preview": "WinCE\r\n=====\r\n\r\nWindows CE is no longer supported by SDL.\r\n\r\nWe have left the CE support in SDL 1.2 for those that must "
  },
  {
    "path": "winlib/SDL2-2.0.10/docs/README-windows.md",
    "chars": 2362,
    "preview": "Windows\n================================================================================\n\n=============================="
  },
  {
    "path": "winlib/SDL2-2.0.10/docs/README-winrt.md",
    "chars": 26158,
    "preview": "WinRT\r\n=====\r\n\r\nThis port allows SDL applications to run on Microsoft's platforms that require\r\nuse of \"Windows Runtime\""
  },
  {
    "path": "winlib/SDL2-2.0.10/docs/README.md",
    "chars": 2191,
    "preview": "Simple DirectMedia Layer {#mainpage}\r\n========================\r\n\r\n                                  (SDL)\r\n\r\n           "
  },
  {
    "path": "winlib/SDL2-2.0.10/docs/doxyfile",
    "chars": 65794,
    "preview": "# Doxyfile 1.5.9\n\n# This file describes the settings to be used by the documentation system\n# doxygen (www.doxygen.org) "
  },
  {
    "path": "winlib/SDL2-2.0.10/i686-w64-mingw32/bin/sdl2-config",
    "chars": 1420,
    "preview": "#!/bin/sh\n\nprefix=/opt/local/i686-w64-mingw32\nexec_prefix=${prefix}\nexec_prefix_set=no\nlibdir=${exec_prefix}/lib\n\n#usage"
  },
  {
    "path": "winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL.h",
    "chars": 4210,
    "preview": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2019 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided '"
  },
  {
    "path": "winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_assert.h",
    "chars": 11045,
    "preview": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2019 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided '"
  },
  {
    "path": "winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_atomic.h",
    "chars": 10839,
    "preview": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2019 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided '"
  },
  {
    "path": "winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_audio.h",
    "chars": 35787,
    "preview": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2019 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided '"
  },
  {
    "path": "winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_bits.h",
    "chars": 3096,
    "preview": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2019 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided '"
  },
  {
    "path": "winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_blendmode.h",
    "chars": 5115,
    "preview": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2019 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided '"
  },
  {
    "path": "winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_clipboard.h",
    "chars": 1966,
    "preview": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2019 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided '"
  },
  {
    "path": "winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_config.h",
    "chars": 6776,
    "preview": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2019 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided '"
  },
  {
    "path": "winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_cpuinfo.h",
    "chars": 8610,
    "preview": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2019 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided '"
  },
  {
    "path": "winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_egl.h",
    "chars": 73586,
    "preview": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2019 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided '"
  },
  {
    "path": "winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_endian.h",
    "chars": 6451,
    "preview": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2019 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided '"
  },
  {
    "path": "winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_error.h",
    "chars": 2271,
    "preview": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2019 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided '"
  },
  {
    "path": "winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_events.h",
    "chars": 30883,
    "preview": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2019 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided '"
  },
  {
    "path": "winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_filesystem.h",
    "chars": 5255,
    "preview": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2019 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided '"
  },
  {
    "path": "winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_gamecontroller.h",
    "chars": 13531,
    "preview": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2019 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided '"
  },
  {
    "path": "winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_gesture.h",
    "chars": 2157,
    "preview": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2019 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided '"
  },
  {
    "path": "winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_haptic.h",
    "chars": 39294,
    "preview": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2019 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided '"
  },
  {
    "path": "winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_hints.h",
    "chars": 53343,
    "preview": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2019 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided '"
  },
  {
    "path": "winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_joystick.h",
    "chars": 13836,
    "preview": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2019 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided '"
  },
  {
    "path": "winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_keyboard.h",
    "chars": 6437,
    "preview": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2019 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided '"
  },
  {
    "path": "winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_keycode.h",
    "chars": 15262,
    "preview": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2019 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided '"
  },
  {
    "path": "winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_loadso.h",
    "chars": 2866,
    "preview": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2019 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided '"
  },
  {
    "path": "winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_log.h",
    "chars": 6491,
    "preview": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2019 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided '"
  },
  {
    "path": "winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_main.h",
    "chars": 5375,
    "preview": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2019 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided '"
  },
  {
    "path": "winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_messagebox.h",
    "chars": 4611,
    "preview": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2019 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided '"
  },
  {
    "path": "winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_mouse.h",
    "chars": 10924,
    "preview": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2019 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided '"
  },
  {
    "path": "winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_mutex.h",
    "chars": 6665,
    "preview": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2019 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided '"
  },
  {
    "path": "winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_name.h",
    "chars": 1155,
    "preview": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2019 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided '"
  },
  {
    "path": "winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_opengl.h",
    "chars": 82593,
    "preview": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2019 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided '"
  },
  {
    "path": "winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_opengl_glext.h",
    "chars": 731497,
    "preview": "#ifndef __glext_h_\n#define __glext_h_ 1\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/*\n** Copyright (c) 2013-2014 The Khron"
  },
  {
    "path": "winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_opengles.h",
    "chars": 1254,
    "preview": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2019 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided '"
  },
  {
    "path": "winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_opengles2.h",
    "chars": 1552,
    "preview": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2019 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided '"
  },
  {
    "path": "winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_opengles2_gl2.h",
    "chars": 31876,
    "preview": "#ifndef __gl2_h_\n#define __gl2_h_\n\n/* $Revision: 20555 $ on $Date:: 2013-02-12 14:32:47 -0800 #$ */\n\n/*#include <GLES2/g"
  },
  {
    "path": "winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_opengles2_gl2ext.h",
    "chars": 98695,
    "preview": "#ifndef __gl2ext_h_\n#define __gl2ext_h_\n\n/* $Revision: 22801 $ on $Date:: 2013-08-21 03:20:48 -0700 #$ */\n\n#ifdef __cplu"
  },
  {
    "path": "winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_opengles2_gl2platform.h",
    "chars": 913,
    "preview": "#ifndef __gl2platform_h_\n#define __gl2platform_h_\n\n/* $Revision: 10602 $ on $Date:: 2010-03-04 22:35:34 -0800 #$ */\n\n/*\n"
  },
  {
    "path": "winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_opengles2_khrplatform.h",
    "chars": 10022,
    "preview": "#ifndef __khrplatform_h_\n#define __khrplatform_h_\n\n/*\n** Copyright (c) 2008-2009 The Khronos Group Inc.\n**\n** Permission"
  },
  {
    "path": "winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_pixels.h",
    "chars": 17188,
    "preview": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2019 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided '"
  },
  {
    "path": "winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_platform.h",
    "chars": 5203,
    "preview": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2019 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided '"
  },
  {
    "path": "winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_power.h",
    "chars": 2463,
    "preview": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2019 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided '"
  },
  {
    "path": "winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_quit.h",
    "chars": 2106,
    "preview": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2019 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided '"
  },
  {
    "path": "winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_rect.h",
    "chars": 4839,
    "preview": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2019 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided '"
  },
  {
    "path": "winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_render.h",
    "chars": 42721,
    "preview": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2019 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided '"
  },
  {
    "path": "winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_revision.h",
    "chars": 79,
    "preview": "#define SDL_REVISION \"hg-12952:bc90ce38f1e2\"\n#define SDL_REVISION_NUMBER 12952\n"
  },
  {
    "path": "winlib/SDL2-2.0.10/i686-w64-mingw32/include/SDL2/SDL_rwops.h",
    "chars": 9197,
    "preview": "/*\n  Simple DirectMedia Layer\n  Copyright (C) 1997-2019 Sam Lantinga <slouken@libsdl.org>\n\n  This software is provided '"
  }
]

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

About this extraction

This page contains the full source code of the rxi/lite GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 429 files (18.6 MB), approximately 1.5M tokens, and a symbol index with 2474 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!