Browse Source

Added hardware accelerated support for palettized textures

Supported backends: direct3d, direct3d11, direct3d12, gpu, metal, opengl, opengles2
Sam Lantinga 2 weeks ago
parent
commit
e2fe23ddab
51 changed files with 7658 additions and 6275 deletions
  1. 92 0
      src/render/direct3d/D3D9_PixelShader_Palette.h
  2. 19 0
      src/render/direct3d/D3D9_PixelShader_Palette.hlsl
  3. 109 109
      src/render/direct3d/D3D9_PixelShader_YUV.h
  4. 62 17
      src/render/direct3d/SDL_render_d3d.c
  5. 5 0
      src/render/direct3d/SDL_shaders_d3d.c
  6. 1 0
      src/render/direct3d/SDL_shaders_d3d.h
  7. 1 0
      src/render/direct3d/compile_shaders.bat
  8. 571 333
      src/render/direct3d11/D3D11_PixelShader_Advanced.h
  9. 31 16
      src/render/direct3d11/D3D11_PixelShader_Common.hlsli
  10. 127 44
      src/render/direct3d11/SDL_render_d3d11.c
  11. 644 557
      src/render/direct3d12/D3D12_PixelShader_Advanced.h
  12. 31 16
      src/render/direct3d12/D3D12_PixelShader_Common.hlsli
  13. 20 17
      src/render/direct3d12/D3D12_RootSig_Advanced.h
  14. 2 1
      src/render/direct3d12/D3D12_Shader_Common.hlsli
  15. 254 250
      src/render/direct3d12/D3D12_VertexShader_Advanced.h
  16. 175 67
      src/render/direct3d12/SDL_render_d3d12.c
  17. 80 4
      src/render/gpu/SDL_render_gpu.c
  18. 14 0
      src/render/gpu/SDL_shaders_gpu.c
  19. 2 0
      src/render/gpu/SDL_shaders_gpu.h
  20. 145 145
      src/render/gpu/shaders/color.frag.dxil.h
  21. 2 0
      src/render/gpu/shaders/dxil.h
  22. 78 78
      src/render/gpu/shaders/linepoint.vert.dxil.h
  23. 2 0
      src/render/gpu/shaders/msl.h
  24. 2 0
      src/render/gpu/shaders/spir-v.h
  25. 341 0
      src/render/gpu/shaders/texture_palette.frag.dxil.h
  26. 21 0
      src/render/gpu/shaders/texture_palette.frag.hlsl
  27. 60 0
      src/render/gpu/shaders/texture_palette.frag.msl.h
  28. 106 0
      src/render/gpu/shaders/texture_palette.frag.spv.h
  29. 426 0
      src/render/gpu/shaders/texture_palette_pixelart.frag.dxil.h
  30. 44 0
      src/render/gpu/shaders/texture_palette_pixelart.frag.hlsl
  31. 99 0
      src/render/gpu/shaders/texture_palette_pixelart.frag.msl.h
  32. 169 0
      src/render/gpu/shaders/texture_palette_pixelart.frag.spv.h
  33. 136 137
      src/render/gpu/shaders/texture_rgb.frag.dxil.h
  34. 188 188
      src/render/gpu/shaders/texture_rgb_pixelart.frag.dxil.h
  35. 137 138
      src/render/gpu/shaders/texture_rgba.frag.dxil.h
  36. 189 189
      src/render/gpu/shaders/texture_rgba_pixelart.frag.dxil.h
  37. 81 81
      src/render/gpu/shaders/tri_color.vert.dxil.h
  38. 167 167
      src/render/gpu/shaders/tri_texture.vert.dxil.h
  39. 61 4
      src/render/metal/SDL_render_metal.m
  40. 41 13
      src/render/metal/SDL_shaders_metal.metal
  41. 340 1027
      src/render/metal/SDL_shaders_metal_ios.h
  42. 528 515
      src/render/metal/SDL_shaders_metal_iphonesimulator.h
  43. 596 584
      src/render/metal/SDL_shaders_metal_macos.h
  44. 340 1027
      src/render/metal/SDL_shaders_metal_tvos.h
  45. 840 515
      src/render/metal/SDL_shaders_metal_tvsimulator.h
  46. 62 1
      src/render/opengl/SDL_render_gl.c
  47. 47 1
      src/render/opengl/SDL_shaders_gl.c
  48. 2 0
      src/render/opengl/SDL_shaders_gl.h
  49. 112 32
      src/render/opengles2/SDL_render_gles2.c
  50. 54 2
      src/render/opengles2/SDL_shaders_gles2.c
  51. 2 0
      src/render/opengles2/SDL_shaders_gles2.h

+ 92 - 0
src/render/direct3d/D3D9_PixelShader_Palette.h

@@ -0,0 +1,92 @@
+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 10.1
+//
+// Parameters:
+//
+//   sampler2D image;
+//   sampler1D palette;
+//
+//
+// Registers:
+//
+//   Name         Reg   Size
+//   ------------ ----- ----
+//   image        s0       1
+//   palette      s1       1
+//
+
+    ps_2_0
+    def c0, 0.99609375, 0.001953125, 0, 0
+    dcl t0.xy
+    dcl v0
+    dcl_2d s0
+    dcl_2d s1
+    texld r0, t0, s0
+    mad r0.xy, r0.x, c0.x, c0.y
+    texld r0, r0, s1
+    mul r0, r0, v0
+    mov oC0, r0
+
+// approximately 5 instruction slots used (2 texture, 3 arithmetic)
+#endif
+
+const BYTE g_ps20_main[] =
+{
+      0,   2, 255, 255, 254, 255,
+     42,   0,  67,  84,  65,  66,
+     28,   0,   0,   0, 123,   0,
+      0,   0,   0,   2, 255, 255,
+      2,   0,   0,   0,  28,   0,
+      0,   0,   0,   1,   0,   0,
+    116,   0,   0,   0,  68,   0,
+      0,   0,   3,   0,   0,   0,
+      1,   0,   0,   0,  76,   0,
+      0,   0,   0,   0,   0,   0,
+     92,   0,   0,   0,   3,   0,
+      1,   0,   1,   0,   0,   0,
+    100,   0,   0,   0,   0,   0,
+      0,   0, 105, 109,  97, 103,
+    101,   0, 171, 171,   4,   0,
+     12,   0,   1,   0,   1,   0,
+      1,   0,   0,   0,   0,   0,
+      0,   0, 112,  97, 108, 101,
+    116, 116, 101,   0,   4,   0,
+     11,   0,   1,   0,   1,   0,
+      1,   0,   0,   0,   0,   0,
+      0,   0, 112, 115,  95,  50,
+     95,  48,   0,  77, 105,  99,
+    114, 111, 115, 111, 102, 116,
+     32,  40,  82,  41,  32,  72,
+     76,  83,  76,  32,  83, 104,
+     97, 100, 101, 114,  32,  67,
+    111, 109, 112, 105, 108, 101,
+    114,  32,  49,  48,  46,  49,
+      0, 171,  81,   0,   0,   5,
+      0,   0,  15, 160,   0,   0,
+    127,  63,   0,   0,   0,  59,
+      0,   0,   0,   0,   0,   0,
+      0,   0,  31,   0,   0,   2,
+      0,   0,   0, 128,   0,   0,
+      3, 176,  31,   0,   0,   2,
+      0,   0,   0, 128,   0,   0,
+     15, 144,  31,   0,   0,   2,
+      0,   0,   0, 144,   0,   8,
+     15, 160,  31,   0,   0,   2,
+      0,   0,   0, 144,   1,   8,
+     15, 160,  66,   0,   0,   3,
+      0,   0,  15, 128,   0,   0,
+    228, 176,   0,   8, 228, 160,
+      4,   0,   0,   4,   0,   0,
+      3, 128,   0,   0,   0, 128,
+      0,   0,   0, 160,   0,   0,
+     85, 160,  66,   0,   0,   3,
+      0,   0,  15, 128,   0,   0,
+    228, 128,   1,   8, 228, 160,
+      5,   0,   0,   3,   0,   0,
+     15, 128,   0,   0, 228, 128,
+      0,   0, 228, 144,   1,   0,
+      0,   2,   0,   8,  15, 128,
+      0,   0, 228, 128, 255, 255,
+      0,   0
+};

+ 19 - 0
src/render/direct3d/D3D9_PixelShader_Palette.hlsl

@@ -0,0 +1,19 @@
+
+uniform sampler2D image;
+uniform sampler1D palette;
+
+struct PixelShaderInput
+{
+    float4 pos : SV_POSITION;
+    float2 tex : TEXCOORD0;
+    float4 color : COLOR0;
+};
+
+float4 main(PixelShaderInput input) : SV_TARGET
+{
+    float4 Output;
+    float index;
+    index = tex2D(image, input.tex).r;
+    Output = tex1D(palette, index * (255. / 256) + (0.5 / 256));
+    return Output * input.color;
+}

+ 109 - 109
src/render/direct3d/D3D9_PixelShader_YUV.h

@@ -51,114 +51,114 @@
 
 const BYTE g_ps20_main[] =
 {
-      0,   2, 255, 255, 254, 255, 
-     97,   0,  67,  84,  65,  66, 
-     28,   0,   0,   0,  87,   1, 
-      0,   0,   0,   2, 255, 255, 
-      7,   0,   0,   0,  28,   0, 
-      0,   0,   0,   1,   0,   0, 
-     80,   1,   0,   0, 168,   0, 
-      0,   0,   2,   0,   3,   0, 
-      1,   0,   0,   0, 176,   0, 
-      0,   0,   0,   0,   0,   0, 
-    192,   0,   0,   0,   2,   0, 
-      2,   0,   1,   0,   0,   0, 
-    176,   0,   0,   0,   0,   0, 
-      0,   0, 199,   0,   0,   0, 
-      2,   0,   1,   0,   1,   0, 
-      0,   0, 176,   0,   0,   0, 
-      0,   0,   0,   0, 206,   0, 
-      0,   0,   2,   0,   0,   0, 
-      1,   0,   0,   0, 176,   0, 
-      0,   0,   0,   0,   0,   0, 
-    214,   0,   0,   0,   3,   0, 
-      1,   0,   1,   0,   0,   0, 
-    240,   0,   0,   0,   0,   0, 
-      0,   0,   0,   1,   0,   0, 
-      3,   0,   2,   0,   1,   0, 
-      0,   0,  24,   1,   0,   0, 
-      0,   0,   0,   0,  40,   1, 
-      0,   0,   3,   0,   0,   0, 
-      1,   0,   0,   0,  64,   1, 
-      0,   0,   0,   0,   0,   0, 
-     66,  99, 111, 101, 102, 102, 
-      0, 171,   1,   0,   3,   0, 
-      1,   0,   4,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-     71,  99, 111, 101, 102, 102, 
-      0,  82,  99, 111, 101, 102, 
-    102,   0,  89, 111, 102, 102, 
-    115, 101, 116,   0, 116, 104, 
-    101,  83,  97, 109, 112, 108, 
-    101, 114,  43, 116, 104, 101, 
-     84, 101, 120, 116, 117, 114, 
-    101,  85,   0, 171, 171, 171, 
-      4,   0,   7,   0,   1,   0, 
-      4,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0, 116, 104, 
-    101,  83,  97, 109, 112, 108, 
-    101, 114,  43, 116, 104, 101, 
-     84, 101, 120, 116, 117, 114, 
-    101,  86,   0, 171,   4,   0, 
-      7,   0,   1,   0,   4,   0, 
-      1,   0,   0,   0,   0,   0, 
-      0,   0, 116, 104, 101,  83, 
-     97, 109, 112, 108, 101, 114, 
-     43, 116, 104, 101,  84, 101, 
-    120, 116, 117, 114, 101,  89, 
-      0, 171,   4,   0,   7,   0, 
-      1,   0,   4,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-    112, 115,  95,  50,  95,  48, 
-      0,  77, 105,  99, 114, 111, 
-    115, 111, 102, 116,  32,  40, 
-     82,  41,  32,  72,  76,  83, 
-     76,  32,  83, 104,  97, 100, 
-    101, 114,  32,  67, 111, 109, 
-    112, 105, 108, 101, 114,  32, 
-     49,  48,  46,  49,   0, 171, 
-     81,   0,   0,   5,   4,   0, 
-     15, 160,   0,   0, 128,  63, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-     31,   0,   0,   2,   0,   0, 
-      0, 128,   0,   0,   3, 176, 
-     31,   0,   0,   2,   0,   0, 
-      0, 128,   0,   0,  15, 144, 
-     31,   0,   0,   2,   0,   0, 
-      0, 144,   0,   8,  15, 160, 
-     31,   0,   0,   2,   0,   0, 
-      0, 144,   1,   8,  15, 160, 
-     31,   0,   0,   2,   0,   0, 
-      0, 144,   2,   8,  15, 160, 
-     66,   0,   0,   3,   0,   0, 
-     15, 128,   0,   0, 228, 176, 
-      0,   8, 228, 160,  66,   0, 
-      0,   3,   1,   0,  15, 128, 
-      0,   0, 228, 176,   1,   8, 
-    228, 160,  66,   0,   0,   3, 
-      2,   0,  15, 128,   0,   0, 
-    228, 176,   2,   8, 228, 160, 
-      1,   0,   0,   2,   0,   0, 
-      2, 128,   1,   0,   0, 128, 
-      1,   0,   0,   2,   0,   0, 
-      4, 128,   2,   0,   0, 128, 
-      2,   0,   0,   3,   0,   0, 
-      7, 128,   0,   0, 228, 128, 
-      0,   0, 228, 160,   8,   0, 
-      0,   3,   1,   0,   1, 128, 
-      0,   0, 228, 128,   1,   0, 
-    228, 160,   8,   0,   0,   3, 
-      1,   0,   2, 128,   0,   0, 
-    228, 128,   2,   0, 228, 160, 
-      8,   0,   0,   3,   1,   0, 
-      4, 128,   0,   0, 228, 128, 
-      3,   0, 228, 160,   1,   0, 
-      0,   2,   1,   0,   8, 128, 
-      4,   0,   0, 160,   5,   0, 
-      0,   3,   0,   0,  15, 128, 
-      1,   0, 228, 128,   0,   0, 
-    228, 144,   1,   0,   0,   2, 
-      0,   8,  15, 128,   0,   0, 
+      0,   2, 255, 255, 254, 255,
+     97,   0,  67,  84,  65,  66,
+     28,   0,   0,   0,  87,   1,
+      0,   0,   0,   2, 255, 255,
+      7,   0,   0,   0,  28,   0,
+      0,   0,   0,   1,   0,   0,
+     80,   1,   0,   0, 168,   0,
+      0,   0,   2,   0,   3,   0,
+      1,   0,   0,   0, 176,   0,
+      0,   0,   0,   0,   0,   0,
+    192,   0,   0,   0,   2,   0,
+      2,   0,   1,   0,   0,   0,
+    176,   0,   0,   0,   0,   0,
+      0,   0, 199,   0,   0,   0,
+      2,   0,   1,   0,   1,   0,
+      0,   0, 176,   0,   0,   0,
+      0,   0,   0,   0, 206,   0,
+      0,   0,   2,   0,   0,   0,
+      1,   0,   0,   0, 176,   0,
+      0,   0,   0,   0,   0,   0,
+    214,   0,   0,   0,   3,   0,
+      1,   0,   1,   0,   0,   0,
+    240,   0,   0,   0,   0,   0,
+      0,   0,   0,   1,   0,   0,
+      3,   0,   2,   0,   1,   0,
+      0,   0,  24,   1,   0,   0,
+      0,   0,   0,   0,  40,   1,
+      0,   0,   3,   0,   0,   0,
+      1,   0,   0,   0,  64,   1,
+      0,   0,   0,   0,   0,   0,
+     66,  99, 111, 101, 102, 102,
+      0, 171,   1,   0,   3,   0,
+      1,   0,   4,   0,   1,   0,
+      0,   0,   0,   0,   0,   0,
+     71,  99, 111, 101, 102, 102,
+      0,  82,  99, 111, 101, 102,
+    102,   0,  89, 111, 102, 102,
+    115, 101, 116,   0, 116, 104,
+    101,  83,  97, 109, 112, 108,
+    101, 114,  43, 116, 104, 101,
+     84, 101, 120, 116, 117, 114,
+    101,  85,   0, 171, 171, 171,
+      4,   0,   7,   0,   1,   0,
+      4,   0,   1,   0,   0,   0,
+      0,   0,   0,   0, 116, 104,
+    101,  83,  97, 109, 112, 108,
+    101, 114,  43, 116, 104, 101,
+     84, 101, 120, 116, 117, 114,
+    101,  86,   0, 171,   4,   0,
+      7,   0,   1,   0,   4,   0,
+      1,   0,   0,   0,   0,   0,
+      0,   0, 116, 104, 101,  83,
+     97, 109, 112, 108, 101, 114,
+     43, 116, 104, 101,  84, 101,
+    120, 116, 117, 114, 101,  89,
+      0, 171,   4,   0,   7,   0,
+      1,   0,   4,   0,   1,   0,
+      0,   0,   0,   0,   0,   0,
+    112, 115,  95,  50,  95,  48,
+      0,  77, 105,  99, 114, 111,
+    115, 111, 102, 116,  32,  40,
+     82,  41,  32,  72,  76,  83,
+     76,  32,  83, 104,  97, 100,
+    101, 114,  32,  67, 111, 109,
+    112, 105, 108, 101, 114,  32,
+     49,  48,  46,  49,   0, 171,
+     81,   0,   0,   5,   4,   0,
+     15, 160,   0,   0, 128,  63,
+      0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,
+     31,   0,   0,   2,   0,   0,
+      0, 128,   0,   0,   3, 176,
+     31,   0,   0,   2,   0,   0,
+      0, 128,   0,   0,  15, 144,
+     31,   0,   0,   2,   0,   0,
+      0, 144,   0,   8,  15, 160,
+     31,   0,   0,   2,   0,   0,
+      0, 144,   1,   8,  15, 160,
+     31,   0,   0,   2,   0,   0,
+      0, 144,   2,   8,  15, 160,
+     66,   0,   0,   3,   0,   0,
+     15, 128,   0,   0, 228, 176,
+      0,   8, 228, 160,  66,   0,
+      0,   3,   1,   0,  15, 128,
+      0,   0, 228, 176,   1,   8,
+    228, 160,  66,   0,   0,   3,
+      2,   0,  15, 128,   0,   0,
+    228, 176,   2,   8, 228, 160,
+      1,   0,   0,   2,   0,   0,
+      2, 128,   1,   0,   0, 128,
+      1,   0,   0,   2,   0,   0,
+      4, 128,   2,   0,   0, 128,
+      2,   0,   0,   3,   0,   0,
+      7, 128,   0,   0, 228, 128,
+      0,   0, 228, 160,   8,   0,
+      0,   3,   1,   0,   1, 128,
+      0,   0, 228, 128,   1,   0,
+    228, 160,   8,   0,   0,   3,
+      1,   0,   2, 128,   0,   0,
+    228, 128,   2,   0, 228, 160,
+      8,   0,   0,   3,   1,   0,
+      4, 128,   0,   0, 228, 128,
+      3,   0, 228, 160,   1,   0,
+      0,   2,   1,   0,   8, 128,
+      4,   0,   0, 160,   5,   0,
+      0,   3,   0,   0,  15, 128,
+      1,   0, 228, 128,   0,   0,
+    228, 144,   1,   0,   0,   2,
+      0,   8,  15, 128,   0,   0,
     228, 128, 255, 255,   0,   0
 };

+ 62 - 17
src/render/direct3d/SDL_render_d3d.c

@@ -90,6 +90,7 @@ typedef struct
 typedef struct
 {
     D3D_TextureRep texture;
+    D3D_TextureRep palette;
     D3D9_Shader shader;
     const float *shader_params;
 
@@ -198,6 +199,7 @@ static D3DFORMAT PixelFormatToD3DFMT(Uint32 format)
         return D3DFMT_X8R8G8B8;
     case SDL_PIXELFORMAT_ARGB8888:
         return D3DFMT_A8R8G8B8;
+    case SDL_PIXELFORMAT_INDEX8:
     case SDL_PIXELFORMAT_YV12:
     case SDL_PIXELFORMAT_IYUV:
     case SDL_PIXELFORMAT_NV12:
@@ -552,6 +554,13 @@ static bool D3D_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL_
     if (!D3D_CreateTextureRep(data->device, &texturedata->texture, usage, texture->format, PixelFormatToD3DFMT(texture->format), texture->w, texture->h)) {
         return false;
     }
+    if (texture->format == SDL_PIXELFORMAT_INDEX8) {
+        if (!D3D_CreateTextureRep(data->device, &texturedata->palette, usage, SDL_PIXELFORMAT_ARGB8888, D3DFMT_A8R8G8B8, 256, 1)) {
+            return false;
+        }
+
+        texturedata->shader = SHADER_PALETTE;
+    }
 #ifdef SDL_HAVE_YUV
     if (texture->format == SDL_PIXELFORMAT_YV12 ||
         texture->format == SDL_PIXELFORMAT_IYUV) {
@@ -587,6 +596,12 @@ static bool D3D_RecreateTexture(SDL_Renderer *renderer, SDL_Texture *texture)
     if (!D3D_RecreateTextureRep(data->device, &texturedata->texture)) {
         return false;
     }
+    if (texture->format == SDL_PIXELFORMAT_INDEX8) {
+        if (!D3D_RecreateTextureRep(data->device, &texturedata->palette)) {
+            return false;
+        }
+        texture->palette_version = 0;
+    }
 #ifdef SDL_HAVE_YUV
     if (texturedata->yuv) {
         if (!D3D_RecreateTextureRep(data->device, &texturedata->utexture)) {
@@ -601,6 +616,24 @@ static bool D3D_RecreateTexture(SDL_Renderer *renderer, SDL_Texture *texture)
     return true;
 }
 
+static bool D3D_UpdateTexturePalette(SDL_Renderer *renderer, SDL_Texture *texture)
+{
+    D3D_RenderData *data = (D3D_RenderData *)renderer->internal;
+    D3D_TextureData *texturedata = (D3D_TextureData *)texture->internal;
+    const int ncolors = texture->palette->ncolors;
+    const SDL_Color *colors = texture->palette->colors;
+    Uint32 palette[256];
+
+    if (!texturedata) {
+        return SDL_SetError("Texture is not currently available");
+    }
+
+    for (int i = 0; i < ncolors; ++i) {
+        palette[i] = (colors[i].a << 24) | (colors[i].r << 16) | (colors[i].g << 8) | colors[i].b;
+    }
+    return D3D_UpdateTextureRep(data->device, &texturedata->palette, 0, 0, 256, 1, palette, sizeof(palette));
+}
+
 static bool D3D_UpdateTexture(SDL_Renderer *renderer, SDL_Texture *texture,
                              const SDL_Rect *rect, const void *pixels, int pitch)
 {
@@ -980,6 +1013,11 @@ static bool SetupTextureState(D3D_RenderData *data, SDL_Texture *texture, D3D9_S
     if (!BindTextureRep(data->device, &texturedata->texture, 0)) {
         return false;
     }
+    if (texture->format == SDL_PIXELFORMAT_INDEX8) {
+        if (!BindTextureRep(data->device, &texturedata->palette, 1)) {
+            return false;
+        }
+    }
 #ifdef SDL_HAVE_YUV
     if (texturedata->yuv) {
         if (!BindTextureRep(data->device, &texturedata->utexture, 1)) {
@@ -999,10 +1037,8 @@ static bool SetDrawState(D3D_RenderData *data, const SDL_RenderCommand *cmd)
     const SDL_BlendMode blend = cmd->data.draw.blend;
 
     if (texture != data->drawstate.texture) {
-#ifdef SDL_HAVE_YUV
         D3D_TextureData *oldtexturedata = data->drawstate.texture ? (D3D_TextureData *)data->drawstate.texture->internal : NULL;
         D3D_TextureData *newtexturedata = texture ? (D3D_TextureData *)texture->internal : NULL;
-#endif
         D3D9_Shader shader = SHADER_NONE;
         const float *shader_params = NULL;
 
@@ -1010,6 +1046,10 @@ static bool SetDrawState(D3D_RenderData *data, const SDL_RenderCommand *cmd)
         if (!texture) {
             IDirect3DDevice9_SetTexture(data->device, 0, NULL);
         }
+        if ((!newtexturedata || (texture->format != SDL_PIXELFORMAT_INDEX8)) &&
+            (oldtexturedata && (data->drawstate.texture->format == SDL_PIXELFORMAT_INDEX8))) {
+            IDirect3DDevice9_SetTexture(data->device, 1, NULL);
+        }
 #ifdef SDL_HAVE_YUV
         if ((!newtexturedata || !newtexturedata->yuv) && (oldtexturedata && oldtexturedata->yuv)) {
             IDirect3DDevice9_SetTexture(data->device, 1, NULL);
@@ -1046,6 +1086,9 @@ static bool SetDrawState(D3D_RenderData *data, const SDL_RenderCommand *cmd)
         D3D_TextureData *texturedata = (D3D_TextureData *)texture->internal;
         if (texturedata) {
             UpdateDirtyTexture(data->device, &texturedata->texture);
+            if (texture->format == SDL_PIXELFORMAT_INDEX8) {
+                UpdateDirtyTexture(data->device, &texturedata->palette);
+            }
 #ifdef SDL_HAVE_YUV
             if (texturedata->yuv) {
                 UpdateDirtyTexture(data->device, &texturedata->utexture);
@@ -1445,8 +1488,11 @@ static void D3D_DestroyTexture(SDL_Renderer *renderer, SDL_Texture *texture)
         renderdata->drawstate.shader_params = NULL;
         IDirect3DDevice9_SetPixelShader(renderdata->device, NULL);
         IDirect3DDevice9_SetTexture(renderdata->device, 0, NULL);
+        if (texture->format == SDL_PIXELFORMAT_INDEX8) {
+            IDirect3DDevice9_SetTexture(renderdata->device, 1, NULL);
+        }
 #ifdef SDL_HAVE_YUV
-        if (data->yuv) {
+        if (data && data->yuv) {
             IDirect3DDevice9_SetTexture(renderdata->device, 1, NULL);
             IDirect3DDevice9_SetTexture(renderdata->device, 2, NULL);
         }
@@ -1483,14 +1529,12 @@ static void D3D_DestroyRenderer(SDL_Renderer *renderer)
             IDirect3DSurface9_Release(data->currentRenderTarget);
             data->currentRenderTarget = NULL;
         }
-#ifdef SDL_HAVE_YUV
         for (i = 0; i < SDL_arraysize(data->shaders); ++i) {
             if (data->shaders[i]) {
                 IDirect3DPixelShader9_Release(data->shaders[i]);
                 data->shaders[i] = NULL;
             }
         }
-#endif
         // Release all vertex buffers
         for (i = 0; i < SDL_arraysize(data->vertexBuffers); ++i) {
             if (data->vertexBuffers[i]) {
@@ -1668,6 +1712,7 @@ static bool D3D_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_P
     renderer->WindowEvent = D3D_WindowEvent;
     renderer->SupportsBlendMode = D3D_SupportsBlendMode;
     renderer->CreateTexture = D3D_CreateTexture;
+    renderer->UpdateTexturePalette = D3D_UpdateTexturePalette;
     renderer->UpdateTexture = D3D_UpdateTexture;
 #ifdef SDL_HAVE_YUV
     renderer->UpdateTextureYUV = D3D_UpdateTextureYUV;
@@ -1771,20 +1816,20 @@ static bool D3D_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_P
 
     // Set up parameters for rendering
     D3D_InitRenderState(data);
-#ifdef SDL_HAVE_YUV
-    if (caps.MaxSimultaneousTextures >= 3) {
-        int i;
-        for (i = SHADER_NONE + 1; i < SDL_arraysize(data->shaders); ++i) {
-            result = D3D9_CreatePixelShader(data->device, (D3D9_Shader)i, &data->shaders[i]);
-            if (FAILED(result)) {
-                D3D_SetError("CreatePixelShader()", result);
-            }
-        }
-        if (data->shaders[SHADER_YUV]) {
-            SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_YV12);
-            SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_IYUV);
+    for (int i = SHADER_NONE + 1; i < SDL_arraysize(data->shaders); ++i) {
+        result = D3D9_CreatePixelShader(data->device, (D3D9_Shader)i, &data->shaders[i]);
+        if (FAILED(result)) {
+            D3D_SetError("CreatePixelShader()", result);
         }
     }
+    if (caps.MaxSimultaneousTextures >= 2 && data->shaders[SHADER_PALETTE]) {
+        SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_INDEX8);
+    }
+#ifdef SDL_HAVE_YUV
+    if (caps.MaxSimultaneousTextures >= 3 && data->shaders[SHADER_YUV]) {
+        SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_YV12);
+        SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_IYUV);
+    }
 #endif
 
     SDL_SetPointerProperty(SDL_GetRendererProperties(renderer), SDL_PROP_RENDERER_D3D9_DEVICE_POINTER, data->device);

+ 5 - 0
src/render/direct3d/SDL_shaders_d3d.c

@@ -30,12 +30,17 @@
 
 // The shaders here were compiled with compile_shaders.bat
 
+#define g_ps20_main D3D9_PixelShader_Palette
+#include "D3D9_PixelShader_Palette.h"
+#undef g_ps20_main
+
 #define g_ps20_main D3D9_PixelShader_YUV
 #include "D3D9_PixelShader_YUV.h"
 #undef g_ps20_main
 
 static const BYTE *D3D9_shaders[] = {
     NULL,
+    D3D9_PixelShader_Palette,
     D3D9_PixelShader_YUV
 };
 SDL_COMPILE_TIME_ASSERT(D3D9_shaders, SDL_arraysize(D3D9_shaders) == NUM_SHADERS);

+ 1 - 0
src/render/direct3d/SDL_shaders_d3d.h

@@ -25,6 +25,7 @@
 typedef enum
 {
     SHADER_NONE,
+    SHADER_PALETTE,
     SHADER_YUV,
     NUM_SHADERS
 } D3D9_Shader;

+ 1 - 0
src/render/direct3d/compile_shaders.bat

@@ -1 +1,2 @@
+fxc /T ps_2_0 /Fh D3D9_PixelShader_Palette.h D3D9_PixelShader_Palette.hlsl
 fxc /T ps_2_0 /Fh D3D9_PixelShader_YUV.h D3D9_PixelShader_YUV.hlsl

File diff suppressed because it is too large
+ 571 - 333
src/render/direct3d11/D3D11_PixelShader_Advanced.h


+ 31 - 16
src/render/direct3d11/D3D11_PixelShader_Common.hlsli

@@ -3,6 +3,7 @@ Texture2D texture0 : register(t0);
 Texture2D texture1 : register(t1);
 Texture2D texture2 : register(t2);
 SamplerState sampler0 : register(s0);
+SamplerState sampler1 : register(s1);
 
 struct PixelShaderInput
 {
@@ -19,9 +20,11 @@ static const float TONEMAP_CHROME = 2;
 static const float TEXTURETYPE_NONE = 0;
 static const float TEXTURETYPE_RGB = 1;
 static const float TEXTURETYPE_RGB_PIXELART = 2;
-static const float TEXTURETYPE_NV12 = 3;
-static const float TEXTURETYPE_NV21 = 4;
-static const float TEXTURETYPE_YUV = 5;
+static const float TEXTURETYPE_PALETTE = 3;
+static const float TEXTURETYPE_PALETTE_PIXELART = 4;
+static const float TEXTURETYPE_NV12 = 5;
+static const float TEXTURETYPE_NV21 = 6;
+static const float TEXTURETYPE_YUV = 7;
 
 static const float INPUTTYPE_UNSPECIFIED = 0;
 static const float INPUTTYPE_SRGB = 1;
@@ -116,6 +119,23 @@ float3 ApplyTonemap(float3 v)
     return v;
 }
 
+float2 GetPixelArtUV(PixelShaderInput input)
+{
+    // box filter size in texel units
+    float2 boxSize = clamp(fwidth(input.tex) * texel_size.zw, 1e-5, 1);
+
+    // scale uv by texture size to get texel coordinate
+    float2 tx = input.tex * texel_size.zw - 0.5 * boxSize;
+
+    // compute offset for pixel-sized box filter
+    float2 txOffset = smoothstep(1 - boxSize, 1, frac(tx));
+
+    // compute bilinear sample uv coordinates
+    float2 uv = (floor(tx) + 0.5 + txOffset) * texel_size.xy;
+
+    return uv;
+}
+
 float4 GetInputColor(PixelShaderInput input)
 {
     float4 rgba;
@@ -125,20 +145,15 @@ float4 GetInputColor(PixelShaderInput input)
     } else if (texture_type == TEXTURETYPE_RGB) {
         rgba = texture0.Sample(sampler0, input.tex);
     } else if (texture_type == TEXTURETYPE_RGB_PIXELART) {
-        // box filter size in texel units
-        float2 boxSize = clamp(fwidth(input.tex) * texel_size.zw, 1e-5, 1);
-
-        // scale uv by texture size to get texel coordinate
-        float2 tx = input.tex * texel_size.zw - 0.5 * boxSize;
-
-        // compute offset for pixel-sized box filter
-        float2 txOffset = smoothstep(1 - boxSize, 1, frac(tx));
-
-        // compute bilinear sample uv coordinates
-        float2 uv = (floor(tx) + 0.5 + txOffset) * texel_size.xy;
-
-        // sample the texture
+        float2 uv = GetPixelArtUV(input);
         rgba = texture0.SampleGrad(sampler0, uv, ddx(input.tex), ddy(input.tex));
+    } else if (texture_type == TEXTURETYPE_PALETTE) {
+        float index = texture0.Sample(sampler0, input.tex).r * 255;
+        rgba = texture1.Sample(sampler1, float2((index + 0.5) / 256, 0.5));
+    } else if (texture_type == TEXTURETYPE_PALETTE_PIXELART) {
+        float2 uv = GetPixelArtUV(input);
+        float index = texture0.Sample(sampler0, uv).r * 255;
+        rgba = texture1.Sample(sampler1, float2((index + 0.5) / 256, 0.5));
     } else if (texture_type == TEXTURETYPE_NV12) {
         float3 yuv;
         yuv.x = texture0.Sample(sampler0, input.tex).r;

+ 127 - 44
src/render/direct3d11/SDL_render_d3d11.c

@@ -69,9 +69,11 @@ static const float TONEMAP_CHROME = 2;
 //static const float TEXTURETYPE_NONE = 0;
 static const float TEXTURETYPE_RGB = 1;
 static const float TEXTURETYPE_RGB_PIXELART = 2;
-static const float TEXTURETYPE_NV12 = 3;
-static const float TEXTURETYPE_NV21 = 4;
-static const float TEXTURETYPE_YUV = 5;
+static const float TEXTURETYPE_PALETTE = 3;
+static const float TEXTURETYPE_PALETTE_PIXELART = 4;
+static const float TEXTURETYPE_NV12 = 5;
+static const float TEXTURETYPE_NV21 = 6;
+static const float TEXTURETYPE_YUV = 7;
 
 static const float INPUTTYPE_UNSPECIFIED = 0;
 static const float INPUTTYPE_SRGB = 1;
@@ -119,6 +121,8 @@ typedef struct
     ID3D11Texture2D *mainTexture;
     ID3D11ShaderResourceView *mainTextureResourceView;
     ID3D11RenderTargetView *mainTextureRenderTargetView;
+    ID3D11Texture2D *paletteTexture;
+    ID3D11ShaderResourceView *paletteTextureResourceView;
     ID3D11Texture2D *stagingTexture;
     int lockedTexturePositionX;
     int lockedTexturePositionY;
@@ -190,8 +194,10 @@ typedef struct
     ID3D11BlendState *currentBlendState;
     D3D11_Shader currentShader;
     D3D11_PixelShaderState currentShaderState[NUM_SHADERS];
+    int numCurrentShaderResources;
     ID3D11ShaderResourceView *currentShaderResource;
-    ID3D11SamplerState *currentSampler;
+    int numCurrentShaderSamplers;
+    ID3D11SamplerState *currentShaderSampler;
     bool cliprectDirty;
     bool currentCliprectEnabled;
     SDL_Rect currentCliprect;
@@ -269,6 +275,7 @@ static DXGI_FORMAT SDLPixelFormatToDXGITextureFormat(Uint32 format, Uint32 outpu
             return DXGI_FORMAT_B8G8R8X8_UNORM_SRGB;
         }
         return DXGI_FORMAT_B8G8R8X8_UNORM;
+    case SDL_PIXELFORMAT_INDEX8:
     case SDL_PIXELFORMAT_YV12:
     case SDL_PIXELFORMAT_IYUV:
         return DXGI_FORMAT_R8_UNORM;
@@ -378,8 +385,10 @@ static void D3D11_ReleaseAll(SDL_Renderer *renderer)
         data->currentBlendState = NULL;
         data->currentShader = SHADER_NONE;
         SDL_zero(data->currentShaderState);
+        data->numCurrentShaderResources = 0;
         data->currentShaderResource = NULL;
-        data->currentSampler = NULL;
+        data->numCurrentShaderSamplers = 0;
+        data->currentShaderSampler = NULL;
 
         // Check for any leaks if in debug mode
         if (data->dxgiDebug) {
@@ -1242,6 +1251,25 @@ static bool D3D11_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SD
         }
     }
     SDL_SetPointerProperty(SDL_GetTextureProperties(texture), SDL_PROP_TEXTURE_D3D11_TEXTURE_POINTER, textureData->mainTexture);
+
+    if (texture->format == SDL_PIXELFORMAT_INDEX8) {
+        textureDesc.Width = 256;
+        textureDesc.Height = 1;
+        if (renderer->output_colorspace == SDL_COLORSPACE_SRGB_LINEAR) {
+            textureDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM_SRGB;
+        } else {
+            textureDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
+        }
+
+        result = ID3D11Device_CreateTexture2D(rendererData->d3dDevice,
+                                              &textureDesc,
+                                              NULL,
+                                              &textureData->paletteTexture);
+        if (FAILED(result)) {
+            return WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D11Device1::CreateTexture2D"), result);
+        }
+    }
+
 #ifdef SDL_HAVE_YUV
     if (texture->format == SDL_PIXELFORMAT_YV12 ||
         texture->format == SDL_PIXELFORMAT_IYUV) {
@@ -1316,6 +1344,18 @@ static bool D3D11_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SD
     if (FAILED(result)) {
         return WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D11Device1::CreateShaderResourceView"), result);
     }
+
+    if (texture->format == SDL_PIXELFORMAT_INDEX8) {
+        resourceViewDesc.Format = textureDesc.Format;
+        result = ID3D11Device_CreateShaderResourceView(rendererData->d3dDevice,
+                                                       (ID3D11Resource *)textureData->paletteTexture,
+                                                       &resourceViewDesc,
+                                                       &textureData->paletteTextureResourceView);
+        if (FAILED(result)) {
+            return WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D11Device1::CreateShaderResourceView"), result);
+        }
+    }
+
 #ifdef SDL_HAVE_YUV
     if (textureData->yuv) {
         result = ID3D11Device_CreateShaderResourceView(rendererData->d3dDevice,
@@ -1384,6 +1424,8 @@ static void D3D11_DestroyTexture(SDL_Renderer *renderer,
     SAFE_RELEASE(data->mainTexture);
     SAFE_RELEASE(data->mainTextureResourceView);
     SAFE_RELEASE(data->mainTextureRenderTargetView);
+    SAFE_RELEASE(data->paletteTexture);
+    SAFE_RELEASE(data->paletteTextureResourceView);
     SAFE_RELEASE(data->stagingTexture);
 #ifdef SDL_HAVE_YUV
     SAFE_RELEASE(data->mainTextureU);
@@ -1500,6 +1542,19 @@ static bool D3D11_UpdateTextureInternal(D3D11_RenderData *rendererData, ID3D11Te
     return true;
 }
 
+static bool D3D11_UpdateTexturePalette(SDL_Renderer *renderer, SDL_Texture *texture)
+{
+    D3D11_RenderData *rendererData = (D3D11_RenderData *)renderer->internal;
+    D3D11_TextureData *textureData = (D3D11_TextureData *)texture->internal;
+    SDL_Palette *palette = texture->palette;
+
+    if (!textureData) {
+        return SDL_SetError("Texture is not currently available");
+    }
+
+    return D3D11_UpdateTextureInternal(rendererData, textureData->paletteTexture, 4, 0, 0, palette->ncolors, 1, palette->colors, palette->ncolors * sizeof(*palette->colors));
+}
+
 #ifdef SDL_HAVE_YUV
 static bool D3D11_UpdateTextureNV(SDL_Renderer *renderer, SDL_Texture *texture,
                                  const SDL_Rect *rect,
@@ -2104,6 +2159,18 @@ static void D3D11_SetupShaderConstants(SDL_Renderer *renderer, const SDL_RenderC
         D3D11_TextureData *textureData = (D3D11_TextureData *)texture->internal;
 
         switch (texture->format) {
+        case SDL_PIXELFORMAT_INDEX8:
+            if (cmd->data.draw.texture_scale_mode == SDL_SCALEMODE_PIXELART) {
+                constants->texture_type = TEXTURETYPE_PALETTE_PIXELART;
+                constants->texture_width = texture->w;
+                constants->texture_height = texture->h;
+                constants->texel_width = 1.0f / constants->texture_width;
+                constants->texel_height = 1.0f / constants->texture_height;
+            } else {
+                constants->texture_type = TEXTURETYPE_PALETTE;
+            }
+            constants->input_type = INPUTTYPE_UNSPECIFIED;
+            break;
         case SDL_PIXELFORMAT_YV12:
         case SDL_PIXELFORMAT_IYUV:
             constants->texture_type = TEXTURETYPE_YUV;
@@ -2179,15 +2246,14 @@ static D3D11_Shader SelectShader(const D3D11_PixelShaderConstants *shader_consta
 
 static bool D3D11_SetDrawState(SDL_Renderer *renderer, const SDL_RenderCommand *cmd,
                               const D3D11_PixelShaderConstants *shader_constants,
-                              const int numShaderResources, ID3D11ShaderResourceView **shaderResources,
-                              ID3D11SamplerState *sampler, const Float4X4 *matrix)
+                              int numShaderResources, ID3D11ShaderResourceView **shaderResources,
+                              int numShaderSamplers, ID3D11SamplerState **shaderSamplers, const Float4X4 *matrix)
 
 {
     D3D11_RenderData *rendererData = (D3D11_RenderData *)renderer->internal;
     const Float4X4 *newmatrix = matrix ? matrix : &rendererData->identity;
     ID3D11RasterizerState *rasterizerState;
     ID3D11RenderTargetView *renderTargetView = D3D11_GetCurrentRenderTargetView(renderer);
-    ID3D11ShaderResourceView *shaderResource;
     const SDL_BlendMode blendMode = cmd->data.draw.blend;
     ID3D11BlendState *blendState = NULL;
     bool updateSubresource = false;
@@ -2195,17 +2261,22 @@ static bool D3D11_SetDrawState(SDL_Renderer *renderer, const SDL_RenderCommand *
     D3D11_PixelShaderState *shader_state = &rendererData->currentShaderState[shader];
     D3D11_PixelShaderConstants solid_constants;
 
-    if (numShaderResources > 0) {
-        shaderResource = shaderResources[0];
-    } else {
-        shaderResource = NULL;
+    bool shaderResourcesChanged = false;
+    if (numShaderResources != rendererData->numCurrentShaderResources ||
+        (numShaderResources > 0 && shaderResources[0] != rendererData->currentShaderResource)) {
+        shaderResourcesChanged = true;
+    }
+
+    bool shaderSamplersChanged = false;
+    if (numShaderSamplers != rendererData->numCurrentShaderSamplers ||
+        (numShaderSamplers > 0 && shaderSamplers[0] != rendererData->currentShaderSampler)) {
+        shaderSamplersChanged = true;
     }
 
     // Make sure the render target isn't bound to a shader
-    if (shaderResource != rendererData->currentShaderResource) {
+    if (shaderResourcesChanged) {
         ID3D11ShaderResourceView *pNullResource = NULL;
         ID3D11DeviceContext_PSSetShaderResources(rendererData->d3dContext, 0, 1, &pNullResource);
-        rendererData->currentShaderResource = NULL;
     }
 
     if (renderTargetView != rendererData->currentRenderTargetView) {
@@ -2308,13 +2379,19 @@ static bool D3D11_SetDrawState(SDL_Renderer *renderer, const SDL_RenderCommand *
         }
         rendererData->currentShader = shader;
     }
-    if (shaderResource != rendererData->currentShaderResource) {
+    if (shaderResourcesChanged) {
         ID3D11DeviceContext_PSSetShaderResources(rendererData->d3dContext, 0, numShaderResources, shaderResources);
-        rendererData->currentShaderResource = shaderResource;
+        rendererData->numCurrentShaderResources = numShaderResources;
+        if (numShaderResources > 0) {
+            rendererData->currentShaderResource = shaderResources[0];
+        }
     }
-    if (sampler != rendererData->currentSampler) {
-        ID3D11DeviceContext_PSSetSamplers(rendererData->d3dContext, 0, 1, &sampler);
-        rendererData->currentSampler = sampler;
+    if (shaderSamplersChanged) {
+        ID3D11DeviceContext_PSSetSamplers(rendererData->d3dContext, 0, numShaderSamplers, shaderSamplers);
+        rendererData->numCurrentShaderSamplers = numShaderSamplers;
+        if (numShaderSamplers) {
+            rendererData->currentShaderSampler = shaderSamplers[0];
+        }
     }
 
     if (updateSubresource == true || SDL_memcmp(&rendererData->vertexShaderConstantsData.model, newmatrix, sizeof(*newmatrix)) != 0) {
@@ -2394,7 +2471,10 @@ static bool D3D11_SetCopyState(SDL_Renderer *renderer, const SDL_RenderCommand *
     SDL_Texture *texture = cmd->data.draw.texture;
     D3D11_RenderData *rendererData = (D3D11_RenderData *)renderer->internal;
     D3D11_TextureData *textureData = (D3D11_TextureData *)texture->internal;
-    ID3D11SamplerState *textureSampler;
+    int numShaderResources = 0;
+    ID3D11ShaderResourceView *shaderResources[3];
+    int numShaderSamplers = 0;
+    ID3D11SamplerState *shaderSamplers[2];
     D3D11_PixelShaderConstants constants;
 
     if (!textureData) {
@@ -2403,34 +2483,33 @@ static bool D3D11_SetCopyState(SDL_Renderer *renderer, const SDL_RenderCommand *
 
     D3D11_SetupShaderConstants(renderer, cmd, texture, &constants);
 
-    textureSampler = D3D11_GetSamplerState(rendererData, cmd->data.draw.texture_scale_mode, cmd->data.draw.texture_address_mode_u, cmd->data.draw.texture_address_mode_v);
-    if (!textureSampler) {
+    shaderResources[numShaderResources++] = textureData->mainTextureResourceView;
+
+    shaderSamplers[numShaderSamplers] = D3D11_GetSamplerState(rendererData, cmd->data.draw.texture_scale_mode, cmd->data.draw.texture_address_mode_u, cmd->data.draw.texture_address_mode_v);
+    if (!shaderSamplers[numShaderSamplers]) {
         return false;
     }
+    ++numShaderSamplers;
 
-#ifdef SDL_HAVE_YUV
-    if (textureData->yuv) {
-        ID3D11ShaderResourceView *shaderResources[3];
-
-        shaderResources[0] = textureData->mainTextureResourceView;
-        shaderResources[1] = textureData->mainTextureResourceViewU;
-        shaderResources[2] = textureData->mainTextureResourceViewV;
+    if (texture->format == SDL_PIXELFORMAT_INDEX8) {
+        shaderResources[numShaderResources++] = textureData->paletteTextureResourceView;
 
-        return D3D11_SetDrawState(renderer, cmd, &constants,
-                                  SDL_arraysize(shaderResources), shaderResources, textureSampler, matrix);
+        shaderSamplers[numShaderSamplers] = D3D11_GetSamplerState(rendererData, SDL_SCALEMODE_NEAREST, SDL_TEXTURE_ADDRESS_CLAMP, SDL_TEXTURE_ADDRESS_CLAMP);
+        if (!shaderSamplers[numShaderSamplers]) {
+            return false;
+        }
+        ++numShaderSamplers;
+    }
 
+#ifdef SDL_HAVE_YUV
+    if (textureData->yuv) {
+        shaderResources[numShaderResources++] = textureData->mainTextureResourceViewU;
+        shaderResources[numShaderResources++] = textureData->mainTextureResourceViewV;
     } else if (textureData->nv12) {
-        ID3D11ShaderResourceView *shaderResources[2];
-
-        shaderResources[0] = textureData->mainTextureResourceView;
-        shaderResources[1] = textureData->mainTextureResourceViewNV;
-
-        return D3D11_SetDrawState(renderer, cmd, &constants,
-                                  SDL_arraysize(shaderResources), shaderResources, textureSampler, matrix);
+        shaderResources[numShaderResources++] = textureData->mainTextureResourceViewNV;
     }
 #endif // SDL_HAVE_YUV
-    return D3D11_SetDrawState(renderer, cmd, &constants,
-                              1, &textureData->mainTextureResourceView, textureSampler, matrix);
+    return D3D11_SetDrawState(renderer, cmd, &constants, numShaderResources, shaderResources, numShaderSamplers, shaderSamplers, matrix);
 }
 
 static void D3D11_DrawPrimitives(SDL_Renderer *renderer, D3D11_PRIMITIVE_TOPOLOGY primitiveTopology, const size_t vertexStart, const size_t vertexCount)
@@ -2447,8 +2526,10 @@ static void D3D11_InvalidateCachedState(SDL_Renderer *renderer)
     data->currentRasterizerState = NULL;
     data->currentBlendState = NULL;
     data->currentShader = SHADER_NONE;
+    data->numCurrentShaderResources = 0;
     data->currentShaderResource = NULL;
-    data->currentSampler = NULL;
+    data->numCurrentShaderSamplers = 0;
+    data->currentShaderSampler = NULL;
     data->cliprectDirty = true;
     data->viewportDirty = true;
 }
@@ -2527,7 +2608,7 @@ static bool D3D11_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd
             const size_t count = cmd->data.draw.count;
             const size_t first = cmd->data.draw.first;
             const size_t start = first / sizeof(D3D11_VertexPositionColor);
-            D3D11_SetDrawState(renderer, cmd, NULL, 0, NULL, NULL, NULL);
+            D3D11_SetDrawState(renderer, cmd, NULL, 0, NULL, 0, NULL, NULL);
             D3D11_DrawPrimitives(renderer, D3D11_PRIMITIVE_TOPOLOGY_POINTLIST, start, count);
             break;
         }
@@ -2538,7 +2619,7 @@ static bool D3D11_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd
             const size_t first = cmd->data.draw.first;
             const size_t start = first / sizeof(D3D11_VertexPositionColor);
             const D3D11_VertexPositionColor *verts = (D3D11_VertexPositionColor *)(((Uint8 *)vertices) + first);
-            D3D11_SetDrawState(renderer, cmd, NULL, 0, NULL, NULL, NULL);
+            D3D11_SetDrawState(renderer, cmd, NULL, 0, NULL, 0, NULL, NULL);
             D3D11_DrawPrimitives(renderer, D3D11_PRIMITIVE_TOPOLOGY_LINESTRIP, start, count);
             if (verts[0].pos.x != verts[count - 1].pos.x || verts[0].pos.y != verts[count - 1].pos.y) {
                 D3D11_DrawPrimitives(renderer, D3D11_PRIMITIVE_TOPOLOGY_POINTLIST, start + (count - 1), 1);
@@ -2565,7 +2646,7 @@ static bool D3D11_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd
             if (texture) {
                 D3D11_SetCopyState(renderer, cmd, NULL);
             } else {
-                D3D11_SetDrawState(renderer, cmd, NULL, 0, NULL, NULL, NULL);
+                D3D11_SetDrawState(renderer, cmd, NULL, 0, NULL, 0, NULL, NULL);
             }
 
             D3D11_DrawPrimitives(renderer, D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST, start, count);
@@ -2766,6 +2847,7 @@ static bool D3D11_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL
     renderer->WindowEvent = D3D11_WindowEvent;
     renderer->SupportsBlendMode = D3D11_SupportsBlendMode;
     renderer->CreateTexture = D3D11_CreateTexture;
+    renderer->UpdateTexturePalette = D3D11_UpdateTexturePalette;
     renderer->UpdateTexture = D3D11_UpdateTexture;
 #ifdef SDL_HAVE_YUV
     renderer->UpdateTextureYUV = D3D11_UpdateTextureYUV;
@@ -2795,6 +2877,7 @@ static bool D3D11_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL
     SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_XRGB8888);
     SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ABGR2101010);
     SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGBA64_FLOAT);
+    SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_INDEX8);
     SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_YV12);
     SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_IYUV);
     SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_NV12);

File diff suppressed because it is too large
+ 644 - 557
src/render/direct3d12/D3D12_PixelShader_Advanced.h


+ 31 - 16
src/render/direct3d12/D3D12_PixelShader_Common.hlsli

@@ -4,6 +4,7 @@ Texture2D texture0 : register(t0);
 Texture2D texture1 : register(t1);
 Texture2D texture2 : register(t2);
 SamplerState sampler0 : register(s0);
+SamplerState sampler1 : register(s1);
 
 struct PixelShaderInput
 {
@@ -20,9 +21,11 @@ static const float TONEMAP_CHROME = 2;
 static const float TEXTURETYPE_NONE = 0;
 static const float TEXTURETYPE_RGB = 1;
 static const float TEXTURETYPE_RGB_PIXELART = 2;
-static const float TEXTURETYPE_NV12 = 3;
-static const float TEXTURETYPE_NV21 = 4;
-static const float TEXTURETYPE_YUV = 5;
+static const float TEXTURETYPE_PALETTE = 3;
+static const float TEXTURETYPE_PALETTE_PIXELART = 4;
+static const float TEXTURETYPE_NV12 = 5;
+static const float TEXTURETYPE_NV21 = 6;
+static const float TEXTURETYPE_YUV = 7;
 
 static const float INPUTTYPE_UNSPECIFIED = 0;
 static const float INPUTTYPE_SRGB = 1;
@@ -117,6 +120,23 @@ float3 ApplyTonemap(float3 v)
     return v;
 }
 
+float2 GetPixelArtUV(PixelShaderInput input)
+{
+    // box filter size in texel units
+    float2 boxSize = clamp(fwidth(input.tex) * texel_size.zw, 1e-5, 1);
+
+    // scale uv by texture size to get texel coordinate
+    float2 tx = input.tex * texel_size.zw - 0.5 * boxSize;
+
+    // compute offset for pixel-sized box filter
+    float2 txOffset = smoothstep(1 - boxSize, 1, frac(tx));
+
+    // compute bilinear sample uv coordinates
+    float2 uv = (floor(tx) + 0.5 + txOffset) * texel_size.xy;
+
+    return uv;
+}
+
 float4 GetInputColor(PixelShaderInput input)
 {
     float4 rgba;
@@ -126,20 +146,15 @@ float4 GetInputColor(PixelShaderInput input)
     } else if (texture_type == TEXTURETYPE_RGB) {
         rgba = texture0.Sample(sampler0, input.tex);
     } else if (texture_type == TEXTURETYPE_RGB_PIXELART) {
-        // box filter size in texel units
-        float2 boxSize = clamp(fwidth(input.tex) * texel_size.zw, 1e-5, 1);
-
-        // scale uv by texture size to get texel coordinate
-        float2 tx = input.tex * texel_size.zw - 0.5 * boxSize;
-
-        // compute offset for pixel-sized box filter
-        float2 txOffset = smoothstep(1 - boxSize, 1, frac(tx));
-
-        // compute bilinear sample uv coordinates
-        float2 uv = (floor(tx) + 0.5 + txOffset) * texel_size.xy;
-
-        // sample the texture
+        float2 uv = GetPixelArtUV(input);
         rgba = texture0.SampleGrad(sampler0, uv, ddx(input.tex), ddy(input.tex));
+    } else if (texture_type == TEXTURETYPE_PALETTE) {
+        float index = texture0.Sample(sampler0, input.tex).r * 255;
+        rgba = texture1.Sample(sampler1, float2((index + 0.5) / 256, 0.5));
+    } else if (texture_type == TEXTURETYPE_PALETTE_PIXELART) {
+        float2 uv = GetPixelArtUV(input);
+        float index = texture0.Sample(sampler0, uv).r * 255;
+        rgba = texture1.Sample(sampler1, float2((index + 0.5) / 256, 0.5));
     } else if (texture_type == TEXTURETYPE_NV12) {
         float3 yuv;
         yuv.x = texture0.Sample(sampler0, input.tex).r;

+ 20 - 17
src/render/direct3d12/D3D12_RootSig_Advanced.h

@@ -3,29 +3,32 @@ Disassembly failed
 #endif
 
 const unsigned char g_AdvancedRS[] = {
-  0x44, 0x58, 0x42, 0x43, 0x8d, 0x48, 0xf0, 0x63, 0x01, 0xb4, 0x8c, 0xf4,
-  0xd4, 0xa4, 0xb8, 0x11, 0xb0, 0xec, 0x0b, 0x59, 0x01, 0x00, 0x00, 0x00,
-  0x24, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00,
-  0x52, 0x54, 0x53, 0x30, 0xf8, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
-  0x06, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0xf8, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x05, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x05, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x05, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x05, 0x00, 0x00, 0x00, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x44, 0x58, 0x42, 0x43, 0x7e, 0x10, 0xf2, 0x34, 0x1f, 0x5f, 0x2b, 0x22,
+  0xbb, 0xe0, 0xa0, 0x5c, 0x42, 0x31, 0x4c, 0x01, 0x01, 0x00, 0x00, 0x00,
+  0x50, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00,
+  0x52, 0x54, 0x53, 0x30, 0x24, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+  0x07, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x24, 0x01, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x05, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x05, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x05, 0x00, 0x00, 0x00, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x05, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x05, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
-  0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+  0x8c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00,
+  0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-  0x01, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x01, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00,
-  0xe0, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+  0xec, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0xff, 0xff, 0xff, 0xff
+  0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x0c, 0x01, 0x00, 0x00,
+  0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff
 };

+ 2 - 1
src/render/direct3d12/D3D12_Shader_Common.hlsli

@@ -33,4 +33,5 @@ cbuffer VertexShaderConstants : register(b0)
     "DescriptorTable ( SRV(t0), visibility = SHADER_VISIBILITY_PIXEL ),"\
     "DescriptorTable ( SRV(t1), visibility = SHADER_VISIBILITY_PIXEL ),"\
     "DescriptorTable ( SRV(t2), visibility = SHADER_VISIBILITY_PIXEL ),"\
-    "DescriptorTable ( Sampler(s0), visibility = SHADER_VISIBILITY_PIXEL )"
+    "DescriptorTable ( Sampler(s0), visibility = SHADER_VISIBILITY_PIXEL )," \
+    "DescriptorTable ( Sampler(s1), visibility = SHADER_VISIBILITY_PIXEL )"

+ 254 - 250
src/render/direct3d12/D3D12_VertexShader_Advanced.h

@@ -199,12 +199,12 @@ attributes #2 = { nounwind readonly }
 #endif
 
 const unsigned char g_mainAdvanced[] = {
-  0x44, 0x58, 0x42, 0x43, 0x15, 0xfa, 0xe2, 0x27, 0x02, 0x03, 0xa4, 0x6d,
-  0xf0, 0xbc, 0x35, 0xb4, 0x3b, 0x0e, 0xc6, 0xe3, 0x01, 0x00, 0x00, 0x00,
-  0x18, 0x12, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,
+  0x44, 0x58, 0x42, 0x43, 0x1f, 0xd8, 0x69, 0x8c, 0xf9, 0x3f, 0xcb, 0x59,
+  0x93, 0xbb, 0x79, 0x04, 0x43, 0x1d, 0xeb, 0xe3, 0x01, 0x00, 0x00, 0x00,
+  0x44, 0x12, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,
   0x50, 0x00, 0x00, 0x00, 0xd8, 0x00, 0x00, 0x00, 0x64, 0x01, 0x00, 0x00,
-  0x88, 0x02, 0x00, 0x00, 0x88, 0x03, 0x00, 0x00, 0x0c, 0x0a, 0x00, 0x00,
-  0x28, 0x0a, 0x00, 0x00, 0x53, 0x46, 0x49, 0x30, 0x08, 0x00, 0x00, 0x00,
+  0x88, 0x02, 0x00, 0x00, 0xb4, 0x03, 0x00, 0x00, 0x38, 0x0a, 0x00, 0x00,
+  0x54, 0x0a, 0x00, 0x00, 0x53, 0x46, 0x49, 0x30, 0x08, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x53, 0x47, 0x31,
   0x80, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -253,31 +253,176 @@ const unsigned char g_mainAdvanced[] = {
   0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
   0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
-  0x52, 0x54, 0x53, 0x30, 0xf8, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
-  0x06, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0xf8, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x05, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x05, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x05, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x05, 0x00, 0x00, 0x00, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x52, 0x54, 0x53, 0x30, 0x24, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+  0x07, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x24, 0x01, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x05, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x05, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x05, 0x00, 0x00, 0x00, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x05, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x05, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
-  0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+  0x8c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00,
+  0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-  0x01, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x01, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00,
-  0xe0, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+  0xec, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0xff, 0xff, 0xff, 0xff, 0x53, 0x54, 0x41, 0x54, 0x7c, 0x06, 0x00, 0x00,
-  0x60, 0x00, 0x01, 0x00, 0x9f, 0x01, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4c,
-  0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x64, 0x06, 0x00, 0x00,
-  0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0x96, 0x01, 0x00, 0x00,
+  0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x0c, 0x01, 0x00, 0x00,
+  0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
+  0x53, 0x54, 0x41, 0x54, 0x7c, 0x06, 0x00, 0x00, 0x60, 0x00, 0x01, 0x00,
+  0x9f, 0x01, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4c, 0x00, 0x01, 0x00, 0x00,
+  0x10, 0x00, 0x00, 0x00, 0x64, 0x06, 0x00, 0x00, 0x42, 0x43, 0xc0, 0xde,
+  0x21, 0x0c, 0x00, 0x00, 0x96, 0x01, 0x00, 0x00, 0x0b, 0x82, 0x20, 0x00,
+  0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, 0x91,
+  0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, 0x0c,
+  0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x14, 0x45, 0x02,
+  0x42, 0x92, 0x0b, 0x42, 0xa4, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18, 0x4b,
+  0x0a, 0x32, 0x52, 0x88, 0x48, 0x90, 0x14, 0x20, 0x43, 0x46, 0x88, 0xa5,
+  0x00, 0x19, 0x32, 0x42, 0xe4, 0x48, 0x0e, 0x90, 0x91, 0x22, 0xc4, 0x50,
+  0x41, 0x51, 0x81, 0x8c, 0xe1, 0x83, 0xe5, 0x8a, 0x04, 0x29, 0x46, 0x06,
+  0x51, 0x18, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x1b, 0x8c, 0xe0, 0xff,
+  0xff, 0xff, 0xff, 0x07, 0x40, 0x02, 0xa8, 0x0d, 0x84, 0xf0, 0xff, 0xff,
+  0xff, 0xff, 0x03, 0x20, 0x6d, 0x30, 0x86, 0xff, 0xff, 0xff, 0xff, 0x1f,
+  0x00, 0x09, 0xa8, 0x00, 0x49, 0x18, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+  0x13, 0x82, 0x60, 0x42, 0x20, 0x4c, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00,
+  0x89, 0x20, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x32, 0x22, 0x48, 0x09,
+  0x20, 0x64, 0x85, 0x04, 0x93, 0x22, 0xa4, 0x84, 0x04, 0x93, 0x22, 0xe3,
+  0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8a, 0x8c, 0x0b, 0x84, 0xa4, 0x4c,
+  0x10, 0x68, 0x23, 0x00, 0x25, 0x00, 0x14, 0x66, 0x00, 0xe6, 0x08, 0xc0,
+  0x60, 0x8e, 0x00, 0x29, 0xc6, 0x20, 0x84, 0x14, 0x42, 0xa6, 0x18, 0x80,
+  0x10, 0x52, 0x06, 0xa1, 0xa3, 0x86, 0xcb, 0x9f, 0xb0, 0x87, 0x90, 0x7c,
+  0x6e, 0xa3, 0x8a, 0x95, 0x98, 0xfc, 0xe2, 0xb6, 0x11, 0x31, 0xc6, 0x18,
+  0x54, 0xee, 0x19, 0x2e, 0x7f, 0xc2, 0x1e, 0x42, 0xf2, 0x43, 0xa0, 0x19,
+  0x16, 0x02, 0x05, 0xab, 0x10, 0x8a, 0x30, 0x42, 0xad, 0x14, 0x83, 0x8c,
+  0x31, 0xe8, 0xcd, 0x11, 0x04, 0xc5, 0x60, 0xa4, 0x10, 0x12, 0x49, 0x0e,
+  0x04, 0x0c, 0x23, 0x10, 0x43, 0x12, 0xd4, 0x03, 0x83, 0xc3, 0x91, 0xa6,
+  0x05, 0xc0, 0x1c, 0x6a, 0xf2, 0x5f, 0x22, 0x9a, 0x88, 0x8b, 0x3d, 0x80,
+  0x81, 0x88, 0x38, 0xa7, 0x91, 0x26, 0xa0, 0x99, 0x24, 0x14, 0x58, 0xba,
+  0xe9, 0x40, 0x00, 0x00, 0x13, 0x14, 0x72, 0xc0, 0x87, 0x74, 0x60, 0x87,
+  0x36, 0x68, 0x87, 0x79, 0x68, 0x03, 0x72, 0xc0, 0x87, 0x0d, 0xaf, 0x50,
+  0x0e, 0x6d, 0xd0, 0x0e, 0x7a, 0x50, 0x0e, 0x6d, 0x00, 0x0f, 0x7a, 0x30,
+  0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0xa0,
+  0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x78, 0xa0, 0x07, 0x73, 0x20,
+  0x07, 0x6d, 0x90, 0x0e, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0,
+  0x06, 0xe9, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90,
+  0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe6, 0x10,
+  0x07, 0x76, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0e, 0x73, 0x20,
+  0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe6, 0x60, 0x07, 0x74, 0xa0,
+  0x07, 0x76, 0x40, 0x07, 0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71, 0x60,
+  0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x43, 0x9e,
+  0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86,
+  0x3c, 0x06, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x0c, 0x79, 0x10, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x18, 0xf2, 0x34, 0x40, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x30, 0xe4, 0x79, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x60, 0xc8, 0x23, 0x01, 0x01, 0x30, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x40, 0x16, 0x08, 0x00, 0x12, 0x00, 0x00, 0x00,
+  0x32, 0x1e, 0x98, 0x14, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47,
+  0xc6, 0x04, 0x43, 0x22, 0x25, 0x30, 0x02, 0x50, 0x0c, 0x05, 0x18, 0x50,
+  0x04, 0x85, 0x50, 0x06, 0xe5, 0x50, 0x12, 0xe5, 0x51, 0x10, 0x25, 0x57,
+  0x14, 0x54, 0x4a, 0x62, 0x04, 0xa0, 0x0c, 0x8a, 0xa0, 0x10, 0xe8, 0xce,
+  0x00, 0x10, 0x9e, 0x01, 0xa0, 0x3c, 0x96, 0xc3, 0x30, 0xcf, 0xf3, 0x00,
+  0x10, 0x18, 0x00, 0x00, 0x88, 0x80, 0x10, 0x08, 0x06, 0x20, 0x28, 0x00,
+  0x79, 0x18, 0x00, 0x00, 0x92, 0x00, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x90,
+  0x46, 0x02, 0x13, 0x44, 0x8f, 0x0c, 0x6f, 0xec, 0xed, 0x4d, 0x0c, 0x24,
+  0xc6, 0xe5, 0xc6, 0x45, 0x66, 0x06, 0x06, 0xc7, 0x25, 0xc6, 0x06, 0x04,
+  0xa5, 0x46, 0x86, 0x2c, 0x2c, 0xe6, 0xa6, 0x4c, 0x26, 0x27, 0x65, 0x43,
+  0x10, 0x4c, 0x10, 0x08, 0x63, 0x82, 0x40, 0x1c, 0x1b, 0x84, 0x81, 0xd8,
+  0x20, 0x10, 0x04, 0x05, 0xbb, 0xb9, 0x09, 0x02, 0x81, 0x6c, 0x18, 0x0e,
+  0x84, 0x98, 0x20, 0x60, 0x19, 0x2b, 0xab, 0x32, 0x39, 0xba, 0x32, 0xbc,
+  0x29, 0xb4, 0x30, 0xb2, 0x32, 0xb9, 0xa1, 0x37, 0xb7, 0x39, 0xba, 0x30,
+  0x37, 0xba, 0xb9, 0x09, 0x02, 0x91, 0x6c, 0x40, 0x08, 0x65, 0x21, 0x88,
+  0x81, 0x01, 0x36, 0x04, 0xcd, 0x06, 0x02, 0x00, 0x1c, 0x60, 0x82, 0x70,
+  0x61, 0x1c, 0xda, 0xe0, 0xec, 0x26, 0x08, 0x84, 0x32, 0x41, 0x20, 0x96,
+  0x0d, 0xc3, 0x34, 0x0d, 0x13, 0x04, 0x82, 0x99, 0x20, 0x10, 0xcd, 0x04,
+  0x81, 0x70, 0x36, 0x20, 0x48, 0x24, 0x51, 0x15, 0x61, 0x5d, 0x1b, 0x04,
+  0x06, 0xdb, 0x30, 0x10, 0x50, 0x36, 0x41, 0x10, 0x80, 0x0d, 0xc0, 0x86,
+  0x81, 0xe0, 0xb8, 0x0d, 0x41, 0xb7, 0x61, 0x18, 0x36, 0x6f, 0x82, 0x90,
+  0x69, 0x1b, 0x02, 0x30, 0x20, 0xd3, 0x16, 0x96, 0xe6, 0x16, 0x44, 0x66,
+  0x17, 0xe6, 0x36, 0x56, 0x46, 0x46, 0x04, 0xea, 0x69, 0x2a, 0x89, 0x2a,
+  0xe9, 0xc9, 0x69, 0x82, 0x50, 0x4c, 0x13, 0x84, 0x82, 0xda, 0x10, 0x10,
+  0x13, 0x84, 0xa2, 0xda, 0x20, 0x54, 0xd6, 0x86, 0x85, 0x18, 0x03, 0x32,
+  0x28, 0x03, 0x33, 0x28, 0x83, 0xe1, 0x0c, 0x88, 0x32, 0x40, 0x03, 0x22,
+  0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x13, 0x84, 0xc2, 0xda,
+  0x20, 0x54, 0xd5, 0x86, 0x65, 0x50, 0x03, 0x32, 0x28, 0x03, 0x33, 0x28,
+  0x83, 0x61, 0x0d, 0x86, 0x32, 0x60, 0x03, 0x16, 0x43, 0x4f, 0x4c, 0x4f,
+  0x52, 0x13, 0x84, 0xe2, 0x9a, 0x20, 0x10, 0xcf, 0x06, 0xa1, 0x82, 0x83,
+  0x0d, 0x8b, 0xe4, 0x06, 0x64, 0x50, 0x06, 0x66, 0x50, 0x06, 0xc3, 0x1b,
+  0x48, 0x65, 0x10, 0x07, 0x1b, 0x86, 0x34, 0x68, 0x03, 0x39, 0xe0, 0x32,
+  0x65, 0xf5, 0x05, 0xf5, 0x36, 0x97, 0x46, 0x97, 0xf6, 0xe6, 0xb6, 0x61,
+  0x21, 0xe8, 0x80, 0x0c, 0xce, 0xc0, 0x0c, 0xde, 0x60, 0x78, 0x03, 0xa2,
+  0x0c, 0xe2, 0x60, 0xc3, 0x32, 0xa8, 0x01, 0x19, 0x94, 0x81, 0x19, 0xac,
+  0xc1, 0xb0, 0x06, 0x43, 0x19, 0xb0, 0xc1, 0x86, 0x45, 0x72, 0x03, 0x32,
+  0x28, 0x03, 0x33, 0x58, 0x83, 0xe1, 0x0d, 0xa4, 0x32, 0x88, 0x83, 0x0d,
+  0x43, 0x1d, 0xd8, 0xc1, 0x1d, 0x6c, 0x18, 0xe6, 0x00, 0x0f, 0x80, 0x0d,
+  0xc5, 0x26, 0x06, 0x79, 0xf0, 0x00, 0x34, 0xcc, 0xd8, 0xde, 0xc2, 0xe8,
+  0xe6, 0x26, 0x08, 0x04, 0xc4, 0x22, 0xcd, 0x6d, 0x8e, 0x6e, 0x6e, 0x82,
+  0x40, 0x44, 0x34, 0xe6, 0xd2, 0xce, 0xbe, 0xd8, 0xc8, 0x68, 0xcc, 0xa5,
+  0x9d, 0x7d, 0xcd, 0xd1, 0x4d, 0x10, 0x08, 0x69, 0x03, 0xb2, 0x07, 0x7c,
+  0xd0, 0x07, 0x7e, 0xf0, 0x07, 0x17, 0x28, 0x84, 0x42, 0x15, 0x36, 0x36,
+  0xbb, 0x36, 0x97, 0x34, 0xb2, 0x32, 0x37, 0xba, 0x29, 0x41, 0x50, 0x85,
+  0x0c, 0xcf, 0xc5, 0xae, 0x4c, 0x6e, 0x2e, 0xed, 0xcd, 0x6d, 0x4a, 0x40,
+  0x34, 0x21, 0xc3, 0x73, 0xb1, 0x0b, 0x63, 0xb3, 0x2b, 0x93, 0x9b, 0x12,
+  0x14, 0x75, 0xc8, 0xf0, 0x5c, 0xe6, 0xd0, 0xc2, 0xc8, 0xca, 0xe4, 0x9a,
+  0xde, 0xc8, 0xca, 0xd8, 0xa6, 0x04, 0x48, 0x19, 0x32, 0x3c, 0x17, 0xb9,
+  0xb2, 0xb9, 0xb7, 0x3a, 0xb9, 0xb1, 0xb2, 0xb9, 0x29, 0x81, 0x53, 0x89,
+  0x0c, 0xcf, 0x85, 0x2e, 0x0f, 0xae, 0x2c, 0xc8, 0xcd, 0xed, 0x8d, 0x2e,
+  0x8c, 0x2e, 0xed, 0xcd, 0x6d, 0x6e, 0x8a, 0x90, 0x79, 0x75, 0xc8, 0xf0,
+  0x5c, 0xec, 0xd2, 0xca, 0xee, 0x92, 0xc8, 0xa6, 0xe8, 0xc2, 0xe8, 0xca,
+  0xa6, 0x04, 0x60, 0x50, 0x87, 0x0c, 0xcf, 0xa5, 0xcc, 0x8d, 0x4e, 0x2e,
+  0x0f, 0xea, 0x2d, 0xcd, 0x8d, 0x6e, 0x6e, 0x4a, 0x90, 0x07, 0x5d, 0xc8,
+  0xf0, 0x5c, 0xc6, 0xde, 0xea, 0xdc, 0xe8, 0xca, 0xe4, 0xe6, 0xa6, 0x04,
+  0xa1, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00,
+  0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88,
+  0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73,
+  0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e,
+  0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, 0x30,
+  0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, 0xc8,
+  0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b,
+  0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, 0x76,
+  0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e,
+  0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e,
+  0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61,
+  0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xb4,
+  0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, 0x76,
+  0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, 0x37,
+  0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76,
+  0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, 0x71,
+  0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e,
+  0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1,
+  0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61,
+  0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, 0x90,
+  0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, 0xb8,
+  0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc,
+  0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x8c, 0xc8,
+  0x21, 0x07, 0x7c, 0x70, 0x03, 0x72, 0x10, 0x87, 0x73, 0x70, 0x03, 0x7b,
+  0x08, 0x07, 0x79, 0x60, 0x87, 0x70, 0xc8, 0x87, 0x77, 0xa8, 0x07, 0x7a,
+  0x98, 0x81, 0x3c, 0xe4, 0x80, 0x0f, 0x6e, 0x40, 0x0f, 0xe5, 0xd0, 0x0e,
+  0xf0, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00,
+  0x36, 0xb0, 0x0d, 0x97, 0xef, 0x3c, 0xbe, 0x10, 0x50, 0x45, 0x41, 0x44,
+  0xa5, 0x03, 0x0c, 0x25, 0x61, 0x00, 0x02, 0xe6, 0x17, 0xb7, 0x6d, 0x05,
+  0xd2, 0x70, 0xf9, 0xce, 0xe3, 0x0b, 0x11, 0x01, 0x4c, 0x44, 0x08, 0x34,
+  0xc3, 0x42, 0x58, 0xc0, 0x34, 0x5c, 0xbe, 0xf3, 0xf8, 0x8b, 0x03, 0x0c,
+  0x62, 0xf3, 0x50, 0x93, 0x5f, 0xdc, 0xb6, 0x09, 0x54, 0xc3, 0xe5, 0x3b,
+  0x8f, 0x2f, 0x4d, 0x4e, 0x44, 0xa0, 0xd4, 0xf4, 0x50, 0x93, 0x5f, 0xdc,
+  0xb6, 0x11, 0x48, 0xc3, 0xe5, 0x3b, 0x8f, 0x3f, 0x11, 0xd1, 0x84, 0x00,
+  0x11, 0xe6, 0x17, 0xb7, 0x6d, 0x00, 0x0c, 0x03, 0x20, 0x8d, 0x36, 0x54,
+  0x40, 0x23, 0x10, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x48, 0x41, 0x53, 0x48, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0xd7, 0xbc, 0xf2, 0x0f, 0x2a, 0x5d, 0xb2, 0x1d, 0x5b, 0xa8, 0x10, 0xd8,
+  0x99, 0x83, 0xd7, 0xfd, 0x44, 0x58, 0x49, 0x4c, 0xe8, 0x07, 0x00, 0x00,
+  0x60, 0x00, 0x01, 0x00, 0xfa, 0x01, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4c,
+  0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xd0, 0x07, 0x00, 0x00,
+  0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0xf1, 0x01, 0x00, 0x00,
   0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00,
   0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39,
   0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62,
@@ -315,69 +460,53 @@ const unsigned char g_mainAdvanced[] = {
   0x60, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe6,
   0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0xe0, 0x0e, 0x78,
   0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x76,
-  0x40, 0x07, 0x43, 0x9e, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x40, 0x07, 0x43, 0x9e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x86, 0x3c, 0x06, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x0c, 0x79, 0x10, 0x20, 0x00, 0x04, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xf2, 0x34, 0x40, 0x00, 0x0c, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xe4, 0x79, 0x80, 0x00, 0x08,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xc8, 0x23, 0x01, 0x01,
   0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x16, 0x08, 0x00,
-  0x12, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x14, 0x19, 0x11, 0x4c, 0x90,
+  0x10, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x14, 0x19, 0x11, 0x4c, 0x90,
   0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0x22, 0x25, 0x30, 0x02, 0x50,
-  0x0c, 0x05, 0x18, 0x50, 0x04, 0x85, 0x50, 0x06, 0xe5, 0x50, 0x12, 0xe5,
-  0x51, 0x10, 0x25, 0x57, 0x14, 0x54, 0x4a, 0x62, 0x04, 0xa0, 0x0c, 0x8a,
-  0xa0, 0x10, 0xe8, 0xce, 0x00, 0x10, 0x9e, 0x01, 0xa0, 0x3c, 0x96, 0xc3,
-  0x30, 0xcf, 0xf3, 0x00, 0x10, 0x18, 0x00, 0x00, 0x88, 0x80, 0x10, 0x08,
-  0x06, 0x20, 0x28, 0x00, 0x79, 0x18, 0x00, 0x00, 0x92, 0x00, 0x00, 0x00,
-  0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0x44, 0x8f, 0x0c, 0x6f, 0xec,
-  0xed, 0x4d, 0x0c, 0x24, 0xc6, 0xe5, 0xc6, 0x45, 0x66, 0x06, 0x06, 0xc7,
-  0x25, 0xc6, 0x06, 0x04, 0xa5, 0x46, 0x86, 0x2c, 0x2c, 0xe6, 0xa6, 0x4c,
-  0x26, 0x27, 0x65, 0x43, 0x10, 0x4c, 0x10, 0x08, 0x63, 0x82, 0x40, 0x1c,
-  0x1b, 0x84, 0x81, 0xd8, 0x20, 0x10, 0x04, 0x05, 0xbb, 0xb9, 0x09, 0x02,
-  0x81, 0x6c, 0x18, 0x0e, 0x84, 0x98, 0x20, 0x60, 0x19, 0x2b, 0xab, 0x32,
-  0x39, 0xba, 0x32, 0xbc, 0x29, 0xb4, 0x30, 0xb2, 0x32, 0xb9, 0xa1, 0x37,
-  0xb7, 0x39, 0xba, 0x30, 0x37, 0xba, 0xb9, 0x09, 0x02, 0x91, 0x6c, 0x40,
-  0x08, 0x65, 0x21, 0x88, 0x81, 0x01, 0x36, 0x04, 0xcd, 0x06, 0x02, 0x00,
-  0x1c, 0x60, 0x82, 0x70, 0x61, 0x1c, 0xda, 0xe0, 0xec, 0x26, 0x08, 0x84,
-  0x32, 0x41, 0x20, 0x96, 0x0d, 0xc3, 0x34, 0x0d, 0x13, 0x04, 0x82, 0x99,
-  0x20, 0x10, 0xcd, 0x04, 0x81, 0x70, 0x36, 0x20, 0x48, 0x24, 0x51, 0x15,
-  0x61, 0x5d, 0x1b, 0x04, 0x06, 0xdb, 0x30, 0x10, 0x50, 0x36, 0x41, 0x10,
-  0x80, 0x0d, 0xc0, 0x86, 0x81, 0xe0, 0xb8, 0x0d, 0x41, 0xb7, 0x61, 0x18,
-  0x36, 0x6f, 0x82, 0x90, 0x69, 0x1b, 0x02, 0x30, 0x20, 0xd3, 0x16, 0x96,
-  0xe6, 0x16, 0x44, 0x66, 0x17, 0xe6, 0x36, 0x56, 0x46, 0x46, 0x04, 0xea,
-  0x69, 0x2a, 0x89, 0x2a, 0xe9, 0xc9, 0x69, 0x82, 0x50, 0x4c, 0x13, 0x84,
-  0x82, 0xda, 0x10, 0x10, 0x13, 0x84, 0xa2, 0xda, 0x20, 0x54, 0xd6, 0x86,
-  0x85, 0x18, 0x03, 0x32, 0x28, 0x03, 0x33, 0x28, 0x83, 0xe1, 0x0c, 0x88,
-  0x32, 0x40, 0x03, 0x22, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44,
-  0x13, 0x84, 0xc2, 0xda, 0x20, 0x54, 0xd5, 0x86, 0x65, 0x50, 0x03, 0x32,
-  0x28, 0x03, 0x33, 0x28, 0x83, 0x61, 0x0d, 0x86, 0x32, 0x60, 0x03, 0x16,
-  0x43, 0x4f, 0x4c, 0x4f, 0x52, 0x13, 0x84, 0xe2, 0x9a, 0x20, 0x10, 0xcf,
-  0x06, 0xa1, 0x82, 0x83, 0x0d, 0x8b, 0xe4, 0x06, 0x64, 0x50, 0x06, 0x66,
-  0x50, 0x06, 0xc3, 0x1b, 0x48, 0x65, 0x10, 0x07, 0x1b, 0x86, 0x34, 0x68,
-  0x03, 0x39, 0xe0, 0x32, 0x65, 0xf5, 0x05, 0xf5, 0x36, 0x97, 0x46, 0x97,
-  0xf6, 0xe6, 0xb6, 0x61, 0x21, 0xe8, 0x80, 0x0c, 0xce, 0xc0, 0x0c, 0xde,
-  0x60, 0x78, 0x03, 0xa2, 0x0c, 0xe2, 0x60, 0xc3, 0x32, 0xa8, 0x01, 0x19,
-  0x94, 0x81, 0x19, 0xac, 0xc1, 0xb0, 0x06, 0x43, 0x19, 0xb0, 0xc1, 0x86,
-  0x45, 0x72, 0x03, 0x32, 0x28, 0x03, 0x33, 0x58, 0x83, 0xe1, 0x0d, 0xa4,
-  0x32, 0x88, 0x83, 0x0d, 0x43, 0x1d, 0xd8, 0xc1, 0x1d, 0x6c, 0x18, 0xe6,
-  0x00, 0x0f, 0x80, 0x0d, 0xc5, 0x26, 0x06, 0x79, 0xf0, 0x00, 0x34, 0xcc,
-  0xd8, 0xde, 0xc2, 0xe8, 0xe6, 0x26, 0x08, 0x04, 0xc4, 0x22, 0xcd, 0x6d,
-  0x8e, 0x6e, 0x6e, 0x82, 0x40, 0x44, 0x34, 0xe6, 0xd2, 0xce, 0xbe, 0xd8,
-  0xc8, 0x68, 0xcc, 0xa5, 0x9d, 0x7d, 0xcd, 0xd1, 0x4d, 0x10, 0x08, 0x69,
-  0x03, 0xb2, 0x07, 0x7c, 0xd0, 0x07, 0x7e, 0xf0, 0x07, 0x17, 0x28, 0x84,
-  0x42, 0x15, 0x36, 0x36, 0xbb, 0x36, 0x97, 0x34, 0xb2, 0x32, 0x37, 0xba,
-  0x29, 0x41, 0x50, 0x85, 0x0c, 0xcf, 0xc5, 0xae, 0x4c, 0x6e, 0x2e, 0xed,
-  0xcd, 0x6d, 0x4a, 0x40, 0x34, 0x21, 0xc3, 0x73, 0xb1, 0x0b, 0x63, 0xb3,
-  0x2b, 0x93, 0x9b, 0x12, 0x14, 0x75, 0xc8, 0xf0, 0x5c, 0xe6, 0xd0, 0xc2,
-  0xc8, 0xca, 0xe4, 0x9a, 0xde, 0xc8, 0xca, 0xd8, 0xa6, 0x04, 0x48, 0x19,
-  0x32, 0x3c, 0x17, 0xb9, 0xb2, 0xb9, 0xb7, 0x3a, 0xb9, 0xb1, 0xb2, 0xb9,
-  0x29, 0x81, 0x53, 0x89, 0x0c, 0xcf, 0x85, 0x2e, 0x0f, 0xae, 0x2c, 0xc8,
-  0xcd, 0xed, 0x8d, 0x2e, 0x8c, 0x2e, 0xed, 0xcd, 0x6d, 0x6e, 0x8a, 0x90,
-  0x79, 0x75, 0xc8, 0xf0, 0x5c, 0xec, 0xd2, 0xca, 0xee, 0x92, 0xc8, 0xa6,
-  0xe8, 0xc2, 0xe8, 0xca, 0xa6, 0x04, 0x60, 0x50, 0x87, 0x0c, 0xcf, 0xa5,
-  0xcc, 0x8d, 0x4e, 0x2e, 0x0f, 0xea, 0x2d, 0xcd, 0x8d, 0x6e, 0x6e, 0x4a,
-  0x90, 0x07, 0x5d, 0xc8, 0xf0, 0x5c, 0xc6, 0xde, 0xea, 0xdc, 0xe8, 0xca,
-  0xe4, 0xe6, 0xa6, 0x04, 0xa1, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00,
+  0x0e, 0xc5, 0x50, 0x80, 0x01, 0x65, 0x50, 0x04, 0xe5, 0x41, 0xa5, 0x24,
+  0x46, 0x00, 0xca, 0xa0, 0x08, 0x0a, 0x81, 0xf0, 0x0c, 0x00, 0xe5, 0xb1,
+  0x1c, 0x86, 0x79, 0x9e, 0x07, 0x80, 0xc0, 0x00, 0x00, 0x40, 0x04, 0x84,
+  0x40, 0x30, 0x00, 0x41, 0x01, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00,
+  0x64, 0x00, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0x44,
+  0x8f, 0x0c, 0x6f, 0xec, 0xed, 0x4d, 0x0c, 0x24, 0xc6, 0xe5, 0xc6, 0x45,
+  0x66, 0x06, 0x06, 0xc7, 0x25, 0xc6, 0x06, 0x04, 0xa5, 0x46, 0x86, 0x2c,
+  0x2c, 0xe6, 0xa6, 0x4c, 0x26, 0x27, 0x65, 0x43, 0x10, 0x4c, 0x10, 0x08,
+  0x63, 0x82, 0x40, 0x1c, 0x1b, 0x84, 0x81, 0x98, 0x20, 0x10, 0xc8, 0x06,
+  0x61, 0x30, 0x28, 0xd8, 0xcd, 0x4d, 0x10, 0x88, 0x64, 0xc3, 0x80, 0x24,
+  0xc4, 0x04, 0x01, 0x9b, 0x08, 0x4c, 0x10, 0x08, 0x65, 0x03, 0x42, 0x2c,
+  0x0c, 0x41, 0x0c, 0x0d, 0xb0, 0x21, 0x70, 0x36, 0x10, 0x00, 0xf0, 0x00,
+  0x13, 0x84, 0x8c, 0xda, 0x10, 0x44, 0x13, 0x04, 0x01, 0x20, 0xd3, 0x16,
+  0x96, 0xe6, 0x16, 0x44, 0x66, 0x17, 0xe6, 0x36, 0x56, 0x46, 0x46, 0x04,
+  0xea, 0x69, 0x2a, 0x89, 0x2a, 0xe9, 0xc9, 0x69, 0x82, 0x50, 0x38, 0x13,
+  0x84, 0xe2, 0xd9, 0x10, 0x10, 0x13, 0x84, 0x02, 0x9a, 0x20, 0x10, 0xcb,
+  0x06, 0x41, 0x33, 0x36, 0x2c, 0x44, 0x65, 0x5d, 0xd8, 0x35, 0x64, 0xc4,
+  0xb5, 0x11, 0xa1, 0x2a, 0xc2, 0x1a, 0x7a, 0x7a, 0x92, 0x22, 0x9a, 0x20,
+  0x14, 0xd1, 0x06, 0x41, 0xd3, 0x36, 0x2c, 0x43, 0x67, 0x5d, 0xd8, 0x35,
+  0x78, 0xc3, 0xf5, 0x4d, 0x10, 0x08, 0x86, 0xc5, 0xd0, 0x13, 0xd3, 0x93,
+  0xd4, 0x04, 0xa1, 0x90, 0x26, 0x08, 0x44, 0xb3, 0x41, 0xd0, 0xc8, 0x60,
+  0xc3, 0x12, 0x06, 0x62, 0x60, 0x5d, 0xd8, 0x35, 0x8c, 0x41, 0x18, 0x5c,
+  0x65, 0xb0, 0x61, 0xe0, 0xc0, 0xc0, 0x0c, 0xb8, 0x4c, 0x59, 0x7d, 0x41,
+  0xbd, 0xcd, 0xa5, 0xd1, 0xa5, 0xbd, 0xb9, 0x6d, 0x58, 0x08, 0x34, 0xb0,
+  0x32, 0x6c, 0x0c, 0x86, 0x31, 0x20, 0xae, 0x32, 0xd8, 0xb0, 0x0c, 0x9d,
+  0x75, 0x61, 0xde, 0xe0, 0x0d, 0xd7, 0xb7, 0x61, 0x09, 0x03, 0x31, 0xb0,
+  0x2e, 0xcc, 0x1b, 0xc6, 0x20, 0x0c, 0xae, 0x32, 0xd8, 0x30, 0xa4, 0x81,
+  0x1a, 0xac, 0xc1, 0x86, 0xe1, 0x0c, 0xd8, 0x00, 0xd8, 0x50, 0x4c, 0x54,
+  0x1b, 0x40, 0x40, 0x15, 0x36, 0x36, 0xbb, 0x36, 0x97, 0x34, 0xb2, 0x32,
+  0x37, 0xba, 0x29, 0x41, 0x50, 0x85, 0x0c, 0xcf, 0xc5, 0xae, 0x4c, 0x6e,
+  0x2e, 0xed, 0xcd, 0x6d, 0x4a, 0x40, 0x34, 0x21, 0xc3, 0x73, 0xb1, 0x0b,
+  0x63, 0xb3, 0x2b, 0x93, 0x9b, 0x12, 0x18, 0x75, 0xc8, 0xf0, 0x5c, 0xe6,
+  0xd0, 0xc2, 0xc8, 0xca, 0xe4, 0x9a, 0xde, 0xc8, 0xca, 0xd8, 0xa6, 0x04,
+  0x49, 0x19, 0x32, 0x3c, 0x17, 0xb9, 0xb2, 0xb9, 0xb7, 0x3a, 0xb9, 0xb1,
+  0xb2, 0xb9, 0x29, 0xc1, 0x53, 0x87, 0x0c, 0xcf, 0xc5, 0x2e, 0xad, 0xec,
+  0x2e, 0x89, 0x6c, 0x8a, 0x2e, 0x8c, 0xae, 0x6c, 0x4a, 0x10, 0xd5, 0x21,
+  0xc3, 0x73, 0x29, 0x73, 0xa3, 0x93, 0xcb, 0x83, 0x7a, 0x4b, 0x73, 0xa3,
+  0x9b, 0x9b, 0x12, 0xb4, 0x01, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00,
   0x4c, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66,
   0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07,
   0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10,
@@ -413,176 +542,51 @@ const unsigned char g_mainAdvanced[] = {
   0x50, 0x93, 0x5f, 0xdc, 0xb6, 0x11, 0x48, 0xc3, 0xe5, 0x3b, 0x8f, 0x3f,
   0x11, 0xd1, 0x84, 0x00, 0x11, 0xe6, 0x17, 0xb7, 0x6d, 0x00, 0x0c, 0x03,
   0x20, 0x8d, 0x36, 0x54, 0x40, 0x23, 0x10, 0x03, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x48, 0x41, 0x53, 0x48, 0x14, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0xd7, 0xbc, 0xf2, 0x0f, 0x2a, 0x5d, 0xb2, 0x1d,
-  0x5b, 0xa8, 0x10, 0xd8, 0x99, 0x83, 0xd7, 0xfd, 0x44, 0x58, 0x49, 0x4c,
-  0xe8, 0x07, 0x00, 0x00, 0x60, 0x00, 0x01, 0x00, 0xfa, 0x01, 0x00, 0x00,
-  0x44, 0x58, 0x49, 0x4c, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
-  0xd0, 0x07, 0x00, 0x00, 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00,
-  0xf1, 0x01, 0x00, 0x00, 0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00,
-  0x13, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49,
-  0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19,
-  0x1e, 0x04, 0x8b, 0x62, 0x80, 0x14, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42,
-  0xa4, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18, 0x4b, 0x0a, 0x32, 0x52, 0x88,
-  0x48, 0x90, 0x14, 0x20, 0x43, 0x46, 0x88, 0xa5, 0x00, 0x19, 0x32, 0x42,
-  0xe4, 0x48, 0x0e, 0x90, 0x91, 0x22, 0xc4, 0x50, 0x41, 0x51, 0x81, 0x8c,
-  0xe1, 0x83, 0xe5, 0x8a, 0x04, 0x29, 0x46, 0x06, 0x51, 0x18, 0x00, 0x00,
-  0x08, 0x00, 0x00, 0x00, 0x1b, 0x8c, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x07,
-  0x40, 0x02, 0xa8, 0x0d, 0x84, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x03, 0x20,
-  0x6d, 0x30, 0x86, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x09, 0xa8, 0x00,
-  0x49, 0x18, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x13, 0x82, 0x60, 0x42,
-  0x20, 0x4c, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00, 0x89, 0x20, 0x00, 0x00,
-  0x26, 0x00, 0x00, 0x00, 0x32, 0x22, 0x48, 0x09, 0x20, 0x64, 0x85, 0x04,
-  0x93, 0x22, 0xa4, 0x84, 0x04, 0x93, 0x22, 0xe3, 0x84, 0xa1, 0x90, 0x14,
-  0x12, 0x4c, 0x8a, 0x8c, 0x0b, 0x84, 0xa4, 0x4c, 0x10, 0x68, 0x23, 0x00,
-  0x25, 0x00, 0x14, 0x66, 0x00, 0xe6, 0x08, 0xc0, 0x60, 0x8e, 0x00, 0x29,
-  0xc6, 0x20, 0x84, 0x14, 0x42, 0xa6, 0x18, 0x80, 0x10, 0x52, 0x06, 0xa1,
-  0xa3, 0x86, 0xcb, 0x9f, 0xb0, 0x87, 0x90, 0x7c, 0x6e, 0xa3, 0x8a, 0x95,
-  0x98, 0xfc, 0xe2, 0xb6, 0x11, 0x31, 0xc6, 0x18, 0x54, 0xee, 0x19, 0x2e,
-  0x7f, 0xc2, 0x1e, 0x42, 0xf2, 0x43, 0xa0, 0x19, 0x16, 0x02, 0x05, 0xab,
-  0x10, 0x8a, 0x30, 0x42, 0xad, 0x14, 0x83, 0x8c, 0x31, 0xe8, 0xcd, 0x11,
-  0x04, 0xc5, 0x60, 0xa4, 0x10, 0x12, 0x49, 0x0e, 0x04, 0x0c, 0x23, 0x10,
-  0x43, 0x12, 0xd4, 0x03, 0x83, 0xc3, 0x91, 0xa6, 0x05, 0xc0, 0x1c, 0x6a,
-  0xf2, 0x5f, 0x22, 0x9a, 0x88, 0x8b, 0x3d, 0x80, 0x81, 0x88, 0x38, 0xa7,
-  0x91, 0x26, 0xa0, 0x99, 0x24, 0x14, 0x58, 0xba, 0xe9, 0x40, 0x00, 0x00,
-  0x13, 0x14, 0x72, 0xc0, 0x87, 0x74, 0x60, 0x87, 0x36, 0x68, 0x87, 0x79,
-  0x68, 0x03, 0x72, 0xc0, 0x87, 0x0d, 0xaf, 0x50, 0x0e, 0x6d, 0xd0, 0x0e,
-  0x7a, 0x50, 0x0e, 0x6d, 0x00, 0x0f, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07,
-  0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0xa0, 0x07, 0x73, 0x20, 0x07,
-  0x6d, 0x90, 0x0e, 0x78, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e,
-  0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe9, 0x30, 0x07,
-  0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x76, 0x40, 0x07,
-  0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe6, 0x10, 0x07, 0x76, 0xa0, 0x07,
-  0x73, 0x20, 0x07, 0x6d, 0x60, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07,
-  0x72, 0xd0, 0x06, 0xe6, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07,
-  0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07,
-  0x72, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x43, 0x9e, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x3c, 0x06, 0x10, 0x00,
-  0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x79, 0x10, 0x20,
-  0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xf2, 0x34,
-  0x40, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xe4,
-  0x79, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60,
-  0xc8, 0x23, 0x01, 0x01, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x40, 0x16, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x14,
-  0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0x22,
-  0x25, 0x30, 0x02, 0x50, 0x0e, 0xc5, 0x50, 0x80, 0x01, 0x65, 0x50, 0x04,
-  0xe5, 0x41, 0xa5, 0x24, 0x46, 0x00, 0xca, 0xa0, 0x08, 0x0a, 0x81, 0xf0,
-  0x0c, 0x00, 0xe5, 0xb1, 0x1c, 0x86, 0x79, 0x9e, 0x07, 0x80, 0xc0, 0x00,
-  0x00, 0x40, 0x04, 0x84, 0x40, 0x30, 0x00, 0x41, 0x01, 0x00, 0x00, 0x00,
-  0x79, 0x18, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x90,
-  0x46, 0x02, 0x13, 0x44, 0x8f, 0x0c, 0x6f, 0xec, 0xed, 0x4d, 0x0c, 0x24,
-  0xc6, 0xe5, 0xc6, 0x45, 0x66, 0x06, 0x06, 0xc7, 0x25, 0xc6, 0x06, 0x04,
-  0xa5, 0x46, 0x86, 0x2c, 0x2c, 0xe6, 0xa6, 0x4c, 0x26, 0x27, 0x65, 0x43,
-  0x10, 0x4c, 0x10, 0x08, 0x63, 0x82, 0x40, 0x1c, 0x1b, 0x84, 0x81, 0x98,
-  0x20, 0x10, 0xc8, 0x06, 0x61, 0x30, 0x28, 0xd8, 0xcd, 0x4d, 0x10, 0x88,
-  0x64, 0xc3, 0x80, 0x24, 0xc4, 0x04, 0x01, 0x9b, 0x08, 0x4c, 0x10, 0x08,
-  0x65, 0x03, 0x42, 0x2c, 0x0c, 0x41, 0x0c, 0x0d, 0xb0, 0x21, 0x70, 0x36,
-  0x10, 0x00, 0xf0, 0x00, 0x13, 0x84, 0x8c, 0xda, 0x10, 0x44, 0x13, 0x04,
-  0x01, 0x20, 0xd3, 0x16, 0x96, 0xe6, 0x16, 0x44, 0x66, 0x17, 0xe6, 0x36,
-  0x56, 0x46, 0x46, 0x04, 0xea, 0x69, 0x2a, 0x89, 0x2a, 0xe9, 0xc9, 0x69,
-  0x82, 0x50, 0x38, 0x13, 0x84, 0xe2, 0xd9, 0x10, 0x10, 0x13, 0x84, 0x02,
-  0x9a, 0x20, 0x10, 0xcb, 0x06, 0x41, 0x33, 0x36, 0x2c, 0x44, 0x65, 0x5d,
-  0xd8, 0x35, 0x64, 0xc4, 0xb5, 0x11, 0xa1, 0x2a, 0xc2, 0x1a, 0x7a, 0x7a,
-  0x92, 0x22, 0x9a, 0x20, 0x14, 0xd1, 0x06, 0x41, 0xd3, 0x36, 0x2c, 0x43,
-  0x67, 0x5d, 0xd8, 0x35, 0x78, 0xc3, 0xf5, 0x4d, 0x10, 0x08, 0x86, 0xc5,
-  0xd0, 0x13, 0xd3, 0x93, 0xd4, 0x04, 0xa1, 0x90, 0x26, 0x08, 0x44, 0xb3,
-  0x41, 0xd0, 0xc8, 0x60, 0xc3, 0x12, 0x06, 0x62, 0x60, 0x5d, 0xd8, 0x35,
-  0x8c, 0x41, 0x18, 0x5c, 0x65, 0xb0, 0x61, 0xe0, 0xc0, 0xc0, 0x0c, 0xb8,
-  0x4c, 0x59, 0x7d, 0x41, 0xbd, 0xcd, 0xa5, 0xd1, 0xa5, 0xbd, 0xb9, 0x6d,
-  0x58, 0x08, 0x34, 0xb0, 0x32, 0x6c, 0x0c, 0x86, 0x31, 0x20, 0xae, 0x32,
-  0xd8, 0xb0, 0x0c, 0x9d, 0x75, 0x61, 0xde, 0xe0, 0x0d, 0xd7, 0xb7, 0x61,
-  0x09, 0x03, 0x31, 0xb0, 0x2e, 0xcc, 0x1b, 0xc6, 0x20, 0x0c, 0xae, 0x32,
-  0xd8, 0x30, 0xa4, 0x81, 0x1a, 0xac, 0xc1, 0x86, 0xe1, 0x0c, 0xd8, 0x00,
-  0xd8, 0x50, 0x4c, 0x54, 0x1b, 0x40, 0x40, 0x15, 0x36, 0x36, 0xbb, 0x36,
-  0x97, 0x34, 0xb2, 0x32, 0x37, 0xba, 0x29, 0x41, 0x50, 0x85, 0x0c, 0xcf,
-  0xc5, 0xae, 0x4c, 0x6e, 0x2e, 0xed, 0xcd, 0x6d, 0x4a, 0x40, 0x34, 0x21,
-  0xc3, 0x73, 0xb1, 0x0b, 0x63, 0xb3, 0x2b, 0x93, 0x9b, 0x12, 0x18, 0x75,
-  0xc8, 0xf0, 0x5c, 0xe6, 0xd0, 0xc2, 0xc8, 0xca, 0xe4, 0x9a, 0xde, 0xc8,
-  0xca, 0xd8, 0xa6, 0x04, 0x49, 0x19, 0x32, 0x3c, 0x17, 0xb9, 0xb2, 0xb9,
-  0xb7, 0x3a, 0xb9, 0xb1, 0xb2, 0xb9, 0x29, 0xc1, 0x53, 0x87, 0x0c, 0xcf,
-  0xc5, 0x2e, 0xad, 0xec, 0x2e, 0x89, 0x6c, 0x8a, 0x2e, 0x8c, 0xae, 0x6c,
-  0x4a, 0x10, 0xd5, 0x21, 0xc3, 0x73, 0x29, 0x73, 0xa3, 0x93, 0xcb, 0x83,
-  0x7a, 0x4b, 0x73, 0xa3, 0x9b, 0x9b, 0x12, 0xb4, 0x01, 0x00, 0x00, 0x00,
-  0x79, 0x18, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c,
-  0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3,
-  0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6,
-  0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e,
-  0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43,
-  0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03,
-  0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48,
-  0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20,
-  0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e,
-  0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d,
-  0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89,
-  0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83,
-  0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68,
-  0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90,
-  0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78,
-  0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98,
-  0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5,
-  0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c,
-  0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c,
-  0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43,
-  0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43,
-  0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82,
-  0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x8c, 0xc8, 0x21, 0x07, 0x7c, 0x70,
-  0x03, 0x72, 0x10, 0x87, 0x73, 0x70, 0x03, 0x7b, 0x08, 0x07, 0x79, 0x60,
-  0x87, 0x70, 0xc8, 0x87, 0x77, 0xa8, 0x07, 0x7a, 0x98, 0x81, 0x3c, 0xe4,
-  0x80, 0x0f, 0x6e, 0x40, 0x0f, 0xe5, 0xd0, 0x0e, 0xf0, 0x00, 0x00, 0x00,
-  0x71, 0x20, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x36, 0xb0, 0x0d, 0x97,
-  0xef, 0x3c, 0xbe, 0x10, 0x50, 0x45, 0x41, 0x44, 0xa5, 0x03, 0x0c, 0x25,
-  0x61, 0x00, 0x02, 0xe6, 0x17, 0xb7, 0x6d, 0x05, 0xd2, 0x70, 0xf9, 0xce,
-  0xe3, 0x0b, 0x11, 0x01, 0x4c, 0x44, 0x08, 0x34, 0xc3, 0x42, 0x58, 0xc0,
-  0x34, 0x5c, 0xbe, 0xf3, 0xf8, 0x8b, 0x03, 0x0c, 0x62, 0xf3, 0x50, 0x93,
-  0x5f, 0xdc, 0xb6, 0x09, 0x54, 0xc3, 0xe5, 0x3b, 0x8f, 0x2f, 0x4d, 0x4e,
-  0x44, 0xa0, 0xd4, 0xf4, 0x50, 0x93, 0x5f, 0xdc, 0xb6, 0x11, 0x48, 0xc3,
-  0xe5, 0x3b, 0x8f, 0x3f, 0x11, 0xd1, 0x84, 0x00, 0x11, 0xe6, 0x17, 0xb7,
-  0x6d, 0x00, 0x0c, 0x03, 0x20, 0x8d, 0x36, 0x54, 0x40, 0x23, 0x10, 0x03,
-  0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00,
-  0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
-  0x44, 0x4a, 0xa1, 0x10, 0x66, 0x00, 0x8a, 0xab, 0xec, 0x4a, 0x8e, 0x4a,
-  0x09, 0x50, 0x1c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x23, 0x06, 0x09, 0x00,
-  0x82, 0x60, 0x20, 0x61, 0x03, 0x63, 0x59, 0xc1, 0x88, 0x41, 0x02, 0x80,
-  0x20, 0x18, 0x18, 0x1d, 0x22, 0x5d, 0xcf, 0x31, 0x62, 0x90, 0x00, 0x20,
-  0x08, 0x06, 0x86, 0x97, 0x4c, 0x18, 0x81, 0x8c, 0x18, 0x24, 0x00, 0x08,
-  0x82, 0x81, 0xf1, 0x29, 0x54, 0xf6, 0x24, 0x23, 0x06, 0x09, 0x00, 0x82,
-  0x60, 0x60, 0x80, 0xc1, 0x52, 0x69, 0x91, 0x32, 0x62, 0x90, 0x00, 0x20,
-  0x08, 0x06, 0x46, 0x18, 0x30, 0xdc, 0x36, 0x2d, 0x23, 0x06, 0x09, 0x00,
-  0x82, 0x60, 0x60, 0x88, 0x41, 0xd3, 0x71, 0x08, 0x33, 0x62, 0x90, 0x00,
-  0x20, 0x08, 0x06, 0xc6, 0x18, 0x38, 0x5d, 0x57, 0x35, 0x23, 0x06, 0x09,
-  0x00, 0x82, 0x60, 0x60, 0x90, 0xc1, 0xe3, 0x79, 0x8a, 0x33, 0x62, 0x90,
-  0x00, 0x20, 0x08, 0x06, 0x46, 0x19, 0x40, 0xdf, 0x57, 0x3d, 0x23, 0x06,
-  0x07, 0x00, 0x82, 0x60, 0xd0, 0x90, 0x81, 0xa3, 0x80, 0xc1, 0x68, 0x42,
-  0x00, 0x8c, 0x26, 0x08, 0xc1, 0x68, 0xc2, 0x20, 0x8c, 0x26, 0x10, 0xc3,
-  0x88, 0xc1, 0x01, 0x80, 0x20, 0x18, 0x34, 0x69, 0x30, 0x3d, 0x66, 0x30,
-  0x9a, 0x10, 0x00, 0xa3, 0x09, 0x42, 0x30, 0x9a, 0x30, 0x08, 0xa3, 0x09,
-  0xc4, 0x30, 0x62, 0x70, 0x00, 0x20, 0x08, 0x06, 0x8d, 0x1b, 0x60, 0x54,
-  0x19, 0x8c, 0x26, 0x04, 0xc0, 0x68, 0x82, 0x10, 0x8c, 0x26, 0x0c, 0xc2,
-  0x68, 0x02, 0x31, 0x8c, 0x18, 0x1c, 0x00, 0x08, 0x82, 0x41, 0x33, 0x07,
-  0x5d, 0xb6, 0x06, 0xa3, 0x09, 0x01, 0x30, 0x9a, 0x20, 0x04, 0xa3, 0x09,
-  0x83, 0x30, 0x9a, 0x40, 0x0c, 0x36, 0x5d, 0xf2, 0x19, 0x31, 0x40, 0x00,
-  0x10, 0x04, 0x83, 0x07, 0x0f, 0xc8, 0xe0, 0x7a, 0x82, 0x11, 0x03, 0x04,
-  0x00, 0x41, 0x30, 0x78, 0xf2, 0xa0, 0x0c, 0xae, 0x25, 0xb0, 0xe0, 0x80,
-  0x8e, 0x59, 0x9b, 0x7c, 0x46, 0x0c, 0x10, 0x00, 0x04, 0xc1, 0xe0, 0xe1,
-  0x03, 0x34, 0xd8, 0xa4, 0x60, 0xc4, 0x00, 0x01, 0x40, 0x10, 0x0c, 0x9e,
-  0x3e, 0x48, 0x83, 0xcd, 0x09, 0x2c, 0x50, 0xa0, 0x63, 0xd9, 0x27, 0x9f,
-  0x11, 0x03, 0x04, 0x00, 0x41, 0x30, 0x78, 0x40, 0x81, 0x0d, 0xbe, 0x2a,
-  0x18, 0x31, 0x40, 0x00, 0x10, 0x04, 0x83, 0x27, 0x14, 0xda, 0xe0, 0x8b,
-  0x02, 0x0b, 0x1a, 0xe8, 0x18, 0x37, 0x06, 0xf2, 0x19, 0x31, 0x40, 0x00,
-  0x10, 0x04, 0x83, 0x87, 0x14, 0xe0, 0x60, 0x0c, 0xb0, 0x60, 0xc4, 0x00,
-  0x01, 0x40, 0x10, 0x0c, 0x9e, 0x52, 0x88, 0x83, 0x31, 0xa0, 0x02, 0x0b,
-  0x20, 0xe8, 0x8c, 0x18, 0x24, 0x00, 0x08, 0x82, 0x01, 0x92, 0x0a, 0x76,
-  0x40, 0x0a, 0xa4, 0xc0, 0x07, 0xcd, 0x88, 0x41, 0x02, 0x80, 0x20, 0x18,
-  0x20, 0xa9, 0x60, 0x07, 0xa4, 0x40, 0x0a, 0x70, 0x90, 0x8c, 0x18, 0x24,
-  0x00, 0x08, 0x82, 0x01, 0x92, 0x0a, 0x76, 0x40, 0x0a, 0xa4, 0xa0, 0x07,
-  0xc5, 0x88, 0x41, 0x02, 0x80, 0x20, 0x18, 0x20, 0xa9, 0x60, 0x07, 0xa4,
-  0x40, 0x0a, 0x7b, 0x10, 0x8c, 0x18, 0x24, 0x00, 0x08, 0x82, 0x01, 0x92,
-  0x0a, 0x76, 0x50, 0x0a, 0xa4, 0xc0, 0x07, 0x69, 0x30, 0x62, 0x90, 0x00,
-  0x20, 0x08, 0x06, 0x48, 0x2a, 0xd8, 0x41, 0x29, 0x90, 0x02, 0x1c, 0xa0,
-  0xc1, 0x88, 0x41, 0x02, 0x80, 0x20, 0x18, 0x20, 0xa9, 0x60, 0x07, 0x7f,
-  0x40, 0x0a, 0x7c, 0xd0, 0x06, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x80,
-  0xa4, 0x82, 0x1d, 0xfc, 0x01, 0x29, 0xc0, 0x01, 0x1b, 0x8c, 0x18, 0x24,
-  0x00, 0x08, 0x82, 0x01, 0x92, 0x0a, 0x76, 0xf0, 0x07, 0xa4, 0xa0, 0x07,
-  0x6b, 0x30, 0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0x48, 0x2a, 0xd8, 0xc1,
-  0x1f, 0x90, 0xc2, 0x1e, 0xa8, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00
+  0x61, 0x20, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, 0x2c,
+  0x10, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x44, 0x4a, 0xa1, 0x10,
+  0x66, 0x00, 0x8a, 0xab, 0xec, 0x4a, 0x8e, 0x4a, 0x09, 0x50, 0x1c, 0x01,
+  0x00, 0x00, 0x00, 0x00, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x20, 0x61,
+  0x03, 0x63, 0x59, 0xc1, 0x88, 0x41, 0x02, 0x80, 0x20, 0x18, 0x18, 0x1d,
+  0x22, 0x5d, 0xcf, 0x31, 0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0x86, 0x97,
+  0x4c, 0x18, 0x81, 0x8c, 0x18, 0x24, 0x00, 0x08, 0x82, 0x81, 0xf1, 0x29,
+  0x54, 0xf6, 0x24, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x60, 0x80, 0xc1,
+  0x52, 0x69, 0x91, 0x32, 0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0x46, 0x18,
+  0x30, 0xdc, 0x36, 0x2d, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x60, 0x88,
+  0x41, 0xd3, 0x71, 0x08, 0x33, 0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0xc6,
+  0x18, 0x38, 0x5d, 0x57, 0x35, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x60,
+  0x90, 0xc1, 0xe3, 0x79, 0x8a, 0x33, 0x62, 0x90, 0x00, 0x20, 0x08, 0x06,
+  0x46, 0x19, 0x40, 0xdf, 0x57, 0x3d, 0x23, 0x06, 0x07, 0x00, 0x82, 0x60,
+  0xd0, 0x90, 0x81, 0xa3, 0x80, 0xc1, 0x68, 0x42, 0x00, 0x8c, 0x26, 0x08,
+  0xc1, 0x68, 0xc2, 0x20, 0x8c, 0x26, 0x10, 0xc3, 0x88, 0xc1, 0x01, 0x80,
+  0x20, 0x18, 0x34, 0x69, 0x30, 0x3d, 0x66, 0x30, 0x9a, 0x10, 0x00, 0xa3,
+  0x09, 0x42, 0x30, 0x9a, 0x30, 0x08, 0xa3, 0x09, 0xc4, 0x30, 0x62, 0x70,
+  0x00, 0x20, 0x08, 0x06, 0x8d, 0x1b, 0x60, 0x54, 0x19, 0x8c, 0x26, 0x04,
+  0xc0, 0x68, 0x82, 0x10, 0x8c, 0x26, 0x0c, 0xc2, 0x68, 0x02, 0x31, 0x8c,
+  0x18, 0x1c, 0x00, 0x08, 0x82, 0x41, 0x33, 0x07, 0x5d, 0xb6, 0x06, 0xa3,
+  0x09, 0x01, 0x30, 0x9a, 0x20, 0x04, 0xa3, 0x09, 0x83, 0x30, 0x9a, 0x40,
+  0x0c, 0x36, 0x5d, 0xf2, 0x19, 0x31, 0x40, 0x00, 0x10, 0x04, 0x83, 0x07,
+  0x0f, 0xc8, 0xe0, 0x7a, 0x82, 0x11, 0x03, 0x04, 0x00, 0x41, 0x30, 0x78,
+  0xf2, 0xa0, 0x0c, 0xae, 0x25, 0xb0, 0xe0, 0x80, 0x8e, 0x59, 0x9b, 0x7c,
+  0x46, 0x0c, 0x10, 0x00, 0x04, 0xc1, 0xe0, 0xe1, 0x03, 0x34, 0xd8, 0xa4,
+  0x60, 0xc4, 0x00, 0x01, 0x40, 0x10, 0x0c, 0x9e, 0x3e, 0x48, 0x83, 0xcd,
+  0x09, 0x2c, 0x50, 0xa0, 0x63, 0xd9, 0x27, 0x9f, 0x11, 0x03, 0x04, 0x00,
+  0x41, 0x30, 0x78, 0x40, 0x81, 0x0d, 0xbe, 0x2a, 0x18, 0x31, 0x40, 0x00,
+  0x10, 0x04, 0x83, 0x27, 0x14, 0xda, 0xe0, 0x8b, 0x02, 0x0b, 0x1a, 0xe8,
+  0x18, 0x37, 0x06, 0xf2, 0x19, 0x31, 0x40, 0x00, 0x10, 0x04, 0x83, 0x87,
+  0x14, 0xe0, 0x60, 0x0c, 0xb0, 0x60, 0xc4, 0x00, 0x01, 0x40, 0x10, 0x0c,
+  0x9e, 0x52, 0x88, 0x83, 0x31, 0xa0, 0x02, 0x0b, 0x20, 0xe8, 0x8c, 0x18,
+  0x24, 0x00, 0x08, 0x82, 0x01, 0x92, 0x0a, 0x76, 0x40, 0x0a, 0xa4, 0xc0,
+  0x07, 0xcd, 0x88, 0x41, 0x02, 0x80, 0x20, 0x18, 0x20, 0xa9, 0x60, 0x07,
+  0xa4, 0x40, 0x0a, 0x70, 0x90, 0x8c, 0x18, 0x24, 0x00, 0x08, 0x82, 0x01,
+  0x92, 0x0a, 0x76, 0x40, 0x0a, 0xa4, 0xa0, 0x07, 0xc5, 0x88, 0x41, 0x02,
+  0x80, 0x20, 0x18, 0x20, 0xa9, 0x60, 0x07, 0xa4, 0x40, 0x0a, 0x7b, 0x10,
+  0x8c, 0x18, 0x24, 0x00, 0x08, 0x82, 0x01, 0x92, 0x0a, 0x76, 0x50, 0x0a,
+  0xa4, 0xc0, 0x07, 0x69, 0x30, 0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0x48,
+  0x2a, 0xd8, 0x41, 0x29, 0x90, 0x02, 0x1c, 0xa0, 0xc1, 0x88, 0x41, 0x02,
+  0x80, 0x20, 0x18, 0x20, 0xa9, 0x60, 0x07, 0x7f, 0x40, 0x0a, 0x7c, 0xd0,
+  0x06, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x80, 0xa4, 0x82, 0x1d, 0xfc,
+  0x01, 0x29, 0xc0, 0x01, 0x1b, 0x8c, 0x18, 0x24, 0x00, 0x08, 0x82, 0x01,
+  0x92, 0x0a, 0x76, 0xf0, 0x07, 0xa4, 0xa0, 0x07, 0x6b, 0x30, 0x62, 0x90,
+  0x00, 0x20, 0x08, 0x06, 0x48, 0x2a, 0xd8, 0xc1, 0x1f, 0x90, 0xc2, 0x1e,
+  0xa8, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00
 };

+ 175 - 67
src/render/direct3d12/SDL_render_d3d12.c

@@ -70,9 +70,11 @@ static const float TONEMAP_CHROME = 2;
 //static const float TEXTURETYPE_NONE = 0;
 static const float TEXTURETYPE_RGB = 1;
 static const float TEXTURETYPE_RGB_PIXELART = 2;
-static const float TEXTURETYPE_NV12 = 3;
-static const float TEXTURETYPE_NV21 = 4;
-static const float TEXTURETYPE_YUV = 5;
+static const float TEXTURETYPE_PALETTE = 3;
+static const float TEXTURETYPE_PALETTE_PIXELART = 4;
+static const float TEXTURETYPE_NV12 = 5;
+static const float TEXTURETYPE_NV21 = 6;
+static const float TEXTURETYPE_YUV = 7;
 
 static const float INPUTTYPE_UNSPECIFIED = 0;
 static const float INPUTTYPE_SRGB = 1;
@@ -117,6 +119,10 @@ typedef struct
     SIZE_T mainSRVIndex;
     D3D12_CPU_DESCRIPTOR_HANDLE mainTextureRenderTargetView;
     DXGI_FORMAT mainTextureFormat;
+    ID3D12Resource *paletteTexture;
+    D3D12_CPU_DESCRIPTOR_HANDLE paletteTextureResourceView;
+    D3D12_RESOURCE_STATES paletteResourceState;
+    SIZE_T paletteSRVIndex;
     ID3D12Resource *stagingBuffer;
     D3D12_RESOURCE_STATES stagingResourceState;
     const float *YCbCr_matrix;
@@ -237,8 +243,10 @@ typedef struct
     DXGI_MODE_ROTATION rotation;
     D3D12_TextureData *textureRenderTarget;
     D3D12_CPU_DESCRIPTOR_HANDLE currentRenderTargetView;
+    int numCurrentShaderResources;
     D3D12_CPU_DESCRIPTOR_HANDLE currentShaderResource;
-    D3D12_CPU_DESCRIPTOR_HANDLE currentSampler;
+    int numCurrentShaderSamplers;
+    D3D12_CPU_DESCRIPTOR_HANDLE currentShaderSampler;
     bool cliprectDirty;
     bool currentCliprectEnabled;
     SDL_Rect currentCliprect;
@@ -329,6 +337,7 @@ static DXGI_FORMAT SDLPixelFormatToDXGITextureFormat(Uint32 format, Uint32 outpu
             return DXGI_FORMAT_B8G8R8X8_UNORM_SRGB;
         }
         return DXGI_FORMAT_B8G8R8X8_UNORM;
+    case SDL_PIXELFORMAT_INDEX8:
     case SDL_PIXELFORMAT_YV12:
     case SDL_PIXELFORMAT_IYUV:
         return DXGI_FORMAT_R8_UNORM;
@@ -364,6 +373,7 @@ static DXGI_FORMAT SDLPixelFormatToDXGIMainResourceViewFormat(Uint32 format, Uin
             return DXGI_FORMAT_B8G8R8X8_UNORM_SRGB;
         }
         return DXGI_FORMAT_B8G8R8X8_UNORM;
+    case SDL_PIXELFORMAT_INDEX8:
     case SDL_PIXELFORMAT_YV12:
     case SDL_PIXELFORMAT_IYUV:
     case SDL_PIXELFORMAT_NV12: // For the Y texture
@@ -437,7 +447,10 @@ static void D3D12_ReleaseAll(SDL_Renderer *renderer)
         data->swapEffect = (DXGI_SWAP_EFFECT)0;
         data->swapFlags = 0;
         data->currentRenderTargetView.ptr = 0;
-        data->currentSampler.ptr = 0;
+        data->numCurrentShaderResources = 0;
+        data->currentShaderResource.ptr = 0;
+        data->numCurrentShaderSamplers = 0;
+        data->currentShaderSampler.ptr = 0;
 
 #if !defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES)
         // Check for any leaks if in debug mode
@@ -995,7 +1008,7 @@ static HRESULT D3D12_CreateDeviceResources(SDL_Renderer *renderer)
     data->srvDescriptorSize = ID3D12Device1_GetDescriptorHandleIncrementSize(d3dDevice, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);
 
     SDL_zero(descriptorHeapDesc);
-    descriptorHeapDesc.NumDescriptors = 4;
+    descriptorHeapDesc.NumDescriptors = SDL_arraysize(data->samplers);
     descriptorHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER;
     descriptorHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE;
     result = ID3D12Device1_CreateDescriptorHeap(data->d3dDevice,
@@ -1598,6 +1611,30 @@ static bool D3D12_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SD
     }
     textureData->mainResourceState = D3D12_RESOURCE_STATE_COPY_DEST;
     SDL_SetPointerProperty(SDL_GetTextureProperties(texture), SDL_PROP_TEXTURE_D3D12_TEXTURE_POINTER, textureData->mainTexture);
+
+    if (texture->format == SDL_PIXELFORMAT_INDEX8) {
+        textureDesc.Width = 256;
+        textureDesc.Height = 1;
+        if (renderer->output_colorspace == SDL_COLORSPACE_SRGB_LINEAR) {
+            textureDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM_SRGB;
+        } else {
+            textureDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
+        }
+
+        result = ID3D12Device1_CreateCommittedResource(rendererData->d3dDevice,
+                          &heapProps,
+                          D3D12_HEAP_FLAG_NONE,
+                          &textureDesc,
+                          D3D12_RESOURCE_STATE_COPY_DEST,
+                          NULL,
+                          D3D_GUID(SDL_IID_ID3D12Resource),
+                          (void **)&textureData->paletteTexture);
+        if (FAILED(result)) {
+            return WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D12Device::CreateCommittedResource [texture]"), result);
+        }
+        textureData->paletteResourceState = D3D12_RESOURCE_STATE_COPY_DEST;
+    }
+
 #ifdef SDL_HAVE_YUV
     if (texture->format == SDL_PIXELFORMAT_YV12 ||
         texture->format == SDL_PIXELFORMAT_IYUV) {
@@ -1677,14 +1714,28 @@ static bool D3D12_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SD
     resourceViewDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D;
     resourceViewDesc.Texture2D.MipLevels = textureDesc.MipLevels;
 
-    textureData->mainSRVIndex = D3D12_GetAvailableSRVIndex(renderer);
     D3D_CALL_RET(rendererData->srvDescriptorHeap, GetCPUDescriptorHandleForHeapStart, &textureData->mainTextureResourceView);
+    textureData->mainSRVIndex = D3D12_GetAvailableSRVIndex(renderer);
     textureData->mainTextureResourceView.ptr += textureData->mainSRVIndex * rendererData->srvDescriptorSize;
 
     ID3D12Device1_CreateShaderResourceView(rendererData->d3dDevice,
              textureData->mainTexture,
              &resourceViewDesc,
              textureData->mainTextureResourceView);
+
+    if (texture->format == SDL_PIXELFORMAT_INDEX8) {
+        resourceViewDesc.Format = textureDesc.Format;
+
+        D3D_CALL_RET(rendererData->srvDescriptorHeap, GetCPUDescriptorHandleForHeapStart, &textureData->paletteTextureResourceView);
+        textureData->paletteSRVIndex = D3D12_GetAvailableSRVIndex(renderer);
+        textureData->paletteTextureResourceView.ptr += textureData->paletteSRVIndex * rendererData->srvDescriptorSize;
+
+        ID3D12Device1_CreateShaderResourceView(rendererData->d3dDevice,
+                 textureData->paletteTexture,
+                 &resourceViewDesc,
+                 textureData->paletteTextureResourceView);
+    }
+
 #ifdef SDL_HAVE_YUV
     if (textureData->yuv) {
         D3D_CALL_RET(rendererData->srvDescriptorHeap, GetCPUDescriptorHandleForHeapStart, &textureData->mainTextureResourceViewU);
@@ -1760,6 +1811,10 @@ static void D3D12_DestroyTexture(SDL_Renderer *renderer,
     D3D_SAFE_RELEASE(textureData->mainTexture);
     D3D_SAFE_RELEASE(textureData->stagingBuffer);
     D3D12_FreeSRVIndex(renderer, textureData->mainSRVIndex);
+    if (texture->format == SDL_PIXELFORMAT_INDEX8) {
+        D3D_SAFE_RELEASE(textureData->paletteTexture);
+        D3D12_FreeSRVIndex(renderer, textureData->paletteSRVIndex);
+    }
 #ifdef SDL_HAVE_YUV
     D3D_SAFE_RELEASE(textureData->mainTextureU);
     D3D_SAFE_RELEASE(textureData->mainTextureV);
@@ -1914,6 +1969,19 @@ static bool D3D12_UpdateTextureInternal(D3D12_RenderData *rendererData, ID3D12Re
     return true;
 }
 
+static bool D3D12_UpdateTexturePalette(SDL_Renderer *renderer, SDL_Texture *texture)
+{
+    D3D12_RenderData *rendererData = (D3D12_RenderData *)renderer->internal;
+    D3D12_TextureData *textureData = (D3D12_TextureData *)texture->internal;
+    SDL_Palette *palette = texture->palette;
+
+    if (!textureData) {
+        return SDL_SetError("Texture is not currently available");
+    }
+
+    return D3D12_UpdateTextureInternal(rendererData, textureData->paletteTexture, 0, 0, 0, palette->ncolors, 1, palette->colors, palette->ncolors * sizeof(*palette->colors), &textureData->paletteResourceState);
+}
+
 static bool D3D12_UpdateTexture(SDL_Renderer *renderer, SDL_Texture *texture,
                                const SDL_Rect *rect, const void *srcPixels,
                                int srcPitch)
@@ -2495,6 +2563,18 @@ static void D3D12_SetupShaderConstants(SDL_Renderer *renderer, const SDL_RenderC
         D3D12_TextureData *textureData = (D3D12_TextureData *)texture->internal;
 
         switch (texture->format) {
+        case SDL_PIXELFORMAT_INDEX8:
+            if (cmd->data.draw.texture_scale_mode == SDL_SCALEMODE_PIXELART) {
+                constants->texture_type = TEXTURETYPE_PALETTE_PIXELART;
+                constants->texture_width = texture->w;
+                constants->texture_height = texture->h;
+                constants->texel_width = 1.0f / constants->texture_width;
+                constants->texel_height = 1.0f / constants->texture_height;
+            } else {
+                constants->texture_type = TEXTURETYPE_PALETTE;
+            }
+            constants->input_type = INPUTTYPE_UNSPECIFIED;
+            break;
         case SDL_PIXELFORMAT_YV12:
         case SDL_PIXELFORMAT_IYUV:
             constants->texture_type = TEXTURETYPE_YUV;
@@ -2570,22 +2650,32 @@ static D3D12_Shader SelectShader(const D3D12_PixelShaderConstants *shader_consta
 
 static bool D3D12_SetDrawState(SDL_Renderer *renderer, const SDL_RenderCommand *cmd, const D3D12_PixelShaderConstants *shader_constants,
                               D3D12_PRIMITIVE_TOPOLOGY_TYPE topology,
-                              const int numShaderResources, D3D12_CPU_DESCRIPTOR_HANDLE *shaderResources,
-                              D3D12_CPU_DESCRIPTOR_HANDLE *sampler, const Float4X4 *matrix)
+                              int numShaderResources, D3D12_CPU_DESCRIPTOR_HANDLE *shaderResources,
+                              int numShaderSamplers, D3D12_CPU_DESCRIPTOR_HANDLE *shaderSamplers)
 
 {
     D3D12_RenderData *rendererData = (D3D12_RenderData *)renderer->internal;
-    const Float4X4 *newmatrix = matrix ? matrix : &rendererData->identity;
     D3D12_CPU_DESCRIPTOR_HANDLE renderTargetView = D3D12_GetCurrentRenderTargetView(renderer);
     const SDL_BlendMode blendMode = cmd->data.draw.blend;
     bool updateSubresource = false;
     int i;
-    D3D12_CPU_DESCRIPTOR_HANDLE firstShaderResource;
     DXGI_FORMAT rtvFormat = rendererData->renderTargetFormat;
     D3D12_PipelineState *currentPipelineState = rendererData->currentPipelineState;
     D3D12_Shader shader = SelectShader(shader_constants);
     D3D12_PixelShaderConstants solid_constants;
 
+    bool shaderResourcesChanged = false;
+    if (numShaderResources != rendererData->numCurrentShaderResources ||
+        (numShaderResources > 0 && shaderResources[0].ptr != rendererData->currentShaderResource.ptr)) {
+        shaderResourcesChanged = true;
+    }
+
+    bool shaderSamplersChanged = false;
+    if (numShaderSamplers != rendererData->numCurrentShaderSamplers ||
+        (numShaderSamplers > 0 && shaderSamplers[0].ptr != rendererData->currentShaderSampler.ptr)) {
+        shaderSamplersChanged = true;
+    }
+
     if (rendererData->textureRenderTarget) {
         rtvFormat = rendererData->textureRenderTarget->mainTextureFormat;
     }
@@ -2630,8 +2720,8 @@ static bool D3D12_SetDrawState(SDL_Renderer *renderer, const SDL_RenderCommand *
                  rendererData->rootSignatures[D3D12_GetRootSignatureType(currentPipelineState->shader)]);
         // When we change these we will need to re-upload the constant buffer and reset any descriptors
         updateSubresource = true;
-        rendererData->currentSampler.ptr = 0;
-        rendererData->currentShaderResource.ptr = 0;
+        shaderResourcesChanged = true;
+        shaderSamplersChanged = true;
         rendererData->currentPipelineState = currentPipelineState;
     }
 
@@ -2657,41 +2747,51 @@ static bool D3D12_SetDrawState(SDL_Renderer *renderer, const SDL_RenderCommand *
         rendererData->cliprectDirty = false;
     }
 
-    if (numShaderResources > 0) {
-        firstShaderResource = shaderResources[0];
-    } else {
-        firstShaderResource.ptr = 0;
-    }
-    if (firstShaderResource.ptr != rendererData->currentShaderResource.ptr) {
+    if (shaderResourcesChanged) {
         for (i = 0; i < numShaderResources; ++i) {
             D3D12_GPU_DESCRIPTOR_HANDLE GPUHandle = D3D12_CPUtoGPUHandle(rendererData->srvDescriptorHeap, shaderResources[i]);
             ID3D12GraphicsCommandList2_SetGraphicsRootDescriptorTable(rendererData->commandList, i + 2, GPUHandle);
         }
-        rendererData->currentShaderResource.ptr = firstShaderResource.ptr;
+        rendererData->numCurrentShaderResources = numShaderResources;
+        if (numShaderResources > 0) {
+            rendererData->currentShaderResource.ptr = shaderResources[0].ptr;
+        }
     }
 
-    if (sampler && sampler->ptr != rendererData->currentSampler.ptr) {
-        D3D12_GPU_DESCRIPTOR_HANDLE GPUHandle = D3D12_CPUtoGPUHandle(rendererData->samplerDescriptorHeap, *sampler);
-        UINT tableIndex = 0;
+    if (shaderSamplersChanged) {
+        if (numShaderSamplers > 0) {
+            D3D12_GPU_DESCRIPTOR_HANDLE GPUHandle = D3D12_CPUtoGPUHandle(rendererData->samplerDescriptorHeap, shaderSamplers[0]);
+            UINT tableIndex = 0;
 
-        // Figure out the correct sampler descriptor table index based on the type of shader
-        switch (shader) {
-        case SHADER_RGB:
-            tableIndex = 3;
-            break;
-        case SHADER_ADVANCED:
-            tableIndex = 5;
-            break;
-        default:
-            return SDL_SetError("[direct3d12] Trying to set a sampler for a shader which doesn't have one");
-            break;
+            // Figure out the correct sampler descriptor table index based on the type of shader
+            switch (shader) {
+            case SHADER_RGB:
+                tableIndex = 3;
+                break;
+            case SHADER_ADVANCED:
+                tableIndex = 5;
+                break;
+            default:
+                return SDL_SetError("[direct3d12] Trying to set a sampler for a shader which doesn't have one");
+                break;
+            }
+
+            ID3D12GraphicsCommandList2_SetGraphicsRootDescriptorTable(rendererData->commandList, tableIndex, GPUHandle);
+        }
+
+        if (numShaderSamplers > 1) {
+            D3D12_GPU_DESCRIPTOR_HANDLE GPUHandle = D3D12_CPUtoGPUHandle(rendererData->samplerDescriptorHeap, shaderSamplers[1]);
+            UINT tableIndex = 6;
+            ID3D12GraphicsCommandList2_SetGraphicsRootDescriptorTable(rendererData->commandList, tableIndex, GPUHandle);
         }
 
-        ID3D12GraphicsCommandList2_SetGraphicsRootDescriptorTable(rendererData->commandList, tableIndex, GPUHandle);
-        rendererData->currentSampler = *sampler;
+        rendererData->numCurrentShaderSamplers = numShaderSamplers;
+        if (numShaderSamplers > 0) {
+            rendererData->currentShaderSampler.ptr = shaderSamplers[0].ptr;
+        }
     }
 
-    if (updateSubresource == true) {
+    if (updateSubresource) {
         D3D12_VertexShaderConstants vertex_constants;
         // Our model matrix is always identity
         vertex_constants.mpv = rendererData->projectionAndView;
@@ -2707,7 +2807,7 @@ static bool D3D12_SetDrawState(SDL_Renderer *renderer, const SDL_RenderCommand *
         shader_constants = &solid_constants;
     }
 
-    if (updateSubresource == true ||
+    if (updateSubresource ||
         SDL_memcmp(shader_constants, &currentPipelineState->shader_constants, sizeof(*shader_constants)) != 0) {
         ID3D12GraphicsCommandList2_SetGraphicsRoot32BitConstants(rendererData->commandList,
                  1,
@@ -2731,7 +2831,7 @@ static D3D12_CPU_DESCRIPTOR_HANDLE *D3D12_GetSamplerState(D3D12_RenderData *data
         samplerDesc.AddressW = D3D12_TEXTURE_ADDRESS_MODE_CLAMP;
         samplerDesc.MipLODBias = 0.0f;
         samplerDesc.MaxAnisotropy = 1;
-        samplerDesc.ComparisonFunc = D3D12_COMPARISON_FUNC_ALWAYS;
+        samplerDesc.ComparisonFunc = D3D12_COMPARISON_FUNC_NONE;
         samplerDesc.MinLOD = 0.0f;
         samplerDesc.MaxLOD = D3D12_FLOAT32_MAX;
         switch (scale_mode) {
@@ -2774,13 +2874,17 @@ static D3D12_CPU_DESCRIPTOR_HANDLE *D3D12_GetSamplerState(D3D12_RenderData *data
     return &data->samplers[key];
 }
 
-static bool D3D12_SetCopyState(SDL_Renderer *renderer, const SDL_RenderCommand *cmd, const Float4X4 *matrix)
+static bool D3D12_SetCopyState(SDL_Renderer *renderer, const SDL_RenderCommand *cmd)
 {
     SDL_Texture *texture = cmd->data.draw.texture;
     D3D12_RenderData *rendererData = (D3D12_RenderData *)renderer->internal;
     D3D12_TextureData *textureData = (D3D12_TextureData *)texture->internal;
     D3D12_CPU_DESCRIPTOR_HANDLE *textureSampler;
     D3D12_PixelShaderConstants constants;
+    int numShaderResources = 0;
+    D3D12_CPU_DESCRIPTOR_HANDLE shaderResources[3];
+    int numShaderSamplers = 0;
+    D3D12_CPU_DESCRIPTOR_HANDLE shaderSamplers[2];
 
     if (!textureData) {
         return SDL_SetError("Texture is not currently available");
@@ -2788,44 +2892,44 @@ static bool D3D12_SetCopyState(SDL_Renderer *renderer, const SDL_RenderCommand *
 
     D3D12_SetupShaderConstants(renderer, cmd, texture, &constants);
 
+    D3D12_TransitionResource(rendererData, textureData->mainTexture, textureData->mainResourceState, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE);
+    textureData->mainResourceState = D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE;
+    shaderResources[numShaderResources++] = textureData->mainTextureResourceView;
+
     textureSampler = D3D12_GetSamplerState(rendererData, cmd->data.draw.texture_scale_mode, cmd->data.draw.texture_address_mode_u, cmd->data.draw.texture_address_mode_v);
     if (!textureSampler) {
         return false;
     }
+    shaderSamplers[numShaderSamplers++] = *textureSampler;
 
-#ifdef SDL_HAVE_YUV
-    if (textureData->yuv) {
-        D3D12_CPU_DESCRIPTOR_HANDLE shaderResources[3];
+    if (texture->format == SDL_PIXELFORMAT_INDEX8) {
+        D3D12_TransitionResource(rendererData, textureData->paletteTexture, textureData->paletteResourceState, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE);
+        textureData->paletteResourceState = D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE;
+        shaderResources[numShaderResources++] = textureData->paletteTextureResourceView;
 
-        shaderResources[0] = textureData->mainTextureResourceView;
-        shaderResources[1] = textureData->mainTextureResourceViewU;
-        shaderResources[2] = textureData->mainTextureResourceViewV;
+        textureSampler = D3D12_GetSamplerState(rendererData, SDL_SCALEMODE_NEAREST, SDL_TEXTURE_ADDRESS_CLAMP, SDL_TEXTURE_ADDRESS_CLAMP);
+        if (!textureSampler) {
+            return false;
+        }
+        shaderSamplers[numShaderSamplers++] = *textureSampler;
+    }
 
-        // Make sure each texture is in the correct state to be accessed by the pixel shader.
-        D3D12_TransitionResource(rendererData, textureData->mainTexture, textureData->mainResourceState, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE);
-        textureData->mainResourceState = D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE;
+#ifdef SDL_HAVE_YUV
+    if (textureData->yuv) {
         D3D12_TransitionResource(rendererData, textureData->mainTextureU, textureData->mainResourceStateU, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE);
         textureData->mainResourceStateU = D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE;
+        shaderResources[numShaderResources++] = textureData->mainTextureResourceViewU;
+
         D3D12_TransitionResource(rendererData, textureData->mainTextureV, textureData->mainResourceStateV, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE);
         textureData->mainResourceStateV = D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE;
-
-        return D3D12_SetDrawState(renderer, cmd, &constants, D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE, SDL_arraysize(shaderResources), shaderResources, textureSampler, matrix);
+        shaderResources[numShaderResources++] = textureData->mainTextureResourceViewV;
     } else if (textureData->nv12) {
-        D3D12_CPU_DESCRIPTOR_HANDLE shaderResources[2];
-
-        shaderResources[0] = textureData->mainTextureResourceView;
-        shaderResources[1] = textureData->mainTextureResourceViewNV;
-
-        // Make sure each texture is in the correct state to be accessed by the pixel shader.
         D3D12_TransitionResource(rendererData, textureData->mainTexture, textureData->mainResourceState, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE);
         textureData->mainResourceState = D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE;
-
-        return D3D12_SetDrawState(renderer, cmd, &constants, D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE, SDL_arraysize(shaderResources), shaderResources, textureSampler, matrix);
+        shaderResources[numShaderResources++] = textureData->mainTextureResourceViewNV;
     }
 #endif // SDL_HAVE_YUV
-    D3D12_TransitionResource(rendererData, textureData->mainTexture, textureData->mainResourceState, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE);
-    textureData->mainResourceState = D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE;
-    return D3D12_SetDrawState(renderer, cmd, &constants, D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE, 1, &textureData->mainTextureResourceView, textureSampler, matrix);
+    return D3D12_SetDrawState(renderer, cmd, &constants, D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE, numShaderResources, shaderResources, numShaderSamplers, shaderSamplers);
 }
 
 static void D3D12_DrawPrimitives(SDL_Renderer *renderer, D3D12_PRIMITIVE_TOPOLOGY primitiveTopology, const size_t vertexStart, const size_t vertexCount)
@@ -2839,8 +2943,10 @@ static void D3D12_InvalidateCachedState(SDL_Renderer *renderer)
 {
     D3D12_RenderData *data = (D3D12_RenderData *)renderer->internal;
     data->currentRenderTargetView.ptr = 0;
+    data->numCurrentShaderResources = 0;
     data->currentShaderResource.ptr = 0;
-    data->currentSampler.ptr = 0;
+    data->numCurrentShaderSamplers = 0;
+    data->currentShaderSampler.ptr = 0;
     data->cliprectDirty = true;
     data->viewportDirty = true;
 }
@@ -2930,7 +3036,7 @@ static bool D3D12_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd
             const size_t count = cmd->data.draw.count;
             const size_t first = cmd->data.draw.first;
             const size_t start = first / sizeof(D3D12_VertexPositionColor);
-            D3D12_SetDrawState(renderer, cmd, NULL, D3D12_PRIMITIVE_TOPOLOGY_TYPE_POINT, 0, NULL, NULL, NULL);
+            D3D12_SetDrawState(renderer, cmd, NULL, D3D12_PRIMITIVE_TOPOLOGY_TYPE_POINT, 0, NULL, 0, NULL);
             D3D12_DrawPrimitives(renderer, D3D_PRIMITIVE_TOPOLOGY_POINTLIST, start, count);
             break;
         }
@@ -2941,7 +3047,7 @@ static bool D3D12_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd
             const size_t first = cmd->data.draw.first;
             const size_t start = first / sizeof(D3D12_VertexPositionColor);
             const D3D12_VertexPositionColor *verts = (D3D12_VertexPositionColor *)(((Uint8 *)vertices) + first);
-            D3D12_SetDrawState(renderer, cmd, NULL, D3D12_PRIMITIVE_TOPOLOGY_TYPE_LINE, 0, NULL, NULL, NULL);
+            D3D12_SetDrawState(renderer, cmd, NULL, D3D12_PRIMITIVE_TOPOLOGY_TYPE_LINE, 0, NULL, 0, NULL);
             D3D12_DrawPrimitives(renderer, D3D_PRIMITIVE_TOPOLOGY_LINESTRIP, start, count);
             if (verts[0].pos.x != verts[count - 1].pos.x || verts[0].pos.y != verts[count - 1].pos.y) {
                 D3D12_DrawPrimitives(renderer, D3D_PRIMITIVE_TOPOLOGY_POINTLIST, start + (count - 1), 1);
@@ -2966,9 +3072,9 @@ static bool D3D12_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd
             const size_t start = first / sizeof(D3D12_VertexPositionColor);
 
             if (texture) {
-                D3D12_SetCopyState(renderer, cmd, NULL);
+                D3D12_SetCopyState(renderer, cmd);
             } else {
-                D3D12_SetDrawState(renderer, cmd, NULL, D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE, 0, NULL, NULL, NULL);
+                D3D12_SetDrawState(renderer, cmd, NULL, D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE, 0, NULL, 0, NULL);
             }
 
             D3D12_DrawPrimitives(renderer, D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST, start, count);
@@ -3261,6 +3367,7 @@ bool D3D12_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_Proper
     renderer->WindowEvent = D3D12_WindowEvent;
     renderer->SupportsBlendMode = D3D12_SupportsBlendMode;
     renderer->CreateTexture = D3D12_CreateTexture;
+    renderer->UpdateTexturePalette = D3D12_UpdateTexturePalette;
     renderer->UpdateTexture = D3D12_UpdateTexture;
 #ifdef SDL_HAVE_YUV
     renderer->UpdateTextureYUV = D3D12_UpdateTextureYUV;
@@ -3290,6 +3397,7 @@ bool D3D12_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_Proper
     SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_XRGB8888);
     SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ABGR2101010);
     SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGBA64_FLOAT);
+    SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_INDEX8);
     SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_YV12);
     SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_IYUV);
     SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_NV12);

+ 80 - 4
src/render/gpu/SDL_render_gpu.c

@@ -89,6 +89,7 @@ typedef struct GPU_RenderData
 typedef struct GPU_TextureData
 {
     SDL_GPUTexture *texture;
+    SDL_GPUTexture *palette;
     SDL_GPUTextureFormat format;
     GPU_FragmentShaderID shader;
     void *pixels;
@@ -124,8 +125,11 @@ static bool GPU_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL_
     SDL_GPUTextureFormat format;
     SDL_GPUTextureUsageFlags usage = SDL_GPU_TEXTUREUSAGE_SAMPLER;
 
-    format = SDL_GetGPUTextureFormatFromPixelFormat(texture->format);
-
+    if (texture->format == SDL_PIXELFORMAT_INDEX8) {
+        format = SDL_GPU_TEXTUREFORMAT_R8_UNORM;
+    } else {
+        format = SDL_GetGPUTextureFormatFromPixelFormat(texture->format);
+    }
     if (format == SDL_GPU_TEXTUREFORMAT_INVALID) {
         return SDL_SetError("Texture format %s not supported by SDL_GPU",
                             SDL_GetPixelFormatName(texture->format));
@@ -180,6 +184,16 @@ static bool GPU_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL_
         return false;
     }
 
+    if (texture->format == SDL_PIXELFORMAT_INDEX8) {
+        tci.format = SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM;
+        tci.width = 256;
+        tci.height = 1;
+        data->palette = SDL_CreateGPUTexture(renderdata->device, &tci);
+        if (!data->palette) {
+            return false;
+        }
+    }
+
     SDL_PropertiesID props = SDL_GetTextureProperties(texture);
     SDL_SetPointerProperty(props, SDL_PROP_TEXTURE_GPU_TEXTURE_POINTER, data->texture);
 
@@ -192,6 +206,52 @@ static bool GPU_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL_
     return true;
 }
 
+static bool GPU_UpdateTexturePalette(SDL_Renderer *renderer, SDL_Texture *texture)
+{
+    GPU_RenderData *renderdata = (GPU_RenderData *)renderer->internal;
+    GPU_TextureData *data = (GPU_TextureData *)texture->internal;
+    SDL_Palette *palette = texture->palette;
+    const Uint32 data_size = palette->ncolors * sizeof(*palette->colors);
+
+    SDL_GPUTransferBufferCreateInfo tbci;
+    SDL_zero(tbci);
+    tbci.size = data_size;
+    tbci.usage = SDL_GPU_TRANSFERBUFFERUSAGE_UPLOAD;
+
+    SDL_GPUTransferBuffer *tbuf = SDL_CreateGPUTransferBuffer(renderdata->device, &tbci);
+    if (tbuf == NULL) {
+        return false;
+    }
+
+    Uint8 *output = SDL_MapGPUTransferBuffer(renderdata->device, tbuf, false);
+    SDL_memcpy(output, palette->colors, data_size);
+    SDL_UnmapGPUTransferBuffer(renderdata->device, tbuf);
+
+    SDL_GPUCommandBuffer *cbuf = renderdata->state.command_buffer;
+    SDL_GPUCopyPass *cpass = SDL_BeginGPUCopyPass(cbuf);
+
+    SDL_GPUTextureTransferInfo tex_src;
+    SDL_zero(tex_src);
+    tex_src.transfer_buffer = tbuf;
+    tex_src.rows_per_layer = 1;
+    tex_src.pixels_per_row = palette->ncolors;
+
+    SDL_GPUTextureRegion tex_dst;
+    SDL_zero(tex_dst);
+    tex_dst.texture = data->palette;
+    tex_dst.x = 0;
+    tex_dst.y = 0;
+    tex_dst.w = palette->ncolors;
+    tex_dst.h = 1;
+    tex_dst.d = 1;
+
+    SDL_UploadToGPUTexture(cpass, &tex_src, &tex_dst, false);
+    SDL_EndGPUCopyPass(cpass);
+    SDL_ReleaseGPUTransferBuffer(renderdata->device, tbuf);
+
+    return true;
+}
+
 static bool GPU_UpdateTexture(SDL_Renderer *renderer, SDL_Texture *texture,
                               const SDL_Rect *rect, const void *pixels, int pitch)
 {
@@ -539,7 +599,13 @@ static void Draw(
         SDL_Texture *texture = cmd->data.draw.texture;
         if (texture) {
             v_shader = VERT_SHADER_TRI_TEXTURE;
-            if (texture->format == SDL_PIXELFORMAT_RGBA32 || texture->format == SDL_PIXELFORMAT_BGRA32) {
+            if (texture->format == SDL_PIXELFORMAT_INDEX8) {
+                if (cmd->data.draw.texture_scale_mode == SDL_SCALEMODE_PIXELART) {
+                    f_shader = FRAG_SHADER_TEXTURE_PALETTE_PIXELART;
+                } else {
+                    f_shader = FRAG_SHADER_TEXTURE_PALETTE;
+                }
+            } else if (texture->format == SDL_PIXELFORMAT_RGBA32 || texture->format == SDL_PIXELFORMAT_BGRA32) {
                 if (cmd->data.draw.texture_scale_mode == SDL_SCALEMODE_PIXELART) {
                     f_shader = FRAG_SHADER_TEXTURE_RGBA_PIXELART;
                 } else {
@@ -589,12 +655,19 @@ static void Draw(
 
     Uint32 sampler_slot = 0;
     if (cmd->data.draw.texture) {
-        GPU_TextureData *tdata = (GPU_TextureData *)cmd->data.draw.texture->internal;
+        SDL_Texture *texture = cmd->data.draw.texture;
+        GPU_TextureData *tdata = (GPU_TextureData *)texture->internal;
         SDL_GPUTextureSamplerBinding sampler_bind;
         SDL_zero(sampler_bind);
         sampler_bind.sampler = GetSampler(data, cmd->data.draw.texture_scale_mode, cmd->data.draw.texture_address_mode_u, cmd->data.draw.texture_address_mode_v);
         sampler_bind.texture = tdata->texture;
         SDL_BindGPUFragmentSamplers(pass, sampler_slot++, &sampler_bind, 1);
+
+        if (texture->format == SDL_PIXELFORMAT_INDEX8) {
+            sampler_bind.sampler = GetSampler(data, SDL_SCALEMODE_NEAREST, SDL_TEXTURE_ADDRESS_CLAMP, SDL_TEXTURE_ADDRESS_CLAMP);
+            sampler_bind.texture = tdata->palette;
+            SDL_BindGPUFragmentSamplers(pass, sampler_slot++, &sampler_bind, 1);
+        }
     }
     if (custom_state) {
         if (custom_state->num_sampler_bindings > 0) {
@@ -1055,6 +1128,7 @@ static void GPU_DestroyTexture(SDL_Renderer *renderer, SDL_Texture *texture)
     }
 
     SDL_ReleaseGPUTexture(renderdata->device, data->texture);
+    SDL_ReleaseGPUTexture(renderdata->device, data->palette);
     SDL_free(data->pixels);
     SDL_free(data);
     texture->internal = NULL;
@@ -1169,6 +1243,7 @@ static bool GPU_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_P
 
     renderer->SupportsBlendMode = GPU_SupportsBlendMode;
     renderer->CreateTexture = GPU_CreateTexture;
+    renderer->UpdateTexturePalette = GPU_UpdateTexturePalette;
     renderer->UpdateTexture = GPU_UpdateTexture;
     renderer->LockTexture = GPU_LockTexture;
     renderer->UnlockTexture = GPU_UnlockTexture;
@@ -1256,6 +1331,7 @@ static bool GPU_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_P
     SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGBA32);
     SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_BGRX32);
     SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGBX32);
+    SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_INDEX8);
 
     SDL_SetNumberProperty(SDL_GetRendererProperties(renderer), SDL_PROP_RENDERER_MAX_TEXTURE_SIZE_NUMBER, 16384);
 

+ 14 - 0
src/render/gpu/SDL_shaders_gpu.c

@@ -111,6 +111,13 @@ static const GPU_ShaderSources frag_shader_sources[NUM_FRAG_SHADERS] = {
         SHADER_DXIL60(color_frag_dxil)
         SHADER_METAL(color_frag_msl)
     },
+    [FRAG_SHADER_TEXTURE_PALETTE] = {
+        .num_samplers = 2,
+        .num_uniform_buffers = 0,
+        SHADER_SPIRV(texture_palette_frag_spv)
+        SHADER_DXIL60(texture_palette_frag_dxil)
+        SHADER_METAL(texture_palette_frag_msl)
+    },
     [FRAG_SHADER_TEXTURE_RGB] = {
         .num_samplers = 1,
         .num_uniform_buffers = 0,
@@ -125,6 +132,13 @@ static const GPU_ShaderSources frag_shader_sources[NUM_FRAG_SHADERS] = {
         SHADER_DXIL60(texture_rgba_frag_dxil)
         SHADER_METAL(texture_rgba_frag_msl)
     },
+    [FRAG_SHADER_TEXTURE_PALETTE_PIXELART] = {
+        .num_samplers = 2,
+        .num_uniform_buffers = 1,
+        SHADER_SPIRV(texture_palette_pixelart_frag_spv)
+        SHADER_DXIL60(texture_palette_pixelart_frag_dxil)
+        SHADER_METAL(texture_palette_pixelart_frag_msl)
+    },
     [FRAG_SHADER_TEXTURE_RGB_PIXELART] = {
         .num_samplers = 1,
         .num_uniform_buffers = 1,

+ 2 - 0
src/render/gpu/SDL_shaders_gpu.h

@@ -40,8 +40,10 @@ typedef enum
 {
     FRAG_SHADER_INVALID = -1,
     FRAG_SHADER_COLOR,
+    FRAG_SHADER_TEXTURE_PALETTE,
     FRAG_SHADER_TEXTURE_RGB,
     FRAG_SHADER_TEXTURE_RGBA,
+    FRAG_SHADER_TEXTURE_PALETTE_PIXELART,
     FRAG_SHADER_TEXTURE_RGB_PIXELART,
     FRAG_SHADER_TEXTURE_RGBA_PIXELART,
     FRAG_SHADER_TEXTURE_CUSTOM,

+ 145 - 145
src/render/gpu/shaders/color.frag.dxil.h

@@ -1,9 +1,9 @@
 static const unsigned char color_frag_dxil[] = {
-  0x44, 0x58, 0x42, 0x43, 0x2e, 0x2e, 0xa9, 0x96, 0x45, 0xe1, 0xc0, 0xaa,
-  0xe2, 0x19, 0x19, 0xf0, 0x13, 0x89, 0x7b, 0xcc, 0x01, 0x00, 0x00, 0x00,
-  0x00, 0x0b, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00,
+  0x44, 0x58, 0x42, 0x43, 0x22, 0x83, 0x29, 0x5c, 0x68, 0x9b, 0xf1, 0x0d,
+  0x9d, 0x30, 0x30, 0x3c, 0x40, 0x0e, 0xef, 0x82, 0x01, 0x00, 0x00, 0x00,
+  0x04, 0x0b, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00,
   0x4c, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0xc4, 0x00, 0x00, 0x00,
-  0x58, 0x01, 0x00, 0x00, 0x08, 0x06, 0x00, 0x00, 0x24, 0x06, 0x00, 0x00,
+  0x58, 0x01, 0x00, 0x00, 0x0c, 0x06, 0x00, 0x00, 0x28, 0x06, 0x00, 0x00,
   0x53, 0x46, 0x49, 0x30, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x49, 0x53, 0x47, 0x31, 0x34, 0x00, 0x00, 0x00,
   0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -28,10 +28,10 @@ static const unsigned char color_frag_dxil[] = {
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x44, 0x10,
   0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
   0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x53, 0x54, 0x41, 0x54,
-  0xa8, 0x04, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x2a, 0x01, 0x00, 0x00,
+  0xac, 0x04, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x2b, 0x01, 0x00, 0x00,
   0x44, 0x58, 0x49, 0x4c, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
-  0x90, 0x04, 0x00, 0x00, 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00,
-  0x21, 0x01, 0x00, 0x00, 0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00,
+  0x94, 0x04, 0x00, 0x00, 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00,
+  0x22, 0x01, 0x00, 0x00, 0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00,
   0x13, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49,
   0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19,
   0x1e, 0x04, 0x8b, 0x62, 0x80, 0x10, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42,
@@ -67,131 +67,36 @@ static const unsigned char color_frag_dxil[] = {
   0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0xa2,
   0x12, 0x18, 0x01, 0x28, 0x86, 0x32, 0x28, 0x8f, 0x92, 0x28, 0x04, 0xaa,
   0x92, 0x18, 0x01, 0x28, 0x82, 0x42, 0x28, 0x10, 0xda, 0xb1, 0x0c, 0x82,
-  0x08, 0x04, 0x02, 0x01, 0x79, 0x18, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00,
-  0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0xc4, 0x8e, 0x0c, 0x6f, 0xec,
-  0xed, 0x4d, 0x0c, 0x24, 0xc6, 0x05, 0xc7, 0x45, 0xa6, 0x06, 0x46, 0xc6,
-  0x05, 0x07, 0x04, 0x45, 0x8c, 0xe6, 0x26, 0x26, 0x06, 0x67, 0x26, 0xa7,
-  0x2c, 0x65, 0x43, 0x10, 0x4c, 0x10, 0x88, 0x61, 0x82, 0x40, 0x10, 0x1b,
-  0x84, 0x81, 0xd8, 0x20, 0x10, 0x04, 0x05, 0xb8, 0xb9, 0x09, 0x02, 0x51,
-  0x6c, 0x18, 0x0e, 0x84, 0x98, 0x20, 0x08, 0xc0, 0x06, 0x60, 0xc3, 0x40,
-  0x2c, 0xcb, 0x86, 0x80, 0xd9, 0x30, 0x0c, 0x4a, 0x33, 0x41, 0x58, 0x9e,
-  0x0d, 0xc1, 0x43, 0xa2, 0x2d, 0x2c, 0xcd, 0x8d, 0x08, 0x55, 0x11, 0xd6,
-  0xd0, 0xd3, 0x93, 0x14, 0xd1, 0x04, 0xa1, 0x50, 0x26, 0x08, 0xc5, 0xb2,
-  0x21, 0x20, 0x26, 0x08, 0x05, 0x33, 0x41, 0x28, 0x9a, 0x09, 0x02, 0x61,
-  0x4c, 0x10, 0x88, 0x63, 0x83, 0x80, 0x65, 0x1b, 0x16, 0x42, 0x9a, 0xa8,
-  0xca, 0x1a, 0x2e, 0x82, 0xd2, 0x36, 0x04, 0x1b, 0x93, 0x29, 0xab, 0x2f,
-  0xaa, 0x30, 0xb9, 0xb3, 0x32, 0xba, 0x09, 0x42, 0xe1, 0x6c, 0x58, 0x88,
-  0x6e, 0xf2, 0x2a, 0x6a, 0xb8, 0x08, 0x4a, 0xdb, 0x10, 0x7c, 0x1b, 0x06,
-  0x0e, 0x0c, 0x80, 0x0d, 0x85, 0x12, 0x85, 0x01, 0x00, 0xb0, 0x48, 0x73,
-  0x9b, 0xa3, 0x9b, 0x9b, 0x20, 0x10, 0x08, 0x8d, 0xb9, 0xb4, 0xb3, 0x2f,
-  0x36, 0xb2, 0x09, 0x02, 0x91, 0xd0, 0x98, 0x4b, 0x3b, 0xfb, 0x9a, 0xa3,
-  0xdb, 0x60, 0x8c, 0x01, 0x19, 0x94, 0x81, 0x19, 0x9c, 0x81, 0x19, 0x54,
-  0x61, 0x63, 0xb3, 0x6b, 0x73, 0x49, 0x23, 0x2b, 0x73, 0xa3, 0x9b, 0x12,
-  0x04, 0x55, 0xc8, 0xf0, 0x5c, 0xec, 0xca, 0xe4, 0xe6, 0xd2, 0xde, 0xdc,
-  0xa6, 0x04, 0x44, 0x13, 0x32, 0x3c, 0x17, 0xbb, 0x30, 0x36, 0xbb, 0x32,
-  0xb9, 0x29, 0x41, 0x51, 0x87, 0x0c, 0xcf, 0x65, 0x0e, 0x2d, 0x8c, 0xac,
-  0x4c, 0xae, 0xe9, 0x8d, 0xac, 0x8c, 0x6d, 0x4a, 0x80, 0x54, 0x22, 0xc3,
-  0x73, 0xa1, 0xcb, 0x83, 0x2b, 0x0b, 0x72, 0x73, 0x7b, 0xa3, 0x0b, 0xa3,
-  0x4b, 0x7b, 0x73, 0x9b, 0x9b, 0x12, 0x34, 0x75, 0xc8, 0xf0, 0x5c, 0xec,
-  0xd2, 0xca, 0xee, 0x92, 0xc8, 0xa6, 0xe8, 0xc2, 0xe8, 0xca, 0xa6, 0x04,
-  0x4f, 0x1d, 0x32, 0x3c, 0x97, 0x32, 0x37, 0x3a, 0xb9, 0x3c, 0xa8, 0xb7,
-  0x34, 0x37, 0xba, 0xb9, 0x29, 0x41, 0x18, 0x74, 0x21, 0xc3, 0x73, 0x19,
-  0x7b, 0xab, 0x73, 0xa3, 0x2b, 0x93, 0x9b, 0x9b, 0x12, 0x9c, 0x01, 0x00,
-  0x79, 0x18, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c,
-  0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3,
-  0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6,
-  0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e,
-  0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43,
-  0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03,
-  0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48,
-  0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20,
-  0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e,
-  0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d,
-  0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89,
-  0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83,
-  0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68,
-  0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90,
-  0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78,
-  0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98,
-  0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5,
-  0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c,
-  0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c,
-  0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43,
-  0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43,
-  0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82,
-  0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x8c, 0xc8, 0x21, 0x07, 0x7c, 0x70,
-  0x03, 0x72, 0x10, 0x87, 0x73, 0x70, 0x03, 0x7b, 0x08, 0x07, 0x79, 0x60,
-  0x87, 0x70, 0xc8, 0x87, 0x77, 0xa8, 0x07, 0x7a, 0x98, 0x81, 0x3c, 0xe4,
-  0x80, 0x0f, 0x6e, 0x40, 0x0f, 0xe5, 0xd0, 0x0e, 0xf0, 0x00, 0x00, 0x00,
-  0x71, 0x20, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x16, 0x30, 0x0d, 0x97,
-  0xef, 0x3c, 0xfe, 0xe2, 0x00, 0x83, 0xd8, 0x3c, 0xd4, 0xe4, 0x17, 0xb7,
-  0x6d, 0x02, 0xd5, 0x70, 0xf9, 0xce, 0xe3, 0x4b, 0x93, 0x13, 0x11, 0x28,
-  0x35, 0x3d, 0xd4, 0xe4, 0x17, 0xb7, 0x6d, 0x00, 0x04, 0x03, 0x20, 0x0d,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x41, 0x53, 0x48,
-  0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0xe3, 0x7f, 0x22,
-  0xb6, 0x5b, 0x10, 0xf4, 0xa4, 0x0f, 0xbe, 0x64, 0x48, 0x54, 0x5a, 0xc1,
-  0x44, 0x58, 0x49, 0x4c, 0xd4, 0x04, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
-  0x35, 0x01, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4c, 0x00, 0x01, 0x00, 0x00,
-  0x10, 0x00, 0x00, 0x00, 0xbc, 0x04, 0x00, 0x00, 0x42, 0x43, 0xc0, 0xde,
-  0x21, 0x0c, 0x00, 0x00, 0x2c, 0x01, 0x00, 0x00, 0x0b, 0x82, 0x20, 0x00,
-  0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, 0x91,
-  0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, 0x0c,
-  0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x10, 0x45, 0x02,
-  0x42, 0x92, 0x0b, 0x42, 0x84, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18, 0x4b,
-  0x0a, 0x32, 0x42, 0x88, 0x48, 0x90, 0x14, 0x20, 0x43, 0x46, 0x88, 0xa5,
-  0x00, 0x19, 0x32, 0x42, 0xe4, 0x48, 0x0e, 0x90, 0x11, 0x22, 0xc4, 0x50,
-  0x41, 0x51, 0x81, 0x8c, 0xe1, 0x83, 0xe5, 0x8a, 0x04, 0x21, 0x46, 0x06,
-  0x51, 0x18, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1b, 0x8c, 0xe0, 0xff,
-  0xff, 0xff, 0xff, 0x07, 0x40, 0x02, 0xa8, 0x0d, 0x84, 0xf0, 0xff, 0xff,
-  0xff, 0xff, 0x03, 0x20, 0x01, 0x00, 0x00, 0x00, 0x49, 0x18, 0x00, 0x00,
-  0x02, 0x00, 0x00, 0x00, 0x13, 0x82, 0x60, 0x42, 0x20, 0x00, 0x00, 0x00,
-  0x89, 0x20, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x32, 0x22, 0x08, 0x09,
-  0x20, 0x64, 0x85, 0x04, 0x13, 0x22, 0xa4, 0x84, 0x04, 0x13, 0x22, 0xe3,
-  0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x88, 0x8c, 0x0b, 0x84, 0x84, 0x4c,
-  0x10, 0x30, 0x23, 0x00, 0x25, 0x00, 0x8a, 0x19, 0x80, 0x39, 0x02, 0x30,
-  0x98, 0x23, 0x40, 0x8a, 0x31, 0x44, 0x54, 0x44, 0x56, 0x0c, 0x20, 0xa2,
-  0x1a, 0xc2, 0x81, 0x80, 0x34, 0x20, 0x00, 0x00, 0x13, 0x14, 0x72, 0xc0,
-  0x87, 0x74, 0x60, 0x87, 0x36, 0x68, 0x87, 0x79, 0x68, 0x03, 0x72, 0xc0,
-  0x87, 0x0d, 0xaf, 0x50, 0x0e, 0x6d, 0xd0, 0x0e, 0x7a, 0x50, 0x0e, 0x6d,
-  0x00, 0x0f, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d,
-  0x90, 0x0e, 0x71, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x78,
-  0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0x60, 0x07, 0x7a,
-  0x30, 0x07, 0x72, 0xd0, 0x06, 0xe9, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73,
-  0x20, 0x07, 0x6d, 0x90, 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74,
-  0xd0, 0x06, 0xe6, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d,
-  0x60, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe6,
-  0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0xe0, 0x0e, 0x78,
-  0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x76,
-  0x40, 0x07, 0x43, 0x9e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x86, 0x3c, 0x06, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x0c, 0x79, 0x10, 0x20, 0x00, 0x04, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x02, 0x01, 0x0b, 0x00, 0x00, 0x00,
-  0x32, 0x1e, 0x98, 0x10, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47,
-  0xc6, 0x04, 0x43, 0xa2, 0x12, 0x18, 0x01, 0x28, 0x88, 0x62, 0x28, 0x83,
-  0xf2, 0xa0, 0x2a, 0x89, 0x11, 0x80, 0x22, 0x28, 0x84, 0x02, 0xa1, 0x1d,
-  0xcb, 0x20, 0x88, 0x40, 0x20, 0x10, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00,
-  0x42, 0x00, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0xc4,
-  0x8e, 0x0c, 0x6f, 0xec, 0xed, 0x4d, 0x0c, 0x24, 0xc6, 0x05, 0xc7, 0x45,
-  0xa6, 0x06, 0x46, 0xc6, 0x05, 0x07, 0x04, 0x45, 0x8c, 0xe6, 0x26, 0x26,
-  0x06, 0x67, 0x26, 0xa7, 0x2c, 0x65, 0x43, 0x10, 0x4c, 0x10, 0x88, 0x61,
-  0x82, 0x40, 0x10, 0x1b, 0x84, 0x81, 0x98, 0x20, 0x10, 0xc5, 0x06, 0x61,
-  0x30, 0x28, 0xc0, 0xcd, 0x4d, 0x10, 0x08, 0x63, 0xc3, 0x80, 0x24, 0xc4,
-  0x04, 0x61, 0x71, 0x36, 0x04, 0xcb, 0x04, 0x41, 0x00, 0x48, 0xb4, 0x85,
-  0xa5, 0xb9, 0x11, 0xa1, 0x2a, 0xc2, 0x1a, 0x7a, 0x7a, 0x92, 0x22, 0x9a,
-  0x20, 0x14, 0xc9, 0x04, 0xa1, 0x50, 0x36, 0x04, 0xc4, 0x04, 0xa1, 0x58,
-  0x26, 0x08, 0x05, 0x33, 0x41, 0x20, 0x8e, 0x09, 0x02, 0x81, 0x6c, 0x10,
-  0x2a, 0x6b, 0xc3, 0x42, 0x3c, 0x50, 0x24, 0x4d, 0x03, 0x45, 0x44, 0xd7,
-  0x86, 0x00, 0x63, 0x32, 0x65, 0xf5, 0x45, 0x15, 0x26, 0x77, 0x56, 0x46,
-  0x37, 0x41, 0x28, 0x9a, 0x0d, 0x0b, 0xa1, 0x41, 0x9b, 0x14, 0x0d, 0x14,
-  0x11, 0x5d, 0x1b, 0x02, 0x6e, 0xc3, 0x90, 0x75, 0xc0, 0x86, 0xa2, 0x71,
-  0x3c, 0x00, 0xa8, 0xc2, 0xc6, 0x66, 0xd7, 0xe6, 0x92, 0x46, 0x56, 0xe6,
-  0x46, 0x37, 0x25, 0x08, 0xaa, 0x90, 0xe1, 0xb9, 0xd8, 0x95, 0xc9, 0xcd,
-  0xa5, 0xbd, 0xb9, 0x4d, 0x09, 0x88, 0x26, 0x64, 0x78, 0x2e, 0x76, 0x61,
-  0x6c, 0x76, 0x65, 0x72, 0x53, 0x02, 0xa3, 0x0e, 0x19, 0x9e, 0xcb, 0x1c,
-  0x5a, 0x18, 0x59, 0x99, 0x5c, 0xd3, 0x1b, 0x59, 0x19, 0xdb, 0x94, 0x20,
-  0xa9, 0x43, 0x86, 0xe7, 0x62, 0x97, 0x56, 0x76, 0x97, 0x44, 0x36, 0x45,
-  0x17, 0x46, 0x57, 0x36, 0x25, 0x58, 0xea, 0x90, 0xe1, 0xb9, 0x94, 0xb9,
-  0xd1, 0xc9, 0xe5, 0x41, 0xbd, 0xa5, 0xb9, 0xd1, 0xcd, 0x4d, 0x09, 0x3c,
+  0x08, 0x04, 0x02, 0x01, 0x79, 0x18, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00,
+  0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0x44, 0x8f, 0x0c, 0x6f, 0xec,
+  0xed, 0x4d, 0x0c, 0x24, 0xc6, 0x05, 0xc7, 0x45, 0xa6, 0x06, 0xa6, 0xc6,
+  0x45, 0x06, 0x07, 0x04, 0x25, 0xa7, 0xcc, 0x4c, 0x4c, 0xcc, 0x66, 0x6c,
+  0x46, 0x26, 0x65, 0x43, 0x10, 0x4c, 0x10, 0x88, 0x61, 0x82, 0x40, 0x10,
+  0x1b, 0x84, 0x81, 0xd8, 0x20, 0x10, 0x04, 0x05, 0xb8, 0xb9, 0x09, 0x02,
+  0x51, 0x6c, 0x18, 0x0e, 0x84, 0x98, 0x20, 0x08, 0xc0, 0x06, 0x60, 0xc3,
+  0x40, 0x2c, 0xcb, 0x86, 0x80, 0xd9, 0x30, 0x0c, 0x4a, 0x33, 0x41, 0x58,
+  0x9e, 0x0d, 0xc1, 0x43, 0xa2, 0x2d, 0x2c, 0xcd, 0x8d, 0x08, 0x55, 0x11,
+  0xd6, 0xd0, 0xd3, 0x93, 0x14, 0xd1, 0x04, 0xa1, 0x50, 0x26, 0x08, 0xc5,
+  0xb2, 0x21, 0x20, 0x26, 0x08, 0x05, 0x33, 0x41, 0x28, 0x9a, 0x09, 0x02,
+  0x61, 0x4c, 0x10, 0x88, 0x63, 0x83, 0x80, 0x65, 0x1b, 0x16, 0x42, 0x9a,
+  0xa8, 0xca, 0x1a, 0x2e, 0x82, 0xd2, 0x36, 0x04, 0x1b, 0x93, 0x29, 0xab,
+  0x2f, 0xaa, 0x30, 0xb9, 0xb3, 0x32, 0xba, 0x09, 0x42, 0xe1, 0x6c, 0x58,
+  0x88, 0x6e, 0xf2, 0x2a, 0x6a, 0xb8, 0x08, 0x4a, 0xdb, 0x10, 0x7c, 0x1b,
+  0x06, 0x0e, 0x0c, 0x80, 0x0d, 0x85, 0x12, 0x85, 0x01, 0x00, 0xb0, 0x48,
+  0x73, 0x9b, 0xa3, 0x9b, 0x9b, 0x20, 0x10, 0x08, 0x8d, 0xb9, 0xb4, 0xb3,
+  0x2f, 0x36, 0xb2, 0x09, 0x02, 0x91, 0xd0, 0x98, 0x4b, 0x3b, 0xfb, 0x9a,
+  0xa3, 0xdb, 0x60, 0x8c, 0x01, 0x19, 0x94, 0x81, 0x19, 0x9c, 0x81, 0x19,
+  0x54, 0x61, 0x63, 0xb3, 0x6b, 0x73, 0x49, 0x23, 0x2b, 0x73, 0xa3, 0x9b,
+  0x12, 0x04, 0x55, 0xc8, 0xf0, 0x5c, 0xec, 0xca, 0xe4, 0xe6, 0xd2, 0xde,
+  0xdc, 0xa6, 0x04, 0x44, 0x13, 0x32, 0x3c, 0x17, 0xbb, 0x30, 0x36, 0xbb,
+  0x32, 0xb9, 0x29, 0x41, 0x51, 0x87, 0x0c, 0xcf, 0x65, 0x0e, 0x2d, 0x8c,
+  0xac, 0x4c, 0xae, 0xe9, 0x8d, 0xac, 0x8c, 0x6d, 0x4a, 0x80, 0x54, 0x22,
+  0xc3, 0x73, 0xa1, 0xcb, 0x83, 0x2b, 0x0b, 0x72, 0x73, 0x7b, 0xa3, 0x0b,
+  0xa3, 0x4b, 0x7b, 0x73, 0x9b, 0x9b, 0x12, 0x34, 0x75, 0xc8, 0xf0, 0x5c,
+  0xec, 0xd2, 0xca, 0xee, 0x92, 0xc8, 0xa6, 0xe8, 0xc2, 0xe8, 0xca, 0xa6,
+  0x04, 0x4f, 0x1d, 0x32, 0x3c, 0x97, 0x32, 0x37, 0x3a, 0xb9, 0x3c, 0xa8,
+  0xb7, 0x34, 0x37, 0xba, 0xb9, 0x29, 0x41, 0x18, 0x74, 0x21, 0xc3, 0x73,
+  0x19, 0x7b, 0xab, 0x73, 0xa3, 0x2b, 0x93, 0x9b, 0x9b, 0x12, 0x9c, 0x01,
   0x00, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00,
   0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88,
   0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73,
@@ -222,17 +127,112 @@ static const unsigned char color_frag_dxil[] = {
   0x16, 0x30, 0x0d, 0x97, 0xef, 0x3c, 0xfe, 0xe2, 0x00, 0x83, 0xd8, 0x3c,
   0xd4, 0xe4, 0x17, 0xb7, 0x6d, 0x02, 0xd5, 0x70, 0xf9, 0xce, 0xe3, 0x4b,
   0x93, 0x13, 0x11, 0x28, 0x35, 0x3d, 0xd4, 0xe4, 0x17, 0xb7, 0x6d, 0x00,
-  0x04, 0x03, 0x20, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00,
-  0x1e, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, 0x00,
-  0x03, 0x00, 0x00, 0x00, 0x44, 0x85, 0x30, 0x03, 0x50, 0x0a, 0x54, 0x25,
-  0x50, 0x06, 0x00, 0x00, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x60, 0x4c,
-  0x05, 0x04, 0x29, 0xc4, 0x88, 0x41, 0x02, 0x80, 0x20, 0x18, 0x18, 0x94,
-  0x11, 0x45, 0x43, 0x31, 0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0x46, 0x75,
-  0x48, 0xd2, 0x62, 0x8c, 0x18, 0x24, 0x00, 0x08, 0x82, 0x81, 0x61, 0x21,
-  0xd3, 0x44, 0x1c, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x80, 0x58, 0x07,
-  0x45, 0x39, 0xc4, 0x88, 0x41, 0x02, 0x80, 0x20, 0x18, 0x20, 0xd6, 0x41,
-  0x51, 0xc6, 0x30, 0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0x88, 0x75, 0x50,
-  0x54, 0x23, 0x8c, 0x18, 0x24, 0x00, 0x08, 0x82, 0x01, 0x62, 0x1d, 0x14,
-  0x55, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00
+  0x04, 0x03, 0x20, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x48, 0x41, 0x53, 0x48, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x1c, 0x7c, 0xd7, 0x34, 0x1f, 0x6e, 0x13, 0xad, 0x41, 0x1b, 0x61, 0x87,
+  0x0c, 0x13, 0x10, 0xdc, 0x44, 0x58, 0x49, 0x4c, 0xd4, 0x04, 0x00, 0x00,
+  0x60, 0x00, 0x00, 0x00, 0x35, 0x01, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4c,
+  0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xbc, 0x04, 0x00, 0x00,
+  0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0x2c, 0x01, 0x00, 0x00,
+  0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00,
+  0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39,
+  0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62,
+  0x80, 0x10, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0x84, 0x10, 0x32, 0x14,
+  0x38, 0x08, 0x18, 0x4b, 0x0a, 0x32, 0x42, 0x88, 0x48, 0x90, 0x14, 0x20,
+  0x43, 0x46, 0x88, 0xa5, 0x00, 0x19, 0x32, 0x42, 0xe4, 0x48, 0x0e, 0x90,
+  0x11, 0x22, 0xc4, 0x50, 0x41, 0x51, 0x81, 0x8c, 0xe1, 0x83, 0xe5, 0x8a,
+  0x04, 0x21, 0x46, 0x06, 0x51, 0x18, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
+  0x1b, 0x8c, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x07, 0x40, 0x02, 0xa8, 0x0d,
+  0x84, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x03, 0x20, 0x01, 0x00, 0x00, 0x00,
+  0x49, 0x18, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x82, 0x60, 0x42,
+  0x20, 0x00, 0x00, 0x00, 0x89, 0x20, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
+  0x32, 0x22, 0x08, 0x09, 0x20, 0x64, 0x85, 0x04, 0x13, 0x22, 0xa4, 0x84,
+  0x04, 0x13, 0x22, 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x88, 0x8c,
+  0x0b, 0x84, 0x84, 0x4c, 0x10, 0x30, 0x23, 0x00, 0x25, 0x00, 0x8a, 0x19,
+  0x80, 0x39, 0x02, 0x30, 0x98, 0x23, 0x40, 0x8a, 0x31, 0x44, 0x54, 0x44,
+  0x56, 0x0c, 0x20, 0xa2, 0x1a, 0xc2, 0x81, 0x80, 0x34, 0x20, 0x00, 0x00,
+  0x13, 0x14, 0x72, 0xc0, 0x87, 0x74, 0x60, 0x87, 0x36, 0x68, 0x87, 0x79,
+  0x68, 0x03, 0x72, 0xc0, 0x87, 0x0d, 0xaf, 0x50, 0x0e, 0x6d, 0xd0, 0x0e,
+  0x7a, 0x50, 0x0e, 0x6d, 0x00, 0x0f, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07,
+  0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0xa0, 0x07, 0x73, 0x20, 0x07,
+  0x6d, 0x90, 0x0e, 0x78, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e,
+  0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe9, 0x30, 0x07,
+  0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x76, 0x40, 0x07,
+  0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe6, 0x10, 0x07, 0x76, 0xa0, 0x07,
+  0x73, 0x20, 0x07, 0x6d, 0x60, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07,
+  0x72, 0xd0, 0x06, 0xe6, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07,
+  0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07,
+  0x72, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x43, 0x9e, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x3c, 0x06, 0x10, 0x00,
+  0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x79, 0x10, 0x20,
+  0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x02, 0x01,
+  0x0b, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x10, 0x19, 0x11, 0x4c, 0x90,
+  0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0xa2, 0x12, 0x18, 0x01, 0x28,
+  0x89, 0x62, 0x28, 0x83, 0xf2, 0xa0, 0x2a, 0x89, 0x11, 0x80, 0x22, 0x28,
+  0x84, 0x02, 0xa1, 0x1d, 0xcb, 0x20, 0x88, 0x40, 0x20, 0x10, 0x00, 0x00,
+  0x79, 0x18, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x90,
+  0x46, 0x02, 0x13, 0x44, 0x8f, 0x0c, 0x6f, 0xec, 0xed, 0x4d, 0x0c, 0x24,
+  0xc6, 0x05, 0xc7, 0x45, 0xa6, 0x06, 0xa6, 0xc6, 0x45, 0x06, 0x07, 0x04,
+  0x25, 0xa7, 0xcc, 0x4c, 0x4c, 0xcc, 0x66, 0x6c, 0x46, 0x26, 0x65, 0x43,
+  0x10, 0x4c, 0x10, 0x88, 0x61, 0x82, 0x40, 0x10, 0x1b, 0x84, 0x81, 0x98,
+  0x20, 0x10, 0xc5, 0x06, 0x61, 0x30, 0x28, 0xc0, 0xcd, 0x4d, 0x10, 0x08,
+  0x63, 0xc3, 0x80, 0x24, 0xc4, 0x04, 0x61, 0x71, 0x36, 0x04, 0xcb, 0x04,
+  0x41, 0x00, 0x48, 0xb4, 0x85, 0xa5, 0xb9, 0x11, 0xa1, 0x2a, 0xc2, 0x1a,
+  0x7a, 0x7a, 0x92, 0x22, 0x9a, 0x20, 0x14, 0xc9, 0x04, 0xa1, 0x50, 0x36,
+  0x04, 0xc4, 0x04, 0xa1, 0x58, 0x26, 0x08, 0x05, 0x33, 0x41, 0x20, 0x8e,
+  0x09, 0x02, 0x81, 0x6c, 0x10, 0x2a, 0x6b, 0xc3, 0x42, 0x3c, 0x50, 0x24,
+  0x4d, 0x03, 0x45, 0x44, 0xd7, 0x86, 0x00, 0x63, 0x32, 0x65, 0xf5, 0x45,
+  0x15, 0x26, 0x77, 0x56, 0x46, 0x37, 0x41, 0x28, 0x9a, 0x0d, 0x0b, 0xa1,
+  0x41, 0x9b, 0x14, 0x0d, 0x14, 0x11, 0x5d, 0x1b, 0x02, 0x6e, 0xc3, 0x90,
+  0x75, 0xc0, 0x86, 0xa2, 0x71, 0x3c, 0x00, 0xa8, 0xc2, 0xc6, 0x66, 0xd7,
+  0xe6, 0x92, 0x46, 0x56, 0xe6, 0x46, 0x37, 0x25, 0x08, 0xaa, 0x90, 0xe1,
+  0xb9, 0xd8, 0x95, 0xc9, 0xcd, 0xa5, 0xbd, 0xb9, 0x4d, 0x09, 0x88, 0x26,
+  0x64, 0x78, 0x2e, 0x76, 0x61, 0x6c, 0x76, 0x65, 0x72, 0x53, 0x02, 0xa3,
+  0x0e, 0x19, 0x9e, 0xcb, 0x1c, 0x5a, 0x18, 0x59, 0x99, 0x5c, 0xd3, 0x1b,
+  0x59, 0x19, 0xdb, 0x94, 0x20, 0xa9, 0x43, 0x86, 0xe7, 0x62, 0x97, 0x56,
+  0x76, 0x97, 0x44, 0x36, 0x45, 0x17, 0x46, 0x57, 0x36, 0x25, 0x58, 0xea,
+  0x90, 0xe1, 0xb9, 0x94, 0xb9, 0xd1, 0xc9, 0xe5, 0x41, 0xbd, 0xa5, 0xb9,
+  0xd1, 0xcd, 0x4d, 0x09, 0x3c, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00,
+  0x4c, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66,
+  0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07,
+  0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10,
+  0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, 0xce,
+  0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1b,
+  0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, 0x8c,
+  0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, 0x07,
+  0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, 0x11,
+  0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, 0xf0,
+  0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, 0xd8,
+  0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, 0x3b,
+  0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, 0x3b,
+  0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87,
+  0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, 0x07,
+  0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, 0x87,
+  0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 0x81,
+  0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, 0x30,
+  0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4,
+  0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, 0xca,
+  0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, 0x39,
+  0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, 0x3b,
+  0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, 0x3b,
+  0xb0, 0xc3, 0x8c, 0xc8, 0x21, 0x07, 0x7c, 0x70, 0x03, 0x72, 0x10, 0x87,
+  0x73, 0x70, 0x03, 0x7b, 0x08, 0x07, 0x79, 0x60, 0x87, 0x70, 0xc8, 0x87,
+  0x77, 0xa8, 0x07, 0x7a, 0x98, 0x81, 0x3c, 0xe4, 0x80, 0x0f, 0x6e, 0x40,
+  0x0f, 0xe5, 0xd0, 0x0e, 0xf0, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00,
+  0x0b, 0x00, 0x00, 0x00, 0x16, 0x30, 0x0d, 0x97, 0xef, 0x3c, 0xfe, 0xe2,
+  0x00, 0x83, 0xd8, 0x3c, 0xd4, 0xe4, 0x17, 0xb7, 0x6d, 0x02, 0xd5, 0x70,
+  0xf9, 0xce, 0xe3, 0x4b, 0x93, 0x13, 0x11, 0x28, 0x35, 0x3d, 0xd4, 0xe4,
+  0x17, 0xb7, 0x6d, 0x00, 0x04, 0x03, 0x20, 0x0d, 0x00, 0x00, 0x00, 0x00,
+  0x61, 0x20, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, 0x2c,
+  0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x44, 0x85, 0x30, 0x03,
+  0x50, 0x0a, 0x54, 0x25, 0x50, 0x06, 0x00, 0x00, 0x23, 0x06, 0x09, 0x00,
+  0x82, 0x60, 0x60, 0x4c, 0x05, 0x04, 0x29, 0xc4, 0x88, 0x41, 0x02, 0x80,
+  0x20, 0x18, 0x18, 0x94, 0x11, 0x45, 0x43, 0x31, 0x62, 0x90, 0x00, 0x20,
+  0x08, 0x06, 0x46, 0x75, 0x48, 0xd2, 0x62, 0x8c, 0x18, 0x24, 0x00, 0x08,
+  0x82, 0x81, 0x61, 0x21, 0xd3, 0x44, 0x1c, 0x23, 0x06, 0x09, 0x00, 0x82,
+  0x60, 0x80, 0x58, 0x07, 0x45, 0x39, 0xc4, 0x88, 0x41, 0x02, 0x80, 0x20,
+  0x18, 0x20, 0xd6, 0x41, 0x51, 0xc6, 0x30, 0x62, 0x90, 0x00, 0x20, 0x08,
+  0x06, 0x88, 0x75, 0x50, 0x54, 0x23, 0x8c, 0x18, 0x24, 0x00, 0x08, 0x82,
+  0x01, 0x62, 0x1d, 0x14, 0x55, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00
 };
-static const unsigned int color_frag_dxil_len = 2816;
+static const unsigned int color_frag_dxil_len = 2820;

+ 2 - 0
src/render/gpu/shaders/dxil.h

@@ -1,5 +1,7 @@
 #include "color.frag.dxil.h"
 #include "linepoint.vert.dxil.h"
+#include "texture_palette.frag.dxil.h"
+#include "texture_palette_pixelart.frag.dxil.h"
 #include "texture_rgb.frag.dxil.h"
 #include "texture_rgb_pixelart.frag.dxil.h"
 #include "texture_rgba.frag.dxil.h"

+ 78 - 78
src/render/gpu/shaders/linepoint.vert.dxil.h

@@ -1,6 +1,6 @@
 static const unsigned char linepoint_vert_dxil[] = {
-  0x44, 0x58, 0x42, 0x43, 0x9b, 0x4e, 0xec, 0xb3, 0xe4, 0x5e, 0xe1, 0x55,
-  0x87, 0x02, 0xf2, 0x69, 0x75, 0x7b, 0x57, 0x48, 0x01, 0x00, 0x00, 0x00,
+  0x44, 0x58, 0x42, 0x43, 0xd5, 0xa7, 0x16, 0xf8, 0xe8, 0xeb, 0x76, 0x9e,
+  0x29, 0x33, 0x06, 0xea, 0x71, 0xb6, 0x8e, 0x51, 0x01, 0x00, 0x00, 0x00,
   0xf0, 0x0e, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00,
   0x4c, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00,
   0xb8, 0x01, 0x00, 0x00, 0xfc, 0x07, 0x00, 0x00, 0x18, 0x08, 0x00, 0x00,
@@ -89,52 +89,52 @@ static const unsigned char linepoint_vert_dxil[] = {
   0x51, 0x10, 0x85, 0x45, 0xa5, 0x24, 0x46, 0x00, 0x8a, 0xa0, 0x10, 0xca,
   0x80, 0x62, 0x0d, 0xd0, 0x9d, 0x01, 0x20, 0x3c, 0x03, 0x40, 0x79, 0x2c,
   0x42, 0x40, 0xe0, 0x03, 0x3e, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00,
-  0x87, 0x00, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0xc4,
-  0x8e, 0x0c, 0x6f, 0xec, 0xed, 0x4d, 0x0c, 0x24, 0xc6, 0x05, 0xc7, 0x45,
-  0xa6, 0x06, 0x46, 0xc6, 0x05, 0x07, 0x04, 0x45, 0x8c, 0xe6, 0x26, 0x26,
-  0x06, 0x67, 0x26, 0xa7, 0x2c, 0x65, 0x43, 0x10, 0x4c, 0x10, 0x08, 0x63,
-  0x82, 0x40, 0x1c, 0x1b, 0x84, 0x81, 0xd8, 0x20, 0x10, 0x04, 0x05, 0xbb,
-  0xb9, 0x09, 0x02, 0x81, 0x6c, 0x18, 0x0e, 0x84, 0x98, 0x20, 0x60, 0x1b,
-  0x19, 0xba, 0x3c, 0xb8, 0xb2, 0xaf, 0xa1, 0x37, 0x37, 0xba, 0x32, 0x3c,
-  0xba, 0x09, 0x02, 0x91, 0x6c, 0x40, 0x08, 0x65, 0x19, 0x88, 0x81, 0x01,
-  0x36, 0x04, 0xcd, 0x06, 0x02, 0x00, 0x1c, 0x60, 0x82, 0x70, 0x69, 0x5c,
-  0x86, 0xde, 0xdc, 0xe8, 0xca, 0xf0, 0xe8, 0xbe, 0xda, 0xec, 0xe0, 0x26,
-  0x08, 0x84, 0x32, 0x41, 0x20, 0x96, 0x0d, 0xc3, 0x34, 0x49, 0x13, 0x04,
-  0x82, 0x99, 0x20, 0x10, 0xcd, 0x04, 0x81, 0x70, 0x26, 0x08, 0x51, 0xb6,
-  0x41, 0x41, 0x22, 0x89, 0xaa, 0x08, 0xeb, 0xba, 0x30, 0x36, 0x43, 0x6f,
-  0x6e, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x13,
-  0x04, 0xe2, 0x99, 0x20, 0x10, 0xd0, 0x06, 0x05, 0xd1, 0xaa, 0xcd, 0xba,
-  0x2e, 0x8c, 0x9b, 0x36, 0x0c, 0x4c, 0xd6, 0x6d, 0x18, 0x08, 0xc8, 0x9b,
-  0x20, 0x08, 0xc0, 0x06, 0x60, 0xc3, 0x40, 0x84, 0x41, 0x18, 0x6c, 0x08,
-  0xc4, 0x60, 0xc3, 0x30, 0x80, 0xc1, 0x18, 0x4c, 0x10, 0x32, 0x6e, 0x43,
-  0x50, 0x06, 0x24, 0xda, 0xc2, 0xd2, 0xdc, 0x88, 0x50, 0x15, 0x61, 0x0d,
-  0x3d, 0x3d, 0x49, 0x11, 0x4d, 0x10, 0x0a, 0x6a, 0x82, 0x50, 0x54, 0x1b,
-  0x02, 0x62, 0x82, 0x50, 0x58, 0x1b, 0x84, 0xaa, 0xda, 0xb0, 0x10, 0x68,
-  0x90, 0x06, 0x6a, 0xb0, 0x06, 0x6a, 0x30, 0xb0, 0x01, 0xa1, 0x06, 0x6d,
-  0xb0, 0x21, 0x70, 0x83, 0x09, 0x42, 0x71, 0x4d, 0x10, 0x88, 0x68, 0x83,
-  0x50, 0xc5, 0xc1, 0x86, 0x85, 0x40, 0x83, 0x34, 0x50, 0x83, 0x35, 0x60,
-  0x83, 0x01, 0x0e, 0x08, 0x35, 0x90, 0x03, 0x2e, 0x53, 0x56, 0x5f, 0x50,
-  0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x13, 0x84, 0x02, 0xdb, 0xb0,
-  0x0c, 0x74, 0x90, 0x06, 0x75, 0xb0, 0x06, 0x70, 0x30, 0xc0, 0xc1, 0xa0,
-  0x06, 0x72, 0xb0, 0x41, 0x98, 0x03, 0x3b, 0xd8, 0x30, 0xbc, 0xc1, 0x1d,
-  0x00, 0x1b, 0x0a, 0x30, 0x38, 0x03, 0x3c, 0x78, 0x00, 0x1a, 0x66, 0x6c,
-  0x6f, 0x61, 0x74, 0x73, 0x13, 0x04, 0x42, 0x62, 0x91, 0xe6, 0x36, 0x47,
-  0x37, 0x37, 0x41, 0x20, 0x26, 0x1a, 0x73, 0x69, 0x67, 0x5f, 0x6c, 0x64,
-  0x34, 0xe6, 0xd2, 0xce, 0xbe, 0xe6, 0xe8, 0x36, 0x20, 0x7a, 0xb0, 0x07,
-  0x7c, 0xd0, 0x07, 0x7e, 0x20, 0xfd, 0xc1, 0x1e, 0x54, 0x61, 0x63, 0xb3,
-  0x6b, 0x73, 0x49, 0x23, 0x2b, 0x73, 0xa3, 0x9b, 0x12, 0x04, 0x55, 0xc8,
-  0xf0, 0x5c, 0xec, 0xca, 0xe4, 0xe6, 0xd2, 0xde, 0xdc, 0xa6, 0x04, 0x44,
-  0x13, 0x32, 0x3c, 0x17, 0xbb, 0x30, 0x36, 0xbb, 0x32, 0xb9, 0x29, 0x41,
-  0x51, 0x87, 0x0c, 0xcf, 0x65, 0x0e, 0x2d, 0x8c, 0xac, 0x4c, 0xae, 0xe9,
-  0x8d, 0xac, 0x8c, 0x6d, 0x4a, 0x80, 0x94, 0x21, 0xc3, 0x73, 0x91, 0x2b,
-  0x9b, 0x7b, 0xab, 0x93, 0x1b, 0x2b, 0x9b, 0x9b, 0x12, 0x38, 0x95, 0xc8,
-  0xf0, 0x5c, 0xe8, 0xf2, 0xe0, 0xca, 0x82, 0xdc, 0xdc, 0xde, 0xe8, 0xc2,
-  0xe8, 0xd2, 0xde, 0xdc, 0xe6, 0xa6, 0x08, 0xde, 0x18, 0xd4, 0x21, 0xc3,
-  0x73, 0xb1, 0x4b, 0x2b, 0xbb, 0x4b, 0x22, 0x9b, 0xa2, 0x0b, 0xa3, 0x2b,
-  0x9b, 0x12, 0x94, 0x41, 0x1d, 0x32, 0x3c, 0x97, 0x32, 0x37, 0x3a, 0xb9,
-  0x3c, 0xa8, 0xb7, 0x34, 0x37, 0xba, 0xb9, 0x29, 0x01, 0x1e, 0x74, 0x21,
-  0xc3, 0x73, 0x19, 0x7b, 0xab, 0x73, 0xa3, 0x2b, 0x93, 0x9b, 0x9b, 0x12,
-  0xfc, 0x01, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00,
+  0x87, 0x00, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0x44,
+  0x8f, 0x0c, 0x6f, 0xec, 0xed, 0x4d, 0x0c, 0x24, 0xc6, 0x05, 0xc7, 0x45,
+  0xa6, 0x06, 0xa6, 0xc6, 0x45, 0x06, 0x07, 0x04, 0x25, 0xa7, 0xcc, 0x4c,
+  0x4c, 0xcc, 0x66, 0x6c, 0x46, 0x26, 0x65, 0x43, 0x10, 0x4c, 0x10, 0x08,
+  0x63, 0x82, 0x40, 0x1c, 0x1b, 0x84, 0x81, 0xd8, 0x20, 0x10, 0x04, 0x05,
+  0xbb, 0xb9, 0x09, 0x02, 0x81, 0x6c, 0x18, 0x0e, 0x84, 0x98, 0x20, 0x60,
+  0x1b, 0x19, 0xba, 0x3c, 0xb8, 0xb2, 0xaf, 0xa1, 0x37, 0x37, 0xba, 0x32,
+  0x3c, 0xba, 0x09, 0x02, 0x91, 0x6c, 0x40, 0x08, 0x65, 0x19, 0x88, 0x81,
+  0x01, 0x36, 0x04, 0xcd, 0x06, 0x02, 0x00, 0x1c, 0x60, 0x82, 0x70, 0x69,
+  0x5c, 0x86, 0xde, 0xdc, 0xe8, 0xca, 0xf0, 0xe8, 0xbe, 0xda, 0xec, 0xe0,
+  0x26, 0x08, 0x84, 0x32, 0x41, 0x20, 0x96, 0x0d, 0xc3, 0x34, 0x49, 0x13,
+  0x04, 0x82, 0x99, 0x20, 0x10, 0xcd, 0x04, 0x81, 0x70, 0x26, 0x08, 0x51,
+  0xb6, 0x41, 0x41, 0x22, 0x89, 0xaa, 0x08, 0xeb, 0xba, 0x30, 0x36, 0x43,
+  0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72,
+  0x13, 0x04, 0xe2, 0x99, 0x20, 0x10, 0xd0, 0x06, 0x05, 0xd1, 0xaa, 0xcd,
+  0xba, 0x2e, 0x8c, 0x9b, 0x36, 0x0c, 0x4c, 0xd6, 0x6d, 0x18, 0x08, 0xc8,
+  0x9b, 0x20, 0x08, 0xc0, 0x06, 0x60, 0xc3, 0x40, 0x84, 0x41, 0x18, 0x6c,
+  0x08, 0xc4, 0x60, 0xc3, 0x30, 0x80, 0xc1, 0x18, 0x4c, 0x10, 0x32, 0x6e,
+  0x43, 0x50, 0x06, 0x24, 0xda, 0xc2, 0xd2, 0xdc, 0x88, 0x50, 0x15, 0x61,
+  0x0d, 0x3d, 0x3d, 0x49, 0x11, 0x4d, 0x10, 0x0a, 0x6a, 0x82, 0x50, 0x54,
+  0x1b, 0x02, 0x62, 0x82, 0x50, 0x58, 0x1b, 0x84, 0xaa, 0xda, 0xb0, 0x10,
+  0x68, 0x90, 0x06, 0x6a, 0xb0, 0x06, 0x6a, 0x30, 0xb0, 0x01, 0xa1, 0x06,
+  0x6d, 0xb0, 0x21, 0x70, 0x83, 0x09, 0x42, 0x71, 0x4d, 0x10, 0x88, 0x68,
+  0x83, 0x50, 0xc5, 0xc1, 0x86, 0x85, 0x40, 0x83, 0x34, 0x50, 0x83, 0x35,
+  0x60, 0x83, 0x01, 0x0e, 0x08, 0x35, 0x90, 0x03, 0x2e, 0x53, 0x56, 0x5f,
+  0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x13, 0x84, 0x02, 0xdb,
+  0xb0, 0x0c, 0x74, 0x90, 0x06, 0x75, 0xb0, 0x06, 0x70, 0x30, 0xc0, 0xc1,
+  0xa0, 0x06, 0x72, 0xb0, 0x41, 0x98, 0x03, 0x3b, 0xd8, 0x30, 0xbc, 0xc1,
+  0x1d, 0x00, 0x1b, 0x0a, 0x30, 0x38, 0x03, 0x3c, 0x78, 0x00, 0x1a, 0x66,
+  0x6c, 0x6f, 0x61, 0x74, 0x73, 0x13, 0x04, 0x42, 0x62, 0x91, 0xe6, 0x36,
+  0x47, 0x37, 0x37, 0x41, 0x20, 0x26, 0x1a, 0x73, 0x69, 0x67, 0x5f, 0x6c,
+  0x64, 0x34, 0xe6, 0xd2, 0xce, 0xbe, 0xe6, 0xe8, 0x36, 0x20, 0x7a, 0xb0,
+  0x07, 0x7c, 0xd0, 0x07, 0x7e, 0x20, 0xfd, 0xc1, 0x1e, 0x54, 0x61, 0x63,
+  0xb3, 0x6b, 0x73, 0x49, 0x23, 0x2b, 0x73, 0xa3, 0x9b, 0x12, 0x04, 0x55,
+  0xc8, 0xf0, 0x5c, 0xec, 0xca, 0xe4, 0xe6, 0xd2, 0xde, 0xdc, 0xa6, 0x04,
+  0x44, 0x13, 0x32, 0x3c, 0x17, 0xbb, 0x30, 0x36, 0xbb, 0x32, 0xb9, 0x29,
+  0x41, 0x51, 0x87, 0x0c, 0xcf, 0x65, 0x0e, 0x2d, 0x8c, 0xac, 0x4c, 0xae,
+  0xe9, 0x8d, 0xac, 0x8c, 0x6d, 0x4a, 0x80, 0x94, 0x21, 0xc3, 0x73, 0x91,
+  0x2b, 0x9b, 0x7b, 0xab, 0x93, 0x1b, 0x2b, 0x9b, 0x9b, 0x12, 0x38, 0x95,
+  0xc8, 0xf0, 0x5c, 0xe8, 0xf2, 0xe0, 0xca, 0x82, 0xdc, 0xdc, 0xde, 0xe8,
+  0xc2, 0xe8, 0xd2, 0xde, 0xdc, 0xe6, 0xa6, 0x08, 0xde, 0x18, 0xd4, 0x21,
+  0xc3, 0x73, 0xb1, 0x4b, 0x2b, 0xbb, 0x4b, 0x22, 0x9b, 0xa2, 0x0b, 0xa3,
+  0x2b, 0x9b, 0x12, 0x94, 0x41, 0x1d, 0x32, 0x3c, 0x97, 0x32, 0x37, 0x3a,
+  0xb9, 0x3c, 0xa8, 0xb7, 0x34, 0x37, 0xba, 0xb9, 0x29, 0x01, 0x1e, 0x74,
+  0x21, 0xc3, 0x73, 0x19, 0x7b, 0xab, 0x73, 0xa3, 0x2b, 0x93, 0x9b, 0x9b,
+  0x12, 0xfc, 0x01, 0x00, 0x79, 0x18, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00,
   0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88,
   0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73,
   0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e,
@@ -170,8 +170,8 @@ static const unsigned char linepoint_vert_dxil[] = {
   0xb6, 0x11, 0x48, 0xc3, 0xe5, 0x3b, 0x8f, 0x3f, 0x11, 0xd1, 0x84, 0x00,
   0x11, 0xe6, 0x17, 0xb7, 0x6d, 0x00, 0x04, 0x03, 0x20, 0x0d, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x48, 0x41, 0x53, 0x48, 0x14, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x32, 0x63, 0x21, 0x70, 0x7f, 0xef, 0xf1, 0xef,
-  0x3c, 0xfd, 0x55, 0xb7, 0x1c, 0x2f, 0xca, 0x0f, 0x44, 0x58, 0x49, 0x4c,
+  0x00, 0x00, 0x00, 0x00, 0x0b, 0x58, 0x3b, 0xbc, 0x36, 0xf9, 0x46, 0x51,
+  0xda, 0xd9, 0x36, 0x77, 0xb0, 0x50, 0x94, 0xe0, 0x44, 0x58, 0x49, 0x4c,
   0xd0, 0x06, 0x00, 0x00, 0x60, 0x00, 0x01, 0x00, 0xb4, 0x01, 0x00, 0x00,
   0x44, 0x58, 0x49, 0x4c, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
   0xb8, 0x06, 0x00, 0x00, 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00,
@@ -220,37 +220,37 @@ static const unsigned char linepoint_vert_dxil[] = {
   0x00, 0x00, 0x00, 0x60, 0xc8, 0x23, 0x01, 0x01, 0x30, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x40, 0x16, 0x08, 0x00, 0x0d, 0x00, 0x00, 0x00,
   0x32, 0x1e, 0x98, 0x14, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47,
-  0xc6, 0x04, 0x43, 0x22, 0x25, 0x30, 0x02, 0x50, 0x10, 0xc5, 0x50, 0xa0,
+  0xc6, 0x04, 0x43, 0x22, 0x25, 0x30, 0x02, 0x50, 0x12, 0xc5, 0x50, 0xa0,
   0x01, 0x65, 0x50, 0x1e, 0x54, 0x4a, 0x62, 0x04, 0xa0, 0x08, 0x0a, 0xa1,
   0x0c, 0x08, 0xcf, 0x00, 0x50, 0x1e, 0x8b, 0x10, 0x10, 0xf8, 0x80, 0x0f,
   0x00, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, 0x51, 0x00, 0x00, 0x00,
-  0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0xc4, 0x8e, 0x0c, 0x6f, 0xec,
-  0xed, 0x4d, 0x0c, 0x24, 0xc6, 0x05, 0xc7, 0x45, 0xa6, 0x06, 0x46, 0xc6,
-  0x05, 0x07, 0x04, 0x45, 0x8c, 0xe6, 0x26, 0x26, 0x06, 0x67, 0x26, 0xa7,
-  0x2c, 0x65, 0x43, 0x10, 0x4c, 0x10, 0x08, 0x63, 0x82, 0x40, 0x1c, 0x1b,
-  0x84, 0x81, 0x98, 0x20, 0x10, 0xc8, 0x06, 0x61, 0x30, 0x28, 0xd8, 0xcd,
-  0x4d, 0x10, 0x88, 0x64, 0xc3, 0x80, 0x24, 0xc4, 0x04, 0x01, 0x93, 0x08,
-  0x4c, 0x10, 0x08, 0x65, 0x03, 0x42, 0x2c, 0xcc, 0x40, 0x0c, 0x0d, 0xb0,
-  0x21, 0x70, 0x36, 0x10, 0x00, 0xf0, 0x00, 0x13, 0x84, 0x6c, 0xda, 0x10,
-  0x44, 0x13, 0x04, 0x01, 0x20, 0xd1, 0x16, 0x96, 0xe6, 0x46, 0x84, 0xaa,
-  0x08, 0x6b, 0xe8, 0xe9, 0x49, 0x8a, 0x68, 0x82, 0x50, 0x34, 0x13, 0x84,
-  0xc2, 0xd9, 0x10, 0x10, 0x13, 0x84, 0xe2, 0x99, 0x20, 0x10, 0xcb, 0x06,
-  0x41, 0xd3, 0x36, 0x2c, 0x44, 0x65, 0x5d, 0xd8, 0x35, 0x64, 0xc4, 0xb5,
-  0x6d, 0x08, 0xb8, 0x09, 0x42, 0x01, 0x4d, 0x10, 0x08, 0x66, 0x83, 0xa0,
-  0x7d, 0x1b, 0x16, 0xa2, 0xb2, 0x2e, 0x2c, 0x1b, 0x3c, 0xe2, 0x02, 0x03,
-  0x2e, 0x53, 0x56, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e,
-  0x13, 0x84, 0x22, 0xda, 0xb0, 0x0c, 0x62, 0x60, 0x8d, 0x01, 0xe6, 0x0d,
-  0xde, 0x70, 0x81, 0xc1, 0x06, 0x21, 0x0c, 0xc8, 0x60, 0xc3, 0xd0, 0x95,
-  0x01, 0xb0, 0xa1, 0x98, 0x28, 0x33, 0x80, 0x80, 0x2a, 0x6c, 0x6c, 0x76,
-  0x6d, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x53, 0x82, 0xa0, 0x0a, 0x19,
-  0x9e, 0x8b, 0x5d, 0x99, 0xdc, 0x5c, 0xda, 0x9b, 0xdb, 0x94, 0x80, 0x68,
-  0x42, 0x86, 0xe7, 0x62, 0x17, 0xc6, 0x66, 0x57, 0x26, 0x37, 0x25, 0x30,
-  0xea, 0x90, 0xe1, 0xb9, 0xcc, 0xa1, 0x85, 0x91, 0x95, 0xc9, 0x35, 0xbd,
-  0x91, 0x95, 0xb1, 0x4d, 0x09, 0x92, 0x32, 0x64, 0x78, 0x2e, 0x72, 0x65,
-  0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x53, 0x82, 0xa7, 0x0e, 0x19,
-  0x9e, 0x8b, 0x5d, 0x5a, 0xd9, 0x5d, 0x12, 0xd9, 0x14, 0x5d, 0x18, 0x5d,
-  0xd9, 0x94, 0x20, 0xaa, 0x43, 0x86, 0xe7, 0x52, 0xe6, 0x46, 0x27, 0x97,
-  0x07, 0xf5, 0x96, 0xe6, 0x46, 0x37, 0x37, 0x25, 0x30, 0x03, 0x00, 0x00,
+  0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0x44, 0x8f, 0x0c, 0x6f, 0xec,
+  0xed, 0x4d, 0x0c, 0x24, 0xc6, 0x05, 0xc7, 0x45, 0xa6, 0x06, 0xa6, 0xc6,
+  0x45, 0x06, 0x07, 0x04, 0x25, 0xa7, 0xcc, 0x4c, 0x4c, 0xcc, 0x66, 0x6c,
+  0x46, 0x26, 0x65, 0x43, 0x10, 0x4c, 0x10, 0x08, 0x63, 0x82, 0x40, 0x1c,
+  0x1b, 0x84, 0x81, 0x98, 0x20, 0x10, 0xc8, 0x06, 0x61, 0x30, 0x28, 0xd8,
+  0xcd, 0x4d, 0x10, 0x88, 0x64, 0xc3, 0x80, 0x24, 0xc4, 0x04, 0x01, 0x93,
+  0x08, 0x4c, 0x10, 0x08, 0x65, 0x03, 0x42, 0x2c, 0xcc, 0x40, 0x0c, 0x0d,
+  0xb0, 0x21, 0x70, 0x36, 0x10, 0x00, 0xf0, 0x00, 0x13, 0x84, 0x6c, 0xda,
+  0x10, 0x44, 0x13, 0x04, 0x01, 0x20, 0xd1, 0x16, 0x96, 0xe6, 0x46, 0x84,
+  0xaa, 0x08, 0x6b, 0xe8, 0xe9, 0x49, 0x8a, 0x68, 0x82, 0x50, 0x34, 0x13,
+  0x84, 0xc2, 0xd9, 0x10, 0x10, 0x13, 0x84, 0xe2, 0x99, 0x20, 0x10, 0xcb,
+  0x06, 0x41, 0xd3, 0x36, 0x2c, 0x44, 0x65, 0x5d, 0xd8, 0x35, 0x64, 0xc4,
+  0xb5, 0x6d, 0x08, 0xb8, 0x09, 0x42, 0x01, 0x4d, 0x10, 0x08, 0x66, 0x83,
+  0xa0, 0x7d, 0x1b, 0x16, 0xa2, 0xb2, 0x2e, 0x2c, 0x1b, 0x3c, 0xe2, 0x02,
+  0x03, 0x2e, 0x53, 0x56, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f,
+  0x6e, 0x13, 0x84, 0x22, 0xda, 0xb0, 0x0c, 0x62, 0x60, 0x8d, 0x01, 0xe6,
+  0x0d, 0xde, 0x70, 0x81, 0xc1, 0x06, 0x21, 0x0c, 0xc8, 0x60, 0xc3, 0xd0,
+  0x95, 0x01, 0xb0, 0xa1, 0x98, 0x28, 0x33, 0x80, 0x80, 0x2a, 0x6c, 0x6c,
+  0x76, 0x6d, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x53, 0x82, 0xa0, 0x0a,
+  0x19, 0x9e, 0x8b, 0x5d, 0x99, 0xdc, 0x5c, 0xda, 0x9b, 0xdb, 0x94, 0x80,
+  0x68, 0x42, 0x86, 0xe7, 0x62, 0x17, 0xc6, 0x66, 0x57, 0x26, 0x37, 0x25,
+  0x30, 0xea, 0x90, 0xe1, 0xb9, 0xcc, 0xa1, 0x85, 0x91, 0x95, 0xc9, 0x35,
+  0xbd, 0x91, 0x95, 0xb1, 0x4d, 0x09, 0x92, 0x32, 0x64, 0x78, 0x2e, 0x72,
+  0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x53, 0x82, 0xa7, 0x0e,
+  0x19, 0x9e, 0x8b, 0x5d, 0x5a, 0xd9, 0x5d, 0x12, 0xd9, 0x14, 0x5d, 0x18,
+  0x5d, 0xd9, 0x94, 0x20, 0xaa, 0x43, 0x86, 0xe7, 0x52, 0xe6, 0x46, 0x27,
+  0x97, 0x07, 0xf5, 0x96, 0xe6, 0x46, 0x37, 0x37, 0x25, 0x30, 0x03, 0x00,
   0x79, 0x18, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c,
   0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3,
   0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6,

+ 2 - 0
src/render/gpu/shaders/msl.h

@@ -1,5 +1,7 @@
 #include "color.frag.msl.h"
 #include "linepoint.vert.msl.h"
+#include "texture_palette.frag.msl.h"
+#include "texture_palette_pixelart.frag.msl.h"
 #include "texture_rgb.frag.msl.h"
 #include "texture_rgb_pixelart.frag.msl.h"
 #include "texture_rgba.frag.msl.h"

+ 2 - 0
src/render/gpu/shaders/spir-v.h

@@ -1,5 +1,7 @@
 #include "color.frag.spv.h"
 #include "linepoint.vert.spv.h"
+#include "texture_palette.frag.spv.h"
+#include "texture_palette_pixelart.frag.spv.h"
 #include "texture_rgb.frag.spv.h"
 #include "texture_rgb_pixelart.frag.spv.h"
 #include "texture_rgba.frag.spv.h"

+ 341 - 0
src/render/gpu/shaders/texture_palette.frag.dxil.h

@@ -0,0 +1,341 @@
+static const unsigned char texture_palette_frag_dxil[] = {
+  0x44, 0x58, 0x42, 0x43, 0x55, 0x86, 0x21, 0xa0, 0x19, 0xf3, 0xde, 0xc6,
+  0x36, 0x0f, 0xde, 0xab, 0xfc, 0x7c, 0x9b, 0x93, 0x01, 0x00, 0x00, 0x00,
+  0xd0, 0x0f, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00,
+  0x4c, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0x00,
+  0x08, 0x02, 0x00, 0x00, 0x90, 0x08, 0x00, 0x00, 0xac, 0x08, 0x00, 0x00,
+  0x53, 0x46, 0x49, 0x30, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x49, 0x53, 0x47, 0x31, 0x54, 0x00, 0x00, 0x00,
+  0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00,
+  0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+  0x01, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x00, 0x00, 0x00, 0x00,
+  0x4f, 0x53, 0x47, 0x31, 0x34, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+  0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x53, 0x56, 0x5f, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x00, 0x00, 0x00,
+  0x50, 0x53, 0x56, 0x30, 0x1c, 0x01, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
+  0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x13, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
+  0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+  0x01, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+  0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x18, 0x00, 0x00, 0x00, 0x00, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52,
+  0x44, 0x00, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x00, 0x6d,
+  0x61, 0x69, 0x6e, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x44, 0x00, 0x03, 0x02, 0x00, 0x00,
+  0x0a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x42, 0x00,
+  0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x01, 0x00, 0x44, 0x10, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+  0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
+  0x0f, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x53, 0x54, 0x41, 0x54, 0x80, 0x06, 0x00, 0x00,
+  0x60, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4c,
+  0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x68, 0x06, 0x00, 0x00,
+  0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0x97, 0x01, 0x00, 0x00,
+  0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00,
+  0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39,
+  0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62,
+  0x80, 0x14, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0xa4, 0x10, 0x32, 0x14,
+  0x38, 0x08, 0x18, 0x4b, 0x0a, 0x32, 0x52, 0x88, 0x48, 0x90, 0x14, 0x20,
+  0x43, 0x46, 0x88, 0xa5, 0x00, 0x19, 0x32, 0x42, 0xe4, 0x48, 0x0e, 0x90,
+  0x91, 0x22, 0xc4, 0x50, 0x41, 0x51, 0x81, 0x8c, 0xe1, 0x83, 0xe5, 0x8a,
+  0x04, 0x29, 0x46, 0x06, 0x51, 0x18, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
+  0x1b, 0x8c, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x07, 0x40, 0x02, 0xa8, 0x0d,
+  0x84, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x03, 0x20, 0x6d, 0x30, 0x86, 0xff,
+  0xff, 0xff, 0xff, 0x1f, 0x00, 0x09, 0xa8, 0x00, 0x49, 0x18, 0x00, 0x00,
+  0x03, 0x00, 0x00, 0x00, 0x13, 0x82, 0x60, 0x42, 0x20, 0x4c, 0x08, 0x06,
+  0x00, 0x00, 0x00, 0x00, 0x89, 0x20, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00,
+  0x32, 0x22, 0x48, 0x09, 0x20, 0x64, 0x85, 0x04, 0x93, 0x22, 0xa4, 0x84,
+  0x04, 0x93, 0x22, 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8a, 0x8c,
+  0x0b, 0x84, 0xa4, 0x4c, 0x10, 0x68, 0x23, 0x00, 0x25, 0x00, 0x14, 0x66,
+  0x00, 0xe6, 0x08, 0xc0, 0x60, 0x8e, 0x00, 0x29, 0xc6, 0x20, 0x84, 0x14,
+  0x42, 0xa6, 0x18, 0x80, 0x10, 0x52, 0x06, 0xa1, 0x9b, 0x86, 0xcb, 0x9f,
+  0xb0, 0x87, 0x90, 0xfc, 0x95, 0x90, 0x56, 0x62, 0xf2, 0x8b, 0xdb, 0x46,
+  0xc5, 0x18, 0x63, 0x10, 0x2a, 0xf7, 0x0c, 0x97, 0x3f, 0x61, 0x0f, 0x21,
+  0xf9, 0x21, 0xd0, 0x0c, 0x0b, 0x81, 0x82, 0x55, 0x18, 0x45, 0x18, 0x1b,
+  0x63, 0x0c, 0x42, 0xc8, 0xa0, 0x36, 0x47, 0x10, 0x14, 0x83, 0x91, 0x42,
+  0xc8, 0x23, 0x38, 0x10, 0x30, 0x8c, 0x40, 0x0c, 0x33, 0xb5, 0xc1, 0x38,
+  0xb0, 0x43, 0x38, 0xcc, 0xc3, 0x3c, 0xb8, 0x01, 0x2d, 0x94, 0x03, 0x3e,
+  0xd0, 0x43, 0x3d, 0xc8, 0x43, 0x39, 0xc8, 0x01, 0x29, 0xf0, 0x81, 0x3d,
+  0x94, 0xc3, 0x38, 0xd0, 0xc3, 0x3b, 0xc8, 0x03, 0x1f, 0x98, 0x03, 0x3b,
+  0xbc, 0x43, 0x38, 0xd0, 0x03, 0x1b, 0x80, 0x01, 0x1d, 0xf8, 0x01, 0x18,
+  0xf8, 0x81, 0x1e, 0xe8, 0x41, 0x3b, 0xa4, 0x03, 0x3c, 0xcc, 0xc3, 0x2f,
+  0xd0, 0x43, 0x3e, 0xc0, 0x43, 0x39, 0xa0, 0x80, 0xcc, 0x24, 0x06, 0xe3,
+  0xc0, 0x0e, 0xe1, 0x30, 0x0f, 0xf3, 0xe0, 0x06, 0xb4, 0x50, 0x0e, 0xf8,
+  0x40, 0x0f, 0xf5, 0x20, 0x0f, 0xe5, 0x20, 0x07, 0xa4, 0xc0, 0x07, 0xf6,
+  0x50, 0x0e, 0xe3, 0x40, 0x0f, 0xef, 0x20, 0x0f, 0x7c, 0x60, 0x0e, 0xec,
+  0xf0, 0x0e, 0xe1, 0x40, 0x0f, 0x6c, 0x00, 0x06, 0x74, 0xe0, 0x07, 0x60,
+  0xe0, 0x07, 0x48, 0x98, 0x94, 0xea, 0x4d, 0xd2, 0x14, 0x51, 0xc2, 0xe4,
+  0xb3, 0x00, 0xf3, 0x2c, 0x44, 0xc4, 0x4e, 0xc0, 0x44, 0xa0, 0x80, 0xd0,
+  0x4d, 0x04, 0x02, 0x00, 0x13, 0x14, 0x72, 0xc0, 0x87, 0x74, 0x60, 0x87,
+  0x36, 0x68, 0x87, 0x79, 0x68, 0x03, 0x72, 0xc0, 0x87, 0x0d, 0xaf, 0x50,
+  0x0e, 0x6d, 0xd0, 0x0e, 0x7a, 0x50, 0x0e, 0x6d, 0x00, 0x0f, 0x7a, 0x30,
+  0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0xa0,
+  0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x78, 0xa0, 0x07, 0x73, 0x20,
+  0x07, 0x6d, 0x90, 0x0e, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0,
+  0x06, 0xe9, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90,
+  0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe6, 0x10,
+  0x07, 0x76, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0e, 0x73, 0x20,
+  0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe6, 0x60, 0x07, 0x74, 0xa0,
+  0x07, 0x76, 0x40, 0x07, 0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71, 0x60,
+  0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x43, 0x9e,
+  0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86,
+  0x3c, 0x06, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x0c, 0x79, 0x10, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x18, 0xf2, 0x34, 0x40, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x30, 0xe4, 0x81, 0x80, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x20, 0x0b, 0x04, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00,
+  0x32, 0x1e, 0x98, 0x14, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47,
+  0xc6, 0x04, 0x43, 0x22, 0x25, 0x30, 0x02, 0x50, 0x0c, 0x45, 0x50, 0x12,
+  0x65, 0x50, 0x1e, 0x85, 0x53, 0x08, 0x54, 0x4a, 0x62, 0x04, 0xa0, 0x08,
+  0x0a, 0xa1, 0x40, 0xc8, 0xce, 0x00, 0x10, 0x9e, 0x01, 0xa0, 0x3c, 0x16,
+  0x62, 0x10, 0x81, 0x40, 0x20, 0xcf, 0x03, 0x00, 0x79, 0x18, 0x00, 0x00,
+  0x85, 0x00, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0x44,
+  0x8f, 0x0c, 0x6f, 0xec, 0xed, 0x4d, 0x0c, 0x24, 0xc6, 0x05, 0xc7, 0x45,
+  0xa6, 0x06, 0xa6, 0xc6, 0x45, 0x06, 0x07, 0x04, 0x25, 0xa7, 0xcc, 0x4c,
+  0x4c, 0xcc, 0x66, 0x6c, 0x46, 0x26, 0x65, 0x43, 0x10, 0x4c, 0x10, 0x88,
+  0x62, 0x82, 0x40, 0x18, 0x1b, 0x84, 0x81, 0xd8, 0x20, 0x10, 0x04, 0x05,
+  0xb8, 0xb9, 0x09, 0x02, 0x71, 0x6c, 0x18, 0x0e, 0x84, 0x98, 0x20, 0x58,
+  0x13, 0x93, 0xba, 0x2f, 0xba, 0x32, 0x3c, 0xba, 0x3a, 0xb9, 0xb2, 0x09,
+  0x02, 0x81, 0x4c, 0x10, 0x88, 0x64, 0x83, 0x40, 0x34, 0x1b, 0x12, 0x42,
+  0x59, 0x18, 0x62, 0x60, 0x08, 0x87, 0x49, 0xdd, 0x17, 0x5c, 0x18, 0x5b,
+  0x19, 0x1d, 0x5d, 0xd9, 0x86, 0x64, 0x50, 0x20, 0x66, 0x18, 0x18, 0xc2,
+  0xd9, 0x20, 0x3c, 0xd1, 0x04, 0x01, 0xa3, 0xa8, 0xd4, 0x7d, 0xcd, 0x85,
+  0xb5, 0xc1, 0xb1, 0x95, 0xc9, 0xc5, 0x6c, 0x40, 0x88, 0x89, 0x62, 0x88,
+  0x81, 0x00, 0xa8, 0xd4, 0x7d, 0xcd, 0x85, 0xb5, 0xc1, 0xb1, 0x95, 0xc9,
+  0xc9, 0x6c, 0x40, 0x86, 0xc9, 0x62, 0x86, 0x81, 0x00, 0x36, 0x08, 0xd5,
+  0xb5, 0x81, 0x90, 0x00, 0x00, 0x9b, 0x20, 0x08, 0xc0, 0x06, 0x60, 0xc3,
+  0x40, 0x6c, 0xdb, 0x86, 0x80, 0xdb, 0x30, 0x0c, 0x5a, 0x37, 0x41, 0xc8,
+  0xaa, 0x0d, 0xc1, 0x47, 0xa2, 0x2d, 0x2c, 0xcd, 0x8d, 0x08, 0x55, 0x11,
+  0xd6, 0xd0, 0xd3, 0x93, 0x14, 0xd1, 0x04, 0xa1, 0x70, 0x26, 0x08, 0xc5,
+  0xb3, 0x21, 0x20, 0x26, 0x08, 0x05, 0x34, 0x41, 0x28, 0xa2, 0x09, 0x02,
+  0xa1, 0x4c, 0x10, 0x88, 0x65, 0x83, 0x80, 0x06, 0x69, 0xb0, 0x61, 0x21,
+  0xc4, 0x60, 0x0c, 0xc8, 0xa0, 0x0c, 0xcc, 0x60, 0x38, 0x03, 0x82, 0x0c,
+  0xd4, 0x60, 0x43, 0x30, 0x6c, 0x10, 0xd0, 0x00, 0x0d, 0x36, 0x2c, 0x83,
+  0x18, 0x8c, 0x01, 0x19, 0xb0, 0x81, 0x19, 0x0c, 0x66, 0x30, 0x90, 0x41,
+  0x1b, 0x6c, 0x10, 0xd6, 0xc0, 0x0d, 0x98, 0x4c, 0x59, 0x7d, 0x51, 0x85,
+  0xc9, 0x9d, 0x95, 0xd1, 0x4d, 0x10, 0x0a, 0x69, 0xc3, 0x42, 0xc0, 0xc1,
+  0x18, 0xc4, 0x41, 0x19, 0x90, 0xc1, 0x70, 0x06, 0x04, 0x19, 0xa8, 0xc1,
+  0x86, 0x40, 0x0e, 0x36, 0x0c, 0x6f, 0x30, 0x07, 0xc0, 0x86, 0x42, 0x0b,
+  0x03, 0x3a, 0xc8, 0x00, 0x1a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x73, 0x2c,
+  0xd2, 0xdc, 0xe6, 0xe8, 0xe6, 0x26, 0x08, 0x04, 0x43, 0x63, 0x2e, 0xed,
+  0xec, 0x8b, 0x8d, 0x8c, 0xc6, 0x5c, 0xda, 0xd9, 0xd7, 0x1c, 0xdd, 0x04,
+  0x81, 0x68, 0x88, 0xd0, 0x95, 0xe1, 0x7d, 0xb9, 0xbd, 0xc9, 0xb5, 0x6d,
+  0x50, 0xec, 0x00, 0xb9, 0x03, 0x3c, 0xc8, 0x03, 0x44, 0x0f, 0xf6, 0x80,
+  0x0f, 0x98, 0x2a, 0x6c, 0x6c, 0x76, 0x6d, 0x2e, 0x69, 0x64, 0x65, 0x6e,
+  0x74, 0x53, 0x82, 0xa0, 0x0a, 0x19, 0x9e, 0x8b, 0x5d, 0x99, 0xdc, 0x5c,
+  0xda, 0x9b, 0xdb, 0x94, 0x80, 0x68, 0x42, 0x86, 0xe7, 0x62, 0x17, 0xc6,
+  0x66, 0x57, 0x26, 0x37, 0x25, 0x28, 0xea, 0x90, 0xe1, 0xb9, 0xcc, 0xa1,
+  0x85, 0x91, 0x95, 0xc9, 0x35, 0xbd, 0x91, 0x95, 0xb1, 0x4d, 0x09, 0x90,
+  0x32, 0x64, 0x78, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65,
+  0x73, 0x53, 0x02, 0xac, 0x12, 0x19, 0x9e, 0x0b, 0x5d, 0x1e, 0x5c, 0x59,
+  0x90, 0x9b, 0xdb, 0x1b, 0x5d, 0x18, 0x5d, 0xda, 0x9b, 0xdb, 0xdc, 0x94,
+  0xa0, 0xab, 0x43, 0x86, 0xe7, 0x62, 0x97, 0x56, 0x76, 0x97, 0x44, 0x36,
+  0x45, 0x17, 0x46, 0x57, 0x36, 0x25, 0xf8, 0xea, 0x90, 0xe1, 0xb9, 0x94,
+  0xb9, 0xd1, 0xc9, 0xe5, 0x41, 0xbd, 0xa5, 0xb9, 0xd1, 0xcd, 0x4d, 0x09,
+  0xe8, 0xa0, 0x0b, 0x19, 0x9e, 0xcb, 0xd8, 0x5b, 0x9d, 0x1b, 0x5d, 0x99,
+  0xdc, 0xdc, 0x94, 0x80, 0x0f, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00,
+  0x4c, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66,
+  0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07,
+  0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10,
+  0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, 0xce,
+  0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1b,
+  0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, 0x8c,
+  0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, 0x07,
+  0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, 0x11,
+  0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, 0xf0,
+  0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, 0xd8,
+  0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, 0x3b,
+  0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, 0x3b,
+  0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87,
+  0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, 0x07,
+  0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, 0x87,
+  0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 0x81,
+  0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, 0x30,
+  0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4,
+  0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, 0xca,
+  0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, 0x39,
+  0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, 0x3b,
+  0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, 0x3b,
+  0xb0, 0xc3, 0x8c, 0xc8, 0x21, 0x07, 0x7c, 0x70, 0x03, 0x72, 0x10, 0x87,
+  0x73, 0x70, 0x03, 0x7b, 0x08, 0x07, 0x79, 0x60, 0x87, 0x70, 0xc8, 0x87,
+  0x77, 0xa8, 0x07, 0x7a, 0x98, 0x81, 0x3c, 0xe4, 0x80, 0x0f, 0x6e, 0x40,
+  0x0f, 0xe5, 0xd0, 0x0e, 0xf0, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00,
+  0x12, 0x00, 0x00, 0x00, 0x46, 0x20, 0x0d, 0x97, 0xef, 0x3c, 0xbe, 0x10,
+  0x11, 0xc0, 0x44, 0x84, 0x40, 0x33, 0x2c, 0x84, 0x05, 0x4c, 0xc3, 0xe5,
+  0x3b, 0x8f, 0xbf, 0x38, 0xc0, 0x20, 0x36, 0x0f, 0x35, 0xf9, 0xc5, 0x6d,
+  0xdb, 0x00, 0x34, 0x5c, 0xbe, 0xf3, 0xf8, 0x12, 0xc0, 0x3c, 0x0b, 0xe1,
+  0x17, 0xb7, 0x6d, 0x02, 0xd5, 0x70, 0xf9, 0xce, 0xe3, 0x4b, 0x93, 0x13,
+  0x11, 0x28, 0x35, 0x3d, 0xd4, 0xe4, 0x17, 0xb7, 0x6d, 0x00, 0x04, 0x03,
+  0x20, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x41, 0x53, 0x48,
+  0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0xe9, 0xb9, 0xc5,
+  0x3e, 0x0d, 0xf1, 0xc0, 0xc2, 0x52, 0xbd, 0xf2, 0xbd, 0xb8, 0x68, 0x11,
+  0x44, 0x58, 0x49, 0x4c, 0x1c, 0x07, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
+  0xc7, 0x01, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4c, 0x00, 0x01, 0x00, 0x00,
+  0x10, 0x00, 0x00, 0x00, 0x04, 0x07, 0x00, 0x00, 0x42, 0x43, 0xc0, 0xde,
+  0x21, 0x0c, 0x00, 0x00, 0xbe, 0x01, 0x00, 0x00, 0x0b, 0x82, 0x20, 0x00,
+  0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, 0x91,
+  0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, 0x0c,
+  0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x14, 0x45, 0x02,
+  0x42, 0x92, 0x0b, 0x42, 0xa4, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18, 0x4b,
+  0x0a, 0x32, 0x52, 0x88, 0x48, 0x90, 0x14, 0x20, 0x43, 0x46, 0x88, 0xa5,
+  0x00, 0x19, 0x32, 0x42, 0xe4, 0x48, 0x0e, 0x90, 0x91, 0x22, 0xc4, 0x50,
+  0x41, 0x51, 0x81, 0x8c, 0xe1, 0x83, 0xe5, 0x8a, 0x04, 0x29, 0x46, 0x06,
+  0x51, 0x18, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x1b, 0x8c, 0xe0, 0xff,
+  0xff, 0xff, 0xff, 0x07, 0x40, 0x02, 0xa8, 0x0d, 0x84, 0xf0, 0xff, 0xff,
+  0xff, 0xff, 0x03, 0x20, 0x6d, 0x30, 0x86, 0xff, 0xff, 0xff, 0xff, 0x1f,
+  0x00, 0x09, 0xa8, 0x00, 0x49, 0x18, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+  0x13, 0x82, 0x60, 0x42, 0x20, 0x4c, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00,
+  0x89, 0x20, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x32, 0x22, 0x48, 0x09,
+  0x20, 0x64, 0x85, 0x04, 0x93, 0x22, 0xa4, 0x84, 0x04, 0x93, 0x22, 0xe3,
+  0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8a, 0x8c, 0x0b, 0x84, 0xa4, 0x4c,
+  0x10, 0x68, 0x23, 0x00, 0x25, 0x00, 0x14, 0x66, 0x00, 0xe6, 0x08, 0xc0,
+  0x60, 0x8e, 0x00, 0x29, 0xc6, 0x20, 0x84, 0x14, 0x42, 0xa6, 0x18, 0x80,
+  0x10, 0x52, 0x06, 0xa1, 0x9b, 0x86, 0xcb, 0x9f, 0xb0, 0x87, 0x90, 0xfc,
+  0x95, 0x90, 0x56, 0x62, 0xf2, 0x8b, 0xdb, 0x46, 0xc5, 0x18, 0x63, 0x10,
+  0x2a, 0xf7, 0x0c, 0x97, 0x3f, 0x61, 0x0f, 0x21, 0xf9, 0x21, 0xd0, 0x0c,
+  0x0b, 0x81, 0x82, 0x55, 0x18, 0x45, 0x18, 0x1b, 0x63, 0x0c, 0x42, 0xc8,
+  0xa0, 0x36, 0x47, 0x10, 0x14, 0x83, 0x91, 0x42, 0xc8, 0x23, 0x38, 0x10,
+  0x30, 0x8c, 0x40, 0x0c, 0x33, 0xb5, 0xc1, 0x38, 0xb0, 0x43, 0x38, 0xcc,
+  0xc3, 0x3c, 0xb8, 0x01, 0x2d, 0x94, 0x03, 0x3e, 0xd0, 0x43, 0x3d, 0xc8,
+  0x43, 0x39, 0xc8, 0x01, 0x29, 0xf0, 0x81, 0x3d, 0x94, 0xc3, 0x38, 0xd0,
+  0xc3, 0x3b, 0xc8, 0x03, 0x1f, 0x98, 0x03, 0x3b, 0xbc, 0x43, 0x38, 0xd0,
+  0x03, 0x1b, 0x80, 0x01, 0x1d, 0xf8, 0x01, 0x18, 0xf8, 0x81, 0x1e, 0xe8,
+  0x41, 0x3b, 0xa4, 0x03, 0x3c, 0xcc, 0xc3, 0x2f, 0xd0, 0x43, 0x3e, 0xc0,
+  0x43, 0x39, 0xa0, 0x80, 0xcc, 0x24, 0x06, 0xe3, 0xc0, 0x0e, 0xe1, 0x30,
+  0x0f, 0xf3, 0xe0, 0x06, 0xb4, 0x50, 0x0e, 0xf8, 0x40, 0x0f, 0xf5, 0x20,
+  0x0f, 0xe5, 0x20, 0x07, 0xa4, 0xc0, 0x07, 0xf6, 0x50, 0x0e, 0xe3, 0x40,
+  0x0f, 0xef, 0x20, 0x0f, 0x7c, 0x60, 0x0e, 0xec, 0xf0, 0x0e, 0xe1, 0x40,
+  0x0f, 0x6c, 0x00, 0x06, 0x74, 0xe0, 0x07, 0x60, 0xe0, 0x07, 0x48, 0x98,
+  0x94, 0xea, 0x4d, 0xd2, 0x14, 0x51, 0xc2, 0xe4, 0xb3, 0x00, 0xf3, 0x2c,
+  0x44, 0xc4, 0x4e, 0xc0, 0x44, 0xa0, 0x80, 0xd0, 0x4d, 0x04, 0x02, 0x00,
+  0x13, 0x14, 0x72, 0xc0, 0x87, 0x74, 0x60, 0x87, 0x36, 0x68, 0x87, 0x79,
+  0x68, 0x03, 0x72, 0xc0, 0x87, 0x0d, 0xaf, 0x50, 0x0e, 0x6d, 0xd0, 0x0e,
+  0x7a, 0x50, 0x0e, 0x6d, 0x00, 0x0f, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07,
+  0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0xa0, 0x07, 0x73, 0x20, 0x07,
+  0x6d, 0x90, 0x0e, 0x78, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e,
+  0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe9, 0x30, 0x07,
+  0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x76, 0x40, 0x07,
+  0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe6, 0x10, 0x07, 0x76, 0xa0, 0x07,
+  0x73, 0x20, 0x07, 0x6d, 0x60, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07,
+  0x72, 0xd0, 0x06, 0xe6, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07,
+  0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07,
+  0x72, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x43, 0x9e, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x3c, 0x06, 0x10, 0x00,
+  0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x79, 0x10, 0x20,
+  0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xf2, 0x34,
+  0x40, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xe4,
+  0x81, 0x80, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
+  0x0b, 0x04, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x14,
+  0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0x22,
+  0x25, 0x30, 0x02, 0x50, 0x12, 0xc5, 0x50, 0x04, 0x65, 0x50, 0x1e, 0x54,
+  0x4a, 0x62, 0x04, 0xa0, 0x08, 0x0a, 0xa1, 0x40, 0xc8, 0xce, 0x00, 0x10,
+  0x9e, 0x01, 0xa0, 0x3c, 0x16, 0x62, 0x10, 0x81, 0x40, 0x20, 0xcf, 0x03,
+  0x79, 0x18, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x90,
+  0x46, 0x02, 0x13, 0x44, 0x8f, 0x0c, 0x6f, 0xec, 0xed, 0x4d, 0x0c, 0x24,
+  0xc6, 0x05, 0xc7, 0x45, 0xa6, 0x06, 0xa6, 0xc6, 0x45, 0x06, 0x07, 0x04,
+  0x25, 0xa7, 0xcc, 0x4c, 0x4c, 0xcc, 0x66, 0x6c, 0x46, 0x26, 0x65, 0x43,
+  0x10, 0x4c, 0x10, 0x88, 0x62, 0x82, 0x40, 0x18, 0x1b, 0x84, 0x81, 0x98,
+  0x20, 0x10, 0xc7, 0x06, 0x61, 0x30, 0x28, 0xc0, 0xcd, 0x4d, 0x10, 0x08,
+  0x64, 0xc3, 0x80, 0x24, 0xc4, 0x04, 0xc1, 0x8a, 0x08, 0x4c, 0x10, 0x88,
+  0x64, 0x83, 0x40, 0x18, 0x1b, 0x12, 0x62, 0x61, 0x1a, 0x62, 0x68, 0x08,
+  0x67, 0x43, 0x32, 0x2c, 0x4c, 0x33, 0x0c, 0x0d, 0xe1, 0x6c, 0x10, 0x1e,
+  0x68, 0x82, 0x80, 0x49, 0x1b, 0x10, 0x42, 0x62, 0x1a, 0x62, 0x20, 0x80,
+  0x0d, 0xc8, 0x20, 0x31, 0xcd, 0x30, 0x10, 0xc0, 0x06, 0x61, 0xa2, 0x36,
+  0x10, 0x11, 0x00, 0x54, 0x13, 0x84, 0x6c, 0xda, 0x10, 0x5c, 0x13, 0x04,
+  0x01, 0x20, 0xd1, 0x16, 0x96, 0xe6, 0x46, 0x84, 0xaa, 0x08, 0x6b, 0xe8,
+  0xe9, 0x49, 0x8a, 0x68, 0x82, 0x50, 0x30, 0x13, 0x84, 0xa2, 0xd9, 0x10,
+  0x10, 0x13, 0x84, 0xc2, 0x99, 0x20, 0x14, 0xcf, 0x04, 0x81, 0x50, 0x26,
+  0x08, 0xc4, 0xb2, 0x41, 0x08, 0x03, 0x31, 0xd8, 0xb0, 0x10, 0x1b, 0xd7,
+  0x79, 0xdf, 0x00, 0x06, 0x44, 0x37, 0x06, 0x1b, 0x82, 0x61, 0x83, 0x10,
+  0x06, 0x61, 0xb0, 0x61, 0x19, 0x36, 0xae, 0x2b, 0x83, 0x6f, 0xf8, 0x86,
+  0xce, 0x0c, 0x36, 0x08, 0x64, 0x70, 0x06, 0x4c, 0xa6, 0xac, 0xbe, 0xa8,
+  0xc2, 0xe4, 0xce, 0xca, 0xe8, 0x26, 0x08, 0x05, 0xb4, 0x61, 0x21, 0xd2,
+  0x80, 0x53, 0x03, 0xaf, 0x1b, 0xc0, 0x80, 0xe8, 0xc6, 0x60, 0x43, 0xb0,
+  0x06, 0x1b, 0x06, 0x34, 0x60, 0x03, 0x60, 0x43, 0x91, 0x69, 0x6d, 0x60,
+  0x01, 0x55, 0xd8, 0xd8, 0xec, 0xda, 0x5c, 0xd2, 0xc8, 0xca, 0xdc, 0xe8,
+  0xa6, 0x04, 0x41, 0x15, 0x32, 0x3c, 0x17, 0xbb, 0x32, 0xb9, 0xb9, 0xb4,
+  0x37, 0xb7, 0x29, 0x01, 0xd1, 0x84, 0x0c, 0xcf, 0xc5, 0x2e, 0x8c, 0xcd,
+  0xae, 0x4c, 0x6e, 0x4a, 0x60, 0xd4, 0x21, 0xc3, 0x73, 0x99, 0x43, 0x0b,
+  0x23, 0x2b, 0x93, 0x6b, 0x7a, 0x23, 0x2b, 0x63, 0x9b, 0x12, 0x24, 0x65,
+  0xc8, 0xf0, 0x5c, 0xe4, 0xca, 0xe6, 0xde, 0xea, 0xe4, 0xc6, 0xca, 0xe6,
+  0xa6, 0x04, 0x55, 0x1d, 0x32, 0x3c, 0x17, 0xbb, 0xb4, 0xb2, 0xbb, 0x24,
+  0xb2, 0x29, 0xba, 0x30, 0xba, 0xb2, 0x29, 0xc1, 0x55, 0x87, 0x0c, 0xcf,
+  0xa5, 0xcc, 0x8d, 0x4e, 0x2e, 0x0f, 0xea, 0x2d, 0xcd, 0x8d, 0x6e, 0x6e,
+  0x4a, 0xd0, 0x06, 0x00, 0x79, 0x18, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00,
+  0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88,
+  0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73,
+  0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e,
+  0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, 0x30,
+  0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, 0xc8,
+  0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b,
+  0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, 0x76,
+  0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e,
+  0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e,
+  0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61,
+  0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xb4,
+  0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, 0x76,
+  0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, 0x37,
+  0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76,
+  0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, 0x71,
+  0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e,
+  0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1,
+  0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61,
+  0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, 0x90,
+  0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, 0xb8,
+  0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc,
+  0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x8c, 0xc8,
+  0x21, 0x07, 0x7c, 0x70, 0x03, 0x72, 0x10, 0x87, 0x73, 0x70, 0x03, 0x7b,
+  0x08, 0x07, 0x79, 0x60, 0x87, 0x70, 0xc8, 0x87, 0x77, 0xa8, 0x07, 0x7a,
+  0x98, 0x81, 0x3c, 0xe4, 0x80, 0x0f, 0x6e, 0x40, 0x0f, 0xe5, 0xd0, 0x0e,
+  0xf0, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00,
+  0x46, 0x20, 0x0d, 0x97, 0xef, 0x3c, 0xbe, 0x10, 0x11, 0xc0, 0x44, 0x84,
+  0x40, 0x33, 0x2c, 0x84, 0x05, 0x4c, 0xc3, 0xe5, 0x3b, 0x8f, 0xbf, 0x38,
+  0xc0, 0x20, 0x36, 0x0f, 0x35, 0xf9, 0xc5, 0x6d, 0xdb, 0x00, 0x34, 0x5c,
+  0xbe, 0xf3, 0xf8, 0x12, 0xc0, 0x3c, 0x0b, 0xe1, 0x17, 0xb7, 0x6d, 0x02,
+  0xd5, 0x70, 0xf9, 0xce, 0xe3, 0x4b, 0x93, 0x13, 0x11, 0x28, 0x35, 0x3d,
+  0xd4, 0xe4, 0x17, 0xb7, 0x6d, 0x00, 0x04, 0x03, 0x20, 0x0d, 0x00, 0x00,
+  0x61, 0x20, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, 0x2c,
+  0x10, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0xf4, 0x46, 0x00, 0xa8,
+  0x94, 0x40, 0x19, 0x10, 0x29, 0xbc, 0x19, 0x80, 0x42, 0x28, 0xb9, 0x52,
+  0xa0, 0x31, 0x46, 0x00, 0x82, 0x20, 0x08, 0x7f, 0x63, 0x04, 0x20, 0x08,
+  0x82, 0x70, 0x37, 0x46, 0x00, 0x82, 0xa0, 0x7f, 0x7f, 0x33, 0x00, 0x00,
+  0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x00, 0x71, 0xc6, 0xb4, 0x6d, 0xcc,
+  0x88, 0x41, 0x02, 0x80, 0x20, 0x18, 0x40, 0xdd, 0x41, 0x6d, 0x5b, 0x33,
+  0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0x90, 0x87, 0x30, 0x5d, 0xe7, 0x8c,
+  0x18, 0x24, 0x00, 0x08, 0x82, 0x01, 0xf4, 0x25, 0x4d, 0xd7, 0x3d, 0x23,
+  0x06, 0x09, 0x00, 0x82, 0x60, 0x60, 0x8c, 0xc1, 0xf2, 0x79, 0x17, 0x33,
+  0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0x06, 0x19, 0x30, 0x60, 0xf0, 0x41,
+  0xcd, 0x88, 0x41, 0x02, 0x80, 0x20, 0x18, 0x18, 0x65, 0xd0, 0x80, 0x01,
+  0x18, 0x64, 0xce, 0x88, 0x41, 0x02, 0x80, 0x20, 0x18, 0x18, 0x66, 0xe0,
+  0x84, 0x41, 0x18, 0x48, 0xcf, 0x88, 0x41, 0x02, 0x80, 0x20, 0x18, 0x18,
+  0x67, 0xf0, 0x88, 0x81, 0x18, 0x68, 0xd0, 0x88, 0x41, 0x02, 0x80, 0x20,
+  0x18, 0x18, 0x68, 0x00, 0x8d, 0xc1, 0x18, 0x4c, 0xd1, 0x88, 0xc1, 0x03,
+  0x80, 0x20, 0x18, 0x34, 0x67, 0x30, 0x25, 0x87, 0x51, 0x2c, 0x0b, 0x19,
+  0x90, 0x81, 0xb4, 0x8c, 0x26, 0x04, 0x80, 0x05, 0x8e, 0x7c, 0x2c, 0x80,
+  0xe0, 0x33, 0x62, 0xf0, 0x00, 0x20, 0x08, 0x06, 0xcd, 0x1a, 0x5c, 0x0e,
+  0x13, 0x48, 0xcf, 0x83, 0x06, 0x68, 0x60, 0x3d, 0xa3, 0x09, 0x01, 0x30,
+  0x9a, 0x20, 0x04, 0xa3, 0x09, 0x83, 0x30, 0x9a, 0x40, 0x0c, 0x46, 0x34,
+  0xf2, 0x31, 0xa2, 0x91, 0x8f, 0x11, 0x8d, 0x7c, 0x8c, 0x68, 0xe4, 0x33,
+  0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0x48, 0x1d, 0x70, 0x71, 0x10, 0x07,
+  0x6a, 0x40, 0x8c, 0x18, 0x24, 0x00, 0x08, 0x82, 0x01, 0x52, 0x07, 0x5c,
+  0x1c, 0xc4, 0x81, 0x18, 0x0c, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x80,
+  0xd4, 0x01, 0x17, 0x07, 0x71, 0x90, 0x06, 0xc2, 0x88, 0x41, 0x02, 0x80,
+  0x20, 0x18, 0x20, 0x75, 0xc0, 0xc5, 0x41, 0x1c, 0x84, 0x41, 0x80, 0x00,
+  0x00, 0x00, 0x00, 0x00
+};
+static const unsigned int texture_palette_frag_dxil_len = 4048;

+ 21 - 0
src/render/gpu/shaders/texture_palette.frag.hlsl

@@ -0,0 +1,21 @@
+Texture2D u_texture : register(t0, space2);
+Texture2D u_palette : register(t1, space2);
+SamplerState u_sampler1 : register(s0, space2);
+SamplerState u_sampler2 : register(s1, space2);
+
+struct PSInput {
+    float4 v_color : COLOR0;
+    float2 v_uv : TEXCOORD0;
+};
+
+struct PSOutput {
+    float4 o_color : SV_Target;
+};
+
+PSOutput main(PSInput input) {
+    PSOutput output;
+    float index = u_texture.Sample(u_sampler1, input.v_uv).r * 255;
+    float4 color = u_palette.Sample(u_sampler2, float2((index + 0.5) / 256, 0.5));
+    output.o_color = color * input.v_color;
+    return output;
+}

+ 60 - 0
src/render/gpu/shaders/texture_palette.frag.msl.h

@@ -0,0 +1,60 @@
+static const unsigned char texture_palette_frag_msl[] = {
+  0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x6d, 0x65,
+  0x74, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x64, 0x6c, 0x69, 0x62, 0x3e, 0x0a,
+  0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x73, 0x69,
+  0x6d, 0x64, 0x2f, 0x73, 0x69, 0x6d, 0x64, 0x2e, 0x68, 0x3e, 0x0a, 0x0a,
+  0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70,
+  0x61, 0x63, 0x65, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x3b, 0x0a, 0x0a,
+  0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30,
+  0x5f, 0x6f, 0x75, 0x74, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66,
+  0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x6f, 0x75, 0x74, 0x5f, 0x76, 0x61,
+  0x72, 0x5f, 0x53, 0x56, 0x5f, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20,
+  0x5b, 0x5b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x30, 0x29, 0x5d, 0x5d,
+  0x3b, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74,
+  0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x69, 0x6e, 0x0a, 0x7b, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x69,
+  0x6e, 0x5f, 0x76, 0x61, 0x72, 0x5f, 0x43, 0x4f, 0x4c, 0x4f, 0x52, 0x30,
+  0x20, 0x5b, 0x5b, 0x75, 0x73, 0x65, 0x72, 0x28, 0x6c, 0x6f, 0x63, 0x6e,
+  0x30, 0x29, 0x5d, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c,
+  0x6f, 0x61, 0x74, 0x32, 0x20, 0x69, 0x6e, 0x5f, 0x76, 0x61, 0x72, 0x5f,
+  0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x30, 0x20, 0x5b, 0x5b,
+  0x75, 0x73, 0x65, 0x72, 0x28, 0x6c, 0x6f, 0x63, 0x6e, 0x31, 0x29, 0x5d,
+  0x5d, 0x3b, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x66, 0x72, 0x61, 0x67, 0x6d,
+  0x65, 0x6e, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75,
+  0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x28, 0x6d, 0x61, 0x69, 0x6e,
+  0x30, 0x5f, 0x69, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x5b, 0x5b, 0x73, 0x74,
+  0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x5d, 0x5d, 0x2c, 0x20, 0x74, 0x65,
+  0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x64, 0x3c, 0x66, 0x6c, 0x6f, 0x61,
+  0x74, 0x3e, 0x20, 0x75, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65,
+  0x20, 0x5b, 0x5b, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x30,
+  0x29, 0x5d, 0x5d, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65,
+  0x32, 0x64, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, 0x75, 0x5f,
+  0x70, 0x61, 0x6c, 0x65, 0x74, 0x74, 0x65, 0x20, 0x5b, 0x5b, 0x74, 0x65,
+  0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x31, 0x29, 0x5d, 0x5d, 0x2c, 0x20,
+  0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x75, 0x5f, 0x73, 0x61,
+  0x6d, 0x70, 0x6c, 0x65, 0x72, 0x31, 0x20, 0x5b, 0x5b, 0x73, 0x61, 0x6d,
+  0x70, 0x6c, 0x65, 0x72, 0x28, 0x30, 0x29, 0x5d, 0x5d, 0x2c, 0x20, 0x73,
+  0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x75, 0x5f, 0x73, 0x61, 0x6d,
+  0x70, 0x6c, 0x65, 0x72, 0x32, 0x20, 0x5b, 0x5b, 0x73, 0x61, 0x6d, 0x70,
+  0x6c, 0x65, 0x72, 0x28, 0x31, 0x29, 0x5d, 0x5d, 0x29, 0x0a, 0x7b, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75,
+  0x74, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x3b, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x6f, 0x75, 0x74, 0x5f,
+  0x76, 0x61, 0x72, 0x5f, 0x53, 0x56, 0x5f, 0x54, 0x61, 0x72, 0x67, 0x65,
+  0x74, 0x20, 0x3d, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x6c, 0x65, 0x74, 0x74,
+  0x65, 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x28, 0x75, 0x5f, 0x73,
+  0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x2c, 0x20, 0x66, 0x6c, 0x6f,
+  0x61, 0x74, 0x32, 0x28, 0x28, 0x28, 0x75, 0x5f, 0x74, 0x65, 0x78, 0x74,
+  0x75, 0x72, 0x65, 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x28, 0x75,
+  0x5f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x31, 0x2c, 0x20, 0x69,
+  0x6e, 0x2e, 0x69, 0x6e, 0x5f, 0x76, 0x61, 0x72, 0x5f, 0x54, 0x45, 0x58,
+  0x43, 0x4f, 0x4f, 0x52, 0x44, 0x30, 0x29, 0x2e, 0x78, 0x20, 0x2a, 0x20,
+  0x32, 0x35, 0x35, 0x2e, 0x30, 0x29, 0x20, 0x2b, 0x20, 0x30, 0x2e, 0x35,
+  0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x33, 0x39, 0x30, 0x36,
+  0x32, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x29, 0x20, 0x2a, 0x20,
+  0x69, 0x6e, 0x2e, 0x69, 0x6e, 0x5f, 0x76, 0x61, 0x72, 0x5f, 0x43, 0x4f,
+  0x4c, 0x4f, 0x52, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65,
+  0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x75, 0x74, 0x3b, 0x0a, 0x7d, 0x0a,
+  0x0a
+};
+static const unsigned int texture_palette_frag_msl_len = 673;

+ 106 - 0
src/render/gpu/shaders/texture_palette.frag.spv.h

@@ -0,0 +1,106 @@
+static const unsigned char texture_palette_frag_spv[] = {
+  0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0e, 0x00,
+  0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x02, 0x00,
+  0x01, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00,
+  0x01, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x69, 0x6e, 0x00, 0x00, 0x00, 0x00,
+  0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
+  0x10, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
+  0x03, 0x00, 0x03, 0x00, 0x05, 0x00, 0x00, 0x00, 0x58, 0x02, 0x00, 0x00,
+  0x05, 0x00, 0x06, 0x00, 0x05, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65,
+  0x2e, 0x32, 0x64, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x00, 0x00, 0x00,
+  0x05, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x75, 0x5f, 0x74, 0x65,
+  0x78, 0x74, 0x75, 0x72, 0x65, 0x00, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00,
+  0x07, 0x00, 0x00, 0x00, 0x75, 0x5f, 0x70, 0x61, 0x6c, 0x65, 0x74, 0x74,
+  0x65, 0x00, 0x00, 0x00, 0x05, 0x00, 0x06, 0x00, 0x08, 0x00, 0x00, 0x00,
+  0x74, 0x79, 0x70, 0x65, 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72,
+  0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, 0x09, 0x00, 0x00, 0x00,
+  0x75, 0x5f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x31, 0x00, 0x00,
+  0x05, 0x00, 0x05, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x75, 0x5f, 0x73, 0x61,
+  0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x00, 0x00, 0x05, 0x00, 0x06, 0x00,
+  0x02, 0x00, 0x00, 0x00, 0x69, 0x6e, 0x2e, 0x76, 0x61, 0x72, 0x2e, 0x43,
+  0x4f, 0x4c, 0x4f, 0x52, 0x30, 0x00, 0x00, 0x00, 0x05, 0x00, 0x07, 0x00,
+  0x03, 0x00, 0x00, 0x00, 0x69, 0x6e, 0x2e, 0x76, 0x61, 0x72, 0x2e, 0x54,
+  0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x30, 0x00, 0x00, 0x00, 0x00,
+  0x05, 0x00, 0x07, 0x00, 0x04, 0x00, 0x00, 0x00, 0x6f, 0x75, 0x74, 0x2e,
+  0x76, 0x61, 0x72, 0x2e, 0x53, 0x56, 0x5f, 0x54, 0x61, 0x72, 0x67, 0x65,
+  0x74, 0x00, 0x00, 0x00, 0x05, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00,
+  0x6d, 0x61, 0x69, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x07, 0x00,
+  0x0b, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x73, 0x61, 0x6d,
+  0x70, 0x6c, 0x65, 0x64, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x00, 0x00,
+  0x47, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x03, 0x00, 0x00, 0x00,
+  0x1e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00,
+  0x04, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x47, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00,
+  0x02, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00,
+  0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00,
+  0x07, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+  0x47, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00,
+  0x01, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x09, 0x00, 0x00, 0x00,
+  0x22, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00,
+  0x09, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x47, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00,
+  0x02, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x00, 0x00,
+  0x21, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x16, 0x00, 0x03, 0x00,
+  0x0c, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00,
+  0x0c, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x43,
+  0x2b, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x3f, 0x19, 0x00, 0x09, 0x00, 0x05, 0x00, 0x00, 0x00,
+  0x0c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x02, 0x00,
+  0x08, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x10, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x17, 0x00, 0x04, 0x00,
+  0x11, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
+  0x20, 0x00, 0x04, 0x00, 0x12, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+  0x11, 0x00, 0x00, 0x00, 0x17, 0x00, 0x04, 0x00, 0x13, 0x00, 0x00, 0x00,
+  0x0c, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00,
+  0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00,
+  0x20, 0x00, 0x04, 0x00, 0x15, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+  0x11, 0x00, 0x00, 0x00, 0x13, 0x00, 0x02, 0x00, 0x16, 0x00, 0x00, 0x00,
+  0x21, 0x00, 0x03, 0x00, 0x17, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00,
+  0x1b, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
+  0x3b, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x00, 0x00,
+  0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00,
+  0x10, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x3b, 0x00, 0x04, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x12, 0x00, 0x00, 0x00,
+  0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00,
+  0x14, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+  0x3b, 0x00, 0x04, 0x00, 0x15, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
+  0x03, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00,
+  0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3b, 0x36, 0x00, 0x05, 0x00,
+  0x16, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x17, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x02, 0x00, 0x19, 0x00, 0x00, 0x00,
+  0x3d, 0x00, 0x04, 0x00, 0x11, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00,
+  0x02, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x13, 0x00, 0x00, 0x00,
+  0x1b, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00,
+  0x05, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
+  0x3d, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00,
+  0x09, 0x00, 0x00, 0x00, 0x56, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x00, 0x00,
+  0x1e, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00,
+  0x57, 0x00, 0x06, 0x00, 0x11, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00,
+  0x1e, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x51, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
+  0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x00, 0x05, 0x00,
+  0x0c, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
+  0x0d, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x05, 0x00, 0x00, 0x00,
+  0x22, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00,
+  0x08, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00,
+  0x81, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00,
+  0x21, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x85, 0x00, 0x05, 0x00,
+  0x0c, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00,
+  0x18, 0x00, 0x00, 0x00, 0x50, 0x00, 0x05, 0x00, 0x13, 0x00, 0x00, 0x00,
+  0x26, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00,
+  0x56, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00,
+  0x22, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x57, 0x00, 0x06, 0x00,
+  0x11, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00,
+  0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x00, 0x05, 0x00,
+  0x11, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00,
+  0x1a, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00,
+  0x29, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x01, 0x00, 0x38, 0x00, 0x01, 0x00
+};
+static const unsigned int texture_palette_frag_spv_len = 1236;

+ 426 - 0
src/render/gpu/shaders/texture_palette_pixelart.frag.dxil.h

@@ -0,0 +1,426 @@
+static const unsigned char texture_palette_pixelart_frag_dxil[] = {
+  0x44, 0x58, 0x42, 0x43, 0xfc, 0xac, 0x96, 0xa0, 0x23, 0xe7, 0x88, 0xda,
+  0x37, 0xdd, 0x85, 0x27, 0x01, 0x50, 0x7b, 0xe3, 0x01, 0x00, 0x00, 0x00,
+  0xd0, 0x13, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00,
+  0x4c, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0x00,
+  0x20, 0x02, 0x00, 0x00, 0xe4, 0x09, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00,
+  0x53, 0x46, 0x49, 0x30, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x49, 0x53, 0x47, 0x31, 0x54, 0x00, 0x00, 0x00,
+  0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00,
+  0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+  0x01, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x00, 0x00, 0x00, 0x00,
+  0x4f, 0x53, 0x47, 0x31, 0x34, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+  0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x53, 0x56, 0x5f, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x00, 0x00, 0x00,
+  0x50, 0x53, 0x56, 0x30, 0x34, 0x01, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
+  0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x13, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
+  0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+  0x01, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+  0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x18, 0x00, 0x00, 0x00, 0x00, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52,
+  0x44, 0x00, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x00, 0x6d,
+  0x61, 0x69, 0x6e, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x44, 0x00, 0x03, 0x02, 0x00, 0x00,
+  0x0a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x42, 0x00,
+  0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x01, 0x00, 0x44, 0x10, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+  0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
+  0x0f, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x53, 0x54, 0x41, 0x54, 0xbc, 0x07, 0x00, 0x00,
+  0x60, 0x00, 0x00, 0x00, 0xef, 0x01, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4c,
+  0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xa4, 0x07, 0x00, 0x00,
+  0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0xe6, 0x01, 0x00, 0x00,
+  0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00,
+  0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39,
+  0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62,
+  0x80, 0x18, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0xc4, 0x10, 0x32, 0x14,
+  0x38, 0x08, 0x18, 0x4b, 0x0a, 0x32, 0x62, 0x88, 0x48, 0x90, 0x14, 0x20,
+  0x43, 0x46, 0x88, 0xa5, 0x00, 0x19, 0x32, 0x42, 0xe4, 0x48, 0x0e, 0x90,
+  0x11, 0x23, 0xc4, 0x50, 0x41, 0x51, 0x81, 0x8c, 0xe1, 0x83, 0xe5, 0x8a,
+  0x04, 0x31, 0x46, 0x06, 0x51, 0x18, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
+  0x1b, 0x8c, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x07, 0x40, 0x02, 0xa8, 0x0d,
+  0x84, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x03, 0x20, 0x6d, 0x30, 0x86, 0xff,
+  0xff, 0xff, 0xff, 0x1f, 0x00, 0x09, 0xa8, 0x00, 0x49, 0x18, 0x00, 0x00,
+  0x03, 0x00, 0x00, 0x00, 0x13, 0x82, 0x60, 0x42, 0x20, 0x4c, 0x08, 0x06,
+  0x00, 0x00, 0x00, 0x00, 0x89, 0x20, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00,
+  0x32, 0x22, 0x88, 0x09, 0x20, 0x64, 0x85, 0x04, 0x13, 0x23, 0xa4, 0x84,
+  0x04, 0x13, 0x23, 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8c, 0x8c,
+  0x0b, 0x84, 0xc4, 0x4c, 0x10, 0x94, 0xc1, 0x08, 0x40, 0x09, 0x00, 0x0a,
+  0x66, 0x00, 0xe6, 0x08, 0xc0, 0x60, 0x8e, 0x00, 0x29, 0xc6, 0x40, 0x10,
+  0x44, 0x41, 0x90, 0x51, 0x0c, 0x80, 0x20, 0x88, 0x62, 0x20, 0xa4, 0x0c,
+  0x03, 0x31, 0x90, 0x52, 0x88, 0x81, 0x18, 0x06, 0x62, 0x6e, 0x1a, 0x2e,
+  0x7f, 0xc2, 0x1e, 0x42, 0xf2, 0x57, 0x42, 0x5a, 0x89, 0xc9, 0x2f, 0x6e,
+  0x1b, 0x15, 0xc3, 0x30, 0x0c, 0x04, 0x15, 0xf7, 0x0c, 0x97, 0x3f, 0x61,
+  0x0f, 0x21, 0xf9, 0x21, 0xd0, 0x0c, 0x0b, 0x81, 0x82, 0xa7, 0x30, 0x0e,
+  0x01, 0x41, 0xc3, 0x30, 0x0c, 0x04, 0x41, 0x0c, 0x14, 0x15, 0xc9, 0x21,
+  0x20, 0x68, 0x18, 0x86, 0x81, 0x20, 0x88, 0x61, 0x18, 0x86, 0x61, 0x18,
+  0x68, 0x3a, 0x6a, 0xb8, 0xfc, 0x09, 0x7b, 0x08, 0xc9, 0xe7, 0x36, 0xaa,
+  0x58, 0x89, 0xc9, 0x2f, 0x6e, 0x1b, 0x11, 0xc3, 0x30, 0x0c, 0x85, 0xa8,
+  0x08, 0x88, 0x20, 0x6b, 0x8e, 0x20, 0x28, 0x06, 0x44, 0x14, 0x04, 0x81,
+  0x51, 0x36, 0x10, 0x30, 0x8c, 0x40, 0x0c, 0x33, 0xb5, 0xc1, 0x38, 0xb0,
+  0x43, 0x38, 0xcc, 0xc3, 0x3c, 0xb8, 0x01, 0x2d, 0x94, 0x03, 0x3e, 0xd0,
+  0x43, 0x3d, 0xc8, 0x43, 0x39, 0xc8, 0x01, 0x29, 0xf0, 0x81, 0x3d, 0x94,
+  0xc3, 0x38, 0xd0, 0xc3, 0x3b, 0xc8, 0x03, 0x1f, 0x98, 0x03, 0x3b, 0xbc,
+  0x43, 0x38, 0xd0, 0x03, 0x1b, 0x80, 0x01, 0x1d, 0xf8, 0x01, 0x18, 0xf8,
+  0x81, 0x1e, 0xe8, 0x41, 0x3b, 0xa4, 0x03, 0x3c, 0xcc, 0xc3, 0x2f, 0xd0,
+  0x43, 0x3e, 0xc0, 0x43, 0x39, 0xa0, 0x80, 0x98, 0x49, 0x0c, 0xc6, 0x81,
+  0x1d, 0xc2, 0x61, 0x1e, 0xe6, 0xc1, 0x0d, 0x68, 0xa1, 0x1c, 0xf0, 0x81,
+  0x1e, 0xea, 0x41, 0x1e, 0xca, 0x41, 0x0e, 0x48, 0x81, 0x0f, 0xec, 0xa1,
+  0x1c, 0xc6, 0x81, 0x1e, 0xde, 0x41, 0x1e, 0xf8, 0xc0, 0x1c, 0xd8, 0xe1,
+  0x1d, 0xc2, 0x81, 0x1e, 0xd8, 0x00, 0x0c, 0xe8, 0xc0, 0x0f, 0xc0, 0xc0,
+  0x0f, 0x90, 0xc0, 0x75, 0xe4, 0x1d, 0x33, 0x61, 0x0f, 0xf1, 0x73, 0x4e,
+  0x33, 0x11, 0xd7, 0x84, 0x02, 0x8e, 0xc0, 0x9b, 0xa4, 0x29, 0xa2, 0x84,
+  0xc9, 0x67, 0x01, 0xe6, 0x59, 0x88, 0x88, 0x9d, 0x80, 0x89, 0x40, 0x01,
+  0x41, 0x62, 0x22, 0x10, 0x00, 0x00, 0x00, 0x00, 0x13, 0x14, 0x72, 0xc0,
+  0x87, 0x74, 0x60, 0x87, 0x36, 0x68, 0x87, 0x79, 0x68, 0x03, 0x72, 0xc0,
+  0x87, 0x0d, 0xaf, 0x50, 0x0e, 0x6d, 0xd0, 0x0e, 0x7a, 0x50, 0x0e, 0x6d,
+  0x00, 0x0f, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d,
+  0x90, 0x0e, 0x71, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x78,
+  0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0x60, 0x07, 0x7a,
+  0x30, 0x07, 0x72, 0xd0, 0x06, 0xe9, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73,
+  0x20, 0x07, 0x6d, 0x90, 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74,
+  0xd0, 0x06, 0xe6, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d,
+  0x60, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe6,
+  0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0xe0, 0x0e, 0x78,
+  0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x76,
+  0x40, 0x07, 0x43, 0x9e, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x86, 0x3c, 0x06, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x0c, 0x79, 0x10, 0x20, 0x00, 0x04, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xf2, 0x28, 0x40, 0x00, 0x04, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xe4, 0x61, 0x80, 0x00, 0x08,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xc8, 0x13, 0x01, 0x01,
+  0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x90, 0x67, 0x02,
+  0x02, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x21, 0x8f,
+  0x05, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43,
+  0x9e, 0x0c, 0x08, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0xb2, 0x40, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x18,
+  0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0x22,
+  0x4a, 0x60, 0x04, 0xa0, 0x18, 0x8a, 0xa0, 0x24, 0xca, 0xa0, 0x40, 0xca,
+  0xa1, 0x34, 0x0a, 0xa1, 0x3c, 0x8a, 0xac, 0x48, 0x03, 0xa8, 0x28, 0x89,
+  0x11, 0x80, 0x22, 0x28, 0x84, 0x02, 0xa1, 0x6f, 0x06, 0x80, 0xc0, 0x19,
+  0x00, 0x0a, 0x67, 0x00, 0x68, 0x9c, 0x01, 0x20, 0x72, 0x2c, 0xc4, 0x20,
+  0x02, 0x81, 0x40, 0x9e, 0x07, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00,
+  0x9f, 0x00, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0x44,
+  0x8f, 0x0c, 0x6f, 0xec, 0xed, 0x4d, 0x0c, 0x24, 0xc6, 0x05, 0xc7, 0x45,
+  0xa6, 0x06, 0xa6, 0xc6, 0x45, 0x06, 0x07, 0x04, 0x25, 0xa7, 0xcc, 0x4c,
+  0x4c, 0xcc, 0x66, 0x6c, 0x46, 0x26, 0x65, 0x43, 0x10, 0x4c, 0x10, 0x88,
+  0x64, 0x82, 0x40, 0x28, 0x1b, 0x84, 0x81, 0xd8, 0x20, 0x10, 0x04, 0x05,
+  0xb8, 0xb9, 0x09, 0x02, 0xb1, 0x6c, 0x18, 0x0e, 0x84, 0x98, 0x20, 0x7c,
+  0x1b, 0x93, 0xba, 0x2f, 0xba, 0x32, 0x3c, 0xba, 0x3a, 0xb9, 0xb2, 0x09,
+  0x02, 0xc1, 0x4c, 0x10, 0x88, 0x66, 0x83, 0x40, 0x34, 0x1b, 0x12, 0x42,
+  0x59, 0x18, 0x62, 0x60, 0x08, 0x87, 0x49, 0xdd, 0x17, 0x5c, 0x18, 0x5b,
+  0x19, 0x1d, 0x5d, 0xd9, 0x86, 0x64, 0x50, 0x20, 0x66, 0x18, 0x18, 0xc2,
+  0xd9, 0x20, 0x3c, 0xd1, 0x04, 0x21, 0x0c, 0x3a, 0x32, 0x74, 0x79, 0x70,
+  0x65, 0x5f, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x13, 0x04, 0xc2,
+  0x99, 0x20, 0x10, 0xcf, 0x06, 0x84, 0x98, 0xa8, 0x8a, 0x18, 0x2c, 0x60,
+  0x43, 0x70, 0x4d, 0x10, 0xc6, 0xc0, 0xa3, 0x52, 0xf7, 0x35, 0x17, 0xd6,
+  0x06, 0xc7, 0x56, 0x26, 0x17, 0xb3, 0x01, 0x21, 0x32, 0x8d, 0x21, 0x06,
+  0x02, 0xa0, 0x52, 0xf7, 0x35, 0x17, 0xd6, 0x06, 0xc7, 0x56, 0x26, 0x27,
+  0xb3, 0x01, 0x19, 0x32, 0x8e, 0x19, 0x06, 0x02, 0xd8, 0x20, 0x6c, 0xdd,
+  0x06, 0x42, 0x02, 0x30, 0x6f, 0x82, 0x00, 0x06, 0x1c, 0xa5, 0xa1, 0x37,
+  0x37, 0xba, 0x32, 0x3c, 0xba, 0x2f, 0xba, 0x32, 0xbc, 0x32, 0xb6, 0xaf,
+  0xb9, 0x34, 0xbd, 0xb2, 0x09, 0x02, 0x01, 0x4d, 0x10, 0x88, 0x68, 0x82,
+  0x40, 0x48, 0x1b, 0x10, 0x24, 0x0c, 0x2a, 0x42, 0x0c, 0x9a, 0x31, 0x20,
+  0x83, 0x0d, 0x82, 0x55, 0x06, 0x1b, 0x06, 0x02, 0x0c, 0xcc, 0x60, 0x82,
+  0x20, 0x00, 0x1b, 0x80, 0x0d, 0x03, 0x91, 0x06, 0x69, 0xb0, 0x21, 0x50,
+  0x83, 0x0d, 0xc3, 0x80, 0x06, 0x6b, 0x30, 0x41, 0x20, 0x83, 0x6f, 0x43,
+  0xd0, 0x06, 0x24, 0xda, 0xc2, 0xd2, 0xdc, 0x88, 0x50, 0x15, 0x61, 0x0d,
+  0x3d, 0x3d, 0x49, 0x11, 0x4d, 0x10, 0x0a, 0x6b, 0x82, 0x50, 0x5c, 0x1b,
+  0x02, 0x62, 0x82, 0x50, 0x60, 0x13, 0x84, 0x22, 0x9b, 0x20, 0x10, 0xd3,
+  0x06, 0xa1, 0xb2, 0x83, 0x0d, 0x0b, 0x01, 0x07, 0x71, 0x20, 0x07, 0x73,
+  0x40, 0x07, 0x43, 0x1d, 0x10, 0x72, 0x70, 0x07, 0x1b, 0x82, 0x61, 0x83,
+  0x50, 0x55, 0x1b, 0x96, 0x01, 0x0e, 0xe2, 0x40, 0x0e, 0xf2, 0x80, 0x0e,
+  0x06, 0x3a, 0x18, 0xe4, 0x40, 0x0f, 0x36, 0x08, 0x78, 0xb0, 0x07, 0x4c,
+  0xa6, 0xac, 0xbe, 0xa8, 0xc2, 0xe4, 0xce, 0xca, 0xe8, 0x26, 0x08, 0x85,
+  0xb6, 0x61, 0x21, 0xfa, 0x20, 0x0e, 0xfc, 0x60, 0x0e, 0xe4, 0x60, 0xa8,
+  0x03, 0x42, 0x0e, 0xee, 0x60, 0x43, 0xf0, 0x07, 0x1b, 0x06, 0x3e, 0x00,
+  0x05, 0x60, 0x43, 0x81, 0x06, 0x6f, 0x10, 0x0a, 0x1f, 0x40, 0xc3, 0x8c,
+  0xed, 0x2d, 0x8c, 0x6e, 0x6e, 0x82, 0x40, 0x50, 0x2c, 0xd2, 0xdc, 0xe6,
+  0xe8, 0xe6, 0x26, 0x08, 0x44, 0x45, 0x63, 0x2e, 0xed, 0xec, 0x8b, 0x8d,
+  0x8c, 0xc6, 0x5c, 0xda, 0xd9, 0xd7, 0x1c, 0x1d, 0x11, 0xba, 0x32, 0xbc,
+  0xaf, 0x33, 0xb9, 0x30, 0x32, 0x22, 0x74, 0x65, 0x78, 0x5f, 0x6e, 0x6f,
+  0x72, 0x6d, 0x1b, 0x98, 0x51, 0x20, 0x85, 0x52, 0x30, 0x85, 0x53, 0x40,
+  0x50, 0x81, 0x0c, 0x52, 0x61, 0x50, 0x85, 0xa1, 0x0a, 0x1b, 0x9b, 0x5d,
+  0x9b, 0x4b, 0x1a, 0x59, 0x99, 0x1b, 0xdd, 0x94, 0x20, 0xa8, 0x42, 0x86,
+  0xe7, 0x62, 0x57, 0x26, 0x37, 0x97, 0xf6, 0xe6, 0x36, 0x25, 0x20, 0x9a,
+  0x90, 0xe1, 0xb9, 0xd8, 0x85, 0xb1, 0xd9, 0x95, 0xc9, 0x4d, 0x09, 0x8a,
+  0x3a, 0x64, 0x78, 0x2e, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x6f,
+  0x64, 0x65, 0x6c, 0x53, 0x02, 0xa4, 0x0c, 0x19, 0x9e, 0x8b, 0x5c, 0xd9,
+  0xdc, 0x5b, 0x9d, 0xdc, 0x58, 0xd9, 0xdc, 0x94, 0xc0, 0xab, 0x44, 0x86,
+  0xe7, 0x42, 0x97, 0x07, 0x57, 0x16, 0xe4, 0xe6, 0xf6, 0x46, 0x17, 0x46,
+  0x97, 0xf6, 0xe6, 0x36, 0x37, 0x45, 0x30, 0x83, 0x35, 0xa8, 0x43, 0x86,
+  0xe7, 0x62, 0x97, 0x56, 0x76, 0x97, 0x44, 0x36, 0x45, 0x17, 0x46, 0x57,
+  0x36, 0x25, 0x68, 0x83, 0x3a, 0x64, 0x78, 0x2e, 0x65, 0x6e, 0x74, 0x72,
+  0x79, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x53, 0x82, 0x50, 0xe8, 0x42,
+  0x86, 0xe7, 0x32, 0xf6, 0x56, 0xe7, 0x46, 0x57, 0x26, 0x37, 0x37, 0x25,
+  0x50, 0x05, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00,
+  0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88,
+  0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73,
+  0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e,
+  0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, 0x30,
+  0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, 0xc8,
+  0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b,
+  0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, 0x76,
+  0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e,
+  0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e,
+  0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61,
+  0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xb4,
+  0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, 0x76,
+  0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, 0x37,
+  0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76,
+  0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, 0x71,
+  0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e,
+  0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1,
+  0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61,
+  0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, 0x90,
+  0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, 0xb8,
+  0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc,
+  0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x8c, 0xc8,
+  0x21, 0x07, 0x7c, 0x70, 0x03, 0x72, 0x10, 0x87, 0x73, 0x70, 0x03, 0x7b,
+  0x08, 0x07, 0x79, 0x60, 0x87, 0x70, 0xc8, 0x87, 0x77, 0xa8, 0x07, 0x7a,
+  0x98, 0x81, 0x3c, 0xe4, 0x80, 0x0f, 0x6e, 0x40, 0x0f, 0xe5, 0xd0, 0x0e,
+  0xf0, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00,
+  0x46, 0x00, 0x0d, 0x97, 0xef, 0x3c, 0x7e, 0x80, 0x34, 0x40, 0x84, 0xf9,
+  0xc5, 0x6d, 0xdb, 0xc1, 0x36, 0x5c, 0xbe, 0xf3, 0xf8, 0x42, 0x40, 0x15,
+  0x05, 0x11, 0x95, 0x0e, 0x30, 0x94, 0x84, 0x01, 0x08, 0x98, 0x5f, 0xdc,
+  0xb6, 0x21, 0x48, 0xc3, 0xe5, 0x3b, 0x8f, 0x2f, 0x44, 0x04, 0x30, 0x11,
+  0x21, 0xd0, 0x0c, 0x0b, 0x61, 0x01, 0xd3, 0x70, 0xf9, 0xce, 0xe3, 0x2f,
+  0x0e, 0x30, 0x88, 0xcd, 0x43, 0x4d, 0x7e, 0x71, 0xdb, 0x56, 0x00, 0x0d,
+  0x97, 0xef, 0x3c, 0xbe, 0x04, 0x30, 0xcf, 0x42, 0xf8, 0xc5, 0x6d, 0x9b,
+  0x01, 0x35, 0x5c, 0xbe, 0xf3, 0xf8, 0x12, 0xc0, 0x3c, 0x0b, 0x01, 0x46,
+  0xc0, 0xe0, 0x17, 0xb7, 0x6d, 0x02, 0xd5, 0x70, 0xf9, 0xce, 0xe3, 0x4b,
+  0x93, 0x13, 0x11, 0x28, 0x35, 0x3d, 0xd4, 0xe4, 0x17, 0xb7, 0x6d, 0x03,
+  0xcf, 0x70, 0xf9, 0xce, 0xe3, 0x53, 0x0d, 0x10, 0x61, 0x7e, 0x71, 0xdb,
+  0x06, 0x40, 0x30, 0x00, 0xd2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x48, 0x41, 0x53, 0x48, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x9f, 0xb3, 0x26, 0x31, 0x36, 0xb8, 0x29, 0x67, 0x66, 0xc8, 0x7e, 0x84,
+  0x3e, 0x27, 0x25, 0x2a, 0x44, 0x58, 0x49, 0x4c, 0xc8, 0x09, 0x00, 0x00,
+  0x60, 0x00, 0x00, 0x00, 0x72, 0x02, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4c,
+  0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xb0, 0x09, 0x00, 0x00,
+  0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0x69, 0x02, 0x00, 0x00,
+  0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00,
+  0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39,
+  0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62,
+  0x80, 0x18, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0xc4, 0x10, 0x32, 0x14,
+  0x38, 0x08, 0x18, 0x4b, 0x0a, 0x32, 0x62, 0x88, 0x48, 0x90, 0x14, 0x20,
+  0x43, 0x46, 0x88, 0xa5, 0x00, 0x19, 0x32, 0x42, 0xe4, 0x48, 0x0e, 0x90,
+  0x11, 0x23, 0xc4, 0x50, 0x41, 0x51, 0x81, 0x8c, 0xe1, 0x83, 0xe5, 0x8a,
+  0x04, 0x31, 0x46, 0x06, 0x51, 0x18, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
+  0x1b, 0x8c, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x07, 0x40, 0x02, 0xa8, 0x0d,
+  0x84, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x03, 0x20, 0x6d, 0x30, 0x86, 0xff,
+  0xff, 0xff, 0xff, 0x1f, 0x00, 0x09, 0xa8, 0x00, 0x49, 0x18, 0x00, 0x00,
+  0x03, 0x00, 0x00, 0x00, 0x13, 0x82, 0x60, 0x42, 0x20, 0x4c, 0x08, 0x06,
+  0x00, 0x00, 0x00, 0x00, 0x89, 0x20, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00,
+  0x32, 0x22, 0x88, 0x09, 0x20, 0x64, 0x85, 0x04, 0x13, 0x23, 0xa4, 0x84,
+  0x04, 0x13, 0x23, 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8c, 0x8c,
+  0x0b, 0x84, 0xc4, 0x4c, 0x10, 0x94, 0xc1, 0x08, 0x40, 0x09, 0x00, 0x0a,
+  0x66, 0x00, 0xe6, 0x08, 0xc0, 0x60, 0x8e, 0x00, 0x29, 0xc6, 0x40, 0x10,
+  0x44, 0x41, 0x90, 0x51, 0x0c, 0x80, 0x20, 0x88, 0x62, 0x20, 0xa4, 0x0c,
+  0x03, 0x31, 0x90, 0x52, 0x88, 0x81, 0x18, 0x06, 0x62, 0x6e, 0x1a, 0x2e,
+  0x7f, 0xc2, 0x1e, 0x42, 0xf2, 0x57, 0x42, 0x5a, 0x89, 0xc9, 0x2f, 0x6e,
+  0x1b, 0x15, 0xc3, 0x30, 0x0c, 0x04, 0x15, 0xf7, 0x0c, 0x97, 0x3f, 0x61,
+  0x0f, 0x21, 0xf9, 0x21, 0xd0, 0x0c, 0x0b, 0x81, 0x82, 0xa7, 0x30, 0x0e,
+  0x01, 0x41, 0xc3, 0x30, 0x0c, 0x04, 0x41, 0x0c, 0x14, 0x15, 0xc9, 0x21,
+  0x20, 0x68, 0x18, 0x86, 0x81, 0x20, 0x88, 0x61, 0x18, 0x86, 0x61, 0x18,
+  0x68, 0x3a, 0x6a, 0xb8, 0xfc, 0x09, 0x7b, 0x08, 0xc9, 0xe7, 0x36, 0xaa,
+  0x58, 0x89, 0xc9, 0x2f, 0x6e, 0x1b, 0x11, 0xc3, 0x30, 0x0c, 0x85, 0xa8,
+  0x08, 0x88, 0x20, 0x6b, 0x8e, 0x20, 0x28, 0x06, 0x44, 0x14, 0x04, 0x81,
+  0x51, 0x36, 0x10, 0x30, 0x8c, 0x40, 0x0c, 0x33, 0xb5, 0xc1, 0x38, 0xb0,
+  0x43, 0x38, 0xcc, 0xc3, 0x3c, 0xb8, 0x01, 0x2d, 0x94, 0x03, 0x3e, 0xd0,
+  0x43, 0x3d, 0xc8, 0x43, 0x39, 0xc8, 0x01, 0x29, 0xf0, 0x81, 0x3d, 0x94,
+  0xc3, 0x38, 0xd0, 0xc3, 0x3b, 0xc8, 0x03, 0x1f, 0x98, 0x03, 0x3b, 0xbc,
+  0x43, 0x38, 0xd0, 0x03, 0x1b, 0x80, 0x01, 0x1d, 0xf8, 0x01, 0x18, 0xf8,
+  0x81, 0x1e, 0xe8, 0x41, 0x3b, 0xa4, 0x03, 0x3c, 0xcc, 0xc3, 0x2f, 0xd0,
+  0x43, 0x3e, 0xc0, 0x43, 0x39, 0xa0, 0x80, 0x98, 0x49, 0x0c, 0xc6, 0x81,
+  0x1d, 0xc2, 0x61, 0x1e, 0xe6, 0xc1, 0x0d, 0x68, 0xa1, 0x1c, 0xf0, 0x81,
+  0x1e, 0xea, 0x41, 0x1e, 0xca, 0x41, 0x0e, 0x48, 0x81, 0x0f, 0xec, 0xa1,
+  0x1c, 0xc6, 0x81, 0x1e, 0xde, 0x41, 0x1e, 0xf8, 0xc0, 0x1c, 0xd8, 0xe1,
+  0x1d, 0xc2, 0x81, 0x1e, 0xd8, 0x00, 0x0c, 0xe8, 0xc0, 0x0f, 0xc0, 0xc0,
+  0x0f, 0x90, 0xc0, 0x75, 0xe4, 0x1d, 0x33, 0x61, 0x0f, 0xf1, 0x73, 0x4e,
+  0x33, 0x11, 0xd7, 0x84, 0x02, 0x8e, 0xc0, 0x9b, 0xa4, 0x29, 0xa2, 0x84,
+  0xc9, 0x67, 0x01, 0xe6, 0x59, 0x88, 0x88, 0x9d, 0x80, 0x89, 0x40, 0x01,
+  0x41, 0x62, 0x22, 0x10, 0x00, 0x00, 0x00, 0x00, 0x13, 0x14, 0x72, 0xc0,
+  0x87, 0x74, 0x60, 0x87, 0x36, 0x68, 0x87, 0x79, 0x68, 0x03, 0x72, 0xc0,
+  0x87, 0x0d, 0xaf, 0x50, 0x0e, 0x6d, 0xd0, 0x0e, 0x7a, 0x50, 0x0e, 0x6d,
+  0x00, 0x0f, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d,
+  0x90, 0x0e, 0x71, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x78,
+  0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0x60, 0x07, 0x7a,
+  0x30, 0x07, 0x72, 0xd0, 0x06, 0xe9, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73,
+  0x20, 0x07, 0x6d, 0x90, 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74,
+  0xd0, 0x06, 0xe6, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d,
+  0x60, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe6,
+  0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0xe0, 0x0e, 0x78,
+  0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x76,
+  0x40, 0x07, 0x43, 0x9e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x86, 0x3c, 0x06, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x0c, 0x79, 0x10, 0x20, 0x00, 0x04, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xf2, 0x28, 0x40, 0x00, 0x04, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xe4, 0x61, 0x80, 0x00, 0x08,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xc8, 0x13, 0x01, 0x01,
+  0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x90, 0x67, 0x02,
+  0x02, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x21, 0x8f,
+  0x05, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43,
+  0x9e, 0x0c, 0x08, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0xb2, 0x40, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x14,
+  0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0x22,
+  0x4a, 0x60, 0x04, 0xa0, 0x24, 0x8a, 0xa1, 0x08, 0xca, 0xa0, 0x40, 0xca,
+  0x83, 0x8a, 0x92, 0x18, 0x01, 0x28, 0x82, 0x42, 0x28, 0x10, 0xfa, 0x66,
+  0x00, 0x28, 0x9c, 0x01, 0xa0, 0x71, 0x06, 0x80, 0xc8, 0xb1, 0x10, 0x83,
+  0x08, 0x04, 0x02, 0x79, 0x1e, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00,
+  0x64, 0x00, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0x44,
+  0x8f, 0x0c, 0x6f, 0xec, 0xed, 0x4d, 0x0c, 0x24, 0xc6, 0x05, 0xc7, 0x45,
+  0xa6, 0x06, 0xa6, 0xc6, 0x45, 0x06, 0x07, 0x04, 0x25, 0xa7, 0xcc, 0x4c,
+  0x4c, 0xcc, 0x66, 0x6c, 0x46, 0x26, 0x65, 0x43, 0x10, 0x4c, 0x10, 0x88,
+  0x64, 0x82, 0x40, 0x28, 0x1b, 0x84, 0x81, 0x98, 0x20, 0x10, 0xcb, 0x06,
+  0x61, 0x30, 0x28, 0xc0, 0xcd, 0x4d, 0x10, 0x08, 0x66, 0xc3, 0x80, 0x24,
+  0xc4, 0x04, 0xe1, 0xb3, 0x08, 0x4c, 0x10, 0x88, 0x66, 0x83, 0x40, 0x18,
+  0x1b, 0x12, 0x62, 0x61, 0x1a, 0x62, 0x68, 0x08, 0x67, 0x43, 0x32, 0x2c,
+  0x4c, 0x33, 0x0c, 0x0d, 0xe1, 0x6c, 0x10, 0x1e, 0x68, 0x82, 0x10, 0x06,
+  0xd7, 0x04, 0x81, 0x70, 0x26, 0x08, 0xc4, 0xb3, 0x01, 0x21, 0x24, 0x66,
+  0x22, 0x06, 0x0a, 0xd8, 0x10, 0x54, 0x13, 0x84, 0x31, 0xc0, 0x36, 0x20,
+  0xc4, 0xc5, 0x34, 0xc4, 0x40, 0x00, 0x1b, 0x90, 0xe1, 0x62, 0x9a, 0x61,
+  0x20, 0x80, 0x0d, 0x02, 0x96, 0x6d, 0x20, 0x22, 0xc0, 0xd2, 0x26, 0x08,
+  0x64, 0x90, 0x6d, 0x08, 0xb8, 0x09, 0x82, 0x00, 0x90, 0x68, 0x0b, 0x4b,
+  0x73, 0x23, 0x42, 0x55, 0x84, 0x35, 0xf4, 0xf4, 0x24, 0x45, 0x34, 0x41,
+  0x28, 0xa2, 0x09, 0x42, 0x21, 0x6d, 0x08, 0x88, 0x09, 0x42, 0x31, 0x4d,
+  0x10, 0x0a, 0x6a, 0x82, 0x40, 0x40, 0x1b, 0x84, 0xc9, 0x0c, 0x36, 0x2c,
+  0x04, 0x18, 0x84, 0x81, 0x18, 0x8c, 0x01, 0x19, 0x0c, 0x65, 0x40, 0x88,
+  0xc1, 0x19, 0x6c, 0x08, 0x86, 0x0d, 0xc2, 0x34, 0x6d, 0x58, 0x06, 0x30,
+  0x08, 0x03, 0x31, 0x48, 0x03, 0x32, 0x18, 0xc8, 0x60, 0x10, 0x03, 0x35,
+  0xd8, 0x20, 0xa0, 0xc1, 0x1a, 0x30, 0x99, 0xb2, 0xfa, 0xa2, 0x0a, 0x93,
+  0x3b, 0x2b, 0xa3, 0x9b, 0x20, 0x14, 0xd5, 0x86, 0x85, 0x68, 0x83, 0x30,
+  0x70, 0x83, 0x31, 0x10, 0x83, 0xa1, 0x0c, 0x08, 0x31, 0x38, 0x83, 0x0d,
+  0xc1, 0x1b, 0x6c, 0x18, 0xd8, 0x00, 0x0e, 0x80, 0x0d, 0x85, 0xf7, 0xc5,
+  0xc1, 0x06, 0x54, 0x61, 0x63, 0xb3, 0x6b, 0x73, 0x49, 0x23, 0x2b, 0x73,
+  0xa3, 0x9b, 0x12, 0x04, 0x55, 0xc8, 0xf0, 0x5c, 0xec, 0xca, 0xe4, 0xe6,
+  0xd2, 0xde, 0xdc, 0xa6, 0x04, 0x44, 0x13, 0x32, 0x3c, 0x17, 0xbb, 0x30,
+  0x36, 0xbb, 0x32, 0xb9, 0x29, 0x81, 0x51, 0x87, 0x0c, 0xcf, 0x65, 0x0e,
+  0x2d, 0x8c, 0xac, 0x4c, 0xae, 0xe9, 0x8d, 0xac, 0x8c, 0x6d, 0x4a, 0x90,
+  0x94, 0x21, 0xc3, 0x73, 0x91, 0x2b, 0x9b, 0x7b, 0xab, 0x93, 0x1b, 0x2b,
+  0x9b, 0x9b, 0x12, 0x68, 0x75, 0xc8, 0xf0, 0x5c, 0xec, 0xd2, 0xca, 0xee,
+  0x92, 0xc8, 0xa6, 0xe8, 0xc2, 0xe8, 0xca, 0xa6, 0x04, 0x5c, 0x1d, 0x32,
+  0x3c, 0x97, 0x32, 0x37, 0x3a, 0xb9, 0x3c, 0xa8, 0xb7, 0x34, 0x37, 0xba,
+  0xb9, 0x29, 0x41, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00,
+  0x4c, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66,
+  0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07,
+  0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10,
+  0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, 0xce,
+  0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1b,
+  0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, 0x8c,
+  0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, 0x07,
+  0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, 0x11,
+  0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, 0xf0,
+  0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, 0xd8,
+  0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, 0x3b,
+  0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, 0x3b,
+  0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87,
+  0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, 0x07,
+  0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, 0x87,
+  0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 0x81,
+  0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, 0x30,
+  0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4,
+  0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, 0xca,
+  0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, 0x39,
+  0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, 0x3b,
+  0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, 0x3b,
+  0xb0, 0xc3, 0x8c, 0xc8, 0x21, 0x07, 0x7c, 0x70, 0x03, 0x72, 0x10, 0x87,
+  0x73, 0x70, 0x03, 0x7b, 0x08, 0x07, 0x79, 0x60, 0x87, 0x70, 0xc8, 0x87,
+  0x77, 0xa8, 0x07, 0x7a, 0x98, 0x81, 0x3c, 0xe4, 0x80, 0x0f, 0x6e, 0x40,
+  0x0f, 0xe5, 0xd0, 0x0e, 0xf0, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00,
+  0x23, 0x00, 0x00, 0x00, 0x46, 0x00, 0x0d, 0x97, 0xef, 0x3c, 0x7e, 0x80,
+  0x34, 0x40, 0x84, 0xf9, 0xc5, 0x6d, 0xdb, 0xc1, 0x36, 0x5c, 0xbe, 0xf3,
+  0xf8, 0x42, 0x40, 0x15, 0x05, 0x11, 0x95, 0x0e, 0x30, 0x94, 0x84, 0x01,
+  0x08, 0x98, 0x5f, 0xdc, 0xb6, 0x21, 0x48, 0xc3, 0xe5, 0x3b, 0x8f, 0x2f,
+  0x44, 0x04, 0x30, 0x11, 0x21, 0xd0, 0x0c, 0x0b, 0x61, 0x01, 0xd3, 0x70,
+  0xf9, 0xce, 0xe3, 0x2f, 0x0e, 0x30, 0x88, 0xcd, 0x43, 0x4d, 0x7e, 0x71,
+  0xdb, 0x56, 0x00, 0x0d, 0x97, 0xef, 0x3c, 0xbe, 0x04, 0x30, 0xcf, 0x42,
+  0xf8, 0xc5, 0x6d, 0x9b, 0x01, 0x35, 0x5c, 0xbe, 0xf3, 0xf8, 0x12, 0xc0,
+  0x3c, 0x0b, 0x01, 0x46, 0xc0, 0xe0, 0x17, 0xb7, 0x6d, 0x02, 0xd5, 0x70,
+  0xf9, 0xce, 0xe3, 0x4b, 0x93, 0x13, 0x11, 0x28, 0x35, 0x3d, 0xd4, 0xe4,
+  0x17, 0xb7, 0x6d, 0x03, 0xcf, 0x70, 0xf9, 0xce, 0xe3, 0x53, 0x0d, 0x10,
+  0x61, 0x7e, 0x71, 0xdb, 0x06, 0x40, 0x30, 0x00, 0xd2, 0x00, 0x00, 0x00,
+  0x61, 0x20, 0x00, 0x00, 0xbf, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, 0x2c,
+  0x10, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x84, 0x8d, 0x00, 0x50,
+  0x51, 0x02, 0x65, 0x40, 0x44, 0xe1, 0x95, 0x5f, 0xd9, 0x95, 0x43, 0xb1,
+  0x94, 0xcd, 0x0c, 0x40, 0x21, 0x94, 0x5c, 0x29, 0x94, 0x69, 0x40, 0xa1,
+  0x06, 0x94, 0x51, 0x21, 0xd1, 0x30, 0x46, 0x00, 0x82, 0x20, 0x08, 0x77,
+  0x63, 0x04, 0x20, 0x08, 0xfa, 0xf7, 0x37, 0x46, 0x00, 0x82, 0x20, 0x48,
+  0x82, 0xc1, 0x18, 0x01, 0x08, 0x82, 0x20, 0x08, 0x06, 0x63, 0x04, 0x20,
+  0x08, 0x82, 0xf8, 0x2f, 0x8c, 0x11, 0x80, 0x20, 0x08, 0xe2, 0xdf, 0x18,
+  0x01, 0xdb, 0xc6, 0xaf, 0xbc, 0x8d, 0x11, 0x80, 0x20, 0x08, 0xc2, 0xdf,
+  0x0c, 0x00, 0x00, 0x00, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x90, 0xb1,
+  0xc1, 0x23, 0x06, 0x6b, 0xb0, 0x06, 0xda, 0x88, 0x41, 0x02, 0x80, 0x20,
+  0x18, 0x64, 0x6d, 0x00, 0x8d, 0xc1, 0x1a, 0xac, 0xc1, 0x36, 0x62, 0x90,
+  0x00, 0x20, 0x08, 0x06, 0x99, 0x1b, 0x44, 0x5a, 0x1b, 0xb4, 0x01, 0x37,
+  0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0xd9, 0x1b, 0x48, 0x5b, 0x1b, 0xb4,
+  0x41, 0x37, 0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0x19, 0x1c, 0x4c, 0x65,
+  0xe0, 0x06, 0x6e, 0xe0, 0x8d, 0x18, 0x24, 0x00, 0x08, 0x82, 0x81, 0x81,
+  0x07, 0x15, 0x1c, 0xbc, 0xc1, 0x19, 0x58, 0x23, 0x06, 0x09, 0x00, 0x82,
+  0x60, 0x60, 0xe4, 0x81, 0x15, 0x07, 0x70, 0xf0, 0x5d, 0x23, 0x06, 0x09,
+  0x00, 0x82, 0x60, 0x60, 0xe8, 0xc1, 0x15, 0x07, 0x71, 0x90, 0x06, 0xd8,
+  0x88, 0x41, 0x02, 0x80, 0x20, 0x18, 0x18, 0x7b, 0x80, 0xc9, 0x81, 0x1c,
+  0x84, 0x41, 0x36, 0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0x06, 0x1f, 0x64,
+  0x73, 0x30, 0x07, 0x6a, 0xa0, 0x8d, 0x18, 0x24, 0x00, 0x08, 0x82, 0x81,
+  0xd1, 0x07, 0x1a, 0x1d, 0xd0, 0x81, 0x18, 0x6c, 0x23, 0x06, 0x06, 0x00,
+  0x82, 0x60, 0xa0, 0xf0, 0x01, 0x66, 0x8c, 0x18, 0x18, 0x00, 0x08, 0x82,
+  0x81, 0xd2, 0x07, 0x99, 0x31, 0x62, 0x60, 0x00, 0x20, 0x08, 0x06, 0x8a,
+  0x1f, 0xd4, 0x81, 0x30, 0x62, 0x60, 0x00, 0x20, 0x08, 0x06, 0xca, 0x1f,
+  0xd8, 0x81, 0x30, 0x62, 0x60, 0x00, 0x20, 0x08, 0x06, 0x0a, 0x28, 0x6c,
+  0xca, 0x88, 0x81, 0x01, 0x80, 0x20, 0x18, 0x28, 0xa1, 0xc0, 0x29, 0x23,
+  0x06, 0x06, 0x00, 0x82, 0x60, 0xa0, 0x88, 0x42, 0x1e, 0x08, 0x23, 0x06,
+  0x06, 0x00, 0x82, 0x60, 0xa0, 0x8c, 0x82, 0x1e, 0x08, 0x26, 0x18, 0xf0,
+  0x31, 0xc1, 0x80, 0xcf, 0x88, 0xc1, 0x01, 0x80, 0x20, 0x18, 0x58, 0xa2,
+  0xa0, 0x06, 0xd1, 0x1f, 0x8c, 0x26, 0x04, 0xc2, 0x68, 0x82, 0x30, 0x98,
+  0x50, 0xc8, 0xc7, 0x84, 0x42, 0x3e, 0x23, 0x06, 0x07, 0x00, 0x82, 0x60,
+  0xc0, 0xa8, 0x42, 0x19, 0x08, 0xdd, 0x88, 0xc1, 0x01, 0x80, 0x20, 0x18,
+  0x30, 0xab, 0x60, 0x06, 0x82, 0x37, 0x62, 0x70, 0x00, 0x20, 0x08, 0x06,
+  0x0c, 0x2b, 0x98, 0x81, 0x00, 0x06, 0x23, 0x06, 0x07, 0x00, 0x82, 0x60,
+  0xc0, 0xb4, 0xc2, 0x19, 0x08, 0x61, 0x60, 0x48, 0x26, 0x1f, 0x43, 0x32,
+  0xf9, 0x18, 0x21, 0x06, 0xf2, 0x31, 0x62, 0x0c, 0xe4, 0x63, 0x84, 0x10,
+  0x1f, 0x23, 0x84, 0xf8, 0x8c, 0x18, 0x18, 0x00, 0x08, 0x82, 0x81, 0x52,
+  0x0b, 0x76, 0x20, 0x8c, 0x18, 0x18, 0x00, 0x08, 0x82, 0x81, 0x62, 0x0b,
+  0x77, 0x20, 0x98, 0x80, 0x06, 0xf0, 0x31, 0x21, 0x0d, 0xe0, 0x33, 0x62,
+  0x60, 0x00, 0x20, 0x08, 0x06, 0x4a, 0x2e, 0xec, 0x81, 0x31, 0x62, 0x60,
+  0x00, 0x20, 0x08, 0x06, 0x8a, 0x2e, 0xf0, 0x81, 0x61, 0xce, 0x1b, 0xc0,
+  0xc7, 0x82, 0x01, 0x3e, 0xf6, 0xc4, 0x01, 0x7c, 0x2c, 0x20, 0xe0, 0x63,
+  0x83, 0x44, 0x1f, 0x13, 0x24, 0xfa, 0x8c, 0x18, 0x18, 0x00, 0x08, 0x82,
+  0x81, 0x12, 0x0e, 0xa4, 0x20, 0x8c, 0x18, 0x18, 0x00, 0x08, 0x82, 0x81,
+  0x22, 0x0e, 0xa5, 0x20, 0x98, 0x80, 0x07, 0xf2, 0x31, 0x21, 0x0f, 0xe4,
+  0x63, 0x7b, 0x20, 0xc4, 0xc7, 0xf8, 0x40, 0x88, 0x8f, 0x19, 0x86, 0x7c,
+  0x2c, 0x18, 0xe4, 0x63, 0xc7, 0x21, 0x1f, 0x0b, 0x08, 0xf9, 0x18, 0x35,
+  0xc0, 0xc7, 0x28, 0x01, 0x3e, 0xa3, 0x09, 0x67, 0x00, 0x8c, 0x26, 0xa0,
+  0x41, 0x60, 0x84, 0x20, 0x1f, 0x23, 0x04, 0xf9, 0x8c, 0x18, 0x54, 0x00,
+  0x08, 0x82, 0xc1, 0xe4, 0x0e, 0xb6, 0xf0, 0x07, 0x7d, 0x20, 0x04, 0xa1,
+  0x10, 0x0a, 0xea, 0xa0, 0x0e, 0xb1, 0x50, 0x07, 0x74, 0x10, 0x0a, 0x71,
+  0x00, 0x07, 0xa1, 0x10, 0x0a, 0xa3, 0x09, 0x01, 0x60, 0x81, 0x2a, 0xc8,
+  0xc7, 0x02, 0x56, 0x80, 0xcf, 0x88, 0xc1, 0x03, 0x80, 0x20, 0x18, 0x44,
+  0xf3, 0xb0, 0x0b, 0xa4, 0x20, 0x0a, 0x81, 0x29, 0x94, 0x42, 0x29, 0xb8,
+  0x83, 0x3b, 0xd4, 0x42, 0x29, 0x8c, 0x26, 0x04, 0xc0, 0x68, 0x82, 0x10,
+  0x8c, 0x26, 0x0c, 0xc2, 0x68, 0x02, 0x31, 0x18, 0x21, 0x0a, 0xf2, 0x31,
+  0x42, 0x14, 0xe4, 0x63, 0x84, 0x28, 0xc8, 0xc7, 0x08, 0x51, 0x90, 0xcf,
+  0x88, 0x41, 0x02, 0x80, 0x20, 0x18, 0x20, 0xff, 0xb0, 0x0b, 0xf7, 0x70,
+  0x0f, 0xef, 0x40, 0x8c, 0x18, 0x24, 0x00, 0x08, 0x82, 0x01, 0xf2, 0x0f,
+  0xbb, 0x70, 0x0f, 0xf7, 0x60, 0x0e, 0xc3, 0x88, 0x41, 0x02, 0x80, 0x20,
+  0x18, 0x20, 0xff, 0xb0, 0x0b, 0xf7, 0x70, 0x0f, 0xee, 0x20, 0x8c, 0x18,
+  0x24, 0x00, 0x08, 0x82, 0x01, 0xf2, 0x0f, 0xbb, 0x70, 0x0f, 0xf7, 0x50,
+  0x0e, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+static const unsigned int texture_palette_pixelart_frag_dxil_len = 5072;

+ 44 - 0
src/render/gpu/shaders/texture_palette_pixelart.frag.hlsl

@@ -0,0 +1,44 @@
+cbuffer Context : register(b0, space3) {
+    float4 texel_size;
+};
+
+Texture2D u_texture : register(t0, space2);
+Texture2D u_palette : register(t1, space2);
+SamplerState u_sampler1 : register(s0, space2);
+SamplerState u_sampler2 : register(s1, space2);
+
+struct PSInput {
+    float4 v_color : COLOR0;
+    float2 v_uv : TEXCOORD0;
+};
+
+struct PSOutput {
+    float4 o_color : SV_Target;
+};
+
+float2 GetPixelArtUV(PSInput input)
+{
+    // box filter size in texel units
+    float2 boxSize = clamp(fwidth(input.v_uv) * texel_size.zw, 1e-5, 1);
+
+    // scale uv by texture size to get texel coordinate
+    float2 tx = input.v_uv * texel_size.zw - 0.5 * boxSize;
+
+    // compute offset for pixel-sized box filter
+    float2 txOffset = smoothstep(1 - boxSize, 1, frac(tx));
+
+    // compute bilinear sample uv coordinates
+    float2 uv = (floor(tx) + 0.5 + txOffset) * texel_size.xy;
+
+    return uv;
+}
+
+
+PSOutput main(PSInput input) {
+    PSOutput output;
+    float2 uv = GetPixelArtUV(input);
+    float index = u_texture.SampleGrad(u_sampler1, uv, ddx(input.v_uv), ddy(input.v_uv)).r * 255;
+    float4 color = u_palette.Sample(u_sampler2, float2((index + 0.5) / 256, 0.5));
+    output.o_color = color * input.v_color;
+    return output;
+}

+ 99 - 0
src/render/gpu/shaders/texture_palette_pixelart.frag.msl.h

@@ -0,0 +1,99 @@
+static const unsigned char texture_palette_pixelart_frag_msl[] = {
+  0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x6d, 0x65,
+  0x74, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x64, 0x6c, 0x69, 0x62, 0x3e, 0x0a,
+  0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x73, 0x69,
+  0x6d, 0x64, 0x2f, 0x73, 0x69, 0x6d, 0x64, 0x2e, 0x68, 0x3e, 0x0a, 0x0a,
+  0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70,
+  0x61, 0x63, 0x65, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x3b, 0x0a, 0x0a,
+  0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x5f,
+  0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x0a, 0x7b, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x74, 0x65, 0x78,
+  0x65, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x3b, 0x0a, 0x7d, 0x3b, 0x0a,
+  0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e,
+  0x30, 0x5f, 0x6f, 0x75, 0x74, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x6f, 0x75, 0x74, 0x5f, 0x76,
+  0x61, 0x72, 0x5f, 0x53, 0x56, 0x5f, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74,
+  0x20, 0x5b, 0x5b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x30, 0x29, 0x5d,
+  0x5d, 0x3b, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63,
+  0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x69, 0x6e, 0x0a, 0x7b,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20,
+  0x69, 0x6e, 0x5f, 0x76, 0x61, 0x72, 0x5f, 0x43, 0x4f, 0x4c, 0x4f, 0x52,
+  0x30, 0x20, 0x5b, 0x5b, 0x75, 0x73, 0x65, 0x72, 0x28, 0x6c, 0x6f, 0x63,
+  0x6e, 0x30, 0x29, 0x5d, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66,
+  0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x69, 0x6e, 0x5f, 0x76, 0x61, 0x72,
+  0x5f, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x30, 0x20, 0x5b,
+  0x5b, 0x75, 0x73, 0x65, 0x72, 0x28, 0x6c, 0x6f, 0x63, 0x6e, 0x31, 0x29,
+  0x5d, 0x5d, 0x3b, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x66, 0x72, 0x61, 0x67,
+  0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f,
+  0x75, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x28, 0x6d, 0x61, 0x69,
+  0x6e, 0x30, 0x5f, 0x69, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x5b, 0x5b, 0x73,
+  0x74, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x5d, 0x5d, 0x2c, 0x20, 0x63,
+  0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65,
+  0x5f, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x26, 0x20, 0x43, 0x6f,
+  0x6e, 0x74, 0x65, 0x78, 0x74, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66,
+  0x65, 0x72, 0x28, 0x30, 0x29, 0x5d, 0x5d, 0x2c, 0x20, 0x74, 0x65, 0x78,
+  0x74, 0x75, 0x72, 0x65, 0x32, 0x64, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74,
+  0x3e, 0x20, 0x75, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x20,
+  0x5b, 0x5b, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x30, 0x29,
+  0x5d, 0x5d, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32,
+  0x64, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, 0x75, 0x5f, 0x70,
+  0x61, 0x6c, 0x65, 0x74, 0x74, 0x65, 0x20, 0x5b, 0x5b, 0x74, 0x65, 0x78,
+  0x74, 0x75, 0x72, 0x65, 0x28, 0x31, 0x29, 0x5d, 0x5d, 0x2c, 0x20, 0x73,
+  0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x75, 0x5f, 0x73, 0x61, 0x6d,
+  0x70, 0x6c, 0x65, 0x72, 0x31, 0x20, 0x5b, 0x5b, 0x73, 0x61, 0x6d, 0x70,
+  0x6c, 0x65, 0x72, 0x28, 0x30, 0x29, 0x5d, 0x5d, 0x2c, 0x20, 0x73, 0x61,
+  0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x75, 0x5f, 0x73, 0x61, 0x6d, 0x70,
+  0x6c, 0x65, 0x72, 0x32, 0x20, 0x5b, 0x5b, 0x73, 0x61, 0x6d, 0x70, 0x6c,
+  0x65, 0x72, 0x28, 0x31, 0x29, 0x5d, 0x5d, 0x29, 0x0a, 0x7b, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74,
+  0x20, 0x6f, 0x75, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x3b, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x5f, 0x34,
+  0x35, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x73, 0x74, 0x3a, 0x3a, 0x63, 0x6c,
+  0x61, 0x6d, 0x70, 0x28, 0x66, 0x77, 0x69, 0x64, 0x74, 0x68, 0x28, 0x69,
+  0x6e, 0x2e, 0x69, 0x6e, 0x5f, 0x76, 0x61, 0x72, 0x5f, 0x54, 0x45, 0x58,
+  0x43, 0x4f, 0x4f, 0x52, 0x44, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x43, 0x6f,
+  0x6e, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x74, 0x65, 0x78, 0x65, 0x6c, 0x5f,
+  0x73, 0x69, 0x7a, 0x65, 0x2e, 0x7a, 0x77, 0x2c, 0x20, 0x66, 0x6c, 0x6f,
+  0x61, 0x74, 0x32, 0x28, 0x39, 0x2e, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39,
+  0x37, 0x34, 0x37, 0x33, 0x37, 0x38, 0x37, 0x35, 0x31, 0x36, 0x33, 0x35,
+  0x35, 0x35, 0x31, 0x34, 0x35, 0x32, 0x36, 0x33, 0x36, 0x37, 0x31, 0x38,
+  0x38, 0x65, 0x2d, 0x30, 0x36, 0x29, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61,
+  0x74, 0x32, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x5f, 0x34, 0x38,
+  0x20, 0x3d, 0x20, 0x28, 0x69, 0x6e, 0x2e, 0x69, 0x6e, 0x5f, 0x76, 0x61,
+  0x72, 0x5f, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x30, 0x20,
+  0x2a, 0x20, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x74, 0x65,
+  0x78, 0x65, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2e, 0x7a, 0x77, 0x29,
+  0x20, 0x2d, 0x20, 0x28, 0x5f, 0x34, 0x35, 0x20, 0x2a, 0x20, 0x30, 0x2e,
+  0x35, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e,
+  0x6f, 0x75, 0x74, 0x5f, 0x76, 0x61, 0x72, 0x5f, 0x53, 0x56, 0x5f, 0x54,
+  0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x75, 0x5f, 0x70, 0x61,
+  0x6c, 0x65, 0x74, 0x74, 0x65, 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65,
+  0x28, 0x75, 0x5f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x2c,
+  0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x28, 0x28, 0x75, 0x5f,
+  0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x73, 0x61, 0x6d, 0x70,
+  0x6c, 0x65, 0x28, 0x75, 0x5f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72,
+  0x31, 0x2c, 0x20, 0x28, 0x28, 0x28, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x28,
+  0x5f, 0x34, 0x38, 0x29, 0x20, 0x2b, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74,
+  0x32, 0x28, 0x30, 0x2e, 0x35, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x73, 0x6d,
+  0x6f, 0x6f, 0x74, 0x68, 0x73, 0x74, 0x65, 0x70, 0x28, 0x66, 0x6c, 0x6f,
+  0x61, 0x74, 0x32, 0x28, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2d, 0x20, 0x5f,
+  0x34, 0x35, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x31,
+  0x2e, 0x30, 0x29, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x63, 0x74, 0x28, 0x5f,
+  0x34, 0x38, 0x29, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x43, 0x6f, 0x6e, 0x74,
+  0x65, 0x78, 0x74, 0x2e, 0x74, 0x65, 0x78, 0x65, 0x6c, 0x5f, 0x73, 0x69,
+  0x7a, 0x65, 0x2e, 0x78, 0x79, 0x29, 0x2c, 0x20, 0x67, 0x72, 0x61, 0x64,
+  0x69, 0x65, 0x6e, 0x74, 0x32, 0x64, 0x28, 0x64, 0x66, 0x64, 0x78, 0x28,
+  0x69, 0x6e, 0x2e, 0x69, 0x6e, 0x5f, 0x76, 0x61, 0x72, 0x5f, 0x54, 0x45,
+  0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x30, 0x29, 0x2c, 0x20, 0x64, 0x66,
+  0x64, 0x79, 0x28, 0x69, 0x6e, 0x2e, 0x69, 0x6e, 0x5f, 0x76, 0x61, 0x72,
+  0x5f, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x30, 0x29, 0x29,
+  0x29, 0x2e, 0x78, 0x20, 0x2a, 0x20, 0x32, 0x35, 0x35, 0x2e, 0x30, 0x29,
+  0x20, 0x2b, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e,
+  0x30, 0x30, 0x33, 0x39, 0x30, 0x36, 0x32, 0x35, 0x2c, 0x20, 0x30, 0x2e,
+  0x35, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x69, 0x6e, 0x5f,
+  0x76, 0x61, 0x72, 0x5f, 0x43, 0x4f, 0x4c, 0x4f, 0x52, 0x30, 0x3b, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f,
+  0x75, 0x74, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a
+};
+static const unsigned int texture_palette_pixelart_frag_msl_len = 1147;

+ 169 - 0
src/render/gpu/shaders/texture_palette_pixelart.frag.spv.h

@@ -0,0 +1,169 @@
+static const unsigned char texture_palette_pixelart_frag_spv[] = {
+  0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0e, 0x00,
+  0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x02, 0x00,
+  0x01, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00,
+  0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, 0x35, 0x30,
+  0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00,
+  0x02, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x69, 0x6e, 0x00, 0x00, 0x00, 0x00,
+  0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
+  0x10, 0x00, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
+  0x03, 0x00, 0x03, 0x00, 0x05, 0x00, 0x00, 0x00, 0x58, 0x02, 0x00, 0x00,
+  0x05, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65,
+  0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x00, 0x00, 0x00, 0x00,
+  0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x74, 0x65, 0x78, 0x65, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x00, 0x00,
+  0x05, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x43, 0x6f, 0x6e, 0x74,
+  0x65, 0x78, 0x74, 0x00, 0x05, 0x00, 0x06, 0x00, 0x08, 0x00, 0x00, 0x00,
+  0x74, 0x79, 0x70, 0x65, 0x2e, 0x32, 0x64, 0x2e, 0x69, 0x6d, 0x61, 0x67,
+  0x65, 0x00, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, 0x09, 0x00, 0x00, 0x00,
+  0x75, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x00, 0x00, 0x00,
+  0x05, 0x00, 0x05, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x75, 0x5f, 0x70, 0x61,
+  0x6c, 0x65, 0x74, 0x74, 0x65, 0x00, 0x00, 0x00, 0x05, 0x00, 0x06, 0x00,
+  0x0b, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x73, 0x61, 0x6d,
+  0x70, 0x6c, 0x65, 0x72, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00,
+  0x0c, 0x00, 0x00, 0x00, 0x75, 0x5f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65,
+  0x72, 0x31, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, 0x0d, 0x00, 0x00, 0x00,
+  0x75, 0x5f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x00, 0x00,
+  0x05, 0x00, 0x06, 0x00, 0x03, 0x00, 0x00, 0x00, 0x69, 0x6e, 0x2e, 0x76,
+  0x61, 0x72, 0x2e, 0x43, 0x4f, 0x4c, 0x4f, 0x52, 0x30, 0x00, 0x00, 0x00,
+  0x05, 0x00, 0x07, 0x00, 0x04, 0x00, 0x00, 0x00, 0x69, 0x6e, 0x2e, 0x76,
+  0x61, 0x72, 0x2e, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x30,
+  0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x07, 0x00, 0x05, 0x00, 0x00, 0x00,
+  0x6f, 0x75, 0x74, 0x2e, 0x76, 0x61, 0x72, 0x2e, 0x53, 0x56, 0x5f, 0x54,
+  0x61, 0x72, 0x67, 0x65, 0x74, 0x00, 0x00, 0x00, 0x05, 0x00, 0x04, 0x00,
+  0x02, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x69, 0x6e, 0x00, 0x00, 0x00, 0x00,
+  0x05, 0x00, 0x07, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x74, 0x79, 0x70, 0x65,
+  0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x64, 0x2e, 0x69, 0x6d, 0x61,
+  0x67, 0x65, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x03, 0x00, 0x00, 0x00,
+  0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00,
+  0x04, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+  0x47, 0x00, 0x04, 0x00, 0x05, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00,
+  0x22, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00,
+  0x07, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x47, 0x00, 0x04, 0x00, 0x09, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00,
+  0x02, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x09, 0x00, 0x00, 0x00,
+  0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00,
+  0x0a, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+  0x47, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00,
+  0x01, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00,
+  0x22, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00,
+  0x0c, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x47, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00,
+  0x02, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x00, 0x00,
+  0x21, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00,
+  0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, 0x06, 0x00, 0x00, 0x00,
+  0x02, 0x00, 0x00, 0x00, 0x15, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x00, 0x00,
+  0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x16, 0x00, 0x03, 0x00,
+  0x10, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00,
+  0x10, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x43,
+  0x2b, 0x00, 0x04, 0x00, 0x10, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x3f, 0x2b, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x00, 0x00,
+  0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00,
+  0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0xac, 0xc5, 0x27, 0x37,
+  0x17, 0x00, 0x04, 0x00, 0x15, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
+  0x02, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x05, 0x00, 0x15, 0x00, 0x00, 0x00,
+  0x16, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
+  0x2b, 0x00, 0x04, 0x00, 0x10, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x80, 0x3f, 0x2c, 0x00, 0x05, 0x00, 0x15, 0x00, 0x00, 0x00,
+  0x18, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00,
+  0x2c, 0x00, 0x05, 0x00, 0x15, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00,
+  0x12, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x17, 0x00, 0x04, 0x00,
+  0x1a, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
+  0x1e, 0x00, 0x03, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00,
+  0x20, 0x00, 0x04, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+  0x06, 0x00, 0x00, 0x00, 0x19, 0x00, 0x09, 0x00, 0x08, 0x00, 0x00, 0x00,
+  0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x1c, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x02, 0x00,
+  0x0b, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x1d, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00,
+  0x1e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00,
+  0x20, 0x00, 0x04, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+  0x15, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x20, 0x00, 0x00, 0x00,
+  0x03, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x13, 0x00, 0x02, 0x00,
+  0x21, 0x00, 0x00, 0x00, 0x21, 0x00, 0x03, 0x00, 0x22, 0x00, 0x00, 0x00,
+  0x21, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x00, 0x00,
+  0x08, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x23, 0x00, 0x00, 0x00,
+  0x02, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00,
+  0x1b, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+  0x3b, 0x00, 0x04, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x1c, 0x00, 0x00, 0x00,
+  0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00,
+  0x1d, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x3b, 0x00, 0x04, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x1e, 0x00, 0x00, 0x00,
+  0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00,
+  0x1f, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+  0x3b, 0x00, 0x04, 0x00, 0x20, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
+  0x03, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x10, 0x00, 0x00, 0x00,
+  0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3b, 0x36, 0x00, 0x05, 0x00,
+  0x21, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x22, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x02, 0x00, 0x25, 0x00, 0x00, 0x00,
+  0x3d, 0x00, 0x04, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00,
+  0x03, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x15, 0x00, 0x00, 0x00,
+  0x27, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xd1, 0x00, 0x04, 0x00,
+  0x15, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00,
+  0x41, 0x00, 0x05, 0x00, 0x23, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00,
+  0x07, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00,
+  0x1a, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00,
+  0x4f, 0x00, 0x07, 0x00, 0x15, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00,
+  0x2a, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+  0x03, 0x00, 0x00, 0x00, 0x85, 0x00, 0x05, 0x00, 0x15, 0x00, 0x00, 0x00,
+  0x2c, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00,
+  0x0c, 0x00, 0x08, 0x00, 0x15, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x00, 0x00,
+  0x01, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00,
+  0x16, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x85, 0x00, 0x05, 0x00,
+  0x15, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00,
+  0x2b, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x05, 0x00, 0x15, 0x00, 0x00, 0x00,
+  0x2f, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00,
+  0x83, 0x00, 0x05, 0x00, 0x15, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
+  0x2e, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x00, 0x83, 0x00, 0x05, 0x00,
+  0x15, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
+  0x2d, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x06, 0x00, 0x15, 0x00, 0x00, 0x00,
+  0x32, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00,
+  0x30, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x15, 0x00, 0x00, 0x00,
+  0x33, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00,
+  0x31, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00,
+  0x0c, 0x00, 0x06, 0x00, 0x15, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00,
+  0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
+  0x81, 0x00, 0x05, 0x00, 0x15, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00,
+  0x34, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00,
+  0x15, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00,
+  0x33, 0x00, 0x00, 0x00, 0x4f, 0x00, 0x07, 0x00, 0x15, 0x00, 0x00, 0x00,
+  0x37, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x85, 0x00, 0x05, 0x00,
+  0x15, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00,
+  0x37, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00,
+  0x39, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00,
+  0x0b, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
+  0xcf, 0x00, 0x04, 0x00, 0x15, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x00,
+  0x27, 0x00, 0x00, 0x00, 0xd0, 0x00, 0x04, 0x00, 0x15, 0x00, 0x00, 0x00,
+  0x3c, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x56, 0x00, 0x05, 0x00,
+  0x0e, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00,
+  0x3a, 0x00, 0x00, 0x00, 0x58, 0x00, 0x08, 0x00, 0x1a, 0x00, 0x00, 0x00,
+  0x3e, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
+  0x04, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00,
+  0x51, 0x00, 0x05, 0x00, 0x10, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00,
+  0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x00, 0x05, 0x00,
+  0x10, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00,
+  0x11, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00,
+  0x41, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00,
+  0x0b, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00,
+  0x81, 0x00, 0x05, 0x00, 0x10, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00,
+  0x40, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x85, 0x00, 0x05, 0x00,
+  0x10, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00,
+  0x24, 0x00, 0x00, 0x00, 0x50, 0x00, 0x05, 0x00, 0x15, 0x00, 0x00, 0x00,
+  0x45, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00,
+  0x56, 0x00, 0x05, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00,
+  0x41, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x57, 0x00, 0x06, 0x00,
+  0x1a, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00,
+  0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x00, 0x05, 0x00,
+  0x1a, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00,
+  0x26, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x05, 0x00, 0x00, 0x00,
+  0x48, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x01, 0x00, 0x38, 0x00, 0x01, 0x00
+};
+static const unsigned int texture_palette_pixelart_frag_spv_len = 1992;

+ 136 - 137
src/render/gpu/shaders/texture_rgb.frag.dxil.h

@@ -1,7 +1,7 @@
 static const unsigned char texture_rgb_frag_dxil[] = {
-  0x44, 0x58, 0x42, 0x43, 0xa1, 0x97, 0xb5, 0x23, 0x00, 0xf2, 0x90, 0x46,
-  0x20, 0xc1, 0x0c, 0x3b, 0x4c, 0x17, 0xb1, 0xb4, 0x01, 0x00, 0x00, 0x00,
-  0x10, 0x0f, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00,
+  0x44, 0x58, 0x42, 0x43, 0x1a, 0x3e, 0x83, 0x3d, 0xad, 0x4a, 0x78, 0x19,
+  0xf8, 0xe8, 0xda, 0xf6, 0xa3, 0x17, 0xb1, 0xec, 0x01, 0x00, 0x00, 0x00,
+  0x04, 0x0f, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00,
   0x4c, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0x00,
   0xd8, 0x01, 0x00, 0x00, 0x34, 0x08, 0x00, 0x00, 0x50, 0x08, 0x00, 0x00,
   0x53, 0x46, 0x49, 0x30, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -100,47 +100,47 @@ static const unsigned char texture_rgb_frag_dxil[] = {
   0x65, 0x50, 0x1e, 0x85, 0x52, 0x08, 0x54, 0x4a, 0x62, 0x04, 0xa0, 0x08,
   0x0a, 0xa1, 0x40, 0xc8, 0xce, 0x00, 0x10, 0x9e, 0x01, 0xa0, 0x3c, 0x16,
   0x62, 0x10, 0x81, 0x40, 0x20, 0xc7, 0x01, 0x00, 0x79, 0x18, 0x00, 0x00,
-  0x7a, 0x00, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0xc4,
-  0x8e, 0x0c, 0x6f, 0xec, 0xed, 0x4d, 0x0c, 0x24, 0xc6, 0x05, 0xc7, 0x45,
-  0xa6, 0x06, 0x46, 0xc6, 0x05, 0x07, 0x04, 0x45, 0x8c, 0xe6, 0x26, 0x26,
-  0x06, 0x67, 0x26, 0xa7, 0x2c, 0x65, 0x43, 0x10, 0x4c, 0x10, 0x88, 0x62,
-  0x82, 0x40, 0x18, 0x1b, 0x84, 0x81, 0xd8, 0x20, 0x10, 0x04, 0x05, 0xb8,
-  0xb9, 0x09, 0x02, 0x71, 0x6c, 0x18, 0x0e, 0x84, 0x98, 0x20, 0x58, 0x13,
-  0x93, 0xba, 0x2f, 0xba, 0x32, 0x3c, 0xba, 0x3a, 0xb9, 0xb2, 0x09, 0x02,
-  0x81, 0x4c, 0x10, 0x88, 0x64, 0x83, 0x40, 0x34, 0x1b, 0x12, 0x42, 0x59,
-  0x18, 0x62, 0x60, 0x08, 0x67, 0x43, 0xf0, 0x4c, 0x10, 0x30, 0x8a, 0x49,
-  0xdd, 0xd7, 0x5c, 0x58, 0x1b, 0x1c, 0x5b, 0x99, 0xdc, 0x06, 0x84, 0x88,
-  0x24, 0x86, 0x18, 0x08, 0x60, 0x43, 0x30, 0x6d, 0x20, 0x20, 0x00, 0xa0,
-  0x26, 0x08, 0x02, 0xb0, 0x01, 0xd8, 0x30, 0x10, 0xd7, 0xb5, 0x21, 0xc0,
-  0x36, 0x0c, 0x83, 0x95, 0x4d, 0x10, 0xb2, 0x6a, 0x43, 0xb0, 0x91, 0x68,
-  0x0b, 0x4b, 0x73, 0x23, 0x42, 0x55, 0x84, 0x35, 0xf4, 0xf4, 0x24, 0x45,
-  0x34, 0x41, 0x28, 0x9c, 0x09, 0x42, 0xf1, 0x6c, 0x08, 0x88, 0x09, 0x42,
-  0x01, 0x4d, 0x10, 0x8a, 0x68, 0x82, 0x40, 0x28, 0x13, 0x04, 0x62, 0xd9,
-  0x20, 0x90, 0x41, 0x19, 0x6c, 0x58, 0x08, 0xef, 0x03, 0x83, 0x30, 0x10,
-  0x83, 0x61, 0x0c, 0x08, 0x30, 0x30, 0x83, 0x0d, 0xc1, 0xb0, 0x41, 0x20,
-  0x03, 0x32, 0xd8, 0xb0, 0x0c, 0xde, 0x07, 0x06, 0x68, 0x20, 0x06, 0x83,
-  0x18, 0x0c, 0x60, 0x90, 0x06, 0x1b, 0x84, 0x33, 0x50, 0x03, 0x26, 0x53,
-  0x56, 0x5f, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x13, 0x84, 0x42, 0xda,
-  0xb0, 0x10, 0x6c, 0xf0, 0xb5, 0x41, 0x18, 0x80, 0xc1, 0x30, 0x06, 0x04,
-  0x18, 0x98, 0xc1, 0x86, 0xc0, 0x0d, 0x36, 0x0c, 0x6b, 0xf0, 0x06, 0xc0,
-  0x86, 0xc2, 0xea, 0xe0, 0xa0, 0x02, 0x68, 0x98, 0xb1, 0xbd, 0x85, 0xd1,
-  0xcd, 0xb1, 0x48, 0x73, 0x9b, 0xa3, 0x9b, 0x9b, 0x20, 0x10, 0x0c, 0x8d,
-  0xb9, 0xb4, 0xb3, 0x2f, 0x36, 0x32, 0x1a, 0x73, 0x69, 0x67, 0x5f, 0x73,
-  0x74, 0x13, 0x04, 0xa2, 0x21, 0x42, 0x57, 0x86, 0xf7, 0xe5, 0xf6, 0x26,
-  0xd7, 0xb6, 0x41, 0x91, 0x03, 0x32, 0x98, 0x03, 0x3a, 0xa8, 0x03, 0xc4,
-  0x0e, 0xee, 0x00, 0x0f, 0x86, 0x2a, 0x6c, 0x6c, 0x76, 0x6d, 0x2e, 0x69,
-  0x64, 0x65, 0x6e, 0x74, 0x53, 0x82, 0xa0, 0x0a, 0x19, 0x9e, 0x8b, 0x5d,
-  0x99, 0xdc, 0x5c, 0xda, 0x9b, 0xdb, 0x94, 0x80, 0x68, 0x42, 0x86, 0xe7,
-  0x62, 0x17, 0xc6, 0x66, 0x57, 0x26, 0x37, 0x25, 0x28, 0xea, 0x90, 0xe1,
-  0xb9, 0xcc, 0xa1, 0x85, 0x91, 0x95, 0xc9, 0x35, 0xbd, 0x91, 0x95, 0xb1,
-  0x4d, 0x09, 0x90, 0x32, 0x64, 0x78, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75,
-  0x72, 0x63, 0x65, 0x73, 0x53, 0x02, 0xaa, 0x12, 0x19, 0x9e, 0x0b, 0x5d,
-  0x1e, 0x5c, 0x59, 0x90, 0x9b, 0xdb, 0x1b, 0x5d, 0x18, 0x5d, 0xda, 0x9b,
-  0xdb, 0xdc, 0x94, 0x20, 0xab, 0x43, 0x86, 0xe7, 0x62, 0x97, 0x56, 0x76,
-  0x97, 0x44, 0x36, 0x45, 0x17, 0x46, 0x57, 0x36, 0x25, 0xd8, 0xea, 0x90,
-  0xe1, 0xb9, 0x94, 0xb9, 0xd1, 0xc9, 0xe5, 0x41, 0xbd, 0xa5, 0xb9, 0xd1,
-  0xcd, 0x4d, 0x09, 0xe0, 0xa0, 0x0b, 0x19, 0x9e, 0xcb, 0xd8, 0x5b, 0x9d,
-  0x1b, 0x5d, 0x99, 0xdc, 0xdc, 0x94, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00,
+  0x7a, 0x00, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0x44,
+  0x8f, 0x0c, 0x6f, 0xec, 0xed, 0x4d, 0x0c, 0x24, 0xc6, 0x05, 0xc7, 0x45,
+  0xa6, 0x06, 0xa6, 0xc6, 0x45, 0x06, 0x07, 0x04, 0x25, 0xa7, 0xcc, 0x4c,
+  0x4c, 0xcc, 0x66, 0x6c, 0x46, 0x26, 0x65, 0x43, 0x10, 0x4c, 0x10, 0x88,
+  0x62, 0x82, 0x40, 0x18, 0x1b, 0x84, 0x81, 0xd8, 0x20, 0x10, 0x04, 0x05,
+  0xb8, 0xb9, 0x09, 0x02, 0x71, 0x6c, 0x18, 0x0e, 0x84, 0x98, 0x20, 0x58,
+  0x13, 0x93, 0xba, 0x2f, 0xba, 0x32, 0x3c, 0xba, 0x3a, 0xb9, 0xb2, 0x09,
+  0x02, 0x81, 0x4c, 0x10, 0x88, 0x64, 0x83, 0x40, 0x34, 0x1b, 0x12, 0x42,
+  0x59, 0x18, 0x62, 0x60, 0x08, 0x67, 0x43, 0xf0, 0x4c, 0x10, 0x30, 0x8a,
+  0x49, 0xdd, 0xd7, 0x5c, 0x58, 0x1b, 0x1c, 0x5b, 0x99, 0xdc, 0x06, 0x84,
+  0x88, 0x24, 0x86, 0x18, 0x08, 0x60, 0x43, 0x30, 0x6d, 0x20, 0x20, 0x00,
+  0xa0, 0x26, 0x08, 0x02, 0xb0, 0x01, 0xd8, 0x30, 0x10, 0xd7, 0xb5, 0x21,
+  0xc0, 0x36, 0x0c, 0x83, 0x95, 0x4d, 0x10, 0xb2, 0x6a, 0x43, 0xb0, 0x91,
+  0x68, 0x0b, 0x4b, 0x73, 0x23, 0x42, 0x55, 0x84, 0x35, 0xf4, 0xf4, 0x24,
+  0x45, 0x34, 0x41, 0x28, 0x9c, 0x09, 0x42, 0xf1, 0x6c, 0x08, 0x88, 0x09,
+  0x42, 0x01, 0x4d, 0x10, 0x8a, 0x68, 0x82, 0x40, 0x28, 0x13, 0x04, 0x62,
+  0xd9, 0x20, 0x90, 0x41, 0x19, 0x6c, 0x58, 0x08, 0xef, 0x03, 0x83, 0x30,
+  0x10, 0x83, 0x61, 0x0c, 0x08, 0x30, 0x30, 0x83, 0x0d, 0xc1, 0xb0, 0x41,
+  0x20, 0x03, 0x32, 0xd8, 0xb0, 0x0c, 0xde, 0x07, 0x06, 0x68, 0x20, 0x06,
+  0x83, 0x18, 0x0c, 0x60, 0x90, 0x06, 0x1b, 0x84, 0x33, 0x50, 0x03, 0x26,
+  0x53, 0x56, 0x5f, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x13, 0x84, 0x42,
+  0xda, 0xb0, 0x10, 0x6c, 0xf0, 0xb5, 0x41, 0x18, 0x80, 0xc1, 0x30, 0x06,
+  0x04, 0x18, 0x98, 0xc1, 0x86, 0xc0, 0x0d, 0x36, 0x0c, 0x6b, 0xf0, 0x06,
+  0xc0, 0x86, 0xc2, 0xea, 0xe0, 0xa0, 0x02, 0x68, 0x98, 0xb1, 0xbd, 0x85,
+  0xd1, 0xcd, 0xb1, 0x48, 0x73, 0x9b, 0xa3, 0x9b, 0x9b, 0x20, 0x10, 0x0c,
+  0x8d, 0xb9, 0xb4, 0xb3, 0x2f, 0x36, 0x32, 0x1a, 0x73, 0x69, 0x67, 0x5f,
+  0x73, 0x74, 0x13, 0x04, 0xa2, 0x21, 0x42, 0x57, 0x86, 0xf7, 0xe5, 0xf6,
+  0x26, 0xd7, 0xb6, 0x41, 0x91, 0x03, 0x32, 0x98, 0x03, 0x3a, 0xa8, 0x03,
+  0xc4, 0x0e, 0xee, 0x00, 0x0f, 0x86, 0x2a, 0x6c, 0x6c, 0x76, 0x6d, 0x2e,
+  0x69, 0x64, 0x65, 0x6e, 0x74, 0x53, 0x82, 0xa0, 0x0a, 0x19, 0x9e, 0x8b,
+  0x5d, 0x99, 0xdc, 0x5c, 0xda, 0x9b, 0xdb, 0x94, 0x80, 0x68, 0x42, 0x86,
+  0xe7, 0x62, 0x17, 0xc6, 0x66, 0x57, 0x26, 0x37, 0x25, 0x28, 0xea, 0x90,
+  0xe1, 0xb9, 0xcc, 0xa1, 0x85, 0x91, 0x95, 0xc9, 0x35, 0xbd, 0x91, 0x95,
+  0xb1, 0x4d, 0x09, 0x90, 0x32, 0x64, 0x78, 0x2e, 0x72, 0x65, 0x73, 0x6f,
+  0x75, 0x72, 0x63, 0x65, 0x73, 0x53, 0x02, 0xaa, 0x12, 0x19, 0x9e, 0x0b,
+  0x5d, 0x1e, 0x5c, 0x59, 0x90, 0x9b, 0xdb, 0x1b, 0x5d, 0x18, 0x5d, 0xda,
+  0x9b, 0xdb, 0xdc, 0x94, 0x20, 0xab, 0x43, 0x86, 0xe7, 0x62, 0x97, 0x56,
+  0x76, 0x97, 0x44, 0x36, 0x45, 0x17, 0x46, 0x57, 0x36, 0x25, 0xd8, 0xea,
+  0x90, 0xe1, 0xb9, 0x94, 0xb9, 0xd1, 0xc9, 0xe5, 0x41, 0xbd, 0xa5, 0xb9,
+  0xd1, 0xcd, 0x4d, 0x09, 0xe0, 0xa0, 0x0b, 0x19, 0x9e, 0xcb, 0xd8, 0x5b,
+  0x9d, 0x1b, 0x5d, 0x99, 0xdc, 0xdc, 0x94, 0x00, 0x0f, 0x00, 0x00, 0x00,
   0x79, 0x18, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c,
   0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3,
   0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6,
@@ -175,11 +175,11 @@ static const unsigned char texture_rgb_frag_dxil[] = {
   0xe3, 0x4b, 0x93, 0x13, 0x11, 0x28, 0x35, 0x3d, 0xd4, 0xe4, 0x17, 0xb7,
   0x6d, 0x00, 0x04, 0x03, 0x20, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x48, 0x41, 0x53, 0x48, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0xdb, 0xf0, 0xc5, 0x7d, 0xe8, 0x04, 0xa5, 0x0a, 0x82, 0xd3, 0xa4, 0xb0,
-  0x94, 0x83, 0x51, 0x31, 0x44, 0x58, 0x49, 0x4c, 0xb8, 0x06, 0x00, 0x00,
-  0x60, 0x00, 0x00, 0x00, 0xae, 0x01, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4c,
-  0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xa0, 0x06, 0x00, 0x00,
-  0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0xa5, 0x01, 0x00, 0x00,
+  0x78, 0x26, 0x97, 0x60, 0x43, 0xbf, 0xcf, 0x6c, 0xbf, 0xbb, 0xa0, 0x5f,
+  0xca, 0x55, 0x34, 0x5d, 0x44, 0x58, 0x49, 0x4c, 0xac, 0x06, 0x00, 0x00,
+  0x60, 0x00, 0x00, 0x00, 0xab, 0x01, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4c,
+  0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x94, 0x06, 0x00, 0x00,
+  0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0xa2, 0x01, 0x00, 0x00,
   0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00,
   0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39,
   0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62,
@@ -232,94 +232,93 @@ static const unsigned char texture_rgb_frag_dxil[] = {
   0x0c, 0x79, 0x10, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x18, 0xf2, 0x34, 0x40, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x30, 0xe4, 0x81, 0x80, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x20, 0x0b, 0x04, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x20, 0x0b, 0x04, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00,
   0x32, 0x1e, 0x98, 0x14, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47,
-  0xc6, 0x04, 0x43, 0x22, 0x25, 0x30, 0x02, 0x50, 0x10, 0xc5, 0x50, 0x04,
-  0x25, 0x51, 0x06, 0xe5, 0x41, 0xa5, 0x24, 0x46, 0x00, 0x8a, 0xa0, 0x10,
-  0x0a, 0x84, 0xec, 0x0c, 0x00, 0xe1, 0x19, 0x00, 0xca, 0x63, 0x21, 0x06,
-  0x11, 0x08, 0x04, 0x72, 0x1c, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00,
-  0x58, 0x00, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0xc4,
-  0x8e, 0x0c, 0x6f, 0xec, 0xed, 0x4d, 0x0c, 0x24, 0xc6, 0x05, 0xc7, 0x45,
-  0xa6, 0x06, 0x46, 0xc6, 0x05, 0x07, 0x04, 0x45, 0x8c, 0xe6, 0x26, 0x26,
-  0x06, 0x67, 0x26, 0xa7, 0x2c, 0x65, 0x43, 0x10, 0x4c, 0x10, 0x88, 0x62,
-  0x82, 0x40, 0x18, 0x1b, 0x84, 0x81, 0x98, 0x20, 0x10, 0xc7, 0x06, 0x61,
-  0x30, 0x28, 0xc0, 0xcd, 0x4d, 0x10, 0x08, 0x64, 0xc3, 0x80, 0x24, 0xc4,
-  0x04, 0xc1, 0x92, 0x08, 0x4c, 0x10, 0x88, 0x64, 0x82, 0x40, 0x28, 0x1b,
-  0x04, 0xc2, 0xd9, 0x90, 0x10, 0x0b, 0xd3, 0x10, 0x43, 0x43, 0x3c, 0x1b,
-  0x02, 0x68, 0x82, 0x80, 0x4d, 0x1b, 0x10, 0x42, 0x62, 0x1a, 0x62, 0x20,
-  0x80, 0x0d, 0xc1, 0xb4, 0x81, 0x88, 0x00, 0x80, 0x9a, 0x20, 0x64, 0xd4,
-  0x86, 0xc0, 0x9a, 0x20, 0x08, 0x00, 0x89, 0xb6, 0xb0, 0x34, 0x37, 0x22,
-  0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x13, 0x84, 0xa2, 0x99,
-  0x20, 0x14, 0xce, 0x86, 0x80, 0x98, 0x20, 0x14, 0xcf, 0x04, 0xa1, 0x80,
-  0x26, 0x08, 0xc4, 0x32, 0x41, 0x20, 0x98, 0x0d, 0x02, 0x18, 0x84, 0xc1,
-  0x86, 0x85, 0xd0, 0x36, 0xae, 0xf3, 0x86, 0x8f, 0xe0, 0xc4, 0x60, 0x43,
-  0x30, 0x6c, 0x10, 0xc0, 0x00, 0x0c, 0x36, 0x2c, 0x83, 0xb6, 0x71, 0x64,
-  0xe0, 0x0d, 0xde, 0xc0, 0x95, 0xc1, 0x06, 0x61, 0x0c, 0xcc, 0x80, 0xc9,
-  0x94, 0xd5, 0x17, 0x55, 0x98, 0xdc, 0x59, 0x19, 0xdd, 0x04, 0xa1, 0x88,
-  0x36, 0x2c, 0x04, 0x1a, 0x6c, 0x69, 0xd0, 0x71, 0xc3, 0x47, 0x70, 0x62,
-  0xb0, 0x21, 0x50, 0x83, 0x0d, 0xc3, 0x19, 0xac, 0x01, 0xb0, 0xa1, 0xc0,
-  0x32, 0x36, 0xa8, 0x80, 0x2a, 0x6c, 0x6c, 0x76, 0x6d, 0x2e, 0x69, 0x64,
-  0x65, 0x6e, 0x74, 0x53, 0x82, 0xa0, 0x0a, 0x19, 0x9e, 0x8b, 0x5d, 0x99,
-  0xdc, 0x5c, 0xda, 0x9b, 0xdb, 0x94, 0x80, 0x68, 0x42, 0x86, 0xe7, 0x62,
-  0x17, 0xc6, 0x66, 0x57, 0x26, 0x37, 0x25, 0x30, 0xea, 0x90, 0xe1, 0xb9,
-  0xcc, 0xa1, 0x85, 0x91, 0x95, 0xc9, 0x35, 0xbd, 0x91, 0x95, 0xb1, 0x4d,
-  0x09, 0x92, 0x32, 0x64, 0x78, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72,
-  0x63, 0x65, 0x73, 0x53, 0x02, 0xaa, 0x0e, 0x19, 0x9e, 0x8b, 0x5d, 0x5a,
-  0xd9, 0x5d, 0x12, 0xd9, 0x14, 0x5d, 0x18, 0x5d, 0xd9, 0x94, 0xc0, 0xaa,
-  0x43, 0x86, 0xe7, 0x52, 0xe6, 0x46, 0x27, 0x97, 0x07, 0xf5, 0x96, 0xe6,
-  0x46, 0x37, 0x37, 0x25, 0x60, 0x03, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00,
-  0x4c, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66,
-  0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07,
-  0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10,
-  0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, 0xce,
-  0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1b,
-  0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, 0x8c,
-  0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, 0x07,
-  0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, 0x11,
-  0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, 0xf0,
-  0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, 0xd8,
-  0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, 0x3b,
-  0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, 0x3b,
-  0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87,
-  0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, 0x07,
-  0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, 0x87,
-  0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 0x81,
-  0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, 0x30,
-  0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4,
-  0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, 0xca,
-  0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, 0x39,
-  0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, 0x3b,
-  0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, 0x3b,
-  0xb0, 0xc3, 0x8c, 0xc8, 0x21, 0x07, 0x7c, 0x70, 0x03, 0x72, 0x10, 0x87,
-  0x73, 0x70, 0x03, 0x7b, 0x08, 0x07, 0x79, 0x60, 0x87, 0x70, 0xc8, 0x87,
-  0x77, 0xa8, 0x07, 0x7a, 0x98, 0x81, 0x3c, 0xe4, 0x80, 0x0f, 0x6e, 0x40,
-  0x0f, 0xe5, 0xd0, 0x0e, 0xf0, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00,
-  0x12, 0x00, 0x00, 0x00, 0x46, 0x20, 0x0d, 0x97, 0xef, 0x3c, 0xbe, 0x10,
-  0x11, 0xc0, 0x44, 0x84, 0x40, 0x33, 0x2c, 0x84, 0x05, 0x4c, 0xc3, 0xe5,
-  0x3b, 0x8f, 0xbf, 0x38, 0xc0, 0x20, 0x36, 0x0f, 0x35, 0xf9, 0xc5, 0x6d,
-  0xdb, 0x00, 0x34, 0x5c, 0xbe, 0xf3, 0xf8, 0x12, 0xc0, 0x3c, 0x0b, 0xe1,
-  0x17, 0xb7, 0x6d, 0x02, 0xd5, 0x70, 0xf9, 0xce, 0xe3, 0x4b, 0x93, 0x13,
-  0x11, 0x28, 0x35, 0x3d, 0xd4, 0xe4, 0x17, 0xb7, 0x6d, 0x00, 0x04, 0x03,
-  0x20, 0x0d, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00,
-  0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
-  0xf4, 0x46, 0x00, 0x88, 0xcc, 0x00, 0x14, 0x42, 0x29, 0x94, 0x5c, 0xe1,
-  0x51, 0x29, 0x83, 0x12, 0xa0, 0x31, 0x03, 0x00, 0x23, 0x06, 0x09, 0x00,
-  0x82, 0x60, 0x00, 0x69, 0x05, 0x84, 0x61, 0xc9, 0x88, 0x41, 0x02, 0x80,
-  0x20, 0x18, 0x40, 0x9b, 0x41, 0x64, 0x99, 0x32, 0x62, 0x90, 0x00, 0x20,
-  0x08, 0x06, 0xc6, 0x97, 0x6c, 0x9a, 0xa4, 0x8c, 0x18, 0x24, 0x00, 0x08,
-  0x82, 0x81, 0x01, 0x06, 0x0a, 0xb7, 0x15, 0xcb, 0x88, 0x41, 0x02, 0x80,
-  0x20, 0x18, 0x18, 0x61, 0xb0, 0x70, 0x1c, 0xc5, 0x8c, 0x18, 0x24, 0x00,
-  0x08, 0x82, 0x81, 0x21, 0x06, 0x4c, 0xd7, 0x1d, 0xcd, 0x88, 0x41, 0x02,
-  0x80, 0x20, 0x18, 0x18, 0x63, 0xd0, 0x78, 0x5e, 0xe5, 0x8c, 0x18, 0x24,
-  0x00, 0x08, 0x82, 0x81, 0x41, 0x06, 0xce, 0xf7, 0x29, 0xcf, 0x88, 0xc1,
-  0x03, 0x80, 0x20, 0x18, 0x34, 0x63, 0xc0, 0x20, 0x87, 0x51, 0x24, 0x09,
-  0x18, 0x80, 0x01, 0x94, 0x8c, 0x26, 0x04, 0xc0, 0x68, 0x82, 0x10, 0x8c,
-  0x26, 0x0c, 0x82, 0x0d, 0x88, 0x7c, 0x6c, 0x40, 0xe4, 0x63, 0x03, 0x22,
-  0x9f, 0x11, 0x83, 0x04, 0x00, 0x41, 0x30, 0x40, 0xd6, 0xa0, 0x3a, 0x83,
-  0x33, 0xf8, 0x86, 0x11, 0x83, 0x04, 0x00, 0x41, 0x30, 0x40, 0xd6, 0xa0,
-  0x3a, 0x83, 0x33, 0x88, 0x84, 0x11, 0x83, 0x04, 0x00, 0x41, 0x30, 0x40,
-  0xd6, 0xa0, 0x3a, 0x83, 0x33, 0xf0, 0x82, 0x11, 0x83, 0x04, 0x00, 0x41,
-  0x30, 0x40, 0xd6, 0xa0, 0x3a, 0x83, 0x33, 0x90, 0x10, 0x04, 0x00, 0x00,
+  0xc6, 0x04, 0x43, 0x22, 0x25, 0x30, 0x02, 0x50, 0x12, 0xc5, 0x50, 0x04,
+  0x65, 0x50, 0x1e, 0x54, 0x4a, 0x62, 0x04, 0xa0, 0x08, 0x0a, 0xa1, 0x40,
+  0xc8, 0xce, 0x00, 0x10, 0x9e, 0x01, 0xa0, 0x3c, 0x16, 0x62, 0x10, 0x81,
+  0x40, 0x20, 0xc7, 0x01, 0x79, 0x18, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00,
+  0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0x44, 0x8f, 0x0c, 0x6f, 0xec,
+  0xed, 0x4d, 0x0c, 0x24, 0xc6, 0x05, 0xc7, 0x45, 0xa6, 0x06, 0xa6, 0xc6,
+  0x45, 0x06, 0x07, 0x04, 0x25, 0xa7, 0xcc, 0x4c, 0x4c, 0xcc, 0x66, 0x6c,
+  0x46, 0x26, 0x65, 0x43, 0x10, 0x4c, 0x10, 0x88, 0x62, 0x82, 0x40, 0x18,
+  0x1b, 0x84, 0x81, 0x98, 0x20, 0x10, 0xc7, 0x06, 0x61, 0x30, 0x28, 0xc0,
+  0xcd, 0x4d, 0x10, 0x08, 0x64, 0xc3, 0x80, 0x24, 0xc4, 0x04, 0xc1, 0x8a,
+  0x08, 0x4c, 0x10, 0x88, 0x64, 0x83, 0x40, 0x18, 0x1b, 0x12, 0x62, 0x61,
+  0x1a, 0x62, 0x68, 0x08, 0x67, 0x43, 0xf0, 0x4c, 0x10, 0x30, 0x69, 0x03,
+  0x42, 0x44, 0x4c, 0x43, 0x0c, 0x04, 0xb0, 0x21, 0x90, 0x36, 0x10, 0x10,
+  0x00, 0x4c, 0x13, 0x84, 0x6c, 0xda, 0x10, 0x54, 0x13, 0x04, 0x01, 0x20,
+  0xd1, 0x16, 0x96, 0xe6, 0x46, 0x84, 0xaa, 0x08, 0x6b, 0xe8, 0xe9, 0x49,
+  0x8a, 0x68, 0x82, 0x50, 0x30, 0x13, 0x84, 0xa2, 0xd9, 0x10, 0x10, 0x13,
+  0x84, 0xc2, 0x99, 0x20, 0x14, 0xcf, 0x04, 0x81, 0x50, 0x26, 0x08, 0xc4,
+  0xb2, 0x41, 0xf8, 0xc0, 0x60, 0xc3, 0x42, 0x64, 0xda, 0xc6, 0x75, 0x83,
+  0x47, 0x6c, 0x61, 0xb0, 0x21, 0x18, 0x36, 0x08, 0xdf, 0xb7, 0x61, 0x19,
+  0x32, 0x6d, 0x1b, 0x83, 0x6e, 0xe8, 0x86, 0x8d, 0x0c, 0x36, 0x08, 0x62,
+  0x50, 0x06, 0x4c, 0xa6, 0xac, 0xbe, 0xa8, 0xc2, 0xe4, 0xce, 0xca, 0xe8,
+  0x26, 0x08, 0x05, 0xb4, 0x61, 0x21, 0xce, 0x40, 0x43, 0x03, 0x6e, 0x1b,
+  0x3c, 0x62, 0x0b, 0x83, 0x0d, 0x41, 0x1a, 0x6c, 0x18, 0xcc, 0x40, 0x0d,
+  0x80, 0x0d, 0xc5, 0x85, 0xad, 0x01, 0x05, 0x54, 0x61, 0x63, 0xb3, 0x6b,
+  0x73, 0x49, 0x23, 0x2b, 0x73, 0xa3, 0x9b, 0x12, 0x04, 0x55, 0xc8, 0xf0,
+  0x5c, 0xec, 0xca, 0xe4, 0xe6, 0xd2, 0xde, 0xdc, 0xa6, 0x04, 0x44, 0x13,
+  0x32, 0x3c, 0x17, 0xbb, 0x30, 0x36, 0xbb, 0x32, 0xb9, 0x29, 0x81, 0x51,
+  0x87, 0x0c, 0xcf, 0x65, 0x0e, 0x2d, 0x8c, 0xac, 0x4c, 0xae, 0xe9, 0x8d,
+  0xac, 0x8c, 0x6d, 0x4a, 0x90, 0x94, 0x21, 0xc3, 0x73, 0x91, 0x2b, 0x9b,
+  0x7b, 0xab, 0x93, 0x1b, 0x2b, 0x9b, 0x9b, 0x12, 0x4c, 0x75, 0xc8, 0xf0,
+  0x5c, 0xec, 0xd2, 0xca, 0xee, 0x92, 0xc8, 0xa6, 0xe8, 0xc2, 0xe8, 0xca,
+  0xa6, 0x04, 0x55, 0x1d, 0x32, 0x3c, 0x97, 0x32, 0x37, 0x3a, 0xb9, 0x3c,
+  0xa8, 0xb7, 0x34, 0x37, 0xba, 0xb9, 0x29, 0xc1, 0x1a, 0x00, 0x00, 0x00,
+  0x79, 0x18, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c,
+  0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3,
+  0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6,
+  0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e,
+  0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43,
+  0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03,
+  0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48,
+  0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20,
+  0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e,
+  0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d,
+  0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89,
+  0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83,
+  0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68,
+  0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90,
+  0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78,
+  0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98,
+  0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5,
+  0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c,
+  0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c,
+  0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43,
+  0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43,
+  0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82,
+  0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x8c, 0xc8, 0x21, 0x07, 0x7c, 0x70,
+  0x03, 0x72, 0x10, 0x87, 0x73, 0x70, 0x03, 0x7b, 0x08, 0x07, 0x79, 0x60,
+  0x87, 0x70, 0xc8, 0x87, 0x77, 0xa8, 0x07, 0x7a, 0x98, 0x81, 0x3c, 0xe4,
+  0x80, 0x0f, 0x6e, 0x40, 0x0f, 0xe5, 0xd0, 0x0e, 0xf0, 0x00, 0x00, 0x00,
+  0x71, 0x20, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x46, 0x20, 0x0d, 0x97,
+  0xef, 0x3c, 0xbe, 0x10, 0x11, 0xc0, 0x44, 0x84, 0x40, 0x33, 0x2c, 0x84,
+  0x05, 0x4c, 0xc3, 0xe5, 0x3b, 0x8f, 0xbf, 0x38, 0xc0, 0x20, 0x36, 0x0f,
+  0x35, 0xf9, 0xc5, 0x6d, 0xdb, 0x00, 0x34, 0x5c, 0xbe, 0xf3, 0xf8, 0x12,
+  0xc0, 0x3c, 0x0b, 0xe1, 0x17, 0xb7, 0x6d, 0x02, 0xd5, 0x70, 0xf9, 0xce,
+  0xe3, 0x4b, 0x93, 0x13, 0x11, 0x28, 0x35, 0x3d, 0xd4, 0xe4, 0x17, 0xb7,
+  0x6d, 0x00, 0x04, 0x03, 0x20, 0x0d, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00,
+  0x38, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, 0x00,
+  0x05, 0x00, 0x00, 0x00, 0xf4, 0x46, 0x00, 0x88, 0xcc, 0x00, 0x14, 0x42,
+  0x29, 0x94, 0x5c, 0xe1, 0x51, 0x29, 0x83, 0x12, 0xa0, 0x31, 0x03, 0x00,
+  0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x00, 0x65, 0x05, 0x74, 0x5d, 0xc9,
+  0x88, 0x41, 0x02, 0x80, 0x20, 0x18, 0x40, 0x9a, 0x41, 0x60, 0x98, 0x32,
+  0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0x86, 0x97, 0x68, 0x99, 0xa4, 0x8c,
+  0x18, 0x24, 0x00, 0x08, 0x82, 0x81, 0xf1, 0x29, 0x9b, 0x56, 0x2c, 0x23,
+  0x06, 0x09, 0x00, 0x82, 0x60, 0x60, 0x80, 0xc1, 0xb2, 0x6d, 0x14, 0x33,
+  0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0x46, 0x18, 0x30, 0x1c, 0x77, 0x34,
+  0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x60, 0x88, 0x41, 0xd3, 0x75, 0x95,
+  0x33, 0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0xc6, 0x18, 0x38, 0x9e, 0xa7,
+  0x3c, 0x23, 0x06, 0x0f, 0x00, 0x82, 0x60, 0xd0, 0x88, 0x01, 0x83, 0x1c,
+  0x46, 0x91, 0x24, 0xdf, 0x07, 0x25, 0xa3, 0x09, 0x01, 0x30, 0x9a, 0x20,
+  0x04, 0xa3, 0x09, 0x83, 0x60, 0x03, 0x22, 0x1f, 0x1b, 0x10, 0xf9, 0xd8,
+  0x80, 0xc8, 0x67, 0xc4, 0x20, 0x01, 0x40, 0x10, 0x0c, 0x10, 0x35, 0xa8,
+  0xcc, 0xc0, 0x0c, 0xbe, 0x61, 0xc4, 0x20, 0x01, 0x40, 0x10, 0x0c, 0x10,
+  0x35, 0xa8, 0xcc, 0xc0, 0x0c, 0x22, 0x61, 0xc4, 0x20, 0x01, 0x40, 0x10,
+  0x0c, 0x10, 0x35, 0xa8, 0xcc, 0xc0, 0x0c, 0xbc, 0x60, 0xc4, 0x20, 0x01,
+  0x40, 0x10, 0x0c, 0x10, 0x35, 0xa8, 0xcc, 0xc0, 0x0c, 0x24, 0x04, 0x01,
   0x00, 0x00, 0x00, 0x00
 };
-static const unsigned int texture_rgb_frag_dxil_len = 3856;
+static const unsigned int texture_rgb_frag_dxil_len = 3844;

+ 188 - 188
src/render/gpu/shaders/texture_rgb_pixelart.frag.dxil.h

@@ -1,7 +1,7 @@
 static const unsigned char texture_rgb_pixelart_frag_dxil[] = {
-  0x44, 0x58, 0x42, 0x43, 0x58, 0x86, 0xe6, 0xff, 0x2e, 0x5a, 0x13, 0x7a,
-  0xf3, 0x98, 0xb1, 0x38, 0x6e, 0x1b, 0x35, 0x49, 0x01, 0x00, 0x00, 0x00,
-  0xa8, 0x12, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00,
+  0x44, 0x58, 0x42, 0x43, 0xd3, 0x3a, 0xee, 0x83, 0x73, 0x42, 0x41, 0x69,
+  0x2e, 0xcf, 0xf1, 0xea, 0x25, 0x30, 0xca, 0x66, 0x01, 0x00, 0x00, 0x00,
+  0xa4, 0x12, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00,
   0x4c, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0x00,
   0xf0, 0x01, 0x00, 0x00, 0x54, 0x09, 0x00, 0x00, 0x70, 0x09, 0x00, 0x00,
   0x53, 0x46, 0x49, 0x30, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -112,55 +112,55 @@ static const unsigned char texture_rgb_pixelart_frag_dxil[] = {
   0x11, 0x80, 0x22, 0x28, 0x84, 0x02, 0xa1, 0x6e, 0x06, 0x80, 0xbc, 0x19,
   0x00, 0xfa, 0x66, 0x00, 0x28, 0x9c, 0x01, 0x20, 0x71, 0x2c, 0xc4, 0x20,
   0x02, 0x81, 0x40, 0x8e, 0x03, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00,
-  0x91, 0x00, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0xc4,
-  0x8e, 0x0c, 0x6f, 0xec, 0xed, 0x4d, 0x0c, 0x24, 0xc6, 0x05, 0xc7, 0x45,
-  0xa6, 0x06, 0x46, 0xc6, 0x05, 0x07, 0x04, 0x45, 0x8c, 0xe6, 0x26, 0x26,
-  0x06, 0x67, 0x26, 0xa7, 0x2c, 0x65, 0x43, 0x10, 0x4c, 0x10, 0x08, 0x64,
-  0x82, 0x40, 0x24, 0x1b, 0x84, 0x81, 0xd8, 0x20, 0x10, 0x04, 0x05, 0xb8,
-  0xb9, 0x09, 0x02, 0xa1, 0x6c, 0x18, 0x0e, 0x84, 0x98, 0x20, 0x74, 0x1a,
-  0x93, 0xba, 0x2f, 0xba, 0x32, 0x3c, 0xba, 0x3a, 0xb9, 0xb2, 0x09, 0x02,
-  0xb1, 0x4c, 0x10, 0x08, 0x66, 0x83, 0x40, 0x34, 0x1b, 0x12, 0x42, 0x59,
-  0x18, 0x62, 0x60, 0x08, 0x67, 0x43, 0xf0, 0x4c, 0x10, 0x3e, 0x8e, 0x0c,
-  0x5d, 0x1e, 0x5c, 0xd9, 0xd7, 0xd0, 0x9b, 0x1b, 0x5d, 0x19, 0x1e, 0xdd,
-  0x04, 0x81, 0x68, 0x26, 0x08, 0x84, 0xb3, 0x01, 0x21, 0x22, 0x69, 0x22,
-  0x06, 0x0a, 0xd8, 0x10, 0x54, 0x13, 0x84, 0x30, 0xe8, 0x98, 0xd4, 0x7d,
-  0xcd, 0x85, 0xb5, 0xc1, 0xb1, 0x95, 0xc9, 0x6d, 0x40, 0x88, 0x0b, 0x63,
-  0x88, 0x81, 0x00, 0x36, 0x04, 0xd9, 0x06, 0x02, 0x02, 0x2c, 0x6d, 0x82,
-  0xe0, 0x6d, 0x94, 0x86, 0xde, 0xdc, 0xe8, 0xca, 0xf0, 0xe8, 0xbe, 0xe8,
-  0xca, 0xf0, 0xca, 0xd8, 0xbe, 0xe6, 0xd2, 0xf4, 0xca, 0x26, 0x08, 0xc4,
-  0x33, 0x41, 0x20, 0xa0, 0x09, 0x02, 0x11, 0x6d, 0x40, 0x90, 0x6e, 0x22,
-  0xbc, 0xe6, 0x03, 0x83, 0x0d, 0x02, 0x15, 0x06, 0x1b, 0x06, 0x82, 0x13,
-  0x83, 0x09, 0x82, 0x00, 0x6c, 0x00, 0x36, 0x0c, 0x44, 0x19, 0x94, 0xc1,
-  0x86, 0xc0, 0x0c, 0x36, 0x0c, 0x03, 0x19, 0x9c, 0xc1, 0x04, 0x41, 0x0c,
-  0xbc, 0x0d, 0x41, 0x1a, 0x90, 0x68, 0x0b, 0x4b, 0x73, 0x23, 0x42, 0x55,
-  0x84, 0x35, 0xf4, 0xf4, 0x24, 0x45, 0x34, 0x41, 0x28, 0xaa, 0x09, 0x42,
-  0x61, 0x6d, 0x08, 0x88, 0x09, 0x42, 0x71, 0x4d, 0x10, 0x0a, 0x6c, 0x82,
-  0x40, 0x48, 0x1b, 0x84, 0x49, 0x0e, 0x36, 0x2c, 0x04, 0x1b, 0xb4, 0x81,
-  0x1b, 0xbc, 0x01, 0x1c, 0x0c, 0x71, 0x40, 0xb8, 0xc1, 0x1c, 0x6c, 0x08,
-  0x86, 0x0d, 0xc2, 0x34, 0x6d, 0x58, 0x06, 0x36, 0x68, 0x03, 0x37, 0xa8,
-  0x03, 0x38, 0x18, 0xe0, 0x60, 0x70, 0x03, 0x3b, 0xd8, 0x20, 0xd0, 0xc1,
-  0x1d, 0x30, 0x99, 0xb2, 0xfa, 0xa2, 0x0a, 0x93, 0x3b, 0x2b, 0xa3, 0x9b,
-  0x20, 0x14, 0xd9, 0x86, 0x85, 0xc8, 0x83, 0x36, 0xd0, 0x83, 0x37, 0x70,
-  0x83, 0x21, 0x0e, 0x08, 0x37, 0x98, 0x83, 0x0d, 0xc1, 0x1e, 0x6c, 0x18,
-  0xf0, 0x80, 0x0f, 0x80, 0x0d, 0x05, 0x19, 0xac, 0x41, 0x1f, 0x6c, 0x00,
-  0x0d, 0x33, 0xb6, 0xb7, 0x30, 0xba, 0xb9, 0x09, 0x02, 0x31, 0xb1, 0x48,
-  0x73, 0x9b, 0xa3, 0x9b, 0x9b, 0x20, 0x10, 0x14, 0x8d, 0xb9, 0xb4, 0xb3,
-  0x2f, 0x36, 0x32, 0x1a, 0x73, 0x69, 0x67, 0x5f, 0x73, 0x74, 0x44, 0xe8,
-  0xca, 0xf0, 0xbe, 0xce, 0xe4, 0xc2, 0xc8, 0x36, 0x28, 0x7f, 0x00, 0x0a,
-  0xa1, 0x20, 0x0a, 0xa3, 0x80, 0x90, 0x02, 0x18, 0x94, 0xc2, 0x50, 0x85,
-  0x8d, 0xcd, 0xae, 0xcd, 0x25, 0x8d, 0xac, 0xcc, 0x8d, 0x6e, 0x4a, 0x10,
-  0x54, 0x21, 0xc3, 0x73, 0xb1, 0x2b, 0x93, 0x9b, 0x4b, 0x7b, 0x73, 0x9b,
-  0x12, 0x10, 0x4d, 0xc8, 0xf0, 0x5c, 0xec, 0xc2, 0xd8, 0xec, 0xca, 0xe4,
-  0xa6, 0x04, 0x45, 0x1d, 0x32, 0x3c, 0x97, 0x39, 0xb4, 0x30, 0xb2, 0x32,
-  0xb9, 0xa6, 0x37, 0xb2, 0x32, 0xb6, 0x29, 0x01, 0x52, 0x86, 0x0c, 0xcf,
-  0x45, 0xae, 0x6c, 0xee, 0xad, 0x4e, 0x6e, 0xac, 0x6c, 0x6e, 0x4a, 0xa0,
-  0x55, 0x22, 0xc3, 0x73, 0xa1, 0xcb, 0x83, 0x2b, 0x0b, 0x72, 0x73, 0x7b,
-  0xa3, 0x0b, 0xa3, 0x4b, 0x7b, 0x73, 0x9b, 0x9b, 0x22, 0x88, 0xc1, 0x19,
-  0xd4, 0x21, 0xc3, 0x73, 0xb1, 0x4b, 0x2b, 0xbb, 0x4b, 0x22, 0x9b, 0xa2,
-  0x0b, 0xa3, 0x2b, 0x9b, 0x12, 0xa4, 0x41, 0x1d, 0x32, 0x3c, 0x97, 0x32,
-  0x37, 0x3a, 0xb9, 0x3c, 0xa8, 0xb7, 0x34, 0x37, 0xba, 0xb9, 0x29, 0x41,
-  0x1f, 0x74, 0x21, 0xc3, 0x73, 0x19, 0x7b, 0xab, 0x73, 0xa3, 0x2b, 0x93,
-  0x9b, 0x9b, 0x12, 0x94, 0x02, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00,
+  0x91, 0x00, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0x44,
+  0x8f, 0x0c, 0x6f, 0xec, 0xed, 0x4d, 0x0c, 0x24, 0xc6, 0x05, 0xc7, 0x45,
+  0xa6, 0x06, 0xa6, 0xc6, 0x45, 0x06, 0x07, 0x04, 0x25, 0xa7, 0xcc, 0x4c,
+  0x4c, 0xcc, 0x66, 0x6c, 0x46, 0x26, 0x65, 0x43, 0x10, 0x4c, 0x10, 0x08,
+  0x64, 0x82, 0x40, 0x24, 0x1b, 0x84, 0x81, 0xd8, 0x20, 0x10, 0x04, 0x05,
+  0xb8, 0xb9, 0x09, 0x02, 0xa1, 0x6c, 0x18, 0x0e, 0x84, 0x98, 0x20, 0x74,
+  0x1a, 0x93, 0xba, 0x2f, 0xba, 0x32, 0x3c, 0xba, 0x3a, 0xb9, 0xb2, 0x09,
+  0x02, 0xb1, 0x4c, 0x10, 0x08, 0x66, 0x83, 0x40, 0x34, 0x1b, 0x12, 0x42,
+  0x59, 0x18, 0x62, 0x60, 0x08, 0x67, 0x43, 0xf0, 0x4c, 0x10, 0x3e, 0x8e,
+  0x0c, 0x5d, 0x1e, 0x5c, 0xd9, 0xd7, 0xd0, 0x9b, 0x1b, 0x5d, 0x19, 0x1e,
+  0xdd, 0x04, 0x81, 0x68, 0x26, 0x08, 0x84, 0xb3, 0x01, 0x21, 0x22, 0x69,
+  0x22, 0x06, 0x0a, 0xd8, 0x10, 0x54, 0x13, 0x84, 0x30, 0xe8, 0x98, 0xd4,
+  0x7d, 0xcd, 0x85, 0xb5, 0xc1, 0xb1, 0x95, 0xc9, 0x6d, 0x40, 0x88, 0x0b,
+  0x63, 0x88, 0x81, 0x00, 0x36, 0x04, 0xd9, 0x06, 0x02, 0x02, 0x2c, 0x6d,
+  0x82, 0xe0, 0x6d, 0x94, 0x86, 0xde, 0xdc, 0xe8, 0xca, 0xf0, 0xe8, 0xbe,
+  0xe8, 0xca, 0xf0, 0xca, 0xd8, 0xbe, 0xe6, 0xd2, 0xf4, 0xca, 0x26, 0x08,
+  0xc4, 0x33, 0x41, 0x20, 0xa0, 0x09, 0x02, 0x11, 0x6d, 0x40, 0x90, 0x6e,
+  0x22, 0xbc, 0xe6, 0x03, 0x83, 0x0d, 0x02, 0x15, 0x06, 0x1b, 0x06, 0x82,
+  0x13, 0x83, 0x09, 0x82, 0x00, 0x6c, 0x00, 0x36, 0x0c, 0x44, 0x19, 0x94,
+  0xc1, 0x86, 0xc0, 0x0c, 0x36, 0x0c, 0x03, 0x19, 0x9c, 0xc1, 0x04, 0x41,
+  0x0c, 0xbc, 0x0d, 0x41, 0x1a, 0x90, 0x68, 0x0b, 0x4b, 0x73, 0x23, 0x42,
+  0x55, 0x84, 0x35, 0xf4, 0xf4, 0x24, 0x45, 0x34, 0x41, 0x28, 0xaa, 0x09,
+  0x42, 0x61, 0x6d, 0x08, 0x88, 0x09, 0x42, 0x71, 0x4d, 0x10, 0x0a, 0x6c,
+  0x82, 0x40, 0x48, 0x1b, 0x84, 0x49, 0x0e, 0x36, 0x2c, 0x04, 0x1b, 0xb4,
+  0x81, 0x1b, 0xbc, 0x01, 0x1c, 0x0c, 0x71, 0x40, 0xb8, 0xc1, 0x1c, 0x6c,
+  0x08, 0x86, 0x0d, 0xc2, 0x34, 0x6d, 0x58, 0x06, 0x36, 0x68, 0x03, 0x37,
+  0xa8, 0x03, 0x38, 0x18, 0xe0, 0x60, 0x70, 0x03, 0x3b, 0xd8, 0x20, 0xd0,
+  0xc1, 0x1d, 0x30, 0x99, 0xb2, 0xfa, 0xa2, 0x0a, 0x93, 0x3b, 0x2b, 0xa3,
+  0x9b, 0x20, 0x14, 0xd9, 0x86, 0x85, 0xc8, 0x83, 0x36, 0xd0, 0x83, 0x37,
+  0x70, 0x83, 0x21, 0x0e, 0x08, 0x37, 0x98, 0x83, 0x0d, 0xc1, 0x1e, 0x6c,
+  0x18, 0xf0, 0x80, 0x0f, 0x80, 0x0d, 0x05, 0x19, 0xac, 0x41, 0x1f, 0x6c,
+  0x00, 0x0d, 0x33, 0xb6, 0xb7, 0x30, 0xba, 0xb9, 0x09, 0x02, 0x31, 0xb1,
+  0x48, 0x73, 0x9b, 0xa3, 0x9b, 0x9b, 0x20, 0x10, 0x14, 0x8d, 0xb9, 0xb4,
+  0xb3, 0x2f, 0x36, 0x32, 0x1a, 0x73, 0x69, 0x67, 0x5f, 0x73, 0x74, 0x44,
+  0xe8, 0xca, 0xf0, 0xbe, 0xce, 0xe4, 0xc2, 0xc8, 0x36, 0x28, 0x7f, 0x00,
+  0x0a, 0xa1, 0x20, 0x0a, 0xa3, 0x80, 0x90, 0x02, 0x18, 0x94, 0xc2, 0x50,
+  0x85, 0x8d, 0xcd, 0xae, 0xcd, 0x25, 0x8d, 0xac, 0xcc, 0x8d, 0x6e, 0x4a,
+  0x10, 0x54, 0x21, 0xc3, 0x73, 0xb1, 0x2b, 0x93, 0x9b, 0x4b, 0x7b, 0x73,
+  0x9b, 0x12, 0x10, 0x4d, 0xc8, 0xf0, 0x5c, 0xec, 0xc2, 0xd8, 0xec, 0xca,
+  0xe4, 0xa6, 0x04, 0x45, 0x1d, 0x32, 0x3c, 0x97, 0x39, 0xb4, 0x30, 0xb2,
+  0x32, 0xb9, 0xa6, 0x37, 0xb2, 0x32, 0xb6, 0x29, 0x01, 0x52, 0x86, 0x0c,
+  0xcf, 0x45, 0xae, 0x6c, 0xee, 0xad, 0x4e, 0x6e, 0xac, 0x6c, 0x6e, 0x4a,
+  0xa0, 0x55, 0x22, 0xc3, 0x73, 0xa1, 0xcb, 0x83, 0x2b, 0x0b, 0x72, 0x73,
+  0x7b, 0xa3, 0x0b, 0xa3, 0x4b, 0x7b, 0x73, 0x9b, 0x9b, 0x22, 0x88, 0xc1,
+  0x19, 0xd4, 0x21, 0xc3, 0x73, 0xb1, 0x4b, 0x2b, 0xbb, 0x4b, 0x22, 0x9b,
+  0xa2, 0x0b, 0xa3, 0x2b, 0x9b, 0x12, 0xa4, 0x41, 0x1d, 0x32, 0x3c, 0x97,
+  0x32, 0x37, 0x3a, 0xb9, 0x3c, 0xa8, 0xb7, 0x34, 0x37, 0xba, 0xb9, 0x29,
+  0x41, 0x1f, 0x74, 0x21, 0xc3, 0x73, 0x19, 0x7b, 0xab, 0x73, 0xa3, 0x2b,
+  0x93, 0x9b, 0x9b, 0x12, 0x94, 0x02, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00,
   0x4c, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66,
   0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07,
   0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10,
@@ -199,11 +199,11 @@ static const unsigned char texture_rgb_pixelart_frag_dxil[] = {
   0xdb, 0xc0, 0x33, 0x5c, 0xbe, 0xf3, 0xf8, 0x54, 0x03, 0x44, 0x98, 0x5f,
   0xdc, 0xb6, 0x01, 0x10, 0x0c, 0x80, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x48, 0x41, 0x53, 0x48, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x5a, 0x15, 0x9a, 0x19, 0xc6, 0x89, 0x40, 0x26, 0xc1, 0xc6, 0x4f, 0x4d,
-  0x36, 0x2b, 0x0f, 0x80, 0x44, 0x58, 0x49, 0x4c, 0x30, 0x09, 0x00, 0x00,
-  0x60, 0x00, 0x00, 0x00, 0x4c, 0x02, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4c,
-  0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x18, 0x09, 0x00, 0x00,
-  0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0x43, 0x02, 0x00, 0x00,
+  0x9e, 0x1e, 0xf5, 0xe1, 0xa2, 0x09, 0x7a, 0x62, 0x93, 0xeb, 0xdb, 0x38,
+  0x69, 0x0e, 0xec, 0x47, 0x44, 0x58, 0x49, 0x4c, 0x2c, 0x09, 0x00, 0x00,
+  0x60, 0x00, 0x00, 0x00, 0x4b, 0x02, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4c,
+  0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x14, 0x09, 0x00, 0x00,
+  0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0x42, 0x02, 0x00, 0x00,
   0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00,
   0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39,
   0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62,
@@ -267,135 +267,135 @@ static const unsigned char texture_rgb_pixelart_frag_dxil[] = {
   0x05, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x59,
   0x20, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x14,
   0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0x22,
-  0x4a, 0x60, 0x04, 0xa0, 0x20, 0x8a, 0xa1, 0x08, 0x4a, 0xa2, 0x0c, 0x0a,
-  0xa4, 0x3c, 0xa8, 0x28, 0x89, 0x11, 0x80, 0x22, 0x28, 0x84, 0x02, 0xa1,
-  0x6e, 0x06, 0x80, 0xbe, 0x19, 0x00, 0x0a, 0x67, 0x00, 0x48, 0x1c, 0x0b,
-  0x31, 0x88, 0x40, 0x20, 0x90, 0xe3, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00,
-  0x5f, 0x00, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0xc4,
-  0x8e, 0x0c, 0x6f, 0xec, 0xed, 0x4d, 0x0c, 0x24, 0xc6, 0x05, 0xc7, 0x45,
-  0xa6, 0x06, 0x46, 0xc6, 0x05, 0x07, 0x04, 0x45, 0x8c, 0xe6, 0x26, 0x26,
-  0x06, 0x67, 0x26, 0xa7, 0x2c, 0x65, 0x43, 0x10, 0x4c, 0x10, 0x08, 0x64,
-  0x82, 0x40, 0x24, 0x1b, 0x84, 0x81, 0x98, 0x20, 0x10, 0xca, 0x06, 0x61,
-  0x30, 0x28, 0xc0, 0xcd, 0x4d, 0x10, 0x88, 0x65, 0xc3, 0x80, 0x24, 0xc4,
-  0x04, 0xa1, 0xb3, 0x08, 0x4c, 0x10, 0x08, 0x66, 0x82, 0x40, 0x34, 0x1b,
-  0x04, 0xc2, 0xd9, 0x90, 0x10, 0x0b, 0xd3, 0x10, 0x43, 0x43, 0x3c, 0x1b,
-  0x02, 0x68, 0x82, 0xf0, 0x5d, 0x13, 0x04, 0xc2, 0x99, 0x20, 0x10, 0xcf,
-  0x06, 0x84, 0x90, 0x98, 0x89, 0x18, 0x28, 0x60, 0x43, 0x50, 0x4d, 0x10,
-  0xc2, 0x00, 0xdb, 0x80, 0x10, 0x17, 0xd3, 0x10, 0x03, 0x01, 0x6c, 0x08,
-  0xb0, 0x0d, 0x44, 0x04, 0x58, 0xd9, 0x04, 0x41, 0x0c, 0xb2, 0x0d, 0xc1,
-  0x36, 0x41, 0x10, 0x00, 0x12, 0x6d, 0x61, 0x69, 0x6e, 0x44, 0xa8, 0x8a,
-  0xb0, 0x86, 0x9e, 0x9e, 0xa4, 0x88, 0x26, 0x08, 0x45, 0x34, 0x41, 0x28,
-  0xa4, 0x0d, 0x01, 0x31, 0x41, 0x28, 0xa6, 0x09, 0x42, 0x41, 0x4d, 0x10,
-  0x08, 0x68, 0x83, 0x30, 0x95, 0xc1, 0x86, 0x85, 0xf8, 0xc0, 0x20, 0x0c,
-  0xc4, 0x60, 0x0c, 0x06, 0x32, 0x20, 0xc2, 0xc0, 0x0c, 0x36, 0x04, 0xc3,
-  0x06, 0x61, 0x9a, 0x36, 0x2c, 0xc3, 0x07, 0x06, 0x61, 0x80, 0x06, 0x63,
-  0x30, 0x8c, 0xc1, 0x10, 0x06, 0x69, 0xb0, 0x41, 0x38, 0x03, 0x35, 0x60,
-  0x32, 0x65, 0xf5, 0x45, 0x15, 0x26, 0x77, 0x56, 0x46, 0x37, 0x41, 0x28,
-  0xaa, 0x0d, 0x0b, 0xc1, 0x06, 0x60, 0xd0, 0x06, 0x62, 0x10, 0x06, 0x03,
-  0x19, 0x10, 0x61, 0x60, 0x06, 0x1b, 0x02, 0x37, 0xd8, 0x30, 0xac, 0xc1,
-  0x1b, 0x00, 0x1b, 0x8a, 0xce, 0x83, 0x03, 0x0d, 0xa8, 0xc2, 0xc6, 0x66,
-  0xd7, 0xe6, 0x92, 0x46, 0x56, 0xe6, 0x46, 0x37, 0x25, 0x08, 0xaa, 0x90,
-  0xe1, 0xb9, 0xd8, 0x95, 0xc9, 0xcd, 0xa5, 0xbd, 0xb9, 0x4d, 0x09, 0x88,
-  0x26, 0x64, 0x78, 0x2e, 0x76, 0x61, 0x6c, 0x76, 0x65, 0x72, 0x53, 0x02,
-  0xa3, 0x0e, 0x19, 0x9e, 0xcb, 0x1c, 0x5a, 0x18, 0x59, 0x99, 0x5c, 0xd3,
-  0x1b, 0x59, 0x19, 0xdb, 0x94, 0x20, 0x29, 0x43, 0x86, 0xe7, 0x22, 0x57,
-  0x36, 0xf7, 0x56, 0x27, 0x37, 0x56, 0x36, 0x37, 0x25, 0xc8, 0xea, 0x90,
-  0xe1, 0xb9, 0xd8, 0xa5, 0x95, 0xdd, 0x25, 0x91, 0x4d, 0xd1, 0x85, 0xd1,
-  0x95, 0x4d, 0x09, 0xb6, 0x3a, 0x64, 0x78, 0x2e, 0x65, 0x6e, 0x74, 0x72,
-  0x79, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x53, 0x02, 0x38, 0x00, 0x00,
-  0x79, 0x18, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c,
-  0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3,
-  0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6,
-  0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e,
-  0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43,
-  0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03,
-  0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48,
-  0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20,
-  0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e,
-  0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d,
-  0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89,
-  0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83,
-  0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68,
-  0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90,
-  0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78,
-  0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98,
-  0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5,
-  0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c,
-  0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c,
-  0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43,
-  0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43,
-  0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82,
-  0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x8c, 0xc8, 0x21, 0x07, 0x7c, 0x70,
-  0x03, 0x72, 0x10, 0x87, 0x73, 0x70, 0x03, 0x7b, 0x08, 0x07, 0x79, 0x60,
-  0x87, 0x70, 0xc8, 0x87, 0x77, 0xa8, 0x07, 0x7a, 0x98, 0x81, 0x3c, 0xe4,
-  0x80, 0x0f, 0x6e, 0x40, 0x0f, 0xe5, 0xd0, 0x0e, 0xf0, 0x00, 0x00, 0x00,
-  0x71, 0x20, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x46, 0x00, 0x0d, 0x97,
-  0xef, 0x3c, 0x7e, 0x80, 0x34, 0x40, 0x84, 0xf9, 0xc5, 0x6d, 0x9b, 0xc1,
-  0x36, 0x5c, 0xbe, 0xf3, 0xf8, 0x42, 0x40, 0x15, 0x05, 0x11, 0x95, 0x0e,
-  0x30, 0x94, 0x84, 0x01, 0x08, 0x98, 0x5f, 0xdc, 0xb6, 0x1d, 0x48, 0xc3,
-  0xe5, 0x3b, 0x8f, 0x2f, 0x44, 0x04, 0x30, 0x11, 0x21, 0xd0, 0x0c, 0x0b,
-  0x61, 0x01, 0xd3, 0x70, 0xf9, 0xce, 0xe3, 0x2f, 0x0e, 0x30, 0x88, 0xcd,
-  0x43, 0x4d, 0x7e, 0x71, 0xdb, 0x56, 0x40, 0x0d, 0x97, 0xef, 0x3c, 0xbe,
-  0x04, 0x30, 0xcf, 0x42, 0x80, 0x11, 0x30, 0xf8, 0xc5, 0x6d, 0x9b, 0x40,
-  0x35, 0x5c, 0xbe, 0xf3, 0xf8, 0xd2, 0xe4, 0x44, 0x04, 0x4a, 0x4d, 0x0f,
-  0x35, 0xf9, 0xc5, 0x6d, 0xdb, 0xc0, 0x33, 0x5c, 0xbe, 0xf3, 0xf8, 0x54,
-  0x03, 0x44, 0x98, 0x5f, 0xdc, 0xb6, 0x01, 0x10, 0x0c, 0x80, 0x34, 0x00,
-  0x61, 0x20, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, 0x2c,
-  0x10, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x64, 0x8d, 0x00, 0x50,
-  0x51, 0x02, 0x65, 0x40, 0x44, 0xf9, 0x95, 0x5d, 0x39, 0x14, 0xcb, 0x0c,
-  0x40, 0x21, 0x94, 0x42, 0xc9, 0x95, 0x69, 0x40, 0xa1, 0x06, 0x94, 0x51,
-  0x21, 0x95, 0x0d, 0x0d, 0x63, 0x04, 0x20, 0x08, 0x82, 0x24, 0x18, 0x8c,
-  0x11, 0x80, 0x20, 0x08, 0x82, 0x60, 0x30, 0x46, 0x00, 0x82, 0x20, 0x88,
-  0xff, 0xc2, 0x18, 0x01, 0x08, 0x82, 0x20, 0xfe, 0x8d, 0x11, 0xb0, 0x6d,
-  0xfc, 0xca, 0xdb, 0x18, 0x01, 0x08, 0x82, 0x20, 0xfc, 0xcd, 0x00, 0x00,
-  0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x70, 0xa9, 0x41, 0xf3, 0xa1, 0x01,
-  0x1a, 0x5c, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x70, 0xad, 0x81, 0x63,
-  0xa5, 0x41, 0x1a, 0x60, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x70, 0xb1,
-  0xc1, 0x03, 0x06, 0x6a, 0xa0, 0x06, 0xd9, 0x88, 0x41, 0x02, 0x80, 0x20,
-  0x18, 0x18, 0x73, 0x20, 0xb1, 0xc1, 0x1a, 0x88, 0xc1, 0x34, 0x62, 0x90,
-  0x00, 0x20, 0x08, 0x06, 0x06, 0x1d, 0x4c, 0x6d, 0xc0, 0x06, 0x1a, 0x35,
-  0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0x46, 0x1d, 0x50, 0x6d, 0xd0, 0x06,
-  0x64, 0x50, 0x8d, 0x18, 0x24, 0x00, 0x08, 0x82, 0x81, 0x61, 0x07, 0x95,
-  0x1b, 0xb8, 0x01, 0x67, 0x8d, 0x18, 0x24, 0x00, 0x08, 0x82, 0x81, 0x71,
-  0x07, 0xd6, 0x1b, 0xbc, 0x41, 0x19, 0x5c, 0x23, 0x06, 0x09, 0x00, 0x82,
-  0x60, 0x60, 0xe0, 0xc1, 0x05, 0x07, 0x70, 0xd0, 0x61, 0x23, 0x06, 0x06,
-  0x00, 0x82, 0x60, 0xa0, 0xdc, 0x41, 0x65, 0x8c, 0x18, 0x18, 0x00, 0x08,
-  0x82, 0x81, 0x82, 0x07, 0x96, 0x31, 0x62, 0x60, 0x00, 0x20, 0x08, 0x06,
-  0x4a, 0x1e, 0xc4, 0x81, 0x30, 0x62, 0x60, 0x00, 0x20, 0x08, 0x06, 0x8a,
-  0x1e, 0xc8, 0x81, 0x30, 0x62, 0x60, 0x00, 0x20, 0x08, 0x06, 0xca, 0x1e,
-  0x60, 0xca, 0x88, 0x81, 0x01, 0x80, 0x20, 0x18, 0x28, 0x7c, 0x90, 0x29,
-  0x23, 0x06, 0x06, 0x00, 0x82, 0x60, 0xa0, 0xf4, 0x41, 0x1d, 0x08, 0x23,
-  0x06, 0x06, 0x00, 0x82, 0x60, 0xa0, 0xf8, 0x81, 0x1d, 0x08, 0x26, 0x18,
-  0xf0, 0x31, 0xc1, 0x80, 0xcf, 0x88, 0xc1, 0x01, 0x80, 0x20, 0x18, 0x50,
-  0x7e, 0x60, 0x06, 0xd1, 0x1e, 0x8c, 0x26, 0x04, 0xc2, 0x68, 0x82, 0x30,
-  0x98, 0x50, 0xc8, 0xc7, 0x84, 0x42, 0x3e, 0x23, 0x06, 0x07, 0x00, 0x82,
-  0x60, 0xc0, 0x94, 0x82, 0x18, 0x08, 0xdb, 0x88, 0xc1, 0x01, 0x80, 0x20,
-  0x18, 0x30, 0xa6, 0x30, 0x06, 0x02, 0x37, 0x62, 0x70, 0x00, 0x20, 0x08,
-  0x06, 0xcc, 0x29, 0x8c, 0x81, 0xe0, 0x8d, 0x18, 0x1c, 0x00, 0x08, 0x82,
-  0x01, 0x83, 0x0a, 0x64, 0x20, 0x7c, 0x86, 0x64, 0xf2, 0x31, 0x24, 0x93,
-  0x8f, 0x11, 0x60, 0x20, 0x1f, 0x23, 0xc2, 0x40, 0x3e, 0x46, 0x08, 0xf1,
-  0x31, 0x42, 0x88, 0xcf, 0x88, 0x81, 0x01, 0x80, 0x20, 0x18, 0x28, 0xb0,
-  0xa0, 0x06, 0xc2, 0x88, 0x81, 0x01, 0x80, 0x20, 0x18, 0x28, 0xb1, 0xb0,
-  0x06, 0x82, 0x09, 0x66, 0x00, 0x1f, 0x13, 0xce, 0x00, 0x3e, 0x23, 0x06,
-  0x06, 0x00, 0x82, 0x60, 0xa0, 0xd0, 0xc2, 0x1d, 0x18, 0x23, 0x06, 0x06,
-  0x00, 0x82, 0x60, 0xa0, 0xd4, 0x02, 0x1e, 0x18, 0xe6, 0xb4, 0x01, 0x7c,
-  0x2c, 0x18, 0xe0, 0x63, 0xcf, 0x1b, 0xc0, 0xc7, 0x02, 0x02, 0x3e, 0x36,
-  0x48, 0xf4, 0x31, 0x41, 0xa2, 0xcf, 0x88, 0x81, 0x01, 0x80, 0x20, 0x18,
-  0x28, 0xbc, 0x00, 0x0a, 0xc2, 0x88, 0x81, 0x01, 0x80, 0x20, 0x18, 0x28,
-  0xbd, 0x10, 0x0a, 0x82, 0x09, 0x76, 0x20, 0x1f, 0x13, 0xee, 0x40, 0x3e,
-  0x96, 0x07, 0x42, 0x7c, 0x4c, 0x0f, 0x84, 0xf8, 0x98, 0x61, 0xc8, 0xc7,
-  0x82, 0x41, 0x3e, 0x76, 0x1c, 0xf2, 0xb1, 0x80, 0x90, 0x8f, 0x51, 0x03,
-  0x7c, 0x8c, 0x12, 0xe0, 0x33, 0x9a, 0x70, 0x06, 0xc0, 0x68, 0x02, 0x1a,
-  0x04, 0x46, 0x08, 0xf2, 0x31, 0x42, 0x90, 0xcf, 0x88, 0x41, 0x05, 0x80,
-  0x20, 0x18, 0x44, 0xea, 0x20, 0x0b, 0x7e, 0xd0, 0x07, 0x42, 0xf0, 0x07,
-  0x7f, 0x60, 0x0e, 0xe6, 0xe0, 0x0a, 0x75, 0x40, 0x07, 0x7f, 0x10, 0x07,
-  0x70, 0xf0, 0x07, 0x7f, 0x30, 0x9a, 0x10, 0x00, 0xa3, 0x09, 0x42, 0x30,
-  0x9a, 0x30, 0x08, 0x36, 0xf4, 0x81, 0x7c, 0x6c, 0xe8, 0x03, 0xf9, 0xd8,
-  0xd0, 0x07, 0xf2, 0x19, 0x31, 0x48, 0x00, 0x10, 0x04, 0x03, 0x84, 0x1e,
-  0x66, 0xa1, 0x1d, 0xda, 0x81, 0x1c, 0x86, 0x11, 0x83, 0x04, 0x00, 0x41,
-  0x30, 0x40, 0xe8, 0x61, 0x16, 0xda, 0xa1, 0x1d, 0x76, 0x41, 0x18, 0x31,
-  0x48, 0x00, 0x10, 0x04, 0x03, 0x84, 0x1e, 0x66, 0xa1, 0x1d, 0xda, 0x61,
-  0x1c, 0x82, 0x11, 0x83, 0x04, 0x00, 0x41, 0x30, 0x40, 0xe8, 0x61, 0x16,
-  0xda, 0xa1, 0x1d, 0x74, 0xa1, 0x0f, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00
+  0x4a, 0x60, 0x04, 0xa0, 0x24, 0x8a, 0xa1, 0x08, 0xca, 0xa0, 0x40, 0xca,
+  0x83, 0x8a, 0x92, 0x18, 0x01, 0x28, 0x82, 0x42, 0x28, 0x10, 0xea, 0x66,
+  0x00, 0xe8, 0x9b, 0x01, 0xa0, 0x70, 0x06, 0x80, 0xc4, 0xb1, 0x10, 0x83,
+  0x08, 0x04, 0x02, 0x39, 0x0e, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00,
+  0x5e, 0x00, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0x44,
+  0x8f, 0x0c, 0x6f, 0xec, 0xed, 0x4d, 0x0c, 0x24, 0xc6, 0x05, 0xc7, 0x45,
+  0xa6, 0x06, 0xa6, 0xc6, 0x45, 0x06, 0x07, 0x04, 0x25, 0xa7, 0xcc, 0x4c,
+  0x4c, 0xcc, 0x66, 0x6c, 0x46, 0x26, 0x65, 0x43, 0x10, 0x4c, 0x10, 0x08,
+  0x64, 0x82, 0x40, 0x24, 0x1b, 0x84, 0x81, 0x98, 0x20, 0x10, 0xca, 0x06,
+  0x61, 0x30, 0x28, 0xc0, 0xcd, 0x4d, 0x10, 0x88, 0x65, 0xc3, 0x80, 0x24,
+  0xc4, 0x04, 0xa1, 0xab, 0x08, 0x4c, 0x10, 0x08, 0x66, 0x83, 0x40, 0x18,
+  0x1b, 0x12, 0x62, 0x61, 0x1a, 0x62, 0x68, 0x08, 0x67, 0x43, 0xf0, 0x4c,
+  0x10, 0x3e, 0x6b, 0x82, 0x40, 0x34, 0x13, 0x04, 0xc2, 0xd9, 0x80, 0x10,
+  0x11, 0x23, 0x11, 0xc3, 0x04, 0x6c, 0x08, 0xa8, 0x09, 0x42, 0x18, 0x5c,
+  0x1b, 0x10, 0xc2, 0x62, 0x1a, 0x62, 0x20, 0x80, 0x0d, 0xc1, 0xb5, 0x81,
+  0x80, 0x80, 0x0a, 0x9b, 0x20, 0x88, 0x01, 0xb6, 0x21, 0xd0, 0x26, 0x08,
+  0x02, 0x40, 0xa2, 0x2d, 0x2c, 0xcd, 0x8d, 0x08, 0x55, 0x11, 0xd6, 0xd0,
+  0xd3, 0x93, 0x14, 0xd1, 0x04, 0xa1, 0x80, 0x26, 0x08, 0x45, 0xb4, 0x21,
+  0x20, 0x26, 0x08, 0x85, 0x34, 0x41, 0x28, 0xa6, 0x09, 0x02, 0xf1, 0x6c,
+  0x10, 0x24, 0x32, 0xd8, 0xb0, 0x10, 0xde, 0x07, 0x06, 0x61, 0x20, 0x06,
+  0xc3, 0x18, 0x10, 0x60, 0x50, 0x06, 0x1b, 0x82, 0x61, 0x83, 0x20, 0x49,
+  0x1b, 0x96, 0xc1, 0xfb, 0xc0, 0xe0, 0x0c, 0xc4, 0x60, 0x10, 0x83, 0x01,
+  0x0c, 0xd0, 0x60, 0x83, 0x60, 0x06, 0x69, 0xc0, 0x64, 0xca, 0xea, 0x8b,
+  0x2a, 0x4c, 0xee, 0xac, 0x8c, 0x6e, 0x82, 0x50, 0x50, 0x1b, 0x16, 0x62,
+  0x0d, 0x3e, 0x36, 0x08, 0x03, 0x30, 0x18, 0xc6, 0x80, 0x00, 0x83, 0x32,
+  0xd8, 0x10, 0xb4, 0xc1, 0x86, 0x41, 0x0d, 0xdc, 0x00, 0xd8, 0x50, 0x70,
+  0xdd, 0x1b, 0x64, 0x40, 0x15, 0x36, 0x36, 0xbb, 0x36, 0x97, 0x34, 0xb2,
+  0x32, 0x37, 0xba, 0x29, 0x41, 0x50, 0x85, 0x0c, 0xcf, 0xc5, 0xae, 0x4c,
+  0x6e, 0x2e, 0xed, 0xcd, 0x6d, 0x4a, 0x40, 0x34, 0x21, 0xc3, 0x73, 0xb1,
+  0x0b, 0x63, 0xb3, 0x2b, 0x93, 0x9b, 0x12, 0x18, 0x75, 0xc8, 0xf0, 0x5c,
+  0xe6, 0xd0, 0xc2, 0xc8, 0xca, 0xe4, 0x9a, 0xde, 0xc8, 0xca, 0xd8, 0xa6,
+  0x04, 0x49, 0x19, 0x32, 0x3c, 0x17, 0xb9, 0xb2, 0xb9, 0xb7, 0x3a, 0xb9,
+  0xb1, 0xb2, 0xb9, 0x29, 0x01, 0x56, 0x87, 0x0c, 0xcf, 0xc5, 0x2e, 0xad,
+  0xec, 0x2e, 0x89, 0x6c, 0x8a, 0x2e, 0x8c, 0xae, 0x6c, 0x4a, 0xa0, 0xd5,
+  0x21, 0xc3, 0x73, 0x29, 0x73, 0xa3, 0x93, 0xcb, 0x83, 0x7a, 0x4b, 0x73,
+  0xa3, 0x9b, 0x9b, 0x12, 0xbc, 0x01, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00,
+  0x4c, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66,
+  0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07,
+  0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10,
+  0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, 0xce,
+  0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1b,
+  0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, 0x8c,
+  0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, 0x07,
+  0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, 0x11,
+  0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, 0xf0,
+  0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, 0xd8,
+  0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, 0x3b,
+  0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, 0x3b,
+  0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87,
+  0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, 0x07,
+  0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, 0x87,
+  0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 0x81,
+  0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, 0x30,
+  0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4,
+  0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, 0xca,
+  0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, 0x39,
+  0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, 0x3b,
+  0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, 0x3b,
+  0xb0, 0xc3, 0x8c, 0xc8, 0x21, 0x07, 0x7c, 0x70, 0x03, 0x72, 0x10, 0x87,
+  0x73, 0x70, 0x03, 0x7b, 0x08, 0x07, 0x79, 0x60, 0x87, 0x70, 0xc8, 0x87,
+  0x77, 0xa8, 0x07, 0x7a, 0x98, 0x81, 0x3c, 0xe4, 0x80, 0x0f, 0x6e, 0x40,
+  0x0f, 0xe5, 0xd0, 0x0e, 0xf0, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00,
+  0x1f, 0x00, 0x00, 0x00, 0x46, 0x00, 0x0d, 0x97, 0xef, 0x3c, 0x7e, 0x80,
+  0x34, 0x40, 0x84, 0xf9, 0xc5, 0x6d, 0x9b, 0xc1, 0x36, 0x5c, 0xbe, 0xf3,
+  0xf8, 0x42, 0x40, 0x15, 0x05, 0x11, 0x95, 0x0e, 0x30, 0x94, 0x84, 0x01,
+  0x08, 0x98, 0x5f, 0xdc, 0xb6, 0x1d, 0x48, 0xc3, 0xe5, 0x3b, 0x8f, 0x2f,
+  0x44, 0x04, 0x30, 0x11, 0x21, 0xd0, 0x0c, 0x0b, 0x61, 0x01, 0xd3, 0x70,
+  0xf9, 0xce, 0xe3, 0x2f, 0x0e, 0x30, 0x88, 0xcd, 0x43, 0x4d, 0x7e, 0x71,
+  0xdb, 0x56, 0x40, 0x0d, 0x97, 0xef, 0x3c, 0xbe, 0x04, 0x30, 0xcf, 0x42,
+  0x80, 0x11, 0x30, 0xf8, 0xc5, 0x6d, 0x9b, 0x40, 0x35, 0x5c, 0xbe, 0xf3,
+  0xf8, 0xd2, 0xe4, 0x44, 0x04, 0x4a, 0x4d, 0x0f, 0x35, 0xf9, 0xc5, 0x6d,
+  0xdb, 0xc0, 0x33, 0x5c, 0xbe, 0xf3, 0xf8, 0x54, 0x03, 0x44, 0x98, 0x5f,
+  0xdc, 0xb6, 0x01, 0x10, 0x0c, 0x80, 0x34, 0x00, 0x61, 0x20, 0x00, 0x00,
+  0xa8, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, 0x00,
+  0x13, 0x00, 0x00, 0x00, 0x64, 0x8d, 0x00, 0x50, 0x51, 0x02, 0x65, 0x40,
+  0x44, 0xf9, 0x95, 0x5d, 0x39, 0x14, 0xcb, 0x0c, 0x40, 0x21, 0x94, 0x42,
+  0xc9, 0x95, 0x69, 0x40, 0xa1, 0x06, 0x94, 0x51, 0x21, 0x95, 0x0d, 0x0d,
+  0x63, 0x04, 0x20, 0x08, 0x82, 0x24, 0x18, 0x8c, 0x11, 0x80, 0x20, 0x08,
+  0x82, 0x60, 0x30, 0x46, 0x00, 0x82, 0x20, 0x88, 0xff, 0xc2, 0x18, 0x01,
+  0x08, 0x82, 0x20, 0xfe, 0x8d, 0x11, 0xb0, 0x6d, 0xfc, 0xca, 0xdb, 0x18,
+  0x01, 0x08, 0x82, 0x20, 0xfc, 0xcd, 0x00, 0x00, 0x23, 0x06, 0x09, 0x00,
+  0x82, 0x60, 0x70, 0xa5, 0x41, 0xf3, 0x9d, 0xc1, 0x19, 0x5c, 0x23, 0x06,
+  0x09, 0x00, 0x82, 0x60, 0x70, 0xa9, 0x81, 0x63, 0xa1, 0x01, 0x1a, 0x60,
+  0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x70, 0xad, 0xc1, 0x03, 0x06, 0x69,
+  0x90, 0x06, 0xd9, 0x88, 0x41, 0x02, 0x80, 0x20, 0x18, 0x18, 0x72, 0x20,
+  0xad, 0x81, 0x1a, 0x88, 0xc1, 0x34, 0x62, 0x90, 0x00, 0x20, 0x08, 0x06,
+  0xc6, 0x1c, 0x4c, 0x6c, 0xb0, 0x06, 0x1a, 0x35, 0x62, 0x90, 0x00, 0x20,
+  0x08, 0x06, 0x06, 0x1d, 0x50, 0x6c, 0xc0, 0x06, 0x64, 0x50, 0x8d, 0x18,
+  0x24, 0x00, 0x08, 0x82, 0x81, 0x51, 0x07, 0x55, 0x1b, 0xb4, 0x01, 0x67,
+  0x8d, 0x18, 0x24, 0x00, 0x08, 0x82, 0x81, 0x61, 0x07, 0x96, 0x1b, 0xb8,
+  0x41, 0x19, 0x5c, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x60, 0xdc, 0xc1,
+  0xf5, 0x06, 0x6f, 0xd0, 0x61, 0x23, 0x06, 0x06, 0x00, 0x82, 0x60, 0xa0,
+  0xd8, 0x41, 0x65, 0x8c, 0x18, 0x18, 0x00, 0x08, 0x82, 0x81, 0x72, 0x07,
+  0x96, 0x31, 0x62, 0x60, 0x00, 0x20, 0x08, 0x06, 0x0a, 0x1e, 0xc0, 0x81,
+  0x30, 0x62, 0x60, 0x00, 0x20, 0x08, 0x06, 0x4a, 0x1e, 0xc4, 0x81, 0x30,
+  0x62, 0x60, 0x00, 0x20, 0x08, 0x06, 0x8a, 0x1e, 0x60, 0xca, 0x88, 0x81,
+  0x01, 0x80, 0x20, 0x18, 0x28, 0x7b, 0x90, 0x29, 0x23, 0x06, 0x06, 0x00,
+  0x82, 0x60, 0xa0, 0xf0, 0x01, 0x1d, 0x08, 0x23, 0x06, 0x06, 0x00, 0x82,
+  0x60, 0xa0, 0xf4, 0x41, 0x1d, 0x08, 0x26, 0x18, 0xf0, 0x31, 0xc1, 0x80,
+  0xcf, 0x88, 0xc1, 0x01, 0x80, 0x20, 0x18, 0x50, 0x7d, 0x60, 0x06, 0x91,
+  0x1e, 0x8c, 0x26, 0x04, 0xc2, 0x68, 0x82, 0x30, 0x98, 0x50, 0xc8, 0xc7,
+  0x84, 0x42, 0x3e, 0x23, 0x06, 0x07, 0x00, 0x82, 0x60, 0xc0, 0x90, 0x82,
+  0x18, 0x08, 0xdb, 0x88, 0xc1, 0x01, 0x80, 0x20, 0x18, 0x30, 0xa5, 0x30,
+  0x06, 0x02, 0x37, 0x62, 0x70, 0x00, 0x20, 0x08, 0x06, 0x8c, 0x29, 0x8c,
+  0x81, 0xe0, 0x8d, 0x18, 0x1c, 0x00, 0x08, 0x82, 0x01, 0x73, 0x0a, 0x64,
+  0x20, 0x7c, 0x86, 0x64, 0xf2, 0x31, 0x24, 0x93, 0x8f, 0x11, 0x60, 0x20,
+  0x1f, 0x23, 0xc2, 0x40, 0x3e, 0x46, 0x08, 0xf1, 0x31, 0x42, 0x88, 0xcf,
+  0x88, 0x81, 0x01, 0x80, 0x20, 0x18, 0x28, 0xaf, 0xa0, 0x06, 0xc2, 0x88,
+  0x81, 0x01, 0x80, 0x20, 0x18, 0x28, 0xb0, 0xb0, 0x06, 0x82, 0x09, 0x66,
+  0x00, 0x1f, 0x13, 0xce, 0x00, 0x3e, 0x23, 0x06, 0x06, 0x00, 0x82, 0x60,
+  0xa0, 0xcc, 0xc2, 0x1d, 0x18, 0x23, 0x06, 0x06, 0x00, 0x82, 0x60, 0xa0,
+  0xd0, 0x02, 0x1e, 0x18, 0xe6, 0xb4, 0x01, 0x7c, 0x2c, 0x18, 0xe0, 0x63,
+  0xcf, 0x1b, 0xc0, 0xc7, 0x02, 0x02, 0x3e, 0x36, 0x48, 0xf4, 0x31, 0x41,
+  0xa2, 0xcf, 0x88, 0x81, 0x01, 0x80, 0x20, 0x18, 0x28, 0xbb, 0x00, 0x0a,
+  0xc2, 0x88, 0x81, 0x01, 0x80, 0x20, 0x18, 0x28, 0xbc, 0x10, 0x0a, 0x82,
+  0x09, 0x76, 0x20, 0x1f, 0x13, 0xee, 0x40, 0x3e, 0x96, 0x07, 0x42, 0x7c,
+  0x4c, 0x0f, 0x84, 0xf8, 0x98, 0x61, 0xc8, 0xc7, 0x82, 0x41, 0x3e, 0x76,
+  0x1c, 0xf2, 0xb1, 0x80, 0x90, 0x8f, 0x51, 0x03, 0x7c, 0x8c, 0x12, 0xe0,
+  0x33, 0x9a, 0x70, 0x06, 0xc0, 0x68, 0x02, 0x1a, 0x04, 0x46, 0x08, 0xf2,
+  0x31, 0x42, 0x90, 0xcf, 0x88, 0x41, 0x05, 0x80, 0x20, 0x18, 0x44, 0xe9,
+  0x20, 0x0b, 0x7e, 0xd0, 0x07, 0x42, 0xf0, 0x07, 0x7f, 0x50, 0x0e, 0xe5,
+  0xe0, 0x0a, 0x75, 0x40, 0x07, 0x7f, 0x10, 0x07, 0x70, 0xf0, 0x07, 0x7f,
+  0x30, 0x9a, 0x10, 0x00, 0xa3, 0x09, 0x42, 0x30, 0x9a, 0x30, 0x08, 0x36,
+  0xf4, 0x81, 0x7c, 0x6c, 0xe8, 0x03, 0xf9, 0xd8, 0xd0, 0x07, 0xf2, 0x19,
+  0x31, 0x48, 0x00, 0x10, 0x04, 0x03, 0x64, 0x1e, 0x66, 0x81, 0x1d, 0xd8,
+  0x81, 0x1c, 0x86, 0x11, 0x83, 0x04, 0x00, 0x41, 0x30, 0x40, 0xe6, 0x61,
+  0x16, 0xd8, 0x81, 0x1d, 0x76, 0x41, 0x18, 0x31, 0x48, 0x00, 0x10, 0x04,
+  0x03, 0x64, 0x1e, 0x66, 0x81, 0x1d, 0xd8, 0x61, 0x1c, 0x82, 0x11, 0x83,
+  0x04, 0x00, 0x41, 0x30, 0x40, 0xe6, 0x61, 0x16, 0xd8, 0x81, 0x1d, 0x74,
+  0xa1, 0x0f, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00
 };
-static const unsigned int texture_rgb_pixelart_frag_dxil_len = 4776;
+static const unsigned int texture_rgb_pixelart_frag_dxil_len = 4772;

+ 137 - 138
src/render/gpu/shaders/texture_rgba.frag.dxil.h

@@ -1,7 +1,7 @@
 static const unsigned char texture_rgba_frag_dxil[] = {
-  0x44, 0x58, 0x42, 0x43, 0x2c, 0xf2, 0x0b, 0x54, 0xa5, 0x14, 0xe8, 0x34,
-  0x7c, 0x05, 0x44, 0xa2, 0xa9, 0x4c, 0xf8, 0x8b, 0x01, 0x00, 0x00, 0x00,
-  0x18, 0x0f, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00,
+  0x44, 0x58, 0x42, 0x43, 0x62, 0x3b, 0x7d, 0x43, 0xba, 0x04, 0xbd, 0x2f,
+  0x58, 0xb0, 0x44, 0xf9, 0x75, 0xb5, 0x45, 0xe3, 0x01, 0x00, 0x00, 0x00,
+  0x0c, 0x0f, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00,
   0x4c, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0x00,
   0xd8, 0x01, 0x00, 0x00, 0x34, 0x08, 0x00, 0x00, 0x50, 0x08, 0x00, 0x00,
   0x53, 0x46, 0x49, 0x30, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -100,47 +100,47 @@ static const unsigned char texture_rgba_frag_dxil[] = {
   0x65, 0x50, 0x1e, 0x85, 0x50, 0x2c, 0x54, 0x4a, 0x62, 0x04, 0xa0, 0x08,
   0x0a, 0xa1, 0x40, 0xc8, 0xce, 0x00, 0x10, 0x9e, 0x01, 0xa0, 0x3c, 0x16,
   0x62, 0x10, 0x81, 0x40, 0x20, 0xcf, 0x03, 0x00, 0x79, 0x18, 0x00, 0x00,
-  0x7a, 0x00, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0xc4,
-  0x8e, 0x0c, 0x6f, 0xec, 0xed, 0x4d, 0x0c, 0x24, 0xc6, 0x05, 0xc7, 0x45,
-  0xa6, 0x06, 0x46, 0xc6, 0x05, 0x07, 0x04, 0x45, 0x8c, 0xe6, 0x26, 0x26,
-  0x06, 0x67, 0x26, 0xa7, 0x2c, 0x65, 0x43, 0x10, 0x4c, 0x10, 0x88, 0x62,
-  0x82, 0x40, 0x18, 0x1b, 0x84, 0x81, 0xd8, 0x20, 0x10, 0x04, 0x05, 0xb8,
-  0xb9, 0x09, 0x02, 0x71, 0x6c, 0x18, 0x0e, 0x84, 0x98, 0x20, 0x58, 0x13,
-  0x93, 0xba, 0x2f, 0xba, 0x32, 0x3c, 0xba, 0x3a, 0xb9, 0xb2, 0x09, 0x02,
-  0x81, 0x4c, 0x10, 0x88, 0x64, 0x83, 0x40, 0x34, 0x1b, 0x12, 0x42, 0x59,
-  0x18, 0x62, 0x60, 0x08, 0x67, 0x43, 0xf0, 0x4c, 0x10, 0x30, 0x8a, 0x49,
-  0xdd, 0xd7, 0x5c, 0x58, 0x1b, 0x1c, 0x5b, 0x99, 0xdc, 0x06, 0x84, 0x88,
-  0x24, 0x86, 0x18, 0x08, 0x60, 0x43, 0x30, 0x6d, 0x20, 0x20, 0x00, 0xa0,
-  0x26, 0x08, 0x02, 0xb0, 0x01, 0xd8, 0x30, 0x10, 0xd7, 0xb5, 0x21, 0xc0,
-  0x36, 0x0c, 0x83, 0x95, 0x4d, 0x10, 0xb2, 0x6a, 0x43, 0xb0, 0x91, 0x68,
-  0x0b, 0x4b, 0x73, 0x23, 0x42, 0x55, 0x84, 0x35, 0xf4, 0xf4, 0x24, 0x45,
-  0x34, 0x41, 0x28, 0x9c, 0x09, 0x42, 0xf1, 0x6c, 0x08, 0x88, 0x09, 0x42,
-  0x01, 0x4d, 0x10, 0x8a, 0x68, 0x82, 0x40, 0x28, 0x13, 0x04, 0x62, 0xd9,
-  0x20, 0x90, 0x41, 0x19, 0x6c, 0x58, 0x08, 0xef, 0x03, 0x83, 0x30, 0x10,
-  0x83, 0x61, 0x0c, 0x08, 0x30, 0x30, 0x83, 0x0d, 0xc1, 0xb0, 0x41, 0x20,
-  0x03, 0x32, 0xd8, 0xb0, 0x0c, 0xde, 0x07, 0x06, 0x68, 0x20, 0x06, 0x83,
-  0x18, 0x0c, 0x60, 0x90, 0x06, 0x1b, 0x84, 0x33, 0x50, 0x03, 0x26, 0x53,
-  0x56, 0x5f, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x13, 0x84, 0x42, 0xda,
-  0xb0, 0x10, 0x6c, 0xf0, 0xb5, 0x41, 0x18, 0x80, 0xc1, 0x30, 0x06, 0x04,
-  0x18, 0x98, 0xc1, 0x86, 0xc0, 0x0d, 0x36, 0x0c, 0x6b, 0xf0, 0x06, 0xc0,
-  0x86, 0xc2, 0xea, 0xe0, 0xa0, 0x02, 0x68, 0x98, 0xb1, 0xbd, 0x85, 0xd1,
-  0xcd, 0x4d, 0x10, 0x08, 0x86, 0x45, 0x9a, 0xdb, 0x1c, 0xdd, 0xdc, 0x04,
-  0x81, 0x68, 0x68, 0xcc, 0xa5, 0x9d, 0x7d, 0xb1, 0x91, 0xd1, 0x98, 0x4b,
-  0x3b, 0xfb, 0x9a, 0xa3, 0x23, 0x42, 0x57, 0x86, 0xf7, 0xe5, 0xf6, 0x26,
-  0xd7, 0xb6, 0x41, 0x91, 0x83, 0x39, 0xa0, 0x83, 0x3a, 0xb0, 0x03, 0xe4,
-  0x0e, 0xe6, 0x00, 0x0f, 0x86, 0x2a, 0x6c, 0x6c, 0x76, 0x6d, 0x2e, 0x69,
-  0x64, 0x65, 0x6e, 0x74, 0x53, 0x82, 0xa0, 0x0a, 0x19, 0x9e, 0x8b, 0x5d,
-  0x99, 0xdc, 0x5c, 0xda, 0x9b, 0xdb, 0x94, 0x80, 0x68, 0x42, 0x86, 0xe7,
-  0x62, 0x17, 0xc6, 0x66, 0x57, 0x26, 0x37, 0x25, 0x28, 0xea, 0x90, 0xe1,
-  0xb9, 0xcc, 0xa1, 0x85, 0x91, 0x95, 0xc9, 0x35, 0xbd, 0x91, 0x95, 0xb1,
-  0x4d, 0x09, 0x90, 0x32, 0x64, 0x78, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75,
-  0x72, 0x63, 0x65, 0x73, 0x53, 0x02, 0xaa, 0x12, 0x19, 0x9e, 0x0b, 0x5d,
-  0x1e, 0x5c, 0x59, 0x90, 0x9b, 0xdb, 0x1b, 0x5d, 0x18, 0x5d, 0xda, 0x9b,
-  0xdb, 0xdc, 0x94, 0x20, 0xab, 0x43, 0x86, 0xe7, 0x62, 0x97, 0x56, 0x76,
-  0x97, 0x44, 0x36, 0x45, 0x17, 0x46, 0x57, 0x36, 0x25, 0xd8, 0xea, 0x90,
-  0xe1, 0xb9, 0x94, 0xb9, 0xd1, 0xc9, 0xe5, 0x41, 0xbd, 0xa5, 0xb9, 0xd1,
-  0xcd, 0x4d, 0x09, 0xe0, 0xa0, 0x0b, 0x19, 0x9e, 0xcb, 0xd8, 0x5b, 0x9d,
-  0x1b, 0x5d, 0x99, 0xdc, 0xdc, 0x94, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00,
+  0x7a, 0x00, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0x44,
+  0x8f, 0x0c, 0x6f, 0xec, 0xed, 0x4d, 0x0c, 0x24, 0xc6, 0x05, 0xc7, 0x45,
+  0xa6, 0x06, 0xa6, 0xc6, 0x45, 0x06, 0x07, 0x04, 0x25, 0xa7, 0xcc, 0x4c,
+  0x4c, 0xcc, 0x66, 0x6c, 0x46, 0x26, 0x65, 0x43, 0x10, 0x4c, 0x10, 0x88,
+  0x62, 0x82, 0x40, 0x18, 0x1b, 0x84, 0x81, 0xd8, 0x20, 0x10, 0x04, 0x05,
+  0xb8, 0xb9, 0x09, 0x02, 0x71, 0x6c, 0x18, 0x0e, 0x84, 0x98, 0x20, 0x58,
+  0x13, 0x93, 0xba, 0x2f, 0xba, 0x32, 0x3c, 0xba, 0x3a, 0xb9, 0xb2, 0x09,
+  0x02, 0x81, 0x4c, 0x10, 0x88, 0x64, 0x83, 0x40, 0x34, 0x1b, 0x12, 0x42,
+  0x59, 0x18, 0x62, 0x60, 0x08, 0x67, 0x43, 0xf0, 0x4c, 0x10, 0x30, 0x8a,
+  0x49, 0xdd, 0xd7, 0x5c, 0x58, 0x1b, 0x1c, 0x5b, 0x99, 0xdc, 0x06, 0x84,
+  0x88, 0x24, 0x86, 0x18, 0x08, 0x60, 0x43, 0x30, 0x6d, 0x20, 0x20, 0x00,
+  0xa0, 0x26, 0x08, 0x02, 0xb0, 0x01, 0xd8, 0x30, 0x10, 0xd7, 0xb5, 0x21,
+  0xc0, 0x36, 0x0c, 0x83, 0x95, 0x4d, 0x10, 0xb2, 0x6a, 0x43, 0xb0, 0x91,
+  0x68, 0x0b, 0x4b, 0x73, 0x23, 0x42, 0x55, 0x84, 0x35, 0xf4, 0xf4, 0x24,
+  0x45, 0x34, 0x41, 0x28, 0x9c, 0x09, 0x42, 0xf1, 0x6c, 0x08, 0x88, 0x09,
+  0x42, 0x01, 0x4d, 0x10, 0x8a, 0x68, 0x82, 0x40, 0x28, 0x13, 0x04, 0x62,
+  0xd9, 0x20, 0x90, 0x41, 0x19, 0x6c, 0x58, 0x08, 0xef, 0x03, 0x83, 0x30,
+  0x10, 0x83, 0x61, 0x0c, 0x08, 0x30, 0x30, 0x83, 0x0d, 0xc1, 0xb0, 0x41,
+  0x20, 0x03, 0x32, 0xd8, 0xb0, 0x0c, 0xde, 0x07, 0x06, 0x68, 0x20, 0x06,
+  0x83, 0x18, 0x0c, 0x60, 0x90, 0x06, 0x1b, 0x84, 0x33, 0x50, 0x03, 0x26,
+  0x53, 0x56, 0x5f, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x13, 0x84, 0x42,
+  0xda, 0xb0, 0x10, 0x6c, 0xf0, 0xb5, 0x41, 0x18, 0x80, 0xc1, 0x30, 0x06,
+  0x04, 0x18, 0x98, 0xc1, 0x86, 0xc0, 0x0d, 0x36, 0x0c, 0x6b, 0xf0, 0x06,
+  0xc0, 0x86, 0xc2, 0xea, 0xe0, 0xa0, 0x02, 0x68, 0x98, 0xb1, 0xbd, 0x85,
+  0xd1, 0xcd, 0x4d, 0x10, 0x08, 0x86, 0x45, 0x9a, 0xdb, 0x1c, 0xdd, 0xdc,
+  0x04, 0x81, 0x68, 0x68, 0xcc, 0xa5, 0x9d, 0x7d, 0xb1, 0x91, 0xd1, 0x98,
+  0x4b, 0x3b, 0xfb, 0x9a, 0xa3, 0x23, 0x42, 0x57, 0x86, 0xf7, 0xe5, 0xf6,
+  0x26, 0xd7, 0xb6, 0x41, 0x91, 0x83, 0x39, 0xa0, 0x83, 0x3a, 0xb0, 0x03,
+  0xe4, 0x0e, 0xe6, 0x00, 0x0f, 0x86, 0x2a, 0x6c, 0x6c, 0x76, 0x6d, 0x2e,
+  0x69, 0x64, 0x65, 0x6e, 0x74, 0x53, 0x82, 0xa0, 0x0a, 0x19, 0x9e, 0x8b,
+  0x5d, 0x99, 0xdc, 0x5c, 0xda, 0x9b, 0xdb, 0x94, 0x80, 0x68, 0x42, 0x86,
+  0xe7, 0x62, 0x17, 0xc6, 0x66, 0x57, 0x26, 0x37, 0x25, 0x28, 0xea, 0x90,
+  0xe1, 0xb9, 0xcc, 0xa1, 0x85, 0x91, 0x95, 0xc9, 0x35, 0xbd, 0x91, 0x95,
+  0xb1, 0x4d, 0x09, 0x90, 0x32, 0x64, 0x78, 0x2e, 0x72, 0x65, 0x73, 0x6f,
+  0x75, 0x72, 0x63, 0x65, 0x73, 0x53, 0x02, 0xaa, 0x12, 0x19, 0x9e, 0x0b,
+  0x5d, 0x1e, 0x5c, 0x59, 0x90, 0x9b, 0xdb, 0x1b, 0x5d, 0x18, 0x5d, 0xda,
+  0x9b, 0xdb, 0xdc, 0x94, 0x20, 0xab, 0x43, 0x86, 0xe7, 0x62, 0x97, 0x56,
+  0x76, 0x97, 0x44, 0x36, 0x45, 0x17, 0x46, 0x57, 0x36, 0x25, 0xd8, 0xea,
+  0x90, 0xe1, 0xb9, 0x94, 0xb9, 0xd1, 0xc9, 0xe5, 0x41, 0xbd, 0xa5, 0xb9,
+  0xd1, 0xcd, 0x4d, 0x09, 0xe0, 0xa0, 0x0b, 0x19, 0x9e, 0xcb, 0xd8, 0x5b,
+  0x9d, 0x1b, 0x5d, 0x99, 0xdc, 0xdc, 0x94, 0x00, 0x0f, 0x00, 0x00, 0x00,
   0x79, 0x18, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c,
   0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3,
   0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6,
@@ -175,11 +175,11 @@ static const unsigned char texture_rgba_frag_dxil[] = {
   0xe3, 0x4b, 0x93, 0x13, 0x11, 0x28, 0x35, 0x3d, 0xd4, 0xe4, 0x17, 0xb7,
   0x6d, 0x00, 0x04, 0x03, 0x20, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x48, 0x41, 0x53, 0x48, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x01, 0x40, 0x62, 0x49, 0x8c, 0x9b, 0x86, 0xee, 0x5c, 0xce, 0x55, 0xed,
-  0xa7, 0x1a, 0xb9, 0x7d, 0x44, 0x58, 0x49, 0x4c, 0xc0, 0x06, 0x00, 0x00,
-  0x60, 0x00, 0x00, 0x00, 0xb0, 0x01, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4c,
-  0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xa8, 0x06, 0x00, 0x00,
-  0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0xa7, 0x01, 0x00, 0x00,
+  0x48, 0x75, 0xb4, 0xc1, 0x62, 0x05, 0x2f, 0xdc, 0xc4, 0xd5, 0x60, 0x2b,
+  0x9d, 0x56, 0xf2, 0x75, 0x44, 0x58, 0x49, 0x4c, 0xb4, 0x06, 0x00, 0x00,
+  0x60, 0x00, 0x00, 0x00, 0xad, 0x01, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4c,
+  0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x9c, 0x06, 0x00, 0x00,
+  0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0xa4, 0x01, 0x00, 0x00,
   0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00,
   0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39,
   0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62,
@@ -232,94 +232,93 @@ static const unsigned char texture_rgba_frag_dxil[] = {
   0x0c, 0x79, 0x10, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x18, 0xf2, 0x34, 0x40, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x30, 0xe4, 0x81, 0x80, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x20, 0x0b, 0x04, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x20, 0x0b, 0x04, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00,
   0x32, 0x1e, 0x98, 0x14, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47,
-  0xc6, 0x04, 0x43, 0x22, 0x25, 0x30, 0x02, 0x50, 0x10, 0xc5, 0x50, 0x04,
-  0x25, 0x51, 0x06, 0xe5, 0x41, 0xa5, 0x24, 0x46, 0x00, 0x8a, 0xa0, 0x10,
-  0x0a, 0x84, 0xec, 0x0c, 0x00, 0xe1, 0x19, 0x00, 0xca, 0x63, 0x21, 0x06,
-  0x11, 0x08, 0x04, 0xf2, 0x3c, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00,
-  0x58, 0x00, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0xc4,
-  0x8e, 0x0c, 0x6f, 0xec, 0xed, 0x4d, 0x0c, 0x24, 0xc6, 0x05, 0xc7, 0x45,
-  0xa6, 0x06, 0x46, 0xc6, 0x05, 0x07, 0x04, 0x45, 0x8c, 0xe6, 0x26, 0x26,
-  0x06, 0x67, 0x26, 0xa7, 0x2c, 0x65, 0x43, 0x10, 0x4c, 0x10, 0x88, 0x62,
-  0x82, 0x40, 0x18, 0x1b, 0x84, 0x81, 0x98, 0x20, 0x10, 0xc7, 0x06, 0x61,
-  0x30, 0x28, 0xc0, 0xcd, 0x4d, 0x10, 0x08, 0x64, 0xc3, 0x80, 0x24, 0xc4,
-  0x04, 0xc1, 0x92, 0x08, 0x4c, 0x10, 0x88, 0x64, 0x82, 0x40, 0x28, 0x1b,
-  0x04, 0xc2, 0xd9, 0x90, 0x10, 0x0b, 0xd3, 0x10, 0x43, 0x43, 0x3c, 0x1b,
-  0x02, 0x68, 0x82, 0x80, 0x4d, 0x1b, 0x10, 0x42, 0x62, 0x1a, 0x62, 0x20,
-  0x80, 0x0d, 0xc1, 0xb4, 0x81, 0x88, 0x00, 0x80, 0x9a, 0x20, 0x64, 0xd4,
-  0x86, 0xc0, 0x9a, 0x20, 0x08, 0x00, 0x89, 0xb6, 0xb0, 0x34, 0x37, 0x22,
-  0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x13, 0x84, 0xa2, 0x99,
-  0x20, 0x14, 0xce, 0x86, 0x80, 0x98, 0x20, 0x14, 0xcf, 0x04, 0xa1, 0x80,
-  0x26, 0x08, 0xc4, 0x32, 0x41, 0x20, 0x98, 0x0d, 0x02, 0x18, 0x84, 0xc1,
-  0x86, 0x85, 0xd0, 0x36, 0xae, 0xf3, 0x86, 0x8f, 0xe0, 0xc4, 0x60, 0x43,
-  0x30, 0x6c, 0x10, 0xc0, 0x00, 0x0c, 0x36, 0x2c, 0x83, 0xb6, 0x71, 0x64,
-  0xe0, 0x0d, 0xde, 0xc0, 0x95, 0xc1, 0x06, 0x61, 0x0c, 0xcc, 0x80, 0xc9,
-  0x94, 0xd5, 0x17, 0x55, 0x98, 0xdc, 0x59, 0x19, 0xdd, 0x04, 0xa1, 0x88,
-  0x36, 0x2c, 0x04, 0x1a, 0x6c, 0x69, 0xd0, 0x71, 0xc3, 0x47, 0x70, 0x62,
-  0xb0, 0x21, 0x50, 0x83, 0x0d, 0xc3, 0x19, 0xac, 0x01, 0xb0, 0xa1, 0xc0,
-  0x32, 0x36, 0xa8, 0x80, 0x2a, 0x6c, 0x6c, 0x76, 0x6d, 0x2e, 0x69, 0x64,
-  0x65, 0x6e, 0x74, 0x53, 0x82, 0xa0, 0x0a, 0x19, 0x9e, 0x8b, 0x5d, 0x99,
-  0xdc, 0x5c, 0xda, 0x9b, 0xdb, 0x94, 0x80, 0x68, 0x42, 0x86, 0xe7, 0x62,
-  0x17, 0xc6, 0x66, 0x57, 0x26, 0x37, 0x25, 0x30, 0xea, 0x90, 0xe1, 0xb9,
-  0xcc, 0xa1, 0x85, 0x91, 0x95, 0xc9, 0x35, 0xbd, 0x91, 0x95, 0xb1, 0x4d,
-  0x09, 0x92, 0x32, 0x64, 0x78, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72,
-  0x63, 0x65, 0x73, 0x53, 0x02, 0xaa, 0x0e, 0x19, 0x9e, 0x8b, 0x5d, 0x5a,
-  0xd9, 0x5d, 0x12, 0xd9, 0x14, 0x5d, 0x18, 0x5d, 0xd9, 0x94, 0xc0, 0xaa,
-  0x43, 0x86, 0xe7, 0x52, 0xe6, 0x46, 0x27, 0x97, 0x07, 0xf5, 0x96, 0xe6,
-  0x46, 0x37, 0x37, 0x25, 0x60, 0x03, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00,
-  0x4c, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66,
-  0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07,
-  0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10,
-  0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, 0xce,
-  0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1b,
-  0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, 0x8c,
-  0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, 0x07,
-  0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, 0x11,
-  0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, 0xf0,
-  0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, 0xd8,
-  0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, 0x3b,
-  0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, 0x3b,
-  0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87,
-  0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, 0x07,
-  0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, 0x87,
-  0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 0x81,
-  0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, 0x30,
-  0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4,
-  0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, 0xca,
-  0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, 0x39,
-  0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, 0x3b,
-  0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, 0x3b,
-  0xb0, 0xc3, 0x8c, 0xc8, 0x21, 0x07, 0x7c, 0x70, 0x03, 0x72, 0x10, 0x87,
-  0x73, 0x70, 0x03, 0x7b, 0x08, 0x07, 0x79, 0x60, 0x87, 0x70, 0xc8, 0x87,
-  0x77, 0xa8, 0x07, 0x7a, 0x98, 0x81, 0x3c, 0xe4, 0x80, 0x0f, 0x6e, 0x40,
-  0x0f, 0xe5, 0xd0, 0x0e, 0xf0, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00,
-  0x12, 0x00, 0x00, 0x00, 0x46, 0x20, 0x0d, 0x97, 0xef, 0x3c, 0xbe, 0x10,
-  0x11, 0xc0, 0x44, 0x84, 0x40, 0x33, 0x2c, 0x84, 0x05, 0x4c, 0xc3, 0xe5,
-  0x3b, 0x8f, 0xbf, 0x38, 0xc0, 0x20, 0x36, 0x0f, 0x35, 0xf9, 0xc5, 0x6d,
-  0xdb, 0x00, 0x34, 0x5c, 0xbe, 0xf3, 0xf8, 0x12, 0xc0, 0x3c, 0x0b, 0xe1,
-  0x17, 0xb7, 0x6d, 0x02, 0xd5, 0x70, 0xf9, 0xce, 0xe3, 0x4b, 0x93, 0x13,
-  0x11, 0x28, 0x35, 0x3d, 0xd4, 0xe4, 0x17, 0xb7, 0x6d, 0x00, 0x04, 0x03,
-  0x20, 0x0d, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x00,
-  0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
-  0xf4, 0x46, 0x00, 0x88, 0xcc, 0x00, 0x14, 0x42, 0x29, 0x94, 0x5c, 0xe1,
-  0x51, 0x29, 0x83, 0x12, 0xa0, 0x31, 0x03, 0x00, 0x23, 0x06, 0x09, 0x00,
-  0x82, 0x60, 0x00, 0x69, 0x05, 0x84, 0x61, 0xc9, 0x88, 0x41, 0x02, 0x80,
-  0x20, 0x18, 0x40, 0x9b, 0x41, 0x64, 0x99, 0x32, 0x62, 0x90, 0x00, 0x20,
-  0x08, 0x06, 0xc6, 0x97, 0x6c, 0x9a, 0xa4, 0x8c, 0x18, 0x24, 0x00, 0x08,
-  0x82, 0x81, 0x01, 0x06, 0x0a, 0xb7, 0x15, 0xcb, 0x88, 0x41, 0x02, 0x80,
-  0x20, 0x18, 0x18, 0x61, 0xb0, 0x70, 0x1c, 0xc5, 0x8c, 0x18, 0x24, 0x00,
-  0x08, 0x82, 0x81, 0x21, 0x06, 0x4c, 0xd7, 0x1d, 0xcd, 0x88, 0x41, 0x02,
-  0x80, 0x20, 0x18, 0x18, 0x63, 0xd0, 0x78, 0x5e, 0xe5, 0x8c, 0x18, 0x24,
-  0x00, 0x08, 0x82, 0x81, 0x41, 0x06, 0xce, 0xf7, 0x29, 0xcf, 0x88, 0xc1,
-  0x03, 0x80, 0x20, 0x18, 0x34, 0x63, 0xc0, 0x20, 0x87, 0x51, 0x24, 0x09,
-  0x18, 0x80, 0x01, 0x94, 0x8c, 0x26, 0x04, 0xc0, 0x68, 0x82, 0x10, 0x8c,
-  0x26, 0x0c, 0xc2, 0x68, 0x02, 0x31, 0x18, 0x91, 0xc8, 0xc7, 0x88, 0x44,
-  0x3e, 0x46, 0x24, 0xf2, 0x31, 0x22, 0x91, 0xcf, 0x88, 0x41, 0x02, 0x80,
-  0x20, 0x18, 0x20, 0x6d, 0x70, 0xa5, 0x41, 0x1a, 0x84, 0x01, 0x31, 0x62,
-  0x90, 0x00, 0x20, 0x08, 0x06, 0x48, 0x1b, 0x5c, 0x69, 0x90, 0x06, 0xd3,
-  0x30, 0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0x48, 0x1b, 0x5c, 0x69, 0x90,
-  0x06, 0x60, 0x20, 0x8c, 0x18, 0x24, 0x00, 0x08, 0x82, 0x01, 0xd2, 0x06,
-  0x57, 0x1a, 0xa4, 0x01, 0x15, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+  0xc6, 0x04, 0x43, 0x22, 0x25, 0x30, 0x02, 0x50, 0x12, 0xc5, 0x50, 0x04,
+  0x65, 0x50, 0x1e, 0x54, 0x4a, 0x62, 0x04, 0xa0, 0x08, 0x0a, 0xa1, 0x40,
+  0xc8, 0xce, 0x00, 0x10, 0x9e, 0x01, 0xa0, 0x3c, 0x16, 0x62, 0x10, 0x81,
+  0x40, 0x20, 0xcf, 0x03, 0x79, 0x18, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00,
+  0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0x44, 0x8f, 0x0c, 0x6f, 0xec,
+  0xed, 0x4d, 0x0c, 0x24, 0xc6, 0x05, 0xc7, 0x45, 0xa6, 0x06, 0xa6, 0xc6,
+  0x45, 0x06, 0x07, 0x04, 0x25, 0xa7, 0xcc, 0x4c, 0x4c, 0xcc, 0x66, 0x6c,
+  0x46, 0x26, 0x65, 0x43, 0x10, 0x4c, 0x10, 0x88, 0x62, 0x82, 0x40, 0x18,
+  0x1b, 0x84, 0x81, 0x98, 0x20, 0x10, 0xc7, 0x06, 0x61, 0x30, 0x28, 0xc0,
+  0xcd, 0x4d, 0x10, 0x08, 0x64, 0xc3, 0x80, 0x24, 0xc4, 0x04, 0xc1, 0x8a,
+  0x08, 0x4c, 0x10, 0x88, 0x64, 0x83, 0x40, 0x18, 0x1b, 0x12, 0x62, 0x61,
+  0x1a, 0x62, 0x68, 0x08, 0x67, 0x43, 0xf0, 0x4c, 0x10, 0x30, 0x69, 0x03,
+  0x42, 0x44, 0x4c, 0x43, 0x0c, 0x04, 0xb0, 0x21, 0x90, 0x36, 0x10, 0x10,
+  0x00, 0x4c, 0x13, 0x84, 0x6c, 0xda, 0x10, 0x54, 0x13, 0x04, 0x01, 0x20,
+  0xd1, 0x16, 0x96, 0xe6, 0x46, 0x84, 0xaa, 0x08, 0x6b, 0xe8, 0xe9, 0x49,
+  0x8a, 0x68, 0x82, 0x50, 0x30, 0x13, 0x84, 0xa2, 0xd9, 0x10, 0x10, 0x13,
+  0x84, 0xc2, 0x99, 0x20, 0x14, 0xcf, 0x04, 0x81, 0x50, 0x26, 0x08, 0xc4,
+  0xb2, 0x41, 0xf8, 0xc0, 0x60, 0xc3, 0x42, 0x64, 0xda, 0xc6, 0x75, 0x83,
+  0x47, 0x6c, 0x61, 0xb0, 0x21, 0x18, 0x36, 0x08, 0xdf, 0xb7, 0x61, 0x19,
+  0x32, 0x6d, 0x1b, 0x83, 0x6e, 0xe8, 0x86, 0x8d, 0x0c, 0x36, 0x08, 0x62,
+  0x50, 0x06, 0x4c, 0xa6, 0xac, 0xbe, 0xa8, 0xc2, 0xe4, 0xce, 0xca, 0xe8,
+  0x26, 0x08, 0x05, 0xb4, 0x61, 0x21, 0xce, 0x40, 0x43, 0x03, 0x6e, 0x1b,
+  0x3c, 0x62, 0x0b, 0x83, 0x0d, 0x41, 0x1a, 0x6c, 0x18, 0xcc, 0x40, 0x0d,
+  0x80, 0x0d, 0xc5, 0x85, 0xad, 0x01, 0x05, 0x54, 0x61, 0x63, 0xb3, 0x6b,
+  0x73, 0x49, 0x23, 0x2b, 0x73, 0xa3, 0x9b, 0x12, 0x04, 0x55, 0xc8, 0xf0,
+  0x5c, 0xec, 0xca, 0xe4, 0xe6, 0xd2, 0xde, 0xdc, 0xa6, 0x04, 0x44, 0x13,
+  0x32, 0x3c, 0x17, 0xbb, 0x30, 0x36, 0xbb, 0x32, 0xb9, 0x29, 0x81, 0x51,
+  0x87, 0x0c, 0xcf, 0x65, 0x0e, 0x2d, 0x8c, 0xac, 0x4c, 0xae, 0xe9, 0x8d,
+  0xac, 0x8c, 0x6d, 0x4a, 0x90, 0x94, 0x21, 0xc3, 0x73, 0x91, 0x2b, 0x9b,
+  0x7b, 0xab, 0x93, 0x1b, 0x2b, 0x9b, 0x9b, 0x12, 0x4c, 0x75, 0xc8, 0xf0,
+  0x5c, 0xec, 0xd2, 0xca, 0xee, 0x92, 0xc8, 0xa6, 0xe8, 0xc2, 0xe8, 0xca,
+  0xa6, 0x04, 0x55, 0x1d, 0x32, 0x3c, 0x97, 0x32, 0x37, 0x3a, 0xb9, 0x3c,
+  0xa8, 0xb7, 0x34, 0x37, 0xba, 0xb9, 0x29, 0xc1, 0x1a, 0x00, 0x00, 0x00,
+  0x79, 0x18, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c,
+  0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3,
+  0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6,
+  0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e,
+  0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43,
+  0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03,
+  0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48,
+  0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20,
+  0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e,
+  0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d,
+  0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89,
+  0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83,
+  0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68,
+  0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90,
+  0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78,
+  0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98,
+  0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5,
+  0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c,
+  0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c,
+  0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43,
+  0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43,
+  0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82,
+  0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x8c, 0xc8, 0x21, 0x07, 0x7c, 0x70,
+  0x03, 0x72, 0x10, 0x87, 0x73, 0x70, 0x03, 0x7b, 0x08, 0x07, 0x79, 0x60,
+  0x87, 0x70, 0xc8, 0x87, 0x77, 0xa8, 0x07, 0x7a, 0x98, 0x81, 0x3c, 0xe4,
+  0x80, 0x0f, 0x6e, 0x40, 0x0f, 0xe5, 0xd0, 0x0e, 0xf0, 0x00, 0x00, 0x00,
+  0x71, 0x20, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x46, 0x20, 0x0d, 0x97,
+  0xef, 0x3c, 0xbe, 0x10, 0x11, 0xc0, 0x44, 0x84, 0x40, 0x33, 0x2c, 0x84,
+  0x05, 0x4c, 0xc3, 0xe5, 0x3b, 0x8f, 0xbf, 0x38, 0xc0, 0x20, 0x36, 0x0f,
+  0x35, 0xf9, 0xc5, 0x6d, 0xdb, 0x00, 0x34, 0x5c, 0xbe, 0xf3, 0xf8, 0x12,
+  0xc0, 0x3c, 0x0b, 0xe1, 0x17, 0xb7, 0x6d, 0x02, 0xd5, 0x70, 0xf9, 0xce,
+  0xe3, 0x4b, 0x93, 0x13, 0x11, 0x28, 0x35, 0x3d, 0xd4, 0xe4, 0x17, 0xb7,
+  0x6d, 0x00, 0x04, 0x03, 0x20, 0x0d, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00,
+  0x3a, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, 0x00,
+  0x05, 0x00, 0x00, 0x00, 0xf4, 0x46, 0x00, 0x88, 0xcc, 0x00, 0x14, 0x42,
+  0x29, 0x94, 0x5c, 0xe1, 0x51, 0x29, 0x83, 0x12, 0xa0, 0x31, 0x03, 0x00,
+  0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x00, 0x65, 0x05, 0x74, 0x5d, 0xc9,
+  0x88, 0x41, 0x02, 0x80, 0x20, 0x18, 0x40, 0x9a, 0x41, 0x60, 0x98, 0x32,
+  0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0x86, 0x97, 0x68, 0x99, 0xa4, 0x8c,
+  0x18, 0x24, 0x00, 0x08, 0x82, 0x81, 0xf1, 0x29, 0x9b, 0x56, 0x2c, 0x23,
+  0x06, 0x09, 0x00, 0x82, 0x60, 0x60, 0x80, 0xc1, 0xb2, 0x6d, 0x14, 0x33,
+  0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0x46, 0x18, 0x30, 0x1c, 0x77, 0x34,
+  0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x60, 0x88, 0x41, 0xd3, 0x75, 0x95,
+  0x33, 0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0xc6, 0x18, 0x38, 0x9e, 0xa7,
+  0x3c, 0x23, 0x06, 0x0f, 0x00, 0x82, 0x60, 0xd0, 0x88, 0x01, 0x83, 0x1c,
+  0x46, 0x91, 0x24, 0xdf, 0x07, 0x25, 0xa3, 0x09, 0x01, 0x30, 0x9a, 0x20,
+  0x04, 0xa3, 0x09, 0x83, 0x30, 0x9a, 0x40, 0x0c, 0x46, 0x24, 0xf2, 0x31,
+  0x22, 0x91, 0x8f, 0x11, 0x89, 0x7c, 0x8c, 0x48, 0xe4, 0x33, 0x62, 0x90,
+  0x00, 0x20, 0x08, 0x06, 0x08, 0x1b, 0x5c, 0x68, 0x80, 0x06, 0x61, 0x40,
+  0x8c, 0x18, 0x24, 0x00, 0x08, 0x82, 0x01, 0xc2, 0x06, 0x17, 0x1a, 0xa0,
+  0xc1, 0x34, 0x8c, 0x18, 0x24, 0x00, 0x08, 0x82, 0x01, 0xc2, 0x06, 0x17,
+  0x1a, 0xa0, 0x01, 0x18, 0x08, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x80,
+  0xb0, 0xc1, 0x85, 0x06, 0x68, 0x40, 0x05, 0x08, 0x00, 0x00, 0x00, 0x00
 };
-static const unsigned int texture_rgba_frag_dxil_len = 3864;
+static const unsigned int texture_rgba_frag_dxil_len = 3852;

+ 189 - 189
src/render/gpu/shaders/texture_rgba_pixelart.frag.dxil.h

@@ -1,7 +1,7 @@
 static const unsigned char texture_rgba_pixelart_frag_dxil[] = {
-  0x44, 0x58, 0x42, 0x43, 0x5c, 0xc6, 0xe3, 0x11, 0x85, 0x3a, 0xd2, 0x8a,
-  0xe2, 0x32, 0x94, 0xd3, 0x89, 0xa3, 0xd2, 0x21, 0x01, 0x00, 0x00, 0x00,
-  0xb0, 0x12, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00,
+  0x44, 0x58, 0x42, 0x43, 0xf4, 0x83, 0x28, 0x2e, 0xe0, 0xed, 0xd2, 0xe2,
+  0x3c, 0x78, 0x6f, 0xb7, 0x3e, 0x59, 0xdf, 0x55, 0x01, 0x00, 0x00, 0x00,
+  0xac, 0x12, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00,
   0x4c, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0x00,
   0xf0, 0x01, 0x00, 0x00, 0x54, 0x09, 0x00, 0x00, 0x70, 0x09, 0x00, 0x00,
   0x53, 0x46, 0x49, 0x30, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -112,55 +112,55 @@ static const unsigned char texture_rgba_pixelart_frag_dxil[] = {
   0x11, 0x80, 0x22, 0x28, 0x84, 0x02, 0xa1, 0x6e, 0x06, 0x80, 0xbc, 0x19,
   0x00, 0xfa, 0x66, 0x00, 0x28, 0x9c, 0x01, 0x20, 0x71, 0x2c, 0xc4, 0x20,
   0x02, 0x81, 0x40, 0x9e, 0x07, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00,
-  0x91, 0x00, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0xc4,
-  0x8e, 0x0c, 0x6f, 0xec, 0xed, 0x4d, 0x0c, 0x24, 0xc6, 0x05, 0xc7, 0x45,
-  0xa6, 0x06, 0x46, 0xc6, 0x05, 0x07, 0x04, 0x45, 0x8c, 0xe6, 0x26, 0x26,
-  0x06, 0x67, 0x26, 0xa7, 0x2c, 0x65, 0x43, 0x10, 0x4c, 0x10, 0x08, 0x64,
-  0x82, 0x40, 0x24, 0x1b, 0x84, 0x81, 0xd8, 0x20, 0x10, 0x04, 0x05, 0xb8,
-  0xb9, 0x09, 0x02, 0xa1, 0x6c, 0x18, 0x0e, 0x84, 0x98, 0x20, 0x74, 0x1a,
-  0x93, 0xba, 0x2f, 0xba, 0x32, 0x3c, 0xba, 0x3a, 0xb9, 0xb2, 0x09, 0x02,
-  0xb1, 0x4c, 0x10, 0x08, 0x66, 0x83, 0x40, 0x34, 0x1b, 0x12, 0x42, 0x59,
-  0x18, 0x62, 0x60, 0x08, 0x67, 0x43, 0xf0, 0x4c, 0x10, 0x3e, 0x8e, 0x0c,
-  0x5d, 0x1e, 0x5c, 0xd9, 0xd7, 0xd0, 0x9b, 0x1b, 0x5d, 0x19, 0x1e, 0xdd,
-  0x04, 0x81, 0x68, 0x26, 0x08, 0x84, 0xb3, 0x01, 0x21, 0x22, 0x69, 0x22,
-  0x06, 0x0a, 0xd8, 0x10, 0x54, 0x13, 0x84, 0x30, 0xe8, 0x98, 0xd4, 0x7d,
-  0xcd, 0x85, 0xb5, 0xc1, 0xb1, 0x95, 0xc9, 0x6d, 0x40, 0x88, 0x0b, 0x63,
-  0x88, 0x81, 0x00, 0x36, 0x04, 0xd9, 0x06, 0x02, 0x02, 0x2c, 0x6d, 0x82,
-  0xe0, 0x6d, 0x94, 0x86, 0xde, 0xdc, 0xe8, 0xca, 0xf0, 0xe8, 0xbe, 0xe8,
-  0xca, 0xf0, 0xca, 0xd8, 0xbe, 0xe6, 0xd2, 0xf4, 0xca, 0x26, 0x08, 0xc4,
-  0x33, 0x41, 0x20, 0xa0, 0x09, 0x02, 0x11, 0x6d, 0x40, 0x90, 0x6e, 0x22,
-  0xbc, 0xe6, 0x03, 0x83, 0x0d, 0x02, 0x15, 0x06, 0x1b, 0x06, 0x82, 0x13,
-  0x83, 0x09, 0x82, 0x00, 0x6c, 0x00, 0x36, 0x0c, 0x44, 0x19, 0x94, 0xc1,
-  0x86, 0xc0, 0x0c, 0x36, 0x0c, 0x03, 0x19, 0x9c, 0xc1, 0x04, 0x41, 0x0c,
-  0xbc, 0x0d, 0x41, 0x1a, 0x90, 0x68, 0x0b, 0x4b, 0x73, 0x23, 0x42, 0x55,
-  0x84, 0x35, 0xf4, 0xf4, 0x24, 0x45, 0x34, 0x41, 0x28, 0xaa, 0x09, 0x42,
-  0x61, 0x6d, 0x08, 0x88, 0x09, 0x42, 0x71, 0x4d, 0x10, 0x0a, 0x6c, 0x82,
-  0x40, 0x48, 0x1b, 0x84, 0x49, 0x0e, 0x36, 0x2c, 0x04, 0x1b, 0xb4, 0x81,
-  0x1b, 0xbc, 0x01, 0x1c, 0x0c, 0x71, 0x40, 0xb8, 0xc1, 0x1c, 0x6c, 0x08,
-  0x86, 0x0d, 0xc2, 0x34, 0x6d, 0x58, 0x06, 0x36, 0x68, 0x03, 0x37, 0xa8,
-  0x03, 0x38, 0x18, 0xe0, 0x60, 0x70, 0x03, 0x3b, 0xd8, 0x20, 0xd0, 0xc1,
-  0x1d, 0x30, 0x99, 0xb2, 0xfa, 0xa2, 0x0a, 0x93, 0x3b, 0x2b, 0xa3, 0x9b,
-  0x20, 0x14, 0xd9, 0x86, 0x85, 0xc8, 0x83, 0x36, 0xd0, 0x83, 0x37, 0x70,
-  0x83, 0x21, 0x0e, 0x08, 0x37, 0x98, 0x83, 0x0d, 0xc1, 0x1e, 0x6c, 0x18,
-  0xf0, 0x80, 0x0f, 0x80, 0x0d, 0x05, 0x19, 0xac, 0x41, 0x1f, 0x6c, 0x00,
-  0x0d, 0x33, 0xb6, 0xb7, 0x30, 0xba, 0xb9, 0x09, 0x02, 0x31, 0xb1, 0x48,
-  0x73, 0x9b, 0xa3, 0x9b, 0x9b, 0x20, 0x10, 0x14, 0x8d, 0xb9, 0xb4, 0xb3,
-  0x2f, 0x36, 0x32, 0x1a, 0x73, 0x69, 0x67, 0x5f, 0x73, 0x74, 0x44, 0xe8,
-  0xca, 0xf0, 0xbe, 0xce, 0xe4, 0xc2, 0xc8, 0x36, 0x28, 0x7f, 0x00, 0x0a,
-  0xa1, 0x20, 0x0a, 0xa3, 0x80, 0x90, 0x02, 0x18, 0x94, 0xc2, 0x50, 0x85,
-  0x8d, 0xcd, 0xae, 0xcd, 0x25, 0x8d, 0xac, 0xcc, 0x8d, 0x6e, 0x4a, 0x10,
-  0x54, 0x21, 0xc3, 0x73, 0xb1, 0x2b, 0x93, 0x9b, 0x4b, 0x7b, 0x73, 0x9b,
-  0x12, 0x10, 0x4d, 0xc8, 0xf0, 0x5c, 0xec, 0xc2, 0xd8, 0xec, 0xca, 0xe4,
-  0xa6, 0x04, 0x45, 0x1d, 0x32, 0x3c, 0x97, 0x39, 0xb4, 0x30, 0xb2, 0x32,
-  0xb9, 0xa6, 0x37, 0xb2, 0x32, 0xb6, 0x29, 0x01, 0x52, 0x86, 0x0c, 0xcf,
-  0x45, 0xae, 0x6c, 0xee, 0xad, 0x4e, 0x6e, 0xac, 0x6c, 0x6e, 0x4a, 0xa0,
-  0x55, 0x22, 0xc3, 0x73, 0xa1, 0xcb, 0x83, 0x2b, 0x0b, 0x72, 0x73, 0x7b,
-  0xa3, 0x0b, 0xa3, 0x4b, 0x7b, 0x73, 0x9b, 0x9b, 0x22, 0x88, 0xc1, 0x19,
-  0xd4, 0x21, 0xc3, 0x73, 0xb1, 0x4b, 0x2b, 0xbb, 0x4b, 0x22, 0x9b, 0xa2,
-  0x0b, 0xa3, 0x2b, 0x9b, 0x12, 0xa4, 0x41, 0x1d, 0x32, 0x3c, 0x97, 0x32,
-  0x37, 0x3a, 0xb9, 0x3c, 0xa8, 0xb7, 0x34, 0x37, 0xba, 0xb9, 0x29, 0x41,
-  0x1f, 0x74, 0x21, 0xc3, 0x73, 0x19, 0x7b, 0xab, 0x73, 0xa3, 0x2b, 0x93,
-  0x9b, 0x9b, 0x12, 0x94, 0x02, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00,
+  0x91, 0x00, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0x44,
+  0x8f, 0x0c, 0x6f, 0xec, 0xed, 0x4d, 0x0c, 0x24, 0xc6, 0x05, 0xc7, 0x45,
+  0xa6, 0x06, 0xa6, 0xc6, 0x45, 0x06, 0x07, 0x04, 0x25, 0xa7, 0xcc, 0x4c,
+  0x4c, 0xcc, 0x66, 0x6c, 0x46, 0x26, 0x65, 0x43, 0x10, 0x4c, 0x10, 0x08,
+  0x64, 0x82, 0x40, 0x24, 0x1b, 0x84, 0x81, 0xd8, 0x20, 0x10, 0x04, 0x05,
+  0xb8, 0xb9, 0x09, 0x02, 0xa1, 0x6c, 0x18, 0x0e, 0x84, 0x98, 0x20, 0x74,
+  0x1a, 0x93, 0xba, 0x2f, 0xba, 0x32, 0x3c, 0xba, 0x3a, 0xb9, 0xb2, 0x09,
+  0x02, 0xb1, 0x4c, 0x10, 0x08, 0x66, 0x83, 0x40, 0x34, 0x1b, 0x12, 0x42,
+  0x59, 0x18, 0x62, 0x60, 0x08, 0x67, 0x43, 0xf0, 0x4c, 0x10, 0x3e, 0x8e,
+  0x0c, 0x5d, 0x1e, 0x5c, 0xd9, 0xd7, 0xd0, 0x9b, 0x1b, 0x5d, 0x19, 0x1e,
+  0xdd, 0x04, 0x81, 0x68, 0x26, 0x08, 0x84, 0xb3, 0x01, 0x21, 0x22, 0x69,
+  0x22, 0x06, 0x0a, 0xd8, 0x10, 0x54, 0x13, 0x84, 0x30, 0xe8, 0x98, 0xd4,
+  0x7d, 0xcd, 0x85, 0xb5, 0xc1, 0xb1, 0x95, 0xc9, 0x6d, 0x40, 0x88, 0x0b,
+  0x63, 0x88, 0x81, 0x00, 0x36, 0x04, 0xd9, 0x06, 0x02, 0x02, 0x2c, 0x6d,
+  0x82, 0xe0, 0x6d, 0x94, 0x86, 0xde, 0xdc, 0xe8, 0xca, 0xf0, 0xe8, 0xbe,
+  0xe8, 0xca, 0xf0, 0xca, 0xd8, 0xbe, 0xe6, 0xd2, 0xf4, 0xca, 0x26, 0x08,
+  0xc4, 0x33, 0x41, 0x20, 0xa0, 0x09, 0x02, 0x11, 0x6d, 0x40, 0x90, 0x6e,
+  0x22, 0xbc, 0xe6, 0x03, 0x83, 0x0d, 0x02, 0x15, 0x06, 0x1b, 0x06, 0x82,
+  0x13, 0x83, 0x09, 0x82, 0x00, 0x6c, 0x00, 0x36, 0x0c, 0x44, 0x19, 0x94,
+  0xc1, 0x86, 0xc0, 0x0c, 0x36, 0x0c, 0x03, 0x19, 0x9c, 0xc1, 0x04, 0x41,
+  0x0c, 0xbc, 0x0d, 0x41, 0x1a, 0x90, 0x68, 0x0b, 0x4b, 0x73, 0x23, 0x42,
+  0x55, 0x84, 0x35, 0xf4, 0xf4, 0x24, 0x45, 0x34, 0x41, 0x28, 0xaa, 0x09,
+  0x42, 0x61, 0x6d, 0x08, 0x88, 0x09, 0x42, 0x71, 0x4d, 0x10, 0x0a, 0x6c,
+  0x82, 0x40, 0x48, 0x1b, 0x84, 0x49, 0x0e, 0x36, 0x2c, 0x04, 0x1b, 0xb4,
+  0x81, 0x1b, 0xbc, 0x01, 0x1c, 0x0c, 0x71, 0x40, 0xb8, 0xc1, 0x1c, 0x6c,
+  0x08, 0x86, 0x0d, 0xc2, 0x34, 0x6d, 0x58, 0x06, 0x36, 0x68, 0x03, 0x37,
+  0xa8, 0x03, 0x38, 0x18, 0xe0, 0x60, 0x70, 0x03, 0x3b, 0xd8, 0x20, 0xd0,
+  0xc1, 0x1d, 0x30, 0x99, 0xb2, 0xfa, 0xa2, 0x0a, 0x93, 0x3b, 0x2b, 0xa3,
+  0x9b, 0x20, 0x14, 0xd9, 0x86, 0x85, 0xc8, 0x83, 0x36, 0xd0, 0x83, 0x37,
+  0x70, 0x83, 0x21, 0x0e, 0x08, 0x37, 0x98, 0x83, 0x0d, 0xc1, 0x1e, 0x6c,
+  0x18, 0xf0, 0x80, 0x0f, 0x80, 0x0d, 0x05, 0x19, 0xac, 0x41, 0x1f, 0x6c,
+  0x00, 0x0d, 0x33, 0xb6, 0xb7, 0x30, 0xba, 0xb9, 0x09, 0x02, 0x31, 0xb1,
+  0x48, 0x73, 0x9b, 0xa3, 0x9b, 0x9b, 0x20, 0x10, 0x14, 0x8d, 0xb9, 0xb4,
+  0xb3, 0x2f, 0x36, 0x32, 0x1a, 0x73, 0x69, 0x67, 0x5f, 0x73, 0x74, 0x44,
+  0xe8, 0xca, 0xf0, 0xbe, 0xce, 0xe4, 0xc2, 0xc8, 0x36, 0x28, 0x7f, 0x00,
+  0x0a, 0xa1, 0x20, 0x0a, 0xa3, 0x80, 0x90, 0x02, 0x18, 0x94, 0xc2, 0x50,
+  0x85, 0x8d, 0xcd, 0xae, 0xcd, 0x25, 0x8d, 0xac, 0xcc, 0x8d, 0x6e, 0x4a,
+  0x10, 0x54, 0x21, 0xc3, 0x73, 0xb1, 0x2b, 0x93, 0x9b, 0x4b, 0x7b, 0x73,
+  0x9b, 0x12, 0x10, 0x4d, 0xc8, 0xf0, 0x5c, 0xec, 0xc2, 0xd8, 0xec, 0xca,
+  0xe4, 0xa6, 0x04, 0x45, 0x1d, 0x32, 0x3c, 0x97, 0x39, 0xb4, 0x30, 0xb2,
+  0x32, 0xb9, 0xa6, 0x37, 0xb2, 0x32, 0xb6, 0x29, 0x01, 0x52, 0x86, 0x0c,
+  0xcf, 0x45, 0xae, 0x6c, 0xee, 0xad, 0x4e, 0x6e, 0xac, 0x6c, 0x6e, 0x4a,
+  0xa0, 0x55, 0x22, 0xc3, 0x73, 0xa1, 0xcb, 0x83, 0x2b, 0x0b, 0x72, 0x73,
+  0x7b, 0xa3, 0x0b, 0xa3, 0x4b, 0x7b, 0x73, 0x9b, 0x9b, 0x22, 0x88, 0xc1,
+  0x19, 0xd4, 0x21, 0xc3, 0x73, 0xb1, 0x4b, 0x2b, 0xbb, 0x4b, 0x22, 0x9b,
+  0xa2, 0x0b, 0xa3, 0x2b, 0x9b, 0x12, 0xa4, 0x41, 0x1d, 0x32, 0x3c, 0x97,
+  0x32, 0x37, 0x3a, 0xb9, 0x3c, 0xa8, 0xb7, 0x34, 0x37, 0xba, 0xb9, 0x29,
+  0x41, 0x1f, 0x74, 0x21, 0xc3, 0x73, 0x19, 0x7b, 0xab, 0x73, 0xa3, 0x2b,
+  0x93, 0x9b, 0x9b, 0x12, 0x94, 0x02, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00,
   0x4c, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66,
   0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07,
   0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10,
@@ -199,11 +199,11 @@ static const unsigned char texture_rgba_pixelart_frag_dxil[] = {
   0xdb, 0xc0, 0x33, 0x5c, 0xbe, 0xf3, 0xf8, 0x54, 0x03, 0x44, 0x98, 0x5f,
   0xdc, 0xb6, 0x01, 0x10, 0x0c, 0x80, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x48, 0x41, 0x53, 0x48, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x10, 0x1b, 0xf8, 0xc1, 0x8c, 0x1f, 0xd2, 0x81, 0x53, 0x83, 0x10, 0xf9,
-  0x5d, 0xa8, 0x5e, 0x20, 0x44, 0x58, 0x49, 0x4c, 0x38, 0x09, 0x00, 0x00,
-  0x60, 0x00, 0x00, 0x00, 0x4e, 0x02, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4c,
-  0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x20, 0x09, 0x00, 0x00,
-  0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0x45, 0x02, 0x00, 0x00,
+  0xf3, 0x80, 0xe9, 0x01, 0x7f, 0xa8, 0xd4, 0x53, 0x8b, 0xb2, 0x5c, 0xd1,
+  0xbf, 0xdc, 0xed, 0x2a, 0x44, 0x58, 0x49, 0x4c, 0x34, 0x09, 0x00, 0x00,
+  0x60, 0x00, 0x00, 0x00, 0x4d, 0x02, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4c,
+  0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x1c, 0x09, 0x00, 0x00,
+  0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0x44, 0x02, 0x00, 0x00,
   0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00,
   0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39,
   0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62,
@@ -267,136 +267,136 @@ static const unsigned char texture_rgba_pixelart_frag_dxil[] = {
   0x05, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x59,
   0x20, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x14,
   0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0x22,
-  0x4a, 0x60, 0x04, 0xa0, 0x20, 0x8a, 0xa1, 0x08, 0x4a, 0xa2, 0x0c, 0x0a,
-  0xa4, 0x3c, 0xa8, 0x28, 0x89, 0x11, 0x80, 0x22, 0x28, 0x84, 0x02, 0xa1,
-  0x6e, 0x06, 0x80, 0xbe, 0x19, 0x00, 0x0a, 0x67, 0x00, 0x48, 0x1c, 0x0b,
-  0x31, 0x88, 0x40, 0x20, 0x90, 0xe7, 0x01, 0x00, 0x79, 0x18, 0x00, 0x00,
-  0x5f, 0x00, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0xc4,
-  0x8e, 0x0c, 0x6f, 0xec, 0xed, 0x4d, 0x0c, 0x24, 0xc6, 0x05, 0xc7, 0x45,
-  0xa6, 0x06, 0x46, 0xc6, 0x05, 0x07, 0x04, 0x45, 0x8c, 0xe6, 0x26, 0x26,
-  0x06, 0x67, 0x26, 0xa7, 0x2c, 0x65, 0x43, 0x10, 0x4c, 0x10, 0x08, 0x64,
-  0x82, 0x40, 0x24, 0x1b, 0x84, 0x81, 0x98, 0x20, 0x10, 0xca, 0x06, 0x61,
-  0x30, 0x28, 0xc0, 0xcd, 0x4d, 0x10, 0x88, 0x65, 0xc3, 0x80, 0x24, 0xc4,
-  0x04, 0xa1, 0xb3, 0x08, 0x4c, 0x10, 0x08, 0x66, 0x82, 0x40, 0x34, 0x1b,
-  0x04, 0xc2, 0xd9, 0x90, 0x10, 0x0b, 0xd3, 0x10, 0x43, 0x43, 0x3c, 0x1b,
-  0x02, 0x68, 0x82, 0xf0, 0x5d, 0x13, 0x04, 0xc2, 0x99, 0x20, 0x10, 0xcf,
-  0x06, 0x84, 0x90, 0x98, 0x89, 0x18, 0x28, 0x60, 0x43, 0x50, 0x4d, 0x10,
-  0xc2, 0x00, 0xdb, 0x80, 0x10, 0x17, 0xd3, 0x10, 0x03, 0x01, 0x6c, 0x08,
-  0xb0, 0x0d, 0x44, 0x04, 0x58, 0xd9, 0x04, 0x41, 0x0c, 0xb2, 0x0d, 0xc1,
-  0x36, 0x41, 0x10, 0x00, 0x12, 0x6d, 0x61, 0x69, 0x6e, 0x44, 0xa8, 0x8a,
-  0xb0, 0x86, 0x9e, 0x9e, 0xa4, 0x88, 0x26, 0x08, 0x45, 0x34, 0x41, 0x28,
-  0xa4, 0x0d, 0x01, 0x31, 0x41, 0x28, 0xa6, 0x09, 0x42, 0x41, 0x4d, 0x10,
-  0x08, 0x68, 0x83, 0x30, 0x95, 0xc1, 0x86, 0x85, 0xf8, 0xc0, 0x20, 0x0c,
-  0xc4, 0x60, 0x0c, 0x06, 0x32, 0x20, 0xc2, 0xc0, 0x0c, 0x36, 0x04, 0xc3,
-  0x06, 0x61, 0x9a, 0x36, 0x2c, 0xc3, 0x07, 0x06, 0x61, 0x80, 0x06, 0x63,
-  0x30, 0x8c, 0xc1, 0x10, 0x06, 0x69, 0xb0, 0x41, 0x38, 0x03, 0x35, 0x60,
-  0x32, 0x65, 0xf5, 0x45, 0x15, 0x26, 0x77, 0x56, 0x46, 0x37, 0x41, 0x28,
-  0xaa, 0x0d, 0x0b, 0xc1, 0x06, 0x60, 0xd0, 0x06, 0x62, 0x10, 0x06, 0x03,
-  0x19, 0x10, 0x61, 0x60, 0x06, 0x1b, 0x02, 0x37, 0xd8, 0x30, 0xac, 0xc1,
-  0x1b, 0x00, 0x1b, 0x8a, 0xce, 0x83, 0x03, 0x0d, 0xa8, 0xc2, 0xc6, 0x66,
-  0xd7, 0xe6, 0x92, 0x46, 0x56, 0xe6, 0x46, 0x37, 0x25, 0x08, 0xaa, 0x90,
-  0xe1, 0xb9, 0xd8, 0x95, 0xc9, 0xcd, 0xa5, 0xbd, 0xb9, 0x4d, 0x09, 0x88,
-  0x26, 0x64, 0x78, 0x2e, 0x76, 0x61, 0x6c, 0x76, 0x65, 0x72, 0x53, 0x02,
-  0xa3, 0x0e, 0x19, 0x9e, 0xcb, 0x1c, 0x5a, 0x18, 0x59, 0x99, 0x5c, 0xd3,
-  0x1b, 0x59, 0x19, 0xdb, 0x94, 0x20, 0x29, 0x43, 0x86, 0xe7, 0x22, 0x57,
-  0x36, 0xf7, 0x56, 0x27, 0x37, 0x56, 0x36, 0x37, 0x25, 0xc8, 0xea, 0x90,
-  0xe1, 0xb9, 0xd8, 0xa5, 0x95, 0xdd, 0x25, 0x91, 0x4d, 0xd1, 0x85, 0xd1,
-  0x95, 0x4d, 0x09, 0xb6, 0x3a, 0x64, 0x78, 0x2e, 0x65, 0x6e, 0x74, 0x72,
-  0x79, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x53, 0x02, 0x38, 0x00, 0x00,
-  0x79, 0x18, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c,
-  0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3,
-  0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6,
-  0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e,
-  0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43,
-  0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03,
-  0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48,
-  0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20,
-  0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e,
-  0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d,
-  0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89,
-  0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83,
-  0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68,
-  0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90,
-  0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78,
-  0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98,
-  0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5,
-  0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c,
-  0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c,
-  0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43,
-  0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43,
-  0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82,
-  0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x8c, 0xc8, 0x21, 0x07, 0x7c, 0x70,
-  0x03, 0x72, 0x10, 0x87, 0x73, 0x70, 0x03, 0x7b, 0x08, 0x07, 0x79, 0x60,
-  0x87, 0x70, 0xc8, 0x87, 0x77, 0xa8, 0x07, 0x7a, 0x98, 0x81, 0x3c, 0xe4,
-  0x80, 0x0f, 0x6e, 0x40, 0x0f, 0xe5, 0xd0, 0x0e, 0xf0, 0x00, 0x00, 0x00,
-  0x71, 0x20, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x46, 0x00, 0x0d, 0x97,
-  0xef, 0x3c, 0x7e, 0x80, 0x34, 0x40, 0x84, 0xf9, 0xc5, 0x6d, 0x9b, 0xc1,
-  0x36, 0x5c, 0xbe, 0xf3, 0xf8, 0x42, 0x40, 0x15, 0x05, 0x11, 0x95, 0x0e,
-  0x30, 0x94, 0x84, 0x01, 0x08, 0x98, 0x5f, 0xdc, 0xb6, 0x1d, 0x48, 0xc3,
-  0xe5, 0x3b, 0x8f, 0x2f, 0x44, 0x04, 0x30, 0x11, 0x21, 0xd0, 0x0c, 0x0b,
-  0x61, 0x01, 0xd3, 0x70, 0xf9, 0xce, 0xe3, 0x2f, 0x0e, 0x30, 0x88, 0xcd,
-  0x43, 0x4d, 0x7e, 0x71, 0xdb, 0x56, 0x40, 0x0d, 0x97, 0xef, 0x3c, 0xbe,
-  0x04, 0x30, 0xcf, 0x42, 0x80, 0x11, 0x30, 0xf8, 0xc5, 0x6d, 0x9b, 0x40,
-  0x35, 0x5c, 0xbe, 0xf3, 0xf8, 0xd2, 0xe4, 0x44, 0x04, 0x4a, 0x4d, 0x0f,
-  0x35, 0xf9, 0xc5, 0x6d, 0xdb, 0xc0, 0x33, 0x5c, 0xbe, 0xf3, 0xf8, 0x54,
-  0x03, 0x44, 0x98, 0x5f, 0xdc, 0xb6, 0x01, 0x10, 0x0c, 0x80, 0x34, 0x00,
-  0x61, 0x20, 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, 0x2c,
-  0x10, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x64, 0x8d, 0x00, 0x50,
-  0x51, 0x02, 0x65, 0x40, 0x44, 0xf9, 0x95, 0x5d, 0x39, 0x14, 0xcb, 0x0c,
-  0x40, 0x21, 0x94, 0x42, 0xc9, 0x95, 0x69, 0x40, 0xa1, 0x06, 0x94, 0x51,
-  0x21, 0x95, 0x0d, 0x0d, 0x63, 0x04, 0x20, 0x08, 0x82, 0x24, 0x18, 0x8c,
-  0x11, 0x80, 0x20, 0x08, 0x82, 0x60, 0x30, 0x46, 0x00, 0x82, 0x20, 0x88,
-  0xff, 0xc2, 0x18, 0x01, 0x08, 0x82, 0x20, 0xfe, 0x8d, 0x11, 0xb0, 0x6d,
-  0xfc, 0xca, 0xdb, 0x18, 0x01, 0x08, 0x82, 0x20, 0xfc, 0xcd, 0x00, 0x00,
-  0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x70, 0xa9, 0x41, 0xf3, 0xa1, 0x01,
-  0x1a, 0x5c, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x70, 0xad, 0x81, 0x63,
-  0xa5, 0x41, 0x1a, 0x60, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x70, 0xb1,
-  0xc1, 0x03, 0x06, 0x6a, 0xa0, 0x06, 0xd9, 0x88, 0x41, 0x02, 0x80, 0x20,
-  0x18, 0x18, 0x73, 0x20, 0xb1, 0xc1, 0x1a, 0x88, 0xc1, 0x34, 0x62, 0x90,
-  0x00, 0x20, 0x08, 0x06, 0x06, 0x1d, 0x4c, 0x6d, 0xc0, 0x06, 0x1a, 0x35,
-  0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0x46, 0x1d, 0x50, 0x6d, 0xd0, 0x06,
-  0x64, 0x50, 0x8d, 0x18, 0x24, 0x00, 0x08, 0x82, 0x81, 0x61, 0x07, 0x95,
-  0x1b, 0xb8, 0x01, 0x67, 0x8d, 0x18, 0x24, 0x00, 0x08, 0x82, 0x81, 0x71,
-  0x07, 0xd6, 0x1b, 0xbc, 0x41, 0x19, 0x5c, 0x23, 0x06, 0x09, 0x00, 0x82,
-  0x60, 0x60, 0xe0, 0xc1, 0x05, 0x07, 0x70, 0xd0, 0x61, 0x23, 0x06, 0x06,
-  0x00, 0x82, 0x60, 0xa0, 0xdc, 0x41, 0x65, 0x8c, 0x18, 0x18, 0x00, 0x08,
-  0x82, 0x81, 0x82, 0x07, 0x96, 0x31, 0x62, 0x60, 0x00, 0x20, 0x08, 0x06,
-  0x4a, 0x1e, 0xc4, 0x81, 0x30, 0x62, 0x60, 0x00, 0x20, 0x08, 0x06, 0x8a,
-  0x1e, 0xc8, 0x81, 0x30, 0x62, 0x60, 0x00, 0x20, 0x08, 0x06, 0xca, 0x1e,
-  0x60, 0xca, 0x88, 0x81, 0x01, 0x80, 0x20, 0x18, 0x28, 0x7c, 0x90, 0x29,
-  0x23, 0x06, 0x06, 0x00, 0x82, 0x60, 0xa0, 0xf4, 0x41, 0x1d, 0x08, 0x23,
-  0x06, 0x06, 0x00, 0x82, 0x60, 0xa0, 0xf8, 0x81, 0x1d, 0x08, 0x26, 0x18,
-  0xf0, 0x31, 0xc1, 0x80, 0xcf, 0x88, 0xc1, 0x01, 0x80, 0x20, 0x18, 0x50,
-  0x7e, 0x60, 0x06, 0xd1, 0x1e, 0x8c, 0x26, 0x04, 0xc2, 0x68, 0x82, 0x30,
-  0x98, 0x50, 0xc8, 0xc7, 0x84, 0x42, 0x3e, 0x23, 0x06, 0x07, 0x00, 0x82,
-  0x60, 0xc0, 0x94, 0x82, 0x18, 0x08, 0xdb, 0x88, 0xc1, 0x01, 0x80, 0x20,
-  0x18, 0x30, 0xa6, 0x30, 0x06, 0x02, 0x37, 0x62, 0x70, 0x00, 0x20, 0x08,
-  0x06, 0xcc, 0x29, 0x8c, 0x81, 0xe0, 0x8d, 0x18, 0x1c, 0x00, 0x08, 0x82,
-  0x01, 0x83, 0x0a, 0x64, 0x20, 0x7c, 0x86, 0x64, 0xf2, 0x31, 0x24, 0x93,
-  0x8f, 0x11, 0x60, 0x20, 0x1f, 0x23, 0xc2, 0x40, 0x3e, 0x46, 0x08, 0xf1,
-  0x31, 0x42, 0x88, 0xcf, 0x88, 0x81, 0x01, 0x80, 0x20, 0x18, 0x28, 0xb0,
-  0xa0, 0x06, 0xc2, 0x88, 0x81, 0x01, 0x80, 0x20, 0x18, 0x28, 0xb1, 0xb0,
-  0x06, 0x82, 0x09, 0x66, 0x00, 0x1f, 0x13, 0xce, 0x00, 0x3e, 0x23, 0x06,
-  0x06, 0x00, 0x82, 0x60, 0xa0, 0xd0, 0xc2, 0x1d, 0x18, 0x23, 0x06, 0x06,
-  0x00, 0x82, 0x60, 0xa0, 0xd4, 0x02, 0x1e, 0x18, 0xe6, 0xb4, 0x01, 0x7c,
-  0x2c, 0x18, 0xe0, 0x63, 0xcf, 0x1b, 0xc0, 0xc7, 0x02, 0x02, 0x3e, 0x36,
-  0x48, 0xf4, 0x31, 0x41, 0xa2, 0xcf, 0x88, 0x81, 0x01, 0x80, 0x20, 0x18,
-  0x28, 0xbc, 0x00, 0x0a, 0xc2, 0x88, 0x81, 0x01, 0x80, 0x20, 0x18, 0x28,
-  0xbd, 0x10, 0x0a, 0x82, 0x09, 0x76, 0x20, 0x1f, 0x13, 0xee, 0x40, 0x3e,
-  0x96, 0x07, 0x42, 0x7c, 0x4c, 0x0f, 0x84, 0xf8, 0x98, 0x61, 0xc8, 0xc7,
-  0x82, 0x41, 0x3e, 0x76, 0x1c, 0xf2, 0xb1, 0x80, 0x90, 0x8f, 0x51, 0x03,
-  0x7c, 0x8c, 0x12, 0xe0, 0x33, 0x9a, 0x70, 0x06, 0xc0, 0x68, 0x02, 0x1a,
-  0x04, 0x46, 0x08, 0xf2, 0x31, 0x42, 0x90, 0xcf, 0x88, 0x41, 0x05, 0x80,
-  0x20, 0x18, 0x44, 0xea, 0x20, 0x0b, 0x7e, 0xd0, 0x07, 0x42, 0xf0, 0x07,
-  0x7f, 0x60, 0x0e, 0xe6, 0xe0, 0x0a, 0x75, 0x40, 0x07, 0x7f, 0x10, 0x07,
-  0x70, 0xf0, 0x07, 0x7f, 0x30, 0x9a, 0x10, 0x00, 0xa3, 0x09, 0x42, 0x30,
-  0x9a, 0x30, 0x08, 0xa3, 0x09, 0xc4, 0x60, 0x84, 0x1f, 0xc8, 0xc7, 0x08,
-  0x3f, 0x90, 0x8f, 0x11, 0x7e, 0x20, 0x1f, 0x23, 0xfc, 0x40, 0x3e, 0x23,
-  0x06, 0x09, 0x00, 0x82, 0x60, 0x80, 0xd8, 0x43, 0x2d, 0xbc, 0xc3, 0x3b,
-  0x98, 0x03, 0x31, 0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0x88, 0x3d, 0xd4,
-  0xc2, 0x3b, 0xbc, 0x43, 0x2f, 0x0c, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60,
-  0x80, 0xd8, 0x43, 0x2d, 0xbc, 0xc3, 0x3b, 0x94, 0x83, 0x30, 0x62, 0x90,
-  0x00, 0x20, 0x08, 0x06, 0x88, 0x3d, 0xd4, 0xc2, 0x3b, 0xbc, 0x03, 0x2f,
-  0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+  0x4a, 0x60, 0x04, 0xa0, 0x24, 0x8a, 0xa1, 0x08, 0xca, 0xa0, 0x40, 0xca,
+  0x83, 0x8a, 0x92, 0x18, 0x01, 0x28, 0x82, 0x42, 0x28, 0x10, 0xea, 0x66,
+  0x00, 0xe8, 0x9b, 0x01, 0xa0, 0x70, 0x06, 0x80, 0xc4, 0xb1, 0x10, 0x83,
+  0x08, 0x04, 0x02, 0x79, 0x1e, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00,
+  0x5e, 0x00, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0x44,
+  0x8f, 0x0c, 0x6f, 0xec, 0xed, 0x4d, 0x0c, 0x24, 0xc6, 0x05, 0xc7, 0x45,
+  0xa6, 0x06, 0xa6, 0xc6, 0x45, 0x06, 0x07, 0x04, 0x25, 0xa7, 0xcc, 0x4c,
+  0x4c, 0xcc, 0x66, 0x6c, 0x46, 0x26, 0x65, 0x43, 0x10, 0x4c, 0x10, 0x08,
+  0x64, 0x82, 0x40, 0x24, 0x1b, 0x84, 0x81, 0x98, 0x20, 0x10, 0xca, 0x06,
+  0x61, 0x30, 0x28, 0xc0, 0xcd, 0x4d, 0x10, 0x88, 0x65, 0xc3, 0x80, 0x24,
+  0xc4, 0x04, 0xa1, 0xab, 0x08, 0x4c, 0x10, 0x08, 0x66, 0x83, 0x40, 0x18,
+  0x1b, 0x12, 0x62, 0x61, 0x1a, 0x62, 0x68, 0x08, 0x67, 0x43, 0xf0, 0x4c,
+  0x10, 0x3e, 0x6b, 0x82, 0x40, 0x34, 0x13, 0x04, 0xc2, 0xd9, 0x80, 0x10,
+  0x11, 0x23, 0x11, 0xc3, 0x04, 0x6c, 0x08, 0xa8, 0x09, 0x42, 0x18, 0x5c,
+  0x1b, 0x10, 0xc2, 0x62, 0x1a, 0x62, 0x20, 0x80, 0x0d, 0xc1, 0xb5, 0x81,
+  0x80, 0x80, 0x0a, 0x9b, 0x20, 0x88, 0x01, 0xb6, 0x21, 0xd0, 0x26, 0x08,
+  0x02, 0x40, 0xa2, 0x2d, 0x2c, 0xcd, 0x8d, 0x08, 0x55, 0x11, 0xd6, 0xd0,
+  0xd3, 0x93, 0x14, 0xd1, 0x04, 0xa1, 0x80, 0x26, 0x08, 0x45, 0xb4, 0x21,
+  0x20, 0x26, 0x08, 0x85, 0x34, 0x41, 0x28, 0xa6, 0x09, 0x02, 0xf1, 0x6c,
+  0x10, 0x24, 0x32, 0xd8, 0xb0, 0x10, 0xde, 0x07, 0x06, 0x61, 0x20, 0x06,
+  0xc3, 0x18, 0x10, 0x60, 0x50, 0x06, 0x1b, 0x82, 0x61, 0x83, 0x20, 0x49,
+  0x1b, 0x96, 0xc1, 0xfb, 0xc0, 0xe0, 0x0c, 0xc4, 0x60, 0x10, 0x83, 0x01,
+  0x0c, 0xd0, 0x60, 0x83, 0x60, 0x06, 0x69, 0xc0, 0x64, 0xca, 0xea, 0x8b,
+  0x2a, 0x4c, 0xee, 0xac, 0x8c, 0x6e, 0x82, 0x50, 0x50, 0x1b, 0x16, 0x62,
+  0x0d, 0x3e, 0x36, 0x08, 0x03, 0x30, 0x18, 0xc6, 0x80, 0x00, 0x83, 0x32,
+  0xd8, 0x10, 0xb4, 0xc1, 0x86, 0x41, 0x0d, 0xdc, 0x00, 0xd8, 0x50, 0x70,
+  0xdd, 0x1b, 0x64, 0x40, 0x15, 0x36, 0x36, 0xbb, 0x36, 0x97, 0x34, 0xb2,
+  0x32, 0x37, 0xba, 0x29, 0x41, 0x50, 0x85, 0x0c, 0xcf, 0xc5, 0xae, 0x4c,
+  0x6e, 0x2e, 0xed, 0xcd, 0x6d, 0x4a, 0x40, 0x34, 0x21, 0xc3, 0x73, 0xb1,
+  0x0b, 0x63, 0xb3, 0x2b, 0x93, 0x9b, 0x12, 0x18, 0x75, 0xc8, 0xf0, 0x5c,
+  0xe6, 0xd0, 0xc2, 0xc8, 0xca, 0xe4, 0x9a, 0xde, 0xc8, 0xca, 0xd8, 0xa6,
+  0x04, 0x49, 0x19, 0x32, 0x3c, 0x17, 0xb9, 0xb2, 0xb9, 0xb7, 0x3a, 0xb9,
+  0xb1, 0xb2, 0xb9, 0x29, 0x01, 0x56, 0x87, 0x0c, 0xcf, 0xc5, 0x2e, 0xad,
+  0xec, 0x2e, 0x89, 0x6c, 0x8a, 0x2e, 0x8c, 0xae, 0x6c, 0x4a, 0xa0, 0xd5,
+  0x21, 0xc3, 0x73, 0x29, 0x73, 0xa3, 0x93, 0xcb, 0x83, 0x7a, 0x4b, 0x73,
+  0xa3, 0x9b, 0x9b, 0x12, 0xbc, 0x01, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00,
+  0x4c, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66,
+  0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07,
+  0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10,
+  0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, 0xce,
+  0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1b,
+  0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, 0x8c,
+  0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, 0x07,
+  0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, 0x11,
+  0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, 0xf0,
+  0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, 0xd8,
+  0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, 0x3b,
+  0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, 0x3b,
+  0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87,
+  0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, 0x07,
+  0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, 0x87,
+  0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 0x81,
+  0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, 0x30,
+  0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4,
+  0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, 0xca,
+  0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, 0x39,
+  0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, 0x3b,
+  0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, 0x3b,
+  0xb0, 0xc3, 0x8c, 0xc8, 0x21, 0x07, 0x7c, 0x70, 0x03, 0x72, 0x10, 0x87,
+  0x73, 0x70, 0x03, 0x7b, 0x08, 0x07, 0x79, 0x60, 0x87, 0x70, 0xc8, 0x87,
+  0x77, 0xa8, 0x07, 0x7a, 0x98, 0x81, 0x3c, 0xe4, 0x80, 0x0f, 0x6e, 0x40,
+  0x0f, 0xe5, 0xd0, 0x0e, 0xf0, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00,
+  0x1f, 0x00, 0x00, 0x00, 0x46, 0x00, 0x0d, 0x97, 0xef, 0x3c, 0x7e, 0x80,
+  0x34, 0x40, 0x84, 0xf9, 0xc5, 0x6d, 0x9b, 0xc1, 0x36, 0x5c, 0xbe, 0xf3,
+  0xf8, 0x42, 0x40, 0x15, 0x05, 0x11, 0x95, 0x0e, 0x30, 0x94, 0x84, 0x01,
+  0x08, 0x98, 0x5f, 0xdc, 0xb6, 0x1d, 0x48, 0xc3, 0xe5, 0x3b, 0x8f, 0x2f,
+  0x44, 0x04, 0x30, 0x11, 0x21, 0xd0, 0x0c, 0x0b, 0x61, 0x01, 0xd3, 0x70,
+  0xf9, 0xce, 0xe3, 0x2f, 0x0e, 0x30, 0x88, 0xcd, 0x43, 0x4d, 0x7e, 0x71,
+  0xdb, 0x56, 0x40, 0x0d, 0x97, 0xef, 0x3c, 0xbe, 0x04, 0x30, 0xcf, 0x42,
+  0x80, 0x11, 0x30, 0xf8, 0xc5, 0x6d, 0x9b, 0x40, 0x35, 0x5c, 0xbe, 0xf3,
+  0xf8, 0xd2, 0xe4, 0x44, 0x04, 0x4a, 0x4d, 0x0f, 0x35, 0xf9, 0xc5, 0x6d,
+  0xdb, 0xc0, 0x33, 0x5c, 0xbe, 0xf3, 0xf8, 0x54, 0x03, 0x44, 0x98, 0x5f,
+  0xdc, 0xb6, 0x01, 0x10, 0x0c, 0x80, 0x34, 0x00, 0x61, 0x20, 0x00, 0x00,
+  0xaa, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, 0x00,
+  0x13, 0x00, 0x00, 0x00, 0x64, 0x8d, 0x00, 0x50, 0x51, 0x02, 0x65, 0x40,
+  0x44, 0xf9, 0x95, 0x5d, 0x39, 0x14, 0xcb, 0x0c, 0x40, 0x21, 0x94, 0x42,
+  0xc9, 0x95, 0x69, 0x40, 0xa1, 0x06, 0x94, 0x51, 0x21, 0x95, 0x0d, 0x0d,
+  0x63, 0x04, 0x20, 0x08, 0x82, 0x24, 0x18, 0x8c, 0x11, 0x80, 0x20, 0x08,
+  0x82, 0x60, 0x30, 0x46, 0x00, 0x82, 0x20, 0x88, 0xff, 0xc2, 0x18, 0x01,
+  0x08, 0x82, 0x20, 0xfe, 0x8d, 0x11, 0xb0, 0x6d, 0xfc, 0xca, 0xdb, 0x18,
+  0x01, 0x08, 0x82, 0x20, 0xfc, 0xcd, 0x00, 0x00, 0x23, 0x06, 0x09, 0x00,
+  0x82, 0x60, 0x70, 0xa5, 0x41, 0xf3, 0x9d, 0xc1, 0x19, 0x5c, 0x23, 0x06,
+  0x09, 0x00, 0x82, 0x60, 0x70, 0xa9, 0x81, 0x63, 0xa1, 0x01, 0x1a, 0x60,
+  0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x70, 0xad, 0xc1, 0x03, 0x06, 0x69,
+  0x90, 0x06, 0xd9, 0x88, 0x41, 0x02, 0x80, 0x20, 0x18, 0x18, 0x72, 0x20,
+  0xad, 0x81, 0x1a, 0x88, 0xc1, 0x34, 0x62, 0x90, 0x00, 0x20, 0x08, 0x06,
+  0xc6, 0x1c, 0x4c, 0x6c, 0xb0, 0x06, 0x1a, 0x35, 0x62, 0x90, 0x00, 0x20,
+  0x08, 0x06, 0x06, 0x1d, 0x50, 0x6c, 0xc0, 0x06, 0x64, 0x50, 0x8d, 0x18,
+  0x24, 0x00, 0x08, 0x82, 0x81, 0x51, 0x07, 0x55, 0x1b, 0xb4, 0x01, 0x67,
+  0x8d, 0x18, 0x24, 0x00, 0x08, 0x82, 0x81, 0x61, 0x07, 0x96, 0x1b, 0xb8,
+  0x41, 0x19, 0x5c, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x60, 0xdc, 0xc1,
+  0xf5, 0x06, 0x6f, 0xd0, 0x61, 0x23, 0x06, 0x06, 0x00, 0x82, 0x60, 0xa0,
+  0xd8, 0x41, 0x65, 0x8c, 0x18, 0x18, 0x00, 0x08, 0x82, 0x81, 0x72, 0x07,
+  0x96, 0x31, 0x62, 0x60, 0x00, 0x20, 0x08, 0x06, 0x0a, 0x1e, 0xc0, 0x81,
+  0x30, 0x62, 0x60, 0x00, 0x20, 0x08, 0x06, 0x4a, 0x1e, 0xc4, 0x81, 0x30,
+  0x62, 0x60, 0x00, 0x20, 0x08, 0x06, 0x8a, 0x1e, 0x60, 0xca, 0x88, 0x81,
+  0x01, 0x80, 0x20, 0x18, 0x28, 0x7b, 0x90, 0x29, 0x23, 0x06, 0x06, 0x00,
+  0x82, 0x60, 0xa0, 0xf0, 0x01, 0x1d, 0x08, 0x23, 0x06, 0x06, 0x00, 0x82,
+  0x60, 0xa0, 0xf4, 0x41, 0x1d, 0x08, 0x26, 0x18, 0xf0, 0x31, 0xc1, 0x80,
+  0xcf, 0x88, 0xc1, 0x01, 0x80, 0x20, 0x18, 0x50, 0x7d, 0x60, 0x06, 0x91,
+  0x1e, 0x8c, 0x26, 0x04, 0xc2, 0x68, 0x82, 0x30, 0x98, 0x50, 0xc8, 0xc7,
+  0x84, 0x42, 0x3e, 0x23, 0x06, 0x07, 0x00, 0x82, 0x60, 0xc0, 0x90, 0x82,
+  0x18, 0x08, 0xdb, 0x88, 0xc1, 0x01, 0x80, 0x20, 0x18, 0x30, 0xa5, 0x30,
+  0x06, 0x02, 0x37, 0x62, 0x70, 0x00, 0x20, 0x08, 0x06, 0x8c, 0x29, 0x8c,
+  0x81, 0xe0, 0x8d, 0x18, 0x1c, 0x00, 0x08, 0x82, 0x01, 0x73, 0x0a, 0x64,
+  0x20, 0x7c, 0x86, 0x64, 0xf2, 0x31, 0x24, 0x93, 0x8f, 0x11, 0x60, 0x20,
+  0x1f, 0x23, 0xc2, 0x40, 0x3e, 0x46, 0x08, 0xf1, 0x31, 0x42, 0x88, 0xcf,
+  0x88, 0x81, 0x01, 0x80, 0x20, 0x18, 0x28, 0xaf, 0xa0, 0x06, 0xc2, 0x88,
+  0x81, 0x01, 0x80, 0x20, 0x18, 0x28, 0xb0, 0xb0, 0x06, 0x82, 0x09, 0x66,
+  0x00, 0x1f, 0x13, 0xce, 0x00, 0x3e, 0x23, 0x06, 0x06, 0x00, 0x82, 0x60,
+  0xa0, 0xcc, 0xc2, 0x1d, 0x18, 0x23, 0x06, 0x06, 0x00, 0x82, 0x60, 0xa0,
+  0xd0, 0x02, 0x1e, 0x18, 0xe6, 0xb4, 0x01, 0x7c, 0x2c, 0x18, 0xe0, 0x63,
+  0xcf, 0x1b, 0xc0, 0xc7, 0x02, 0x02, 0x3e, 0x36, 0x48, 0xf4, 0x31, 0x41,
+  0xa2, 0xcf, 0x88, 0x81, 0x01, 0x80, 0x20, 0x18, 0x28, 0xbb, 0x00, 0x0a,
+  0xc2, 0x88, 0x81, 0x01, 0x80, 0x20, 0x18, 0x28, 0xbc, 0x10, 0x0a, 0x82,
+  0x09, 0x76, 0x20, 0x1f, 0x13, 0xee, 0x40, 0x3e, 0x96, 0x07, 0x42, 0x7c,
+  0x4c, 0x0f, 0x84, 0xf8, 0x98, 0x61, 0xc8, 0xc7, 0x82, 0x41, 0x3e, 0x76,
+  0x1c, 0xf2, 0xb1, 0x80, 0x90, 0x8f, 0x51, 0x03, 0x7c, 0x8c, 0x12, 0xe0,
+  0x33, 0x9a, 0x70, 0x06, 0xc0, 0x68, 0x02, 0x1a, 0x04, 0x46, 0x08, 0xf2,
+  0x31, 0x42, 0x90, 0xcf, 0x88, 0x41, 0x05, 0x80, 0x20, 0x18, 0x44, 0xe9,
+  0x20, 0x0b, 0x7e, 0xd0, 0x07, 0x42, 0xf0, 0x07, 0x7f, 0x50, 0x0e, 0xe5,
+  0xe0, 0x0a, 0x75, 0x40, 0x07, 0x7f, 0x10, 0x07, 0x70, 0xf0, 0x07, 0x7f,
+  0x30, 0x9a, 0x10, 0x00, 0xa3, 0x09, 0x42, 0x30, 0x9a, 0x30, 0x08, 0xa3,
+  0x09, 0xc4, 0x60, 0x84, 0x1f, 0xc8, 0xc7, 0x08, 0x3f, 0x90, 0x8f, 0x11,
+  0x7e, 0x20, 0x1f, 0x23, 0xfc, 0x40, 0x3e, 0x23, 0x06, 0x09, 0x00, 0x82,
+  0x60, 0x80, 0xd4, 0x43, 0x2d, 0xb8, 0x83, 0x3b, 0x98, 0x03, 0x31, 0x62,
+  0x90, 0x00, 0x20, 0x08, 0x06, 0x48, 0x3d, 0xd4, 0x82, 0x3b, 0xb8, 0x43,
+  0x2f, 0x0c, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x80, 0xd4, 0x43, 0x2d,
+  0xb8, 0x83, 0x3b, 0x94, 0x83, 0x30, 0x62, 0x90, 0x00, 0x20, 0x08, 0x06,
+  0x48, 0x3d, 0xd4, 0x82, 0x3b, 0xb8, 0x03, 0x2f, 0x04, 0x08, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00
 };
-static const unsigned int texture_rgba_pixelart_frag_dxil_len = 4784;
+static const unsigned int texture_rgba_pixelart_frag_dxil_len = 4780;

+ 81 - 81
src/render/gpu/shaders/tri_color.vert.dxil.h

@@ -1,6 +1,6 @@
 static const unsigned char tri_color_vert_dxil[] = {
-  0x44, 0x58, 0x42, 0x43, 0x14, 0x99, 0xa3, 0x0d, 0x4e, 0xa8, 0x6e, 0xff,
-  0x07, 0xfd, 0x60, 0xaf, 0x17, 0x5f, 0xf9, 0x08, 0x01, 0x00, 0x00, 0x00,
+  0x44, 0x58, 0x42, 0x43, 0x10, 0xfb, 0x25, 0xcb, 0x4d, 0x1f, 0x1b, 0xba,
+  0x07, 0x85, 0x06, 0xd1, 0xc1, 0x66, 0x6e, 0x33, 0x01, 0x00, 0x00, 0x00,
   0x84, 0x0f, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00,
   0x4c, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00,
   0x08, 0x02, 0x00, 0x00, 0x64, 0x08, 0x00, 0x00, 0x80, 0x08, 0x00, 0x00,
@@ -96,53 +96,53 @@ static const unsigned char tri_color_vert_dxil[] = {
   0xa5, 0x24, 0x46, 0x00, 0x8a, 0xa0, 0x10, 0xca, 0x80, 0x62, 0x0d, 0xd0,
   0x9d, 0x01, 0x20, 0x3c, 0x03, 0x40, 0x79, 0x2c, 0x05, 0x41, 0xe0, 0x03,
   0x3e, 0x00, 0x20, 0x10, 0x08, 0x04, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00,
-  0x8c, 0x00, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0xc4,
-  0x8e, 0x0c, 0x6f, 0xec, 0xed, 0x4d, 0x0c, 0x24, 0xc6, 0x05, 0xc7, 0x45,
-  0xa6, 0x06, 0x46, 0xc6, 0x05, 0x07, 0x04, 0x45, 0x8c, 0xe6, 0x26, 0x26,
-  0x06, 0x67, 0x26, 0xa7, 0x2c, 0x65, 0x43, 0x10, 0x4c, 0x10, 0x08, 0x63,
-  0x82, 0x40, 0x1c, 0x1b, 0x84, 0x81, 0xd8, 0x20, 0x10, 0x04, 0x05, 0xbb,
-  0xb9, 0x09, 0x02, 0x81, 0x6c, 0x18, 0x0e, 0x84, 0x98, 0x20, 0x60, 0x1b,
-  0x19, 0xba, 0x3c, 0xb8, 0xb2, 0xaf, 0xa1, 0x37, 0x37, 0xba, 0x32, 0x3c,
-  0xba, 0x09, 0x02, 0x91, 0x6c, 0x40, 0x08, 0x65, 0x19, 0x88, 0x81, 0x01,
-  0x36, 0x04, 0xcd, 0x06, 0x02, 0x00, 0x1c, 0x60, 0x82, 0x70, 0x69, 0x5c,
-  0x86, 0xde, 0xdc, 0xe8, 0xca, 0xf0, 0xe8, 0xbe, 0xda, 0xec, 0xe0, 0x26,
-  0x08, 0x84, 0x32, 0x41, 0x20, 0x96, 0x0d, 0xc3, 0x34, 0x49, 0x13, 0x04,
-  0x82, 0x99, 0x20, 0x10, 0xcd, 0x04, 0x81, 0x70, 0x26, 0x08, 0x51, 0xb6,
-  0x41, 0x41, 0x22, 0x89, 0xaa, 0x08, 0xeb, 0xba, 0x30, 0x36, 0x43, 0x6f,
-  0x6e, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x13,
-  0x04, 0xe2, 0x99, 0x20, 0x10, 0xd0, 0x06, 0x04, 0xd1, 0xaa, 0xcd, 0xba,
-  0xb8, 0x69, 0xc3, 0xc0, 0x64, 0xdd, 0x86, 0x81, 0x80, 0xbc, 0x09, 0x82,
-  0x00, 0x6c, 0x00, 0x36, 0x0c, 0x44, 0x18, 0x84, 0xc1, 0x86, 0x40, 0x0c,
-  0x36, 0x0c, 0x03, 0x18, 0x8c, 0xc1, 0x04, 0x21, 0xe3, 0x36, 0x04, 0x65,
-  0x40, 0xa2, 0x2d, 0x2c, 0xcd, 0x8d, 0x08, 0x55, 0x11, 0xd6, 0xd0, 0xd3,
-  0x93, 0x14, 0xd1, 0x04, 0xa1, 0xa0, 0x26, 0x08, 0x45, 0xb5, 0x21, 0x20,
-  0x26, 0x08, 0x85, 0xb5, 0x41, 0xa8, 0xaa, 0x0d, 0x0b, 0x81, 0x06, 0x69,
-  0xa0, 0x06, 0x6b, 0xa0, 0x06, 0x03, 0x1b, 0x10, 0x6a, 0xd0, 0x06, 0x1b,
-  0x82, 0x61, 0x82, 0x50, 0x5c, 0x13, 0x04, 0x22, 0xda, 0x20, 0x54, 0x71,
-  0xb0, 0x61, 0x19, 0xd0, 0x20, 0x0d, 0xd4, 0xe0, 0x0d, 0xd4, 0x60, 0x80,
-  0x83, 0x41, 0x0d, 0xe4, 0x60, 0x83, 0xe0, 0x06, 0x73, 0xb0, 0x61, 0x21,
-  0xd0, 0x20, 0x0d, 0xd4, 0x60, 0x0d, 0xd8, 0x60, 0x80, 0x03, 0x42, 0x0d,
-  0xe4, 0x80, 0xcb, 0x94, 0xd5, 0x17, 0xd4, 0xdb, 0x5c, 0x1a, 0x5d, 0xda,
-  0x9b, 0xdb, 0x04, 0xa1, 0xc0, 0x36, 0x2c, 0x83, 0x1d, 0xa4, 0xc1, 0x1d,
-  0xac, 0x01, 0x1c, 0x0c, 0x70, 0x30, 0xa8, 0x81, 0x1c, 0x6c, 0x10, 0xea,
-  0x00, 0x0f, 0x36, 0x0c, 0x74, 0x90, 0x07, 0xc0, 0x86, 0x02, 0x0c, 0xce,
-  0x40, 0x0f, 0x1e, 0x80, 0x86, 0x19, 0xdb, 0x5b, 0x18, 0xdd, 0xdc, 0x04,
-  0x81, 0x90, 0x58, 0xa4, 0xb9, 0xcd, 0xd1, 0xcd, 0x4d, 0x10, 0x88, 0x89,
-  0xc6, 0x5c, 0xda, 0xd9, 0x17, 0x1b, 0x19, 0x8d, 0xb9, 0xb4, 0xb3, 0xaf,
-  0x39, 0xba, 0x0d, 0x08, 0x1f, 0xf4, 0x81, 0x1f, 0xfc, 0x01, 0x28, 0x20,
-  0xa1, 0xd0, 0x07, 0x55, 0xd8, 0xd8, 0xec, 0xda, 0x5c, 0xd2, 0xc8, 0xca,
-  0xdc, 0xe8, 0xa6, 0x04, 0x41, 0x15, 0x32, 0x3c, 0x17, 0xbb, 0x32, 0xb9,
-  0xb9, 0xb4, 0x37, 0xb7, 0x29, 0x01, 0xd1, 0x84, 0x0c, 0xcf, 0xc5, 0x2e,
-  0x8c, 0xcd, 0xae, 0x4c, 0x6e, 0x4a, 0x50, 0xd4, 0x21, 0xc3, 0x73, 0x99,
-  0x43, 0x0b, 0x23, 0x2b, 0x93, 0x6b, 0x7a, 0x23, 0x2b, 0x63, 0x9b, 0x12,
-  0x20, 0x65, 0xc8, 0xf0, 0x5c, 0xe4, 0xca, 0xe6, 0xde, 0xea, 0xe4, 0xc6,
-  0xca, 0xe6, 0xa6, 0x04, 0x4e, 0x25, 0x32, 0x3c, 0x17, 0xba, 0x3c, 0xb8,
-  0xb2, 0x20, 0x37, 0xb7, 0x37, 0xba, 0x30, 0xba, 0xb4, 0x37, 0xb7, 0xb9,
-  0x29, 0x82, 0x37, 0x06, 0x75, 0xc8, 0xf0, 0x5c, 0xec, 0xd2, 0xca, 0xee,
-  0x92, 0xc8, 0xa6, 0xe8, 0xc2, 0xe8, 0xca, 0xa6, 0x04, 0x65, 0x50, 0x87,
-  0x0c, 0xcf, 0xa5, 0xcc, 0x8d, 0x4e, 0x2e, 0x0f, 0xea, 0x2d, 0xcd, 0x8d,
-  0x6e, 0x6e, 0x4a, 0xa0, 0x07, 0x5d, 0xc8, 0xf0, 0x5c, 0xc6, 0xde, 0xea,
-  0xdc, 0xe8, 0xca, 0xe4, 0xe6, 0xa6, 0x04, 0xa1, 0x00, 0x00, 0x00, 0x00,
+  0x8c, 0x00, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0x44,
+  0x8f, 0x0c, 0x6f, 0xec, 0xed, 0x4d, 0x0c, 0x24, 0xc6, 0x05, 0xc7, 0x45,
+  0xa6, 0x06, 0xa6, 0xc6, 0x45, 0x06, 0x07, 0x04, 0x25, 0xa7, 0xcc, 0x4c,
+  0x4c, 0xcc, 0x66, 0x6c, 0x46, 0x26, 0x65, 0x43, 0x10, 0x4c, 0x10, 0x08,
+  0x63, 0x82, 0x40, 0x1c, 0x1b, 0x84, 0x81, 0xd8, 0x20, 0x10, 0x04, 0x05,
+  0xbb, 0xb9, 0x09, 0x02, 0x81, 0x6c, 0x18, 0x0e, 0x84, 0x98, 0x20, 0x60,
+  0x1b, 0x19, 0xba, 0x3c, 0xb8, 0xb2, 0xaf, 0xa1, 0x37, 0x37, 0xba, 0x32,
+  0x3c, 0xba, 0x09, 0x02, 0x91, 0x6c, 0x40, 0x08, 0x65, 0x19, 0x88, 0x81,
+  0x01, 0x36, 0x04, 0xcd, 0x06, 0x02, 0x00, 0x1c, 0x60, 0x82, 0x70, 0x69,
+  0x5c, 0x86, 0xde, 0xdc, 0xe8, 0xca, 0xf0, 0xe8, 0xbe, 0xda, 0xec, 0xe0,
+  0x26, 0x08, 0x84, 0x32, 0x41, 0x20, 0x96, 0x0d, 0xc3, 0x34, 0x49, 0x13,
+  0x04, 0x82, 0x99, 0x20, 0x10, 0xcd, 0x04, 0x81, 0x70, 0x26, 0x08, 0x51,
+  0xb6, 0x41, 0x41, 0x22, 0x89, 0xaa, 0x08, 0xeb, 0xba, 0x30, 0x36, 0x43,
+  0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72,
+  0x13, 0x04, 0xe2, 0x99, 0x20, 0x10, 0xd0, 0x06, 0x04, 0xd1, 0xaa, 0xcd,
+  0xba, 0xb8, 0x69, 0xc3, 0xc0, 0x64, 0xdd, 0x86, 0x81, 0x80, 0xbc, 0x09,
+  0x82, 0x00, 0x6c, 0x00, 0x36, 0x0c, 0x44, 0x18, 0x84, 0xc1, 0x86, 0x40,
+  0x0c, 0x36, 0x0c, 0x03, 0x18, 0x8c, 0xc1, 0x04, 0x21, 0xe3, 0x36, 0x04,
+  0x65, 0x40, 0xa2, 0x2d, 0x2c, 0xcd, 0x8d, 0x08, 0x55, 0x11, 0xd6, 0xd0,
+  0xd3, 0x93, 0x14, 0xd1, 0x04, 0xa1, 0xa0, 0x26, 0x08, 0x45, 0xb5, 0x21,
+  0x20, 0x26, 0x08, 0x85, 0xb5, 0x41, 0xa8, 0xaa, 0x0d, 0x0b, 0x81, 0x06,
+  0x69, 0xa0, 0x06, 0x6b, 0xa0, 0x06, 0x03, 0x1b, 0x10, 0x6a, 0xd0, 0x06,
+  0x1b, 0x82, 0x61, 0x82, 0x50, 0x5c, 0x13, 0x04, 0x22, 0xda, 0x20, 0x54,
+  0x71, 0xb0, 0x61, 0x19, 0xd0, 0x20, 0x0d, 0xd4, 0xe0, 0x0d, 0xd4, 0x60,
+  0x80, 0x83, 0x41, 0x0d, 0xe4, 0x60, 0x83, 0xe0, 0x06, 0x73, 0xb0, 0x61,
+  0x21, 0xd0, 0x20, 0x0d, 0xd4, 0x60, 0x0d, 0xd8, 0x60, 0x80, 0x03, 0x42,
+  0x0d, 0xe4, 0x80, 0xcb, 0x94, 0xd5, 0x17, 0xd4, 0xdb, 0x5c, 0x1a, 0x5d,
+  0xda, 0x9b, 0xdb, 0x04, 0xa1, 0xc0, 0x36, 0x2c, 0x83, 0x1d, 0xa4, 0xc1,
+  0x1d, 0xac, 0x01, 0x1c, 0x0c, 0x70, 0x30, 0xa8, 0x81, 0x1c, 0x6c, 0x10,
+  0xea, 0x00, 0x0f, 0x36, 0x0c, 0x74, 0x90, 0x07, 0xc0, 0x86, 0x02, 0x0c,
+  0xce, 0x40, 0x0f, 0x1e, 0x80, 0x86, 0x19, 0xdb, 0x5b, 0x18, 0xdd, 0xdc,
+  0x04, 0x81, 0x90, 0x58, 0xa4, 0xb9, 0xcd, 0xd1, 0xcd, 0x4d, 0x10, 0x88,
+  0x89, 0xc6, 0x5c, 0xda, 0xd9, 0x17, 0x1b, 0x19, 0x8d, 0xb9, 0xb4, 0xb3,
+  0xaf, 0x39, 0xba, 0x0d, 0x08, 0x1f, 0xf4, 0x81, 0x1f, 0xfc, 0x01, 0x28,
+  0x20, 0xa1, 0xd0, 0x07, 0x55, 0xd8, 0xd8, 0xec, 0xda, 0x5c, 0xd2, 0xc8,
+  0xca, 0xdc, 0xe8, 0xa6, 0x04, 0x41, 0x15, 0x32, 0x3c, 0x17, 0xbb, 0x32,
+  0xb9, 0xb9, 0xb4, 0x37, 0xb7, 0x29, 0x01, 0xd1, 0x84, 0x0c, 0xcf, 0xc5,
+  0x2e, 0x8c, 0xcd, 0xae, 0x4c, 0x6e, 0x4a, 0x50, 0xd4, 0x21, 0xc3, 0x73,
+  0x99, 0x43, 0x0b, 0x23, 0x2b, 0x93, 0x6b, 0x7a, 0x23, 0x2b, 0x63, 0x9b,
+  0x12, 0x20, 0x65, 0xc8, 0xf0, 0x5c, 0xe4, 0xca, 0xe6, 0xde, 0xea, 0xe4,
+  0xc6, 0xca, 0xe6, 0xa6, 0x04, 0x4e, 0x25, 0x32, 0x3c, 0x17, 0xba, 0x3c,
+  0xb8, 0xb2, 0x20, 0x37, 0xb7, 0x37, 0xba, 0x30, 0xba, 0xb4, 0x37, 0xb7,
+  0xb9, 0x29, 0x82, 0x37, 0x06, 0x75, 0xc8, 0xf0, 0x5c, 0xec, 0xd2, 0xca,
+  0xee, 0x92, 0xc8, 0xa6, 0xe8, 0xc2, 0xe8, 0xca, 0xa6, 0x04, 0x65, 0x50,
+  0x87, 0x0c, 0xcf, 0xa5, 0xcc, 0x8d, 0x4e, 0x2e, 0x0f, 0xea, 0x2d, 0xcd,
+  0x8d, 0x6e, 0x6e, 0x4a, 0xa0, 0x07, 0x5d, 0xc8, 0xf0, 0x5c, 0xc6, 0xde,
+  0xea, 0xdc, 0xe8, 0xca, 0xe4, 0xe6, 0xa6, 0x04, 0xa1, 0x00, 0x00, 0x00,
   0x79, 0x18, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c,
   0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3,
   0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6,
@@ -179,8 +179,8 @@ static const unsigned char tri_color_vert_dxil[] = {
   0xe5, 0x3b, 0x8f, 0x3f, 0x11, 0xd1, 0x84, 0x00, 0x11, 0xe6, 0x17, 0xb7,
   0x6d, 0x00, 0x04, 0x03, 0x20, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x48, 0x41, 0x53, 0x48, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x64, 0x8e, 0x5e, 0x54, 0x3d, 0x5b, 0xff, 0xc6, 0x96, 0x0d, 0x21, 0xfd,
-  0xb0, 0x7a, 0x04, 0xbe, 0x44, 0x58, 0x49, 0x4c, 0xfc, 0x06, 0x00, 0x00,
+  0xaa, 0x16, 0x60, 0x77, 0x2f, 0xe5, 0x90, 0x78, 0x2c, 0xcc, 0xf5, 0xdc,
+  0xd3, 0xb5, 0xc7, 0xf9, 0x44, 0x58, 0x49, 0x4c, 0xfc, 0x06, 0x00, 0x00,
   0x60, 0x00, 0x01, 0x00, 0xbf, 0x01, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4c,
   0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xe4, 0x06, 0x00, 0x00,
   0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0xb6, 0x01, 0x00, 0x00,
@@ -229,39 +229,39 @@ static const unsigned char tri_color_vert_dxil[] = {
   0xc8, 0x23, 0x01, 0x01, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x40, 0x16, 0x08, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x14,
   0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0x22,
-  0x25, 0x30, 0x02, 0x50, 0x10, 0xc5, 0x50, 0xa0, 0x01, 0x65, 0x50, 0x1e,
+  0x25, 0x30, 0x02, 0x50, 0x12, 0xc5, 0x50, 0xa0, 0x01, 0x65, 0x50, 0x1e,
   0x54, 0x4a, 0x62, 0x04, 0xa0, 0x08, 0x0a, 0xa1, 0x0c, 0x08, 0xcf, 0x00,
   0x50, 0x1e, 0x4b, 0x41, 0x10, 0xf8, 0x80, 0x0f, 0x00, 0x08, 0x04, 0x02,
   0x01, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00,
-  0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0xc4, 0x8e, 0x0c, 0x6f, 0xec,
-  0xed, 0x4d, 0x0c, 0x24, 0xc6, 0x05, 0xc7, 0x45, 0xa6, 0x06, 0x46, 0xc6,
-  0x05, 0x07, 0x04, 0x45, 0x8c, 0xe6, 0x26, 0x26, 0x06, 0x67, 0x26, 0xa7,
-  0x2c, 0x65, 0x43, 0x10, 0x4c, 0x10, 0x08, 0x63, 0x82, 0x40, 0x1c, 0x1b,
-  0x84, 0x81, 0x98, 0x20, 0x10, 0xc8, 0x06, 0x61, 0x30, 0x28, 0xd8, 0xcd,
-  0x4d, 0x10, 0x88, 0x64, 0xc3, 0x80, 0x24, 0xc4, 0x04, 0x01, 0x93, 0x08,
-  0x4c, 0x10, 0x08, 0x65, 0x03, 0x42, 0x2c, 0xcc, 0x40, 0x0c, 0x0d, 0xb0,
-  0x21, 0x70, 0x36, 0x10, 0x00, 0xf0, 0x00, 0x13, 0x84, 0x6c, 0xda, 0x10,
-  0x44, 0x13, 0x04, 0x01, 0x20, 0xd1, 0x16, 0x96, 0xe6, 0x46, 0x84, 0xaa,
-  0x08, 0x6b, 0xe8, 0xe9, 0x49, 0x8a, 0x68, 0x82, 0x50, 0x34, 0x13, 0x84,
-  0xc2, 0xd9, 0x10, 0x10, 0x13, 0x84, 0xe2, 0x99, 0x20, 0x10, 0xcb, 0x06,
-  0x41, 0xd3, 0x36, 0x2c, 0x44, 0x65, 0x5d, 0xd8, 0x35, 0x64, 0xc4, 0xb5,
-  0x6d, 0x08, 0x86, 0x09, 0x42, 0x01, 0x4d, 0x10, 0x08, 0x66, 0x83, 0xa0,
-  0x7d, 0x1b, 0x96, 0xa1, 0xb2, 0xae, 0xee, 0x1a, 0xbc, 0xe1, 0x02, 0x83,
-  0x0d, 0x02, 0x17, 0x06, 0x1b, 0x16, 0xa2, 0xb2, 0x2e, 0x2c, 0x1b, 0x3c,
-  0xe2, 0x02, 0x03, 0x2e, 0x53, 0x56, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74,
-  0x69, 0x6f, 0x6e, 0x13, 0x84, 0x22, 0xda, 0xb0, 0x0c, 0x64, 0x60, 0x95,
-  0x01, 0xe6, 0x0d, 0xde, 0x70, 0x81, 0xc1, 0x06, 0x61, 0x0c, 0xcc, 0x60,
-  0xc3, 0x20, 0x06, 0x67, 0x00, 0x6c, 0x28, 0x26, 0x0a, 0x0d, 0x20, 0xa0,
-  0x0a, 0x1b, 0x9b, 0x5d, 0x9b, 0x4b, 0x1a, 0x59, 0x99, 0x1b, 0xdd, 0x94,
-  0x20, 0xa8, 0x42, 0x86, 0xe7, 0x62, 0x57, 0x26, 0x37, 0x97, 0xf6, 0xe6,
-  0x36, 0x25, 0x20, 0x9a, 0x90, 0xe1, 0xb9, 0xd8, 0x85, 0xb1, 0xd9, 0x95,
-  0xc9, 0x4d, 0x09, 0x8c, 0x3a, 0x64, 0x78, 0x2e, 0x73, 0x68, 0x61, 0x64,
-  0x65, 0x72, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x82, 0xa4, 0x0c, 0x19,
-  0x9e, 0x8b, 0x5c, 0xd9, 0xdc, 0x5b, 0x9d, 0xdc, 0x58, 0xd9, 0xdc, 0x94,
-  0xe0, 0xa9, 0x43, 0x86, 0xe7, 0x62, 0x97, 0x56, 0x76, 0x97, 0x44, 0x36,
-  0x45, 0x17, 0x46, 0x57, 0x36, 0x25, 0x88, 0xea, 0x90, 0xe1, 0xb9, 0x94,
-  0xb9, 0xd1, 0xc9, 0xe5, 0x41, 0xbd, 0xa5, 0xb9, 0xd1, 0xcd, 0x4d, 0x09,
-  0xd0, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00,
+  0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0x44, 0x8f, 0x0c, 0x6f, 0xec,
+  0xed, 0x4d, 0x0c, 0x24, 0xc6, 0x05, 0xc7, 0x45, 0xa6, 0x06, 0xa6, 0xc6,
+  0x45, 0x06, 0x07, 0x04, 0x25, 0xa7, 0xcc, 0x4c, 0x4c, 0xcc, 0x66, 0x6c,
+  0x46, 0x26, 0x65, 0x43, 0x10, 0x4c, 0x10, 0x08, 0x63, 0x82, 0x40, 0x1c,
+  0x1b, 0x84, 0x81, 0x98, 0x20, 0x10, 0xc8, 0x06, 0x61, 0x30, 0x28, 0xd8,
+  0xcd, 0x4d, 0x10, 0x88, 0x64, 0xc3, 0x80, 0x24, 0xc4, 0x04, 0x01, 0x93,
+  0x08, 0x4c, 0x10, 0x08, 0x65, 0x03, 0x42, 0x2c, 0xcc, 0x40, 0x0c, 0x0d,
+  0xb0, 0x21, 0x70, 0x36, 0x10, 0x00, 0xf0, 0x00, 0x13, 0x84, 0x6c, 0xda,
+  0x10, 0x44, 0x13, 0x04, 0x01, 0x20, 0xd1, 0x16, 0x96, 0xe6, 0x46, 0x84,
+  0xaa, 0x08, 0x6b, 0xe8, 0xe9, 0x49, 0x8a, 0x68, 0x82, 0x50, 0x34, 0x13,
+  0x84, 0xc2, 0xd9, 0x10, 0x10, 0x13, 0x84, 0xe2, 0x99, 0x20, 0x10, 0xcb,
+  0x06, 0x41, 0xd3, 0x36, 0x2c, 0x44, 0x65, 0x5d, 0xd8, 0x35, 0x64, 0xc4,
+  0xb5, 0x6d, 0x08, 0x86, 0x09, 0x42, 0x01, 0x4d, 0x10, 0x08, 0x66, 0x83,
+  0xa0, 0x7d, 0x1b, 0x96, 0xa1, 0xb2, 0xae, 0xee, 0x1a, 0xbc, 0xe1, 0x02,
+  0x83, 0x0d, 0x02, 0x17, 0x06, 0x1b, 0x16, 0xa2, 0xb2, 0x2e, 0x2c, 0x1b,
+  0x3c, 0xe2, 0x02, 0x03, 0x2e, 0x53, 0x56, 0x5f, 0x50, 0x6f, 0x73, 0x69,
+  0x74, 0x69, 0x6f, 0x6e, 0x13, 0x84, 0x22, 0xda, 0xb0, 0x0c, 0x64, 0x60,
+  0x95, 0x01, 0xe6, 0x0d, 0xde, 0x70, 0x81, 0xc1, 0x06, 0x61, 0x0c, 0xcc,
+  0x60, 0xc3, 0x20, 0x06, 0x67, 0x00, 0x6c, 0x28, 0x26, 0x0a, 0x0d, 0x20,
+  0xa0, 0x0a, 0x1b, 0x9b, 0x5d, 0x9b, 0x4b, 0x1a, 0x59, 0x99, 0x1b, 0xdd,
+  0x94, 0x20, 0xa8, 0x42, 0x86, 0xe7, 0x62, 0x57, 0x26, 0x37, 0x97, 0xf6,
+  0xe6, 0x36, 0x25, 0x20, 0x9a, 0x90, 0xe1, 0xb9, 0xd8, 0x85, 0xb1, 0xd9,
+  0x95, 0xc9, 0x4d, 0x09, 0x8c, 0x3a, 0x64, 0x78, 0x2e, 0x73, 0x68, 0x61,
+  0x64, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x82, 0xa4, 0x0c,
+  0x19, 0x9e, 0x8b, 0x5c, 0xd9, 0xdc, 0x5b, 0x9d, 0xdc, 0x58, 0xd9, 0xdc,
+  0x94, 0xe0, 0xa9, 0x43, 0x86, 0xe7, 0x62, 0x97, 0x56, 0x76, 0x97, 0x44,
+  0x36, 0x45, 0x17, 0x46, 0x57, 0x36, 0x25, 0x88, 0xea, 0x90, 0xe1, 0xb9,
+  0x94, 0xb9, 0xd1, 0xc9, 0xe5, 0x41, 0xbd, 0xa5, 0xb9, 0xd1, 0xcd, 0x4d,
+  0x09, 0xd0, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00,
   0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88,
   0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73,
   0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e,

+ 167 - 167
src/render/gpu/shaders/tri_texture.vert.dxil.h

@@ -1,7 +1,7 @@
 static const unsigned char tri_texture_vert_dxil[] = {
-  0x44, 0x58, 0x42, 0x43, 0x38, 0x53, 0xc4, 0x1e, 0xbe, 0x34, 0x14, 0xf4,
-  0xf6, 0xbe, 0x8e, 0xc3, 0x28, 0x1b, 0x1e, 0x5e, 0x01, 0x00, 0x00, 0x00,
-  0x94, 0x10, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00,
+  0x44, 0x58, 0x42, 0x43, 0xd3, 0x32, 0x83, 0x71, 0xdb, 0x41, 0x9a, 0x6d,
+  0xbc, 0x73, 0x19, 0x9b, 0x50, 0xcf, 0x6f, 0xdd, 0x01, 0x00, 0x00, 0x00,
+  0x98, 0x10, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00,
   0x4c, 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, 0x50, 0x01, 0x00, 0x00,
   0x8c, 0x02, 0x00, 0x00, 0x14, 0x09, 0x00, 0x00, 0x30, 0x09, 0x00, 0x00,
   0x53, 0x46, 0x49, 0x30, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -108,56 +108,56 @@ static const unsigned char tri_texture_vert_dxil[] = {
   0x00, 0xdd, 0x19, 0x00, 0xc2, 0x33, 0x00, 0x94, 0xc7, 0x62, 0x14, 0x06,
   0xc4, 0x07, 0x10, 0x1f, 0x00, 0x20, 0x10, 0x08, 0x04, 0x02, 0x03, 0x00,
   0x79, 0x18, 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x90,
-  0x46, 0x02, 0x13, 0xc4, 0x8e, 0x0c, 0x6f, 0xec, 0xed, 0x4d, 0x0c, 0x24,
-  0xc6, 0x05, 0xc7, 0x45, 0xa6, 0x06, 0x46, 0xc6, 0x05, 0x07, 0x04, 0x45,
-  0x8c, 0xe6, 0x26, 0x26, 0x06, 0x67, 0x26, 0xa7, 0x2c, 0x65, 0x43, 0x10,
-  0x4c, 0x10, 0x08, 0x63, 0x82, 0x40, 0x1c, 0x1b, 0x84, 0x81, 0xd8, 0x20,
-  0x10, 0x04, 0x05, 0xbb, 0xb9, 0x09, 0x02, 0x81, 0x6c, 0x18, 0x0e, 0x84,
-  0x98, 0x20, 0x60, 0x1c, 0x19, 0xba, 0x3c, 0xb8, 0xb2, 0xaf, 0xa1, 0x37,
-  0x37, 0xba, 0x32, 0x3c, 0xba, 0x09, 0x02, 0x91, 0x6c, 0x40, 0x08, 0x65,
-  0x19, 0x88, 0x81, 0x01, 0x36, 0x04, 0xcd, 0x06, 0x02, 0x00, 0x1c, 0x60,
-  0x82, 0x70, 0x6d, 0x5c, 0x86, 0xde, 0xdc, 0xe8, 0xca, 0xf0, 0xe8, 0xbe,
-  0xda, 0xec, 0xe0, 0x26, 0x08, 0x84, 0x32, 0x41, 0x20, 0x96, 0x0d, 0xc3,
-  0x34, 0x49, 0x13, 0x04, 0x82, 0x99, 0x20, 0x10, 0xcd, 0x04, 0x81, 0x70,
-  0x26, 0x08, 0x91, 0xb6, 0x41, 0x41, 0x22, 0x89, 0xaa, 0x08, 0xeb, 0xba,
-  0x30, 0x36, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x63, 0x6f,
-  0x6c, 0x6f, 0x72, 0x13, 0x04, 0xe2, 0x99, 0x20, 0x10, 0xd0, 0x06, 0x04,
-  0xd1, 0xaa, 0xcd, 0xba, 0xb8, 0x69, 0xc3, 0xc0, 0x64, 0xdd, 0x86, 0x81,
-  0x80, 0xbc, 0x09, 0x82, 0x00, 0x6c, 0x00, 0x36, 0x0c, 0x44, 0x18, 0x84,
-  0xc1, 0x86, 0x40, 0x0c, 0x36, 0x0c, 0x03, 0x18, 0x8c, 0xc1, 0x04, 0x21,
-  0xeb, 0x36, 0x04, 0x65, 0x40, 0xa2, 0x2d, 0x2c, 0xcd, 0x8d, 0x08, 0x55,
-  0x11, 0xd6, 0xd0, 0xd3, 0x93, 0x14, 0xd1, 0x04, 0xa1, 0xa8, 0x26, 0x08,
-  0x85, 0xb5, 0x21, 0x20, 0x26, 0x08, 0xc5, 0xb5, 0x41, 0xa8, 0xaa, 0x0d,
-  0x0b, 0x81, 0x06, 0x69, 0xa0, 0x06, 0x6b, 0xa0, 0x06, 0x03, 0x1b, 0x10,
-  0x6a, 0xd0, 0x06, 0x1b, 0x82, 0x61, 0x82, 0x50, 0x60, 0x13, 0x04, 0x22,
-  0xda, 0x20, 0x54, 0x71, 0xb0, 0x61, 0x19, 0xd0, 0x20, 0x0d, 0xd4, 0xe0,
-  0x0d, 0xd4, 0x60, 0x80, 0x83, 0x41, 0x0d, 0xe4, 0x60, 0x43, 0x20, 0x6d,
-  0x58, 0x24, 0x34, 0x48, 0x03, 0x35, 0xa0, 0x03, 0x35, 0x18, 0xd8, 0x40,
-  0x52, 0x83, 0x36, 0xd8, 0x30, 0xb8, 0xc1, 0x1c, 0xd4, 0xc1, 0x86, 0x85,
-  0x40, 0x83, 0x34, 0x50, 0x83, 0x35, 0x60, 0x83, 0x01, 0x0e, 0x08, 0x35,
-  0x90, 0x83, 0x0d, 0xcb, 0x80, 0x06, 0x69, 0xa0, 0x06, 0x6f, 0xc0, 0x06,
-  0x03, 0x1b, 0x0c, 0x6a, 0xd0, 0x06, 0x5c, 0xa6, 0xac, 0xbe, 0xa0, 0xde,
-  0xe6, 0xd2, 0xe8, 0xd2, 0xde, 0xdc, 0x26, 0x08, 0x45, 0xb6, 0x61, 0x91,
-  0xf2, 0x20, 0x0d, 0xf4, 0x60, 0x0d, 0xe0, 0x60, 0x80, 0x03, 0x49, 0x0d,
-  0xe4, 0x60, 0xc3, 0x70, 0x07, 0x78, 0xb0, 0x07, 0x1b, 0x06, 0x3b, 0xe0,
-  0x03, 0x60, 0x43, 0x01, 0x06, 0x67, 0xd0, 0x07, 0x0f, 0x40, 0xc3, 0x8c,
-  0xed, 0x2d, 0x8c, 0x6e, 0x6e, 0x82, 0x40, 0x48, 0x2c, 0xd2, 0xdc, 0xe6,
-  0xe8, 0xe6, 0x26, 0x08, 0xc4, 0x44, 0x63, 0x2e, 0xed, 0xec, 0x8b, 0x8d,
-  0x8c, 0xc6, 0x5c, 0xda, 0xd9, 0xd7, 0x1c, 0xdd, 0x04, 0x81, 0xa0, 0x36,
-  0x20, 0x7f, 0x00, 0x0a, 0xa1, 0x20, 0x0a, 0xa3, 0x00, 0x0a, 0xa4, 0x50,
-  0x0a, 0x55, 0xd8, 0xd8, 0xec, 0xda, 0x5c, 0xd2, 0xc8, 0xca, 0xdc, 0xe8,
-  0xa6, 0x04, 0x41, 0x15, 0x32, 0x3c, 0x17, 0xbb, 0x32, 0xb9, 0xb9, 0xb4,
-  0x37, 0xb7, 0x29, 0x01, 0xd1, 0x84, 0x0c, 0xcf, 0xc5, 0x2e, 0x8c, 0xcd,
-  0xae, 0x4c, 0x6e, 0x4a, 0x50, 0xd4, 0x21, 0xc3, 0x73, 0x99, 0x43, 0x0b,
-  0x23, 0x2b, 0x93, 0x6b, 0x7a, 0x23, 0x2b, 0x63, 0x9b, 0x12, 0x20, 0x65,
-  0xc8, 0xf0, 0x5c, 0xe4, 0xca, 0xe6, 0xde, 0xea, 0xe4, 0xc6, 0xca, 0xe6,
-  0xa6, 0x04, 0x4e, 0x25, 0x32, 0x3c, 0x17, 0xba, 0x3c, 0xb8, 0xb2, 0x20,
-  0x37, 0xb7, 0x37, 0xba, 0x30, 0xba, 0xb4, 0x37, 0xb7, 0xb9, 0x29, 0x82,
-  0x37, 0x06, 0x75, 0xc8, 0xf0, 0x5c, 0xec, 0xd2, 0xca, 0xee, 0x92, 0xc8,
-  0xa6, 0xe8, 0xc2, 0xe8, 0xca, 0xa6, 0x04, 0x65, 0x50, 0x87, 0x0c, 0xcf,
-  0xa5, 0xcc, 0x8d, 0x4e, 0x2e, 0x0f, 0xea, 0x2d, 0xcd, 0x8d, 0x6e, 0x6e,
-  0x4a, 0xd0, 0x07, 0x5d, 0xc8, 0xf0, 0x5c, 0xc6, 0xde, 0xea, 0xdc, 0xe8,
-  0xca, 0xe4, 0xe6, 0xa6, 0x04, 0xa5, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00,
+  0x46, 0x02, 0x13, 0x44, 0x8f, 0x0c, 0x6f, 0xec, 0xed, 0x4d, 0x0c, 0x24,
+  0xc6, 0x05, 0xc7, 0x45, 0xa6, 0x06, 0xa6, 0xc6, 0x45, 0x06, 0x07, 0x04,
+  0x25, 0xa7, 0xcc, 0x4c, 0x4c, 0xcc, 0x66, 0x6c, 0x46, 0x26, 0x65, 0x43,
+  0x10, 0x4c, 0x10, 0x08, 0x63, 0x82, 0x40, 0x1c, 0x1b, 0x84, 0x81, 0xd8,
+  0x20, 0x10, 0x04, 0x05, 0xbb, 0xb9, 0x09, 0x02, 0x81, 0x6c, 0x18, 0x0e,
+  0x84, 0x98, 0x20, 0x60, 0x1c, 0x19, 0xba, 0x3c, 0xb8, 0xb2, 0xaf, 0xa1,
+  0x37, 0x37, 0xba, 0x32, 0x3c, 0xba, 0x09, 0x02, 0x91, 0x6c, 0x40, 0x08,
+  0x65, 0x19, 0x88, 0x81, 0x01, 0x36, 0x04, 0xcd, 0x06, 0x02, 0x00, 0x1c,
+  0x60, 0x82, 0x70, 0x6d, 0x5c, 0x86, 0xde, 0xdc, 0xe8, 0xca, 0xf0, 0xe8,
+  0xbe, 0xda, 0xec, 0xe0, 0x26, 0x08, 0x84, 0x32, 0x41, 0x20, 0x96, 0x0d,
+  0xc3, 0x34, 0x49, 0x13, 0x04, 0x82, 0x99, 0x20, 0x10, 0xcd, 0x04, 0x81,
+  0x70, 0x26, 0x08, 0x91, 0xb6, 0x41, 0x41, 0x22, 0x89, 0xaa, 0x08, 0xeb,
+  0xba, 0x30, 0x36, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x63,
+  0x6f, 0x6c, 0x6f, 0x72, 0x13, 0x04, 0xe2, 0x99, 0x20, 0x10, 0xd0, 0x06,
+  0x04, 0xd1, 0xaa, 0xcd, 0xba, 0xb8, 0x69, 0xc3, 0xc0, 0x64, 0xdd, 0x86,
+  0x81, 0x80, 0xbc, 0x09, 0x82, 0x00, 0x6c, 0x00, 0x36, 0x0c, 0x44, 0x18,
+  0x84, 0xc1, 0x86, 0x40, 0x0c, 0x36, 0x0c, 0x03, 0x18, 0x8c, 0xc1, 0x04,
+  0x21, 0xeb, 0x36, 0x04, 0x65, 0x40, 0xa2, 0x2d, 0x2c, 0xcd, 0x8d, 0x08,
+  0x55, 0x11, 0xd6, 0xd0, 0xd3, 0x93, 0x14, 0xd1, 0x04, 0xa1, 0xa8, 0x26,
+  0x08, 0x85, 0xb5, 0x21, 0x20, 0x26, 0x08, 0xc5, 0xb5, 0x41, 0xa8, 0xaa,
+  0x0d, 0x0b, 0x81, 0x06, 0x69, 0xa0, 0x06, 0x6b, 0xa0, 0x06, 0x03, 0x1b,
+  0x10, 0x6a, 0xd0, 0x06, 0x1b, 0x82, 0x61, 0x82, 0x50, 0x60, 0x13, 0x04,
+  0x22, 0xda, 0x20, 0x54, 0x71, 0xb0, 0x61, 0x19, 0xd0, 0x20, 0x0d, 0xd4,
+  0xe0, 0x0d, 0xd4, 0x60, 0x80, 0x83, 0x41, 0x0d, 0xe4, 0x60, 0x43, 0x20,
+  0x6d, 0x58, 0x24, 0x34, 0x48, 0x03, 0x35, 0xa0, 0x03, 0x35, 0x18, 0xd8,
+  0x40, 0x52, 0x83, 0x36, 0xd8, 0x30, 0xb8, 0xc1, 0x1c, 0xd4, 0xc1, 0x86,
+  0x85, 0x40, 0x83, 0x34, 0x50, 0x83, 0x35, 0x60, 0x83, 0x01, 0x0e, 0x08,
+  0x35, 0x90, 0x83, 0x0d, 0xcb, 0x80, 0x06, 0x69, 0xa0, 0x06, 0x6f, 0xc0,
+  0x06, 0x03, 0x1b, 0x0c, 0x6a, 0xd0, 0x06, 0x5c, 0xa6, 0xac, 0xbe, 0xa0,
+  0xde, 0xe6, 0xd2, 0xe8, 0xd2, 0xde, 0xdc, 0x26, 0x08, 0x45, 0xb6, 0x61,
+  0x91, 0xf2, 0x20, 0x0d, 0xf4, 0x60, 0x0d, 0xe0, 0x60, 0x80, 0x03, 0x49,
+  0x0d, 0xe4, 0x60, 0xc3, 0x70, 0x07, 0x78, 0xb0, 0x07, 0x1b, 0x06, 0x3b,
+  0xe0, 0x03, 0x60, 0x43, 0x01, 0x06, 0x67, 0xd0, 0x07, 0x0f, 0x40, 0xc3,
+  0x8c, 0xed, 0x2d, 0x8c, 0x6e, 0x6e, 0x82, 0x40, 0x48, 0x2c, 0xd2, 0xdc,
+  0xe6, 0xe8, 0xe6, 0x26, 0x08, 0xc4, 0x44, 0x63, 0x2e, 0xed, 0xec, 0x8b,
+  0x8d, 0x8c, 0xc6, 0x5c, 0xda, 0xd9, 0xd7, 0x1c, 0xdd, 0x04, 0x81, 0xa0,
+  0x36, 0x20, 0x7f, 0x00, 0x0a, 0xa1, 0x20, 0x0a, 0xa3, 0x00, 0x0a, 0xa4,
+  0x50, 0x0a, 0x55, 0xd8, 0xd8, 0xec, 0xda, 0x5c, 0xd2, 0xc8, 0xca, 0xdc,
+  0xe8, 0xa6, 0x04, 0x41, 0x15, 0x32, 0x3c, 0x17, 0xbb, 0x32, 0xb9, 0xb9,
+  0xb4, 0x37, 0xb7, 0x29, 0x01, 0xd1, 0x84, 0x0c, 0xcf, 0xc5, 0x2e, 0x8c,
+  0xcd, 0xae, 0x4c, 0x6e, 0x4a, 0x50, 0xd4, 0x21, 0xc3, 0x73, 0x99, 0x43,
+  0x0b, 0x23, 0x2b, 0x93, 0x6b, 0x7a, 0x23, 0x2b, 0x63, 0x9b, 0x12, 0x20,
+  0x65, 0xc8, 0xf0, 0x5c, 0xe4, 0xca, 0xe6, 0xde, 0xea, 0xe4, 0xc6, 0xca,
+  0xe6, 0xa6, 0x04, 0x4e, 0x25, 0x32, 0x3c, 0x17, 0xba, 0x3c, 0xb8, 0xb2,
+  0x20, 0x37, 0xb7, 0x37, 0xba, 0x30, 0xba, 0xb4, 0x37, 0xb7, 0xb9, 0x29,
+  0x82, 0x37, 0x06, 0x75, 0xc8, 0xf0, 0x5c, 0xec, 0xd2, 0xca, 0xee, 0x92,
+  0xc8, 0xa6, 0xe8, 0xc2, 0xe8, 0xca, 0xa6, 0x04, 0x65, 0x50, 0x87, 0x0c,
+  0xcf, 0xa5, 0xcc, 0x8d, 0x4e, 0x2e, 0x0f, 0xea, 0x2d, 0xcd, 0x8d, 0x6e,
+  0x6e, 0x4a, 0xd0, 0x07, 0x5d, 0xc8, 0xf0, 0x5c, 0xc6, 0xde, 0xea, 0xdc,
+  0xe8, 0xca, 0xe4, 0xe6, 0xa6, 0x04, 0xa5, 0x00, 0x79, 0x18, 0x00, 0x00,
   0x4c, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66,
   0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07,
   0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10,
@@ -193,12 +193,12 @@ static const unsigned char tri_texture_vert_dxil[] = {
   0x50, 0x93, 0x5f, 0xdc, 0xb6, 0x11, 0x48, 0xc3, 0xe5, 0x3b, 0x8f, 0x3f,
   0x11, 0xd1, 0x84, 0x00, 0x11, 0xe6, 0x17, 0xb7, 0x6d, 0x00, 0x04, 0x03,
   0x20, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x41, 0x53, 0x48,
-  0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xae, 0x6b, 0x29, 0xab,
-  0x86, 0x8d, 0x3c, 0x82, 0xc1, 0xee, 0xda, 0x30, 0xa5, 0x82, 0x00, 0x8e,
-  0x44, 0x58, 0x49, 0x4c, 0x5c, 0x07, 0x00, 0x00, 0x60, 0x00, 0x01, 0x00,
-  0xd7, 0x01, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4c, 0x00, 0x01, 0x00, 0x00,
-  0x10, 0x00, 0x00, 0x00, 0x44, 0x07, 0x00, 0x00, 0x42, 0x43, 0xc0, 0xde,
-  0x21, 0x0c, 0x00, 0x00, 0xce, 0x01, 0x00, 0x00, 0x0b, 0x82, 0x20, 0x00,
+  0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xac, 0xeb, 0x28, 0xa3,
+  0x9c, 0xff, 0xc5, 0xa0, 0x79, 0x44, 0xdb, 0xa9, 0xee, 0x73, 0x7f, 0x7f,
+  0x44, 0x58, 0x49, 0x4c, 0x60, 0x07, 0x00, 0x00, 0x60, 0x00, 0x01, 0x00,
+  0xd8, 0x01, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4c, 0x00, 0x01, 0x00, 0x00,
+  0x10, 0x00, 0x00, 0x00, 0x48, 0x07, 0x00, 0x00, 0x42, 0x43, 0xc0, 0xde,
+  0x21, 0x0c, 0x00, 0x00, 0xcf, 0x01, 0x00, 0x00, 0x0b, 0x82, 0x20, 0x00,
   0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, 0x91,
   0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, 0x0c,
   0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x14, 0x45, 0x02,
@@ -244,114 +244,114 @@ static const unsigned char tri_texture_vert_dxil[] = {
   0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x16, 0x08, 0x00,
   0x0f, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x14, 0x19, 0x11, 0x4c, 0x90,
   0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0x22, 0x25, 0x30, 0x02, 0x50,
-  0x10, 0xc5, 0x50, 0xa0, 0x01, 0x65, 0x50, 0x1e, 0x45, 0x40, 0xa5, 0x24,
+  0x12, 0xc5, 0x50, 0xa0, 0x01, 0x65, 0x50, 0x1e, 0x45, 0x40, 0xa5, 0x24,
   0x46, 0x00, 0x8a, 0xa0, 0x10, 0xca, 0x80, 0xf0, 0x0c, 0x00, 0xe5, 0xb1,
   0x18, 0x85, 0x01, 0xf1, 0x01, 0xc4, 0x07, 0x00, 0x08, 0x04, 0x02, 0x81,
-  0xc0, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, 0x5d, 0x00, 0x00, 0x00,
-  0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0xc4, 0x8e, 0x0c, 0x6f, 0xec,
-  0xed, 0x4d, 0x0c, 0x24, 0xc6, 0x05, 0xc7, 0x45, 0xa6, 0x06, 0x46, 0xc6,
-  0x05, 0x07, 0x04, 0x45, 0x8c, 0xe6, 0x26, 0x26, 0x06, 0x67, 0x26, 0xa7,
-  0x2c, 0x65, 0x43, 0x10, 0x4c, 0x10, 0x08, 0x63, 0x82, 0x40, 0x1c, 0x1b,
-  0x84, 0x81, 0x98, 0x20, 0x10, 0xc8, 0x06, 0x61, 0x30, 0x28, 0xd8, 0xcd,
-  0x4d, 0x10, 0x88, 0x64, 0xc3, 0x80, 0x24, 0xc4, 0x04, 0x01, 0x9b, 0x08,
-  0x4c, 0x10, 0x08, 0x65, 0x03, 0x42, 0x2c, 0xcc, 0x40, 0x0c, 0x0d, 0xb0,
-  0x21, 0x70, 0x36, 0x10, 0x00, 0xf0, 0x00, 0x13, 0x84, 0x8c, 0xda, 0x10,
-  0x44, 0x13, 0x04, 0x01, 0x20, 0xd1, 0x16, 0x96, 0xe6, 0x46, 0x84, 0xaa,
-  0x08, 0x6b, 0xe8, 0xe9, 0x49, 0x8a, 0x68, 0x82, 0x50, 0x38, 0x13, 0x84,
-  0xe2, 0xd9, 0x10, 0x10, 0x13, 0x84, 0x02, 0x9a, 0x20, 0x10, 0xcb, 0x06,
-  0x41, 0xd3, 0x36, 0x2c, 0x44, 0x65, 0x5d, 0xd8, 0x35, 0x64, 0xc4, 0xb5,
-  0x6d, 0x08, 0x86, 0x09, 0x42, 0x11, 0x4d, 0x10, 0x08, 0x66, 0x83, 0xa0,
-  0x7d, 0x1b, 0x96, 0xa1, 0xb2, 0xae, 0xee, 0x1a, 0xbc, 0xe1, 0x02, 0x83,
-  0x09, 0x02, 0xd1, 0x6c, 0x08, 0xc4, 0x60, 0xc3, 0x22, 0x06, 0x95, 0x75,
-  0x8d, 0xc1, 0x35, 0x64, 0x62, 0x70, 0x6d, 0x1b, 0x06, 0x2e, 0x0c, 0xc8,
-  0x60, 0xc3, 0x42, 0x54, 0xd6, 0x85, 0x65, 0x83, 0x47, 0x5c, 0x60, 0xb0,
-  0x61, 0x19, 0x2a, 0xeb, 0xea, 0xb2, 0x21, 0x1b, 0xae, 0x8d, 0xcb, 0x94,
-  0xd5, 0x17, 0xd4, 0xdb, 0x5c, 0x1a, 0x5d, 0xda, 0x9b, 0xdb, 0x04, 0xa1,
-  0x90, 0x36, 0x2c, 0x62, 0x80, 0x06, 0x56, 0x1a, 0x60, 0xde, 0xe0, 0x89,
-  0xc1, 0x05, 0x06, 0x1b, 0x06, 0x33, 0x38, 0x03, 0x35, 0xd8, 0x30, 0x94,
-  0xc1, 0x1a, 0x00, 0x1b, 0x8a, 0x89, 0x62, 0x03, 0x08, 0xa8, 0xc2, 0xc6,
-  0x66, 0xd7, 0xe6, 0x92, 0x46, 0x56, 0xe6, 0x46, 0x37, 0x25, 0x08, 0xaa,
-  0x90, 0xe1, 0xb9, 0xd8, 0x95, 0xc9, 0xcd, 0xa5, 0xbd, 0xb9, 0x4d, 0x09,
-  0x88, 0x26, 0x64, 0x78, 0x2e, 0x76, 0x61, 0x6c, 0x76, 0x65, 0x72, 0x53,
-  0x02, 0xa3, 0x0e, 0x19, 0x9e, 0xcb, 0x1c, 0x5a, 0x18, 0x59, 0x99, 0x5c,
-  0xd3, 0x1b, 0x59, 0x19, 0xdb, 0x94, 0x20, 0x29, 0x43, 0x86, 0xe7, 0x22,
-  0x57, 0x36, 0xf7, 0x56, 0x27, 0x37, 0x56, 0x36, 0x37, 0x25, 0x78, 0xea,
-  0x90, 0xe1, 0xb9, 0xd8, 0xa5, 0x95, 0xdd, 0x25, 0x91, 0x4d, 0xd1, 0x85,
-  0xd1, 0x95, 0x4d, 0x09, 0xa2, 0x3a, 0x64, 0x78, 0x2e, 0x65, 0x6e, 0x74,
-  0x72, 0x79, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x53, 0x02, 0x36, 0x00,
-  0x79, 0x18, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c,
-  0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3,
-  0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6,
-  0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e,
-  0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43,
-  0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03,
-  0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48,
-  0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20,
-  0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e,
-  0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d,
-  0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89,
-  0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83,
-  0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68,
-  0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90,
-  0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78,
-  0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98,
-  0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5,
-  0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c,
-  0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c,
-  0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43,
-  0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43,
-  0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82,
-  0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x8c, 0xc8, 0x21, 0x07, 0x7c, 0x70,
-  0x03, 0x72, 0x10, 0x87, 0x73, 0x70, 0x03, 0x7b, 0x08, 0x07, 0x79, 0x60,
-  0x87, 0x70, 0xc8, 0x87, 0x77, 0xa8, 0x07, 0x7a, 0x98, 0x81, 0x3c, 0xe4,
-  0x80, 0x0f, 0x6e, 0x40, 0x0f, 0xe5, 0xd0, 0x0e, 0xf0, 0x00, 0x00, 0x00,
-  0x71, 0x20, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x36, 0xb0, 0x0d, 0x97,
-  0xef, 0x3c, 0xbe, 0x10, 0x50, 0x45, 0x41, 0x44, 0xa5, 0x03, 0x0c, 0x25,
-  0x61, 0x00, 0x02, 0xe6, 0x17, 0xb7, 0x6d, 0x05, 0xd2, 0x70, 0xf9, 0xce,
-  0xe3, 0x0b, 0x11, 0x01, 0x4c, 0x44, 0x08, 0x34, 0xc3, 0x42, 0x58, 0xc0,
-  0x34, 0x5c, 0xbe, 0xf3, 0xf8, 0x8b, 0x03, 0x0c, 0x62, 0xf3, 0x50, 0x93,
-  0x5f, 0xdc, 0xb6, 0x09, 0x54, 0xc3, 0xe5, 0x3b, 0x8f, 0x2f, 0x4d, 0x4e,
-  0x44, 0xa0, 0xd4, 0xf4, 0x50, 0x93, 0x5f, 0xdc, 0xb6, 0x11, 0x48, 0xc3,
-  0xe5, 0x3b, 0x8f, 0x3f, 0x11, 0xd1, 0x84, 0x00, 0x11, 0xe6, 0x17, 0xb7,
-  0x6d, 0x00, 0x04, 0x03, 0x20, 0x0d, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00,
-  0x72, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, 0x00,
-  0x05, 0x00, 0x00, 0x00, 0x44, 0x4a, 0xa1, 0x10, 0x66, 0x00, 0x8a, 0xab,
-  0xec, 0x4a, 0x8e, 0x4a, 0x09, 0x50, 0x1c, 0x01, 0x00, 0x00, 0x00, 0x00,
-  0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x20, 0x61, 0x43, 0x63, 0x59, 0xc1,
-  0x88, 0x41, 0x02, 0x80, 0x20, 0x18, 0x18, 0x1d, 0x12, 0x5d, 0xcf, 0x31,
-  0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0x86, 0x97, 0x48, 0x18, 0x81, 0x8c,
-  0x18, 0x24, 0x00, 0x08, 0x82, 0x81, 0xf1, 0x29, 0x5a, 0x16, 0x25, 0x23,
-  0x06, 0x09, 0x00, 0x82, 0x60, 0x60, 0x80, 0xc1, 0xb2, 0x69, 0x86, 0x32,
-  0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0x46, 0x18, 0x30, 0xdc, 0x26, 0x2d,
-  0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x60, 0x88, 0x41, 0xd3, 0x71, 0x11,
-  0x33, 0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0xc6, 0x18, 0x38, 0x5d, 0x57,
-  0x35, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x60, 0x90, 0xc1, 0xe3, 0x79,
-  0x8a, 0x33, 0x62, 0x70, 0x00, 0x20, 0x08, 0x06, 0xcd, 0x18, 0x34, 0xc9,
-  0x37, 0x9a, 0x10, 0x00, 0xa3, 0x09, 0x42, 0x30, 0x9a, 0x30, 0x08, 0xa3,
-  0x09, 0xc4, 0x30, 0x62, 0x70, 0x00, 0x20, 0x08, 0x06, 0x0d, 0x1a, 0x48,
-  0x4e, 0x19, 0x8c, 0x26, 0x04, 0xc0, 0x68, 0x82, 0x10, 0x8c, 0x26, 0x0c,
-  0xc2, 0x68, 0x02, 0x31, 0x8c, 0x18, 0x1c, 0x00, 0x08, 0x82, 0x41, 0xd3,
-  0x06, 0xd7, 0x54, 0x06, 0xa3, 0x09, 0x01, 0x30, 0x9a, 0x20, 0x04, 0xa3,
-  0x09, 0x83, 0x30, 0x9a, 0x40, 0x0c, 0xe6, 0x44, 0xf2, 0x19, 0x31, 0x40,
-  0x00, 0x10, 0x04, 0x83, 0x47, 0x0e, 0x3c, 0x25, 0x0a, 0xcc, 0x08, 0xa0,
-  0x63, 0x10, 0x25, 0x9f, 0x11, 0x03, 0x04, 0x00, 0x41, 0x30, 0x78, 0xea,
-  0x20, 0x0c, 0x18, 0x2a, 0xb0, 0x00, 0x81, 0x8e, 0x49, 0x97, 0x7c, 0x46,
-  0x0c, 0x10, 0x00, 0x04, 0xc1, 0xe0, 0xc1, 0x03, 0x32, 0x70, 0xae, 0xc0,
-  0x02, 0x05, 0x3a, 0x46, 0x69, 0xf2, 0x19, 0x31, 0x40, 0x00, 0x10, 0x04,
-  0x83, 0x67, 0x0f, 0xce, 0x00, 0xd2, 0x02, 0x0b, 0x18, 0xe8, 0x8c, 0x18,
-  0x24, 0x00, 0x08, 0x82, 0x01, 0xf2, 0x07, 0x6c, 0xa0, 0x07, 0x7a, 0x20,
-  0x07, 0x61, 0x30, 0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0xc8, 0x1f, 0xb0,
-  0x81, 0x1e, 0xe8, 0x81, 0x19, 0x80, 0xc1, 0x88, 0x41, 0x02, 0x80, 0x20,
-  0x18, 0x20, 0x7f, 0xc0, 0x06, 0x7a, 0xa0, 0x07, 0x71, 0xf0, 0x8d, 0x18,
-  0x24, 0x00, 0x08, 0x82, 0x01, 0xf2, 0x07, 0x6c, 0xa0, 0x07, 0x7a, 0xf0,
-  0x06, 0xde, 0x88, 0x41, 0x02, 0x80, 0x20, 0x18, 0x20, 0x7f, 0xc0, 0x06,
-  0x7b, 0xa0, 0x07, 0x72, 0x30, 0x06, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60,
-  0x80, 0xfc, 0x01, 0x1b, 0xec, 0x81, 0x1e, 0x98, 0x81, 0x18, 0x8c, 0x18,
-  0x24, 0x00, 0x08, 0x82, 0x01, 0xf2, 0x07, 0x6c, 0x40, 0x07, 0x7a, 0x20,
-  0x07, 0xca, 0x88, 0x41, 0x02, 0x80, 0x20, 0x18, 0x20, 0x7f, 0xc0, 0x06,
-  0x74, 0xa0, 0x07, 0x66, 0x70, 0x8c, 0x18, 0x24, 0x00, 0x08, 0x82, 0x01,
-  0xf2, 0x07, 0x6c, 0x40, 0x07, 0x7a, 0x10, 0x07, 0xc4, 0x88, 0x41, 0x02,
-  0x80, 0x20, 0x18, 0x20, 0x7f, 0xc0, 0x06, 0x74, 0xa0, 0x07, 0x6f, 0x10,
-  0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+  0xc0, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, 0x5e, 0x00, 0x00, 0x00,
+  0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0x44, 0x8f, 0x0c, 0x6f, 0xec,
+  0xed, 0x4d, 0x0c, 0x24, 0xc6, 0x05, 0xc7, 0x45, 0xa6, 0x06, 0xa6, 0xc6,
+  0x45, 0x06, 0x07, 0x04, 0x25, 0xa7, 0xcc, 0x4c, 0x4c, 0xcc, 0x66, 0x6c,
+  0x46, 0x26, 0x65, 0x43, 0x10, 0x4c, 0x10, 0x08, 0x63, 0x82, 0x40, 0x1c,
+  0x1b, 0x84, 0x81, 0x98, 0x20, 0x10, 0xc8, 0x06, 0x61, 0x30, 0x28, 0xd8,
+  0xcd, 0x4d, 0x10, 0x88, 0x64, 0xc3, 0x80, 0x24, 0xc4, 0x04, 0x01, 0x9b,
+  0x08, 0x4c, 0x10, 0x08, 0x65, 0x03, 0x42, 0x2c, 0xcc, 0x40, 0x0c, 0x0d,
+  0xb0, 0x21, 0x70, 0x36, 0x10, 0x00, 0xf0, 0x00, 0x13, 0x84, 0x8c, 0xda,
+  0x10, 0x44, 0x13, 0x04, 0x01, 0x20, 0xd1, 0x16, 0x96, 0xe6, 0x46, 0x84,
+  0xaa, 0x08, 0x6b, 0xe8, 0xe9, 0x49, 0x8a, 0x68, 0x82, 0x50, 0x38, 0x13,
+  0x84, 0xe2, 0xd9, 0x10, 0x10, 0x13, 0x84, 0x02, 0x9a, 0x20, 0x10, 0xcb,
+  0x06, 0x41, 0xd3, 0x36, 0x2c, 0x44, 0x65, 0x5d, 0xd8, 0x35, 0x64, 0xc4,
+  0xb5, 0x6d, 0x08, 0x86, 0x09, 0x42, 0x11, 0x4d, 0x10, 0x08, 0x66, 0x83,
+  0xa0, 0x7d, 0x1b, 0x96, 0xa1, 0xb2, 0xae, 0xee, 0x1a, 0xbc, 0xe1, 0x02,
+  0x83, 0x09, 0x02, 0xd1, 0x6c, 0x08, 0xc4, 0x60, 0xc3, 0x22, 0x06, 0x95,
+  0x75, 0x8d, 0xc1, 0x35, 0x64, 0x62, 0x70, 0x6d, 0x1b, 0x06, 0x2e, 0x0c,
+  0xc8, 0x60, 0xc3, 0x42, 0x54, 0xd6, 0x85, 0x65, 0x83, 0x47, 0x5c, 0x60,
+  0xb0, 0x61, 0x19, 0x2a, 0xeb, 0xea, 0xb2, 0x21, 0x1b, 0xae, 0x8d, 0xcb,
+  0x94, 0xd5, 0x17, 0xd4, 0xdb, 0x5c, 0x1a, 0x5d, 0xda, 0x9b, 0xdb, 0x04,
+  0xa1, 0x90, 0x36, 0x2c, 0x62, 0x80, 0x06, 0x56, 0x1a, 0x60, 0xde, 0xe0,
+  0x89, 0xc1, 0x05, 0x06, 0x1b, 0x06, 0x33, 0x38, 0x03, 0x35, 0xd8, 0x30,
+  0x94, 0xc1, 0x1a, 0x00, 0x1b, 0x8a, 0x89, 0x62, 0x03, 0x08, 0xa8, 0xc2,
+  0xc6, 0x66, 0xd7, 0xe6, 0x92, 0x46, 0x56, 0xe6, 0x46, 0x37, 0x25, 0x08,
+  0xaa, 0x90, 0xe1, 0xb9, 0xd8, 0x95, 0xc9, 0xcd, 0xa5, 0xbd, 0xb9, 0x4d,
+  0x09, 0x88, 0x26, 0x64, 0x78, 0x2e, 0x76, 0x61, 0x6c, 0x76, 0x65, 0x72,
+  0x53, 0x02, 0xa3, 0x0e, 0x19, 0x9e, 0xcb, 0x1c, 0x5a, 0x18, 0x59, 0x99,
+  0x5c, 0xd3, 0x1b, 0x59, 0x19, 0xdb, 0x94, 0x20, 0x29, 0x43, 0x86, 0xe7,
+  0x22, 0x57, 0x36, 0xf7, 0x56, 0x27, 0x37, 0x56, 0x36, 0x37, 0x25, 0x78,
+  0xea, 0x90, 0xe1, 0xb9, 0xd8, 0xa5, 0x95, 0xdd, 0x25, 0x91, 0x4d, 0xd1,
+  0x85, 0xd1, 0x95, 0x4d, 0x09, 0xa2, 0x3a, 0x64, 0x78, 0x2e, 0x65, 0x6e,
+  0x74, 0x72, 0x79, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x53, 0x02, 0x36,
+  0x00, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00,
+  0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88,
+  0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73,
+  0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e,
+  0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, 0x30,
+  0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, 0xc8,
+  0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b,
+  0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, 0x76,
+  0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e,
+  0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e,
+  0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61,
+  0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xb4,
+  0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, 0x76,
+  0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, 0x37,
+  0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76,
+  0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, 0x71,
+  0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e,
+  0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1,
+  0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61,
+  0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, 0x90,
+  0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, 0xb8,
+  0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc,
+  0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x8c, 0xc8,
+  0x21, 0x07, 0x7c, 0x70, 0x03, 0x72, 0x10, 0x87, 0x73, 0x70, 0x03, 0x7b,
+  0x08, 0x07, 0x79, 0x60, 0x87, 0x70, 0xc8, 0x87, 0x77, 0xa8, 0x07, 0x7a,
+  0x98, 0x81, 0x3c, 0xe4, 0x80, 0x0f, 0x6e, 0x40, 0x0f, 0xe5, 0xd0, 0x0e,
+  0xf0, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
+  0x36, 0xb0, 0x0d, 0x97, 0xef, 0x3c, 0xbe, 0x10, 0x50, 0x45, 0x41, 0x44,
+  0xa5, 0x03, 0x0c, 0x25, 0x61, 0x00, 0x02, 0xe6, 0x17, 0xb7, 0x6d, 0x05,
+  0xd2, 0x70, 0xf9, 0xce, 0xe3, 0x0b, 0x11, 0x01, 0x4c, 0x44, 0x08, 0x34,
+  0xc3, 0x42, 0x58, 0xc0, 0x34, 0x5c, 0xbe, 0xf3, 0xf8, 0x8b, 0x03, 0x0c,
+  0x62, 0xf3, 0x50, 0x93, 0x5f, 0xdc, 0xb6, 0x09, 0x54, 0xc3, 0xe5, 0x3b,
+  0x8f, 0x2f, 0x4d, 0x4e, 0x44, 0xa0, 0xd4, 0xf4, 0x50, 0x93, 0x5f, 0xdc,
+  0xb6, 0x11, 0x48, 0xc3, 0xe5, 0x3b, 0x8f, 0x3f, 0x11, 0xd1, 0x84, 0x00,
+  0x11, 0xe6, 0x17, 0xb7, 0x6d, 0x00, 0x04, 0x03, 0x20, 0x0d, 0x00, 0x00,
+  0x61, 0x20, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, 0x2c,
+  0x10, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x44, 0x4a, 0xa1, 0x10,
+  0x66, 0x00, 0x8a, 0xab, 0xec, 0x4a, 0x8e, 0x4a, 0x09, 0x50, 0x1c, 0x01,
+  0x00, 0x00, 0x00, 0x00, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x20, 0x61,
+  0x43, 0x63, 0x59, 0xc1, 0x88, 0x41, 0x02, 0x80, 0x20, 0x18, 0x18, 0x1d,
+  0x12, 0x5d, 0xcf, 0x31, 0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0x86, 0x97,
+  0x48, 0x18, 0x81, 0x8c, 0x18, 0x24, 0x00, 0x08, 0x82, 0x81, 0xf1, 0x29,
+  0x5a, 0x16, 0x25, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x60, 0x80, 0xc1,
+  0xb2, 0x69, 0x86, 0x32, 0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0x46, 0x18,
+  0x30, 0xdc, 0x26, 0x2d, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x60, 0x88,
+  0x41, 0xd3, 0x71, 0x11, 0x33, 0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0xc6,
+  0x18, 0x38, 0x5d, 0x57, 0x35, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x60,
+  0x90, 0xc1, 0xe3, 0x79, 0x8a, 0x33, 0x62, 0x70, 0x00, 0x20, 0x08, 0x06,
+  0xcd, 0x18, 0x34, 0xc9, 0x37, 0x9a, 0x10, 0x00, 0xa3, 0x09, 0x42, 0x30,
+  0x9a, 0x30, 0x08, 0xa3, 0x09, 0xc4, 0x30, 0x62, 0x70, 0x00, 0x20, 0x08,
+  0x06, 0x0d, 0x1a, 0x48, 0x4e, 0x19, 0x8c, 0x26, 0x04, 0xc0, 0x68, 0x82,
+  0x10, 0x8c, 0x26, 0x0c, 0xc2, 0x68, 0x02, 0x31, 0x8c, 0x18, 0x1c, 0x00,
+  0x08, 0x82, 0x41, 0xd3, 0x06, 0xd7, 0x54, 0x06, 0xa3, 0x09, 0x01, 0x30,
+  0x9a, 0x20, 0x04, 0xa3, 0x09, 0x83, 0x30, 0x9a, 0x40, 0x0c, 0xe6, 0x44,
+  0xf2, 0x19, 0x31, 0x40, 0x00, 0x10, 0x04, 0x83, 0x47, 0x0e, 0x3c, 0x25,
+  0x0a, 0xcc, 0x08, 0xa0, 0x63, 0x10, 0x25, 0x9f, 0x11, 0x03, 0x04, 0x00,
+  0x41, 0x30, 0x78, 0xea, 0x20, 0x0c, 0x18, 0x2a, 0xb0, 0x00, 0x81, 0x8e,
+  0x49, 0x97, 0x7c, 0x46, 0x0c, 0x10, 0x00, 0x04, 0xc1, 0xe0, 0xc1, 0x03,
+  0x32, 0x70, 0xae, 0xc0, 0x02, 0x05, 0x3a, 0x46, 0x69, 0xf2, 0x19, 0x31,
+  0x40, 0x00, 0x10, 0x04, 0x83, 0x67, 0x0f, 0xce, 0x00, 0xd2, 0x02, 0x0b,
+  0x18, 0xe8, 0x8c, 0x18, 0x24, 0x00, 0x08, 0x82, 0x01, 0xf2, 0x07, 0x6c,
+  0xa0, 0x07, 0x7a, 0x20, 0x07, 0x61, 0x30, 0x62, 0x90, 0x00, 0x20, 0x08,
+  0x06, 0xc8, 0x1f, 0xb0, 0x81, 0x1e, 0xe8, 0x81, 0x19, 0x80, 0xc1, 0x88,
+  0x41, 0x02, 0x80, 0x20, 0x18, 0x20, 0x7f, 0xc0, 0x06, 0x7a, 0xa0, 0x07,
+  0x71, 0xf0, 0x8d, 0x18, 0x24, 0x00, 0x08, 0x82, 0x01, 0xf2, 0x07, 0x6c,
+  0xa0, 0x07, 0x7a, 0xf0, 0x06, 0xde, 0x88, 0x41, 0x02, 0x80, 0x20, 0x18,
+  0x20, 0x7f, 0xc0, 0x06, 0x7b, 0xa0, 0x07, 0x72, 0x30, 0x06, 0x23, 0x06,
+  0x09, 0x00, 0x82, 0x60, 0x80, 0xfc, 0x01, 0x1b, 0xec, 0x81, 0x1e, 0x98,
+  0x81, 0x18, 0x8c, 0x18, 0x24, 0x00, 0x08, 0x82, 0x01, 0xf2, 0x07, 0x6c,
+  0x40, 0x07, 0x7a, 0x20, 0x07, 0xca, 0x88, 0x41, 0x02, 0x80, 0x20, 0x18,
+  0x20, 0x7f, 0xc0, 0x06, 0x74, 0xa0, 0x07, 0x66, 0x70, 0x8c, 0x18, 0x24,
+  0x00, 0x08, 0x82, 0x01, 0xf2, 0x07, 0x6c, 0x40, 0x07, 0x7a, 0x10, 0x07,
+  0xc4, 0x88, 0x41, 0x02, 0x80, 0x20, 0x18, 0x20, 0x7f, 0xc0, 0x06, 0x74,
+  0xa0, 0x07, 0x6f, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
 };
-static const unsigned int tri_texture_vert_dxil_len = 4244;
+static const unsigned int tri_texture_vert_dxil_len = 4248;

+ 61 - 4
src/render/metal/SDL_render_metal.m

@@ -88,6 +88,7 @@ typedef enum SDL_MetalVertexFunction
 typedef enum SDL_MetalFragmentFunction
 {
     SDL_METAL_FRAGMENT_SOLID = 0,
+    SDL_METAL_FRAGMENT_PALETTE,
     SDL_METAL_FRAGMENT_COPY,
     SDL_METAL_FRAGMENT_YUV,
     SDL_METAL_FRAGMENT_NV12,
@@ -145,6 +146,7 @@ typedef struct METAL_ShaderPipelines
 
 @interface SDL3METAL_TextureData : NSObject
 @property(nonatomic, retain) id<MTLTexture> mtltexture;
+@property(nonatomic, retain) id<MTLTexture> mtlpalette;
 @property(nonatomic, retain) id<MTLTexture> mtltextureUv;
 @property(nonatomic, assign) SDL_MetalFragmentFunction fragmentFunction;
 #ifdef SDL_HAVE_YUV
@@ -226,6 +228,8 @@ static NSString *GetFragmentFunctionName(SDL_MetalFragmentFunction function)
     switch (function) {
     case SDL_METAL_FRAGMENT_SOLID:
         return @"SDL_Solid_fragment";
+    case SDL_METAL_FRAGMENT_PALETTE:
+        return @"SDL_Palette_fragment";
     case SDL_METAL_FRAGMENT_COPY:
         return @"SDL_Copy_fragment";
     case SDL_METAL_FRAGMENT_YUV:
@@ -367,6 +371,7 @@ void MakeShaderPipelines(SDL3METAL_RenderData *data, METAL_ShaderPipelines *pipe
     pipelines->renderTargetFormat = rtformat;
 
     MakePipelineCache(data, &pipelines->caches[SDL_METAL_FRAGMENT_SOLID], "SDL primitives pipeline", rtformat, SDL_METAL_VERTEX_SOLID, SDL_METAL_FRAGMENT_SOLID);
+    MakePipelineCache(data, &pipelines->caches[SDL_METAL_FRAGMENT_PALETTE], "SDL palette pipeline", rtformat, SDL_METAL_VERTEX_COPY, SDL_METAL_FRAGMENT_PALETTE);
     MakePipelineCache(data, &pipelines->caches[SDL_METAL_FRAGMENT_COPY], "SDL copy pipeline", rtformat, SDL_METAL_VERTEX_COPY, SDL_METAL_FRAGMENT_COPY);
     MakePipelineCache(data, &pipelines->caches[SDL_METAL_FRAGMENT_YUV], "SDL YUV pipeline", rtformat, SDL_METAL_VERTEX_COPY, SDL_METAL_FRAGMENT_YUV);
     MakePipelineCache(data, &pipelines->caches[SDL_METAL_FRAGMENT_NV12], "SDL NV12 pipeline", rtformat, SDL_METAL_VERTEX_COPY, SDL_METAL_FRAGMENT_NV12);
@@ -612,7 +617,7 @@ static bool METAL_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SD
         SDL3METAL_RenderData *data = (__bridge SDL3METAL_RenderData *)renderer->internal;
         MTLPixelFormat pixfmt;
         MTLTextureDescriptor *mtltexdesc;
-        id<MTLTexture> mtltexture = nil, mtltextureUv = nil;
+        id<MTLTexture> mtltexture = nil, mtltextureUv = nil, mtlpalette = nil;
         SDL3METAL_TextureData *texturedata;
         CVPixelBufferRef pixelbuffer = nil;
         IOSurfaceRef surface = nil;
@@ -643,6 +648,7 @@ static bool METAL_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SD
         case SDL_PIXELFORMAT_ABGR2101010:
             pixfmt = MTLPixelFormatRGB10A2Unorm;
             break;
+        case SDL_PIXELFORMAT_INDEX8:
         case SDL_PIXELFORMAT_IYUV:
         case SDL_PIXELFORMAT_YV12:
         case SDL_PIXELFORMAT_NV12:
@@ -682,6 +688,25 @@ static bool METAL_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SD
             return SDL_SetError("Texture allocation failed");
         }
 
+        if (texture->format == SDL_PIXELFORMAT_INDEX8) {
+            if (renderer->output_colorspace == SDL_COLORSPACE_SRGB_LINEAR) {
+                pixfmt = MTLPixelFormatBGRA8Unorm_sRGB;
+            } else {
+                pixfmt = MTLPixelFormatBGRA8Unorm;
+            }
+            mtltexdesc = [MTLTextureDescriptor texture2DDescriptorWithPixelFormat:pixfmt
+                                                                            width:256
+                                                                           height:1
+                                                                        mipmapped:NO];
+
+            mtltexdesc.usage = MTLTextureUsageShaderRead;
+
+            mtlpalette = [data.mtldevice newTextureWithDescriptor:mtltexdesc];
+            if (mtlpalette == nil) {
+                return SDL_SetError("Palette allocation failed");
+            }
+        }
+
         mtltextureUv = nil;
 #ifdef SDL_HAVE_YUV
         BOOL yuv = (texture->format == SDL_PIXELFORMAT_IYUV || texture->format == SDL_PIXELFORMAT_YV12);
@@ -715,17 +740,20 @@ static bool METAL_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SD
         }
 #endif // SDL_HAVE_YUV
         texturedata = [[SDL3METAL_TextureData alloc] init];
+        if (texture->format == SDL_PIXELFORMAT_INDEX8) {
+            texturedata.fragmentFunction = SDL_METAL_FRAGMENT_PALETTE;
 #ifdef SDL_HAVE_YUV
-        if (yuv) {
+        } else if (yuv) {
             texturedata.fragmentFunction = SDL_METAL_FRAGMENT_YUV;
         } else if (nv12) {
             texturedata.fragmentFunction = SDL_METAL_FRAGMENT_NV12;
-        } else
+        }
 #endif
-        {
+        else {
             texturedata.fragmentFunction = SDL_METAL_FRAGMENT_COPY;
         }
         texturedata.mtltexture = mtltexture;
+        texturedata.mtlpalette = mtlpalette;
         texturedata.mtltextureUv = mtltextureUv;
 #ifdef SDL_HAVE_YUV
         texturedata.yuv = yuv;
@@ -828,6 +856,17 @@ static bool METAL_UpdateTextureInternal(SDL_Renderer *renderer, SDL3METAL_Textur
     return true;
 }
 
+static bool METAL_UpdateTexturePalette(SDL_Renderer *renderer, SDL_Texture *texture)
+{
+    @autoreleasepool {
+        SDL3METAL_TextureData *texturedata = (__bridge SDL3METAL_TextureData *)texture->internal;
+        SDL_Palette *palette = texture->palette;
+        SDL_Rect rect = { 0, 0, palette->ncolors, 1 };
+
+        return METAL_UpdateTextureInternal(renderer, texturedata, texturedata.mtlpalette, rect, 0, palette->colors, palette->ncolors * sizeof(*palette->colors));
+    }
+}
+
 static bool METAL_UpdateTexture(SDL_Renderer *renderer, SDL_Texture *texture,
                                const SDL_Rect *rect, const void *pixels, int pitch)
 {
@@ -1291,6 +1330,7 @@ typedef struct
     __unsafe_unretained id<MTLBuffer> vertex_buffer;
     size_t constants_offset;
     SDL_Texture *texture;
+    bool texture_palette;
     SDL_ScaleMode texture_scale_mode;
     SDL_TextureAddressMode texture_address_mode_u;
     SDL_TextureAddressMode texture_address_mode_v;
@@ -1528,6 +1568,9 @@ static bool SetCopyState(SDL_Renderer *renderer, const SDL_RenderCommand *cmd, c
 
     if (texture != statecache->texture) {
         [data.mtlcmdencoder setFragmentTexture:texturedata.mtltexture atIndex:0];
+        if (texture->format == SDL_PIXELFORMAT_INDEX8) {
+            [data.mtlcmdencoder setFragmentTexture:texturedata.mtlpalette atIndex:1];
+        }
 #ifdef SDL_HAVE_YUV
         if (texturedata.yuv || texturedata.nv12) {
             [data.mtlcmdencoder setFragmentTexture:texturedata.mtltextureUv atIndex:1];
@@ -1550,6 +1593,18 @@ static bool SetCopyState(SDL_Renderer *renderer, const SDL_RenderCommand *cmd, c
         statecache->texture_address_mode_u = cmd->data.draw.texture_address_mode_u;
         statecache->texture_address_mode_v = cmd->data.draw.texture_address_mode_v;
     }
+    if (texture->format == SDL_PIXELFORMAT_INDEX8) {
+        if (!statecache->texture_palette) {
+            id<MTLSamplerState> mtlsampler = GetSampler(data, SDL_SCALEMODE_NEAREST, SDL_TEXTURE_ADDRESS_CLAMP, SDL_TEXTURE_ADDRESS_CLAMP);
+            if (mtlsampler == nil) {
+                return false;
+            }
+            [data.mtlcmdencoder setFragmentSamplerState:mtlsampler atIndex:1];
+            statecache->texture_palette = true;
+        }
+    } else {
+        statecache->texture_palette = false;
+    }
     return true;
 }
 
@@ -2147,6 +2202,7 @@ static bool METAL_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL
         renderer->GetOutputSize = METAL_GetOutputSize;
         renderer->SupportsBlendMode = METAL_SupportsBlendMode;
         renderer->CreateTexture = METAL_CreateTexture;
+        renderer->UpdateTexturePalette = METAL_UpdateTexturePalette;
         renderer->UpdateTexture = METAL_UpdateTexture;
 #ifdef SDL_HAVE_YUV
         renderer->UpdateTextureYUV = METAL_UpdateTextureYUV;
@@ -2176,6 +2232,7 @@ static bool METAL_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL
         SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ABGR2101010);
         SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGBA64_FLOAT);
         SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGBA128_FLOAT);
+        SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_INDEX8);
         SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_YV12);
         SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_IYUV);
         SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_NV12);

+ 41 - 13
src/render/metal/SDL_shaders_metal.metal

@@ -13,6 +13,8 @@ using namespace metal;
 #define TEXTURETYPE_NONE        0
 #define TEXTURETYPE_RGB         1
 #define TEXTURETYPE_RGB_PIXELART 2
+#define TEXTURETYPE_PALETTE     1
+#define TEXTURETYPE_PALETTE_PIXELART 2
 #define TEXTURETYPE_NV12        3
 #define TEXTURETYPE_NV21        4
 #define TEXTURETYPE_YUV         5
@@ -110,6 +112,21 @@ float3 ApplyTonemap(float3 v, float input_type, float tonemap_method, float tone
     return v;
 }
 
+float2 GetPixelArtUV(float2 texcoord, float4 texel_size)
+{
+    // box filter size in texel units
+    float2 boxSize = clamp(fwidth(texcoord) * texel_size.zw, 1e-5, 1);
+
+    // scale uv by texture size to get texel coordinate
+    float2 tx = texcoord * texel_size.zw - 0.5 * boxSize;
+
+    // compute offset for pixel-sized box filter
+    float2 txOffset = smoothstep(1 - boxSize, 1, fract(tx));
+
+    // compute bilinear sample uv coordinates
+    return (floor(tx) + 0.5 + txOffset) * texel_size.xy;
+}
+
 float4 GetOutputColorSimple(float4 rgba, float color_scale)
 {
     float4 output;
@@ -244,6 +261,29 @@ vertex CopyVertexOutput SDL_Copy_vertex(CopyVertexInput in [[stage_in]],
     return v;
 }
 
+fragment float4 SDL_Palette_fragment(CopyVertexOutput vert [[stage_in]],
+                                     constant ShaderConstants &c [[buffer(0)]],
+                                     texture2d<float> tex0 [[texture(0)]],
+                                     texture2d<float> tex1 [[texture(1)]],
+                                     sampler s0 [[sampler(0)]],
+                                     sampler s1 [[sampler(1)]])
+{
+    float4 rgba;
+
+    if (c.texture_type == TEXTURETYPE_PALETTE) {
+        float index = tex0.sample(s0, vert.texcoord).r * 255;
+        rgba = tex1.sample(s1, float2((index + 0.5) / 256, 0.5));
+    } else if (c.texture_type == TEXTURETYPE_PALETTE_PIXELART) {
+        float2 uv = GetPixelArtUV(vert.texcoord, c.texel_size);
+        float index = tex0.sample(s0, uv).r * 255;
+        rgba = tex1.sample(s1, float2((index + 0.5) / 256, 0.5));
+    } else {
+        // Unexpected texture type, use magenta error color
+        rgba = float4(1.0, 0.0, 1.0, 1.0);
+    }
+    return GetOutputColor(rgba, c) * vert.color;
+}
+
 fragment float4 SDL_Copy_fragment(CopyVertexOutput vert [[stage_in]],
                                   constant ShaderConstants &c [[buffer(0)]],
                                   texture2d<float> tex [[texture(0)]],
@@ -254,19 +294,7 @@ fragment float4 SDL_Copy_fragment(CopyVertexOutput vert [[stage_in]],
     if (c.texture_type == TEXTURETYPE_RGB) {
         rgba = tex.sample(s, vert.texcoord);
     } else if (c.texture_type == TEXTURETYPE_RGB_PIXELART) {
-        // box filter size in texel units
-        float2 boxSize = clamp(fwidth(vert.texcoord) * c.texel_size.zw, 1e-5, 1);
-
-        // scale uv by texture size to get texel coordinate
-        float2 tx = vert.texcoord * c.texel_size.zw - 0.5 * boxSize;
-
-        // compute offset for pixel-sized box filter
-        float2 txOffset = smoothstep(1 - boxSize, 1, fract(tx));
-
-        // compute bilinear sample uv coordinates
-        float2 uv = (floor(tx) + 0.5 + txOffset) * c.texel_size.xy;
-
-        // sample the texture
+        float2 uv = GetPixelArtUV(vert.texcoord, c.texel_size);
         rgba = tex.sample(s, uv, gradient2d(dfdx(vert.texcoord), dfdy(vert.texcoord)));
     } else {
         // Unexpected texture type, use magenta error color

File diff suppressed because it is too large
+ 340 - 1027
src/render/metal/SDL_shaders_metal_ios.h


File diff suppressed because it is too large
+ 528 - 515
src/render/metal/SDL_shaders_metal_iphonesimulator.h


File diff suppressed because it is too large
+ 596 - 584
src/render/metal/SDL_shaders_metal_macos.h


File diff suppressed because it is too large
+ 340 - 1027
src/render/metal/SDL_shaders_metal_tvos.h


File diff suppressed because it is too large
+ 840 - 515
src/render/metal/SDL_shaders_metal_tvsimulator.h


+ 62 - 1
src/render/opengl/SDL_render_gl.c

@@ -133,6 +133,7 @@ typedef struct
     GLfloat texh;
     GLenum format;
     GLenum formattype;
+    GLuint palette;
     GL_Shader shader;
     float texel_size[4];
     const float *shader_params;
@@ -421,6 +422,7 @@ static bool convert_format(Uint32 pixel_format, GLint *internalFormat, GLenum *f
         *format = GL_RGBA;
         *type = GL_UNSIGNED_BYTE; // previously GL_UNSIGNED_INT_8_8_8_8_REV, seeing if this is better in modern times.
         break;
+    case SDL_PIXELFORMAT_INDEX8:
     case SDL_PIXELFORMAT_YV12:
     case SDL_PIXELFORMAT_IYUV:
     case SDL_PIXELFORMAT_NV12:
@@ -619,6 +621,14 @@ static bool GL_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL_P
     SetTextureScaleMode(renderdata, textype, data->texture_scale_mode);
     SetTextureAddressMode(renderdata, textype, data->texture_address_mode_u, data->texture_address_mode_v);
 
+    if (texture->format == SDL_PIXELFORMAT_INDEX8) {
+        renderdata->glGenTextures(1, &data->palette);
+        renderdata->glBindTexture(textype, data->palette);
+        renderdata->glTexImage2D(textype, 0, GL_RGBA8, 256, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
+        SetTextureScaleMode(renderdata, textype, SDL_SCALEMODE_NEAREST);
+        SetTextureAddressMode(renderdata, textype, SDL_TEXTURE_ADDRESS_CLAMP, SDL_TEXTURE_ADDRESS_CLAMP);
+    }
+
 #ifdef SDL_HAVE_YUV
     if (texture->format == SDL_PIXELFORMAT_YV12 ||
         texture->format == SDL_PIXELFORMAT_IYUV) {
@@ -671,7 +681,9 @@ static bool GL_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL_P
     }
 #endif
 
-    if (texture->format == SDL_PIXELFORMAT_ABGR8888 || texture->format == SDL_PIXELFORMAT_ARGB8888) {
+    if (texture->format == SDL_PIXELFORMAT_INDEX8) {
+        data->shader = SHADER_PALETTE;
+    } else if (texture->format == SDL_PIXELFORMAT_ABGR8888 || texture->format == SDL_PIXELFORMAT_ARGB8888) {
         data->shader = SHADER_RGBA;
     } else {
         data->shader = SHADER_RGB;
@@ -711,6 +723,25 @@ static bool GL_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL_P
     return GL_CheckError("", renderer);
 }
 
+static bool GL_UpdateTexturePalette(SDL_Renderer *renderer, SDL_Texture *texture)
+{
+    GL_RenderData *renderdata = (GL_RenderData *)renderer->internal;
+    const GLenum textype = renderdata->textype;
+    GL_TextureData *data = (GL_TextureData *)texture->internal;
+    SDL_Palette *palette = texture->palette;
+
+    GL_ActivateRenderer(renderer);
+
+    renderdata->drawstate.texture = NULL; // we trash this state.
+
+    renderdata->glBindTexture(textype, data->palette);
+    renderdata->glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+    renderdata->glPixelStorei(GL_UNPACK_ROW_LENGTH, palette->ncolors);
+    renderdata->glTexSubImage2D(textype, 0, 0, 0, palette->ncolors, 1, GL_RGBA, GL_UNSIGNED_BYTE, palette->colors);
+
+    return GL_CheckError("glTexSubImage2D()", renderer);
+}
+
 static bool GL_UpdateTexture(SDL_Renderer *renderer, SDL_Texture *texture,
                             const SDL_Rect *rect, const void *pixels, int pitch)
 {
@@ -1141,6 +1172,10 @@ static bool SetCopyState(GL_RenderData *data, const SDL_RenderCommand *cmd)
 
     if (cmd->data.draw.texture_scale_mode == SDL_SCALEMODE_PIXELART) {
         switch (shader) {
+        case SHADER_PALETTE:
+            shader = SHADER_PALETTE_PIXELART;
+            shader_params = texturedata->texel_size;
+            break;
         case SHADER_RGB:
             shader = SHADER_RGB_PIXELART;
             shader_params = texturedata->texel_size;
@@ -1169,6 +1204,10 @@ static bool SetCopyState(GL_RenderData *data, const SDL_RenderCommand *cmd)
             data->glBindTexture(textype, texturedata->utexture);
         }
 #endif
+        if (texture->palette) {
+            data->glActiveTextureARB(GL_TEXTURE1_ARB);
+            data->glBindTexture(textype, texturedata->palette);
+        }
         if (data->GL_ARB_multitexture_supported) {
             data->glActiveTextureARB(GL_TEXTURE0_ARB);
         }
@@ -1200,6 +1239,14 @@ static bool SetCopyState(GL_RenderData *data, const SDL_RenderCommand *cmd)
             data->glActiveTextureARB(GL_TEXTURE0);
         }
 #endif
+        if (texture->palette) {
+            data->glActiveTextureARB(GL_TEXTURE1);
+            if (!SetTextureScaleMode(data, textype, SDL_SCALEMODE_NEAREST)) {
+                return false;
+            }
+
+            data->glActiveTextureARB(GL_TEXTURE0);
+        }
         if (!SetTextureScaleMode(data, textype, cmd->data.draw.texture_scale_mode)) {
             return false;
         }
@@ -1225,6 +1272,12 @@ static bool SetCopyState(GL_RenderData *data, const SDL_RenderCommand *cmd)
             data->glActiveTextureARB(GL_TEXTURE0);
         }
 #endif
+        if (texture->palette) {
+            data->glActiveTextureARB(GL_TEXTURE1);
+            SetTextureAddressMode(data, textype, SDL_TEXTURE_ADDRESS_CLAMP, SDL_TEXTURE_ADDRESS_CLAMP);
+
+            data->glActiveTextureARB(GL_TEXTURE0);
+        }
         SetTextureAddressMode(data, textype, cmd->data.draw.texture_address_mode_u, cmd->data.draw.texture_address_mode_v);
 
         texturedata->texture_address_mode_u = cmd->data.draw.texture_address_mode_u;
@@ -1578,6 +1631,9 @@ static void GL_DestroyTexture(SDL_Renderer *renderer, SDL_Texture *texture)
     if (data->texture && !data->texture_external) {
         renderdata->glDeleteTextures(1, &data->texture);
     }
+    if (data->palette) {
+        renderdata->glDeleteTextures(1, &data->palette);
+    }
 #ifdef SDL_HAVE_YUV
     if (data->yuv) {
         if (!data->utexture_external) {
@@ -1698,6 +1754,7 @@ static bool GL_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_Pr
     renderer->WindowEvent = GL_WindowEvent;
     renderer->SupportsBlendMode = GL_SupportsBlendMode;
     renderer->CreateTexture = GL_CreateTexture;
+    renderer->UpdateTexturePalette = GL_UpdateTexturePalette;
     renderer->UpdateTexture = GL_UpdateTexture;
 #ifdef SDL_HAVE_YUV
     renderer->UpdateTextureYUV = GL_UpdateTextureYUV;
@@ -1817,6 +1874,10 @@ static bool GL_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_Pr
     data->shaders = GL_CreateShaderContext();
     SDL_LogInfo(SDL_LOG_CATEGORY_RENDER, "OpenGL shaders: %s",
                 data->shaders ? "ENABLED" : "DISABLED");
+    // We support INDEX8 textures using 2 textures and a shader
+    if (data->shaders && data->num_texture_units >= 2) {
+        SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_INDEX8);
+    }
 #ifdef SDL_HAVE_YUV
     // We support YV12 textures using 3 textures and a shader
     if (data->shaders && data->num_texture_units >= 3) {

+ 47 - 1
src/render/opengl/SDL_shaders_gl.c

@@ -260,6 +260,51 @@ static struct {
         NULL
     },
 
+    // SHADER_PALETTE
+    {
+        // vertex shader
+        TEXTURE_VERTEX_SHADER,
+        // fragment shader
+"varying vec4 v_color;\n"
+"varying vec2 v_texCoord;\n"
+"uniform sampler2D tex0;\n"
+"uniform sampler2D tex1;\n"
+"\n"
+"void main()\n"
+"{\n"
+"    float index = texture2D(tex0, v_texCoord).r * 255.0;\n"
+"    gl_FragColor = texture2D(tex1, vec2((index + 0.5) / 256.0, 0.5));\n"
+"    gl_FragColor *= v_color;\n"
+"}",
+        // fragment version
+        "#version 130\n"
+    },
+
+    // SHADER_PALETTE_PIXELART
+    {
+        // vertex shader
+        TEXTURE_VERTEX_SHADER,
+        // fragment shader
+"varying vec4 v_color;\n"
+"varying vec2 v_texCoord;\n"
+"uniform sampler2D tex0;\n"
+"uniform sampler2D tex1;\n"
+"uniform vec4 texel_size;\n"
+"\n"
+"void main()\n"
+"{\n"
+"    vec2 boxSize = clamp(fwidth(v_texCoord) * texel_size.zw, 1e-5, 1.0);\n"
+"    vec2 tx = v_texCoord * texel_size.zw - 0.5 * boxSize;\n"
+"    vec2 txOffset = smoothstep(vec2(1.0) - boxSize, vec2(1.0), fract(tx));\n"
+"    vec2 uv = (floor(tx) + 0.5 + txOffset) * texel_size.xy;\n"
+"    float index = textureGrad(tex0, uv, dFdx(v_texCoord), dFdy(v_texCoord)).r * 255.0;\n"
+"    gl_FragColor = texture2D(tex1, vec2((index + 0.5) / 256.0, 0.5));\n"
+"    gl_FragColor *= v_color;\n"
+"}",
+        // fragment version
+        "#version 130\n"
+    },
+
     // SHADER_RGB
     {
         // vertex shader
@@ -587,7 +632,8 @@ void GL_SelectShader(GL_ShaderContext *ctx, GL_Shader shader, const float *shade
     ctx->glUseProgramObjectARB(program);
 
     if (shader_params && shader_params != ctx->shader_params[shader]) {
-        if (shader == SHADER_RGB_PIXELART ||
+        if (shader == SHADER_PALETTE_PIXELART ||
+            shader == SHADER_RGB_PIXELART ||
             shader == SHADER_RGBA_PIXELART) {
             location = ctx->glGetUniformLocationARB(program, "texel_size");
             if (location >= 0) {

+ 2 - 0
src/render/opengl/SDL_shaders_gl.h

@@ -31,6 +31,8 @@ typedef enum
     SHADER_INVALID = -1,
     SHADER_NONE,
     SHADER_SOLID,
+    SHADER_PALETTE,
+    SHADER_PALETTE_PIXELART,
     SHADER_RGB,
     SHADER_RGBA,
     SHADER_RGB_PIXELART,

+ 112 - 32
src/render/opengles2/SDL_render_gles2.c

@@ -65,6 +65,7 @@ typedef struct GLES2_TextureData
     GLenum texture_type;
     GLenum pixel_format;
     GLenum pixel_type;
+    GLuint palette;
     void *pixel_data;
     int pitch;
 #ifdef SDL_HAVE_YUV
@@ -96,6 +97,7 @@ typedef enum
     GLES2_UNIFORM_TEXTURE,
     GLES2_UNIFORM_TEXTURE_U,
     GLES2_UNIFORM_TEXTURE_V,
+    GLES2_UNIFORM_PALETTE,
     GLES2_UNIFORM_TEXEL_SIZE,
     GLES2_UNIFORM_OFFSET,
     GLES2_UNIFORM_MATRIX,
@@ -107,6 +109,7 @@ static const char *GLES2_UniformNames[] = {
     "u_texture",
     "u_texture_u",
     "u_texture_v",
+    "u_palette",
     "u_texel_size",
     "u_offset",
     "u_matrix"
@@ -136,6 +139,7 @@ typedef enum
 {
     GLES2_IMAGESOURCE_INVALID,
     GLES2_IMAGESOURCE_SOLID,
+    GLES2_IMAGESOURCE_TEXTURE_INDEX8,
     GLES2_IMAGESOURCE_TEXTURE_ABGR,
     GLES2_IMAGESOURCE_TEXTURE_ARGB,
     GLES2_IMAGESOURCE_TEXTURE_RGB,
@@ -475,6 +479,9 @@ static GLES2_ProgramCacheEntry *GLES2_CacheProgram(GLES2_RenderData *data, GLuin
     if (entry->uniform_locations[GLES2_UNIFORM_TEXTURE_U] != -1) {
         data->glUniform1i(entry->uniform_locations[GLES2_UNIFORM_TEXTURE_U], 1); // always texture unit 1.
     }
+    if (entry->uniform_locations[GLES2_UNIFORM_PALETTE] != -1) {
+        data->glUniform1i(entry->uniform_locations[GLES2_UNIFORM_PALETTE], 1); // always texture unit 1.
+    }
     if (entry->uniform_locations[GLES2_UNIFORM_TEXTURE] != -1) {
         data->glUniform1i(entry->uniform_locations[GLES2_UNIFORM_TEXTURE], 0); // always texture unit 0.
     }
@@ -622,6 +629,14 @@ static bool GLES2_SelectProgram(GLES2_RenderData *data, SDL_Texture *texture, GL
     case GLES2_IMAGESOURCE_SOLID:
         ftype = GLES2_SHADER_FRAGMENT_SOLID;
         break;
+    case GLES2_IMAGESOURCE_TEXTURE_INDEX8:
+        if (scale_mode == SDL_SCALEMODE_PIXELART) {
+            ftype = GLES2_SHADER_FRAGMENT_TEXTURE_PALETTE_PIXELART;
+            shader_params = tdata->texel_size;
+        } else {
+            ftype = GLES2_SHADER_FRAGMENT_TEXTURE_PALETTE;
+        }
+        break;
     case GLES2_IMAGESOURCE_TEXTURE_ABGR:
         if (scale_mode == SDL_SCALEMODE_PIXELART) {
             ftype = GLES2_SHADER_FRAGMENT_TEXTURE_ABGR_PIXELART;
@@ -753,7 +768,7 @@ static bool GLES2_SelectProgram(GLES2_RenderData *data, SDL_Texture *texture, GL
         }
         else
 #endif
-        if (ftype >= GLES2_SHADER_FRAGMENT_TEXTURE_ABGR_PIXELART) {
+        if (ftype >= GLES2_SHADER_FRAGMENT_TEXTURE_PALETTE_PIXELART) {
             data->glUniform4f(program->uniform_locations[GLES2_UNIFORM_TEXEL_SIZE], shader_params[0], shader_params[1], shader_params[2], shader_params[3]);
         }
         program->shader_params = shader_params;
@@ -1125,6 +1140,9 @@ static bool SetCopyState(SDL_Renderer *renderer, const SDL_RenderCommand *cmd, v
         // Check if we need to do color mapping between the source and render target textures
         if (renderer->target->format != texture->format) {
             switch (texture->format) {
+            case SDL_PIXELFORMAT_INDEX8:
+                sourceType = GLES2_IMAGESOURCE_TEXTURE_INDEX8;
+                break;
             case SDL_PIXELFORMAT_BGRA32:
                 switch (renderer->target->format) {
                 case SDL_PIXELFORMAT_RGBA32:
@@ -1204,6 +1222,9 @@ static bool SetCopyState(SDL_Renderer *renderer, const SDL_RenderCommand *cmd, v
         }
     } else {
         switch (texture->format) {
+        case SDL_PIXELFORMAT_INDEX8:
+            sourceType = GLES2_IMAGESOURCE_TEXTURE_INDEX8;
+            break;
         case SDL_PIXELFORMAT_BGRA32:
             sourceType = GLES2_IMAGESOURCE_TEXTURE_ARGB;
             break;
@@ -1255,6 +1276,12 @@ static bool SetCopyState(SDL_Renderer *renderer, const SDL_RenderCommand *cmd, v
             data->glActiveTexture(GL_TEXTURE0);
         }
 #endif
+        if (texture->palette) {
+            data->glActiveTexture(GL_TEXTURE1);
+            data->glBindTexture(tdata->texture_type, tdata->palette);
+
+            data->glActiveTexture(GL_TEXTURE0);
+        }
         data->glBindTexture(tdata->texture_type, tdata->texture);
 
         data->drawstate.texture = texture;
@@ -1283,6 +1310,14 @@ static bool SetCopyState(SDL_Renderer *renderer, const SDL_RenderCommand *cmd, v
             data->glActiveTexture(GL_TEXTURE0);
         }
 #endif
+        if (texture->palette) {
+            data->glActiveTexture(GL_TEXTURE1);
+            if (!SetTextureScaleMode(data, tdata->texture_type, SDL_SCALEMODE_NEAREST)) {
+                return false;
+            }
+
+            data->glActiveTexture(GL_TEXTURE0);
+        }
         if (!SetTextureScaleMode(data, tdata->texture_type, cmd->data.draw.texture_scale_mode)) {
             return false;
         }
@@ -1308,6 +1343,12 @@ static bool SetCopyState(SDL_Renderer *renderer, const SDL_RenderCommand *cmd, v
             data->glActiveTexture(GL_TEXTURE0);
         }
 #endif
+        if (texture->palette) {
+            data->glActiveTexture(GL_TEXTURE1);
+            SetTextureAddressMode(data, tdata->texture_type, SDL_TEXTURE_ADDRESS_CLAMP, SDL_TEXTURE_ADDRESS_CLAMP);
+
+            data->glActiveTexture(GL_TEXTURE0);
+        }
         SetTextureAddressMode(data, tdata->texture_type, cmd->data.draw.texture_address_mode_u, cmd->data.draw.texture_address_mode_v);
 
         tdata->texture_address_mode_u = cmd->data.draw.texture_address_mode_u;
@@ -1612,15 +1653,16 @@ static bool GLES2_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SD
         format = GL_RGBA;
         type = GL_UNSIGNED_BYTE;
         break;
+    case SDL_PIXELFORMAT_INDEX8:
 #ifdef SDL_HAVE_YUV
     case SDL_PIXELFORMAT_IYUV:
     case SDL_PIXELFORMAT_YV12:
     case SDL_PIXELFORMAT_NV12:
     case SDL_PIXELFORMAT_NV21:
+#endif
         format = GL_LUMINANCE;
         type = GL_UNSIGNED_BYTE;
         break;
-#endif
 #ifdef GL_TEXTURE_EXTERNAL_OES
     case SDL_PIXELFORMAT_EXTERNAL_OES:
         if (renderdata->GL_OES_EGL_image_external_supported) {
@@ -1655,8 +1697,6 @@ static bool GLES2_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SD
 #ifdef SDL_HAVE_YUV
     data->yuv = ((texture->format == SDL_PIXELFORMAT_IYUV) || (texture->format == SDL_PIXELFORMAT_YV12));
     data->nv12 = ((texture->format == SDL_PIXELFORMAT_NV12) || (texture->format == SDL_PIXELFORMAT_NV21));
-    data->texture_u = 0;
-    data->texture_v = 0;
 #endif
     data->texture_scale_mode = texture->scaleMode;
     data->texture_address_mode_u = SDL_TEXTURE_ADDRESS_CLAMP;
@@ -1691,6 +1731,25 @@ static bool GLES2_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SD
     data->texel_size[0] = 1.0f / data->texel_size[2];
     data->texel_size[1] = 1.0f / data->texel_size[3];
 
+    if (texture->format == SDL_PIXELFORMAT_INDEX8) {
+        renderdata->glGenTextures(1, &data->palette);
+        if (!GL_CheckError("glGenTexures()", renderer)) {
+            SDL_free(data->pixel_data);
+            SDL_free(data);
+            return false;
+        }
+        renderdata->glActiveTexture(GL_TEXTURE1);
+        renderdata->glBindTexture(data->texture_type, data->palette);
+        renderdata->glTexImage2D(data->texture_type, 0, GL_RGBA, 256, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
+        if (!GL_CheckError("glTexImage2D()", renderer)) {
+            SDL_free(data->pixel_data);
+            SDL_free(data);
+            return false;
+        }
+        SetTextureScaleMode(renderdata, data->texture_type, SDL_SCALEMODE_NEAREST);
+        SetTextureAddressMode(renderdata, data->texture_type, SDL_TEXTURE_ADDRESS_CLAMP, SDL_TEXTURE_ADDRESS_CLAMP);
+    }
+
 #ifdef SDL_HAVE_YUV
     if (data->yuv) {
         data->texture_v = (GLuint)SDL_GetNumberProperty(create_props, SDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_V_NUMBER, 0);
@@ -1845,6 +1904,22 @@ static bool GLES2_TexSubImage2D(GLES2_RenderData *data, GLenum target, GLint xof
     return true;
 }
 
+static bool GLES2_UpdateTexturePalette(SDL_Renderer *renderer, SDL_Texture *texture)
+{
+    GLES2_RenderData *data = (GLES2_RenderData *)renderer->internal;
+    GLES2_TextureData *tdata = (GLES2_TextureData *)texture->internal;
+    SDL_Palette *palette = texture->palette;
+
+    GLES2_ActivateRenderer(renderer);
+
+    data->drawstate.texture = NULL; /* we trash this state. */
+
+    data->glBindTexture(tdata->texture_type, tdata->palette);
+    data->glTexSubImage2D(tdata->texture_type, 0, 0, 0, palette->ncolors, 1, GL_RGBA, GL_UNSIGNED_BYTE, palette->colors);
+
+    return GL_CheckError("glTexSubImage2D()", renderer);
+}
+
 static bool GLES2_UpdateTexture(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *rect,
                                const void *pixels, int pitch)
 {
@@ -2085,6 +2160,9 @@ static void GLES2_DestroyTexture(SDL_Renderer *renderer, SDL_Texture *texture)
         if (tdata->texture && !tdata->texture_external) {
             data->glDeleteTextures(1, &tdata->texture);
         }
+        if (tdata->palette) {
+            data->glDeleteTextures(1, &tdata->palette);
+        }
 #ifdef SDL_HAVE_YUV
         if (tdata->texture_v && !tdata->texture_v_external) {
             data->glDeleteTextures(1, &tdata->texture_v);
@@ -2209,11 +2287,32 @@ static bool GLES2_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL
     GLES2_InvalidateCachedState(renderer);
     renderer->window = window;
 
+    // Populate the function pointers for the module
+    renderer->WindowEvent = GLES2_WindowEvent;
+    renderer->SupportsBlendMode = GLES2_SupportsBlendMode;
+    renderer->CreateTexture = GLES2_CreateTexture;
+    renderer->UpdateTexturePalette = GLES2_UpdateTexturePalette;
+    renderer->UpdateTexture = GLES2_UpdateTexture;
+#ifdef SDL_HAVE_YUV
+    renderer->UpdateTextureYUV = GLES2_UpdateTextureYUV;
+    renderer->UpdateTextureNV = GLES2_UpdateTextureNV;
+#endif
+    renderer->LockTexture = GLES2_LockTexture;
+    renderer->UnlockTexture = GLES2_UnlockTexture;
+    renderer->SetRenderTarget = GLES2_SetRenderTarget;
+    renderer->QueueSetViewport = GLES2_QueueNoOp;
+    renderer->QueueSetDrawColor = GLES2_QueueNoOp;
+    renderer->QueueDrawPoints = GLES2_QueueDrawPoints;
+    renderer->QueueDrawLines = GLES2_QueueDrawLines;
+    renderer->QueueGeometry = GLES2_QueueGeometry;
+    renderer->InvalidateCachedState = GLES2_InvalidateCachedState;
+    renderer->RunCommandQueue = GLES2_RunCommandQueue;
+    renderer->RenderReadPixels = GLES2_RenderReadPixels;
+    renderer->RenderPresent = GLES2_RenderPresent;
+    renderer->DestroyTexture = GLES2_DestroyTexture;
+    renderer->DestroyRenderer = GLES2_DestroyRenderer;
+    renderer->SetVSync = GLES2_SetVSync;
     renderer->name = GLES2_RenderDriver.name;
-    SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_BGRA32);
-    SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGBA32);
-    SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_BGRX32);
-    SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGBX32);
 
     // Create an OpenGL ES 2.0 context
     data->context = SDL_GL_CreateContext(window);
@@ -2251,30 +2350,11 @@ static bool GLES2_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL
     data->glGetIntegerv(GL_FRAMEBUFFER_BINDING, &window_framebuffer);
     data->window_framebuffer = (GLuint)window_framebuffer;
 
-    // Populate the function pointers for the module
-    renderer->WindowEvent = GLES2_WindowEvent;
-    renderer->SupportsBlendMode = GLES2_SupportsBlendMode;
-    renderer->CreateTexture = GLES2_CreateTexture;
-    renderer->UpdateTexture = GLES2_UpdateTexture;
-#ifdef SDL_HAVE_YUV
-    renderer->UpdateTextureYUV = GLES2_UpdateTextureYUV;
-    renderer->UpdateTextureNV = GLES2_UpdateTextureNV;
-#endif
-    renderer->LockTexture = GLES2_LockTexture;
-    renderer->UnlockTexture = GLES2_UnlockTexture;
-    renderer->SetRenderTarget = GLES2_SetRenderTarget;
-    renderer->QueueSetViewport = GLES2_QueueNoOp;
-    renderer->QueueSetDrawColor = GLES2_QueueNoOp;
-    renderer->QueueDrawPoints = GLES2_QueueDrawPoints;
-    renderer->QueueDrawLines = GLES2_QueueDrawLines;
-    renderer->QueueGeometry = GLES2_QueueGeometry;
-    renderer->InvalidateCachedState = GLES2_InvalidateCachedState;
-    renderer->RunCommandQueue = GLES2_RunCommandQueue;
-    renderer->RenderReadPixels = GLES2_RenderReadPixels;
-    renderer->RenderPresent = GLES2_RenderPresent;
-    renderer->DestroyTexture = GLES2_DestroyTexture;
-    renderer->DestroyRenderer = GLES2_DestroyRenderer;
-    renderer->SetVSync = GLES2_SetVSync;
+    SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_BGRA32);
+    SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGBA32);
+    SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_BGRX32);
+    SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGBX32);
+    SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_INDEX8);
 #ifdef SDL_HAVE_YUV
     SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_YV12);
     SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_IYUV);

+ 54 - 2
src/render/opengles2/SDL_shaders_gles2.c

@@ -88,6 +88,19 @@ static const char GLES2_Fragment_Solid[] =
 "}\n"
 ;
 
+#define PALETTE_SHADER_PROLOGUE                                 \
+"uniform sampler2D u_texture;\n"                                \
+"uniform sampler2D u_palette;\n"                                \
+"varying mediump vec4 v_color;\n"                               \
+"varying SDL_TEXCOORD_PRECISION vec2 v_texCoord;\n"             \
+
+#define PALETTE_PIXELART_SHADER_PROLOGUE                        \
+"uniform sampler2D u_texture;\n"                                \
+"uniform sampler2D u_palette;\n"                                \
+"uniform mediump vec4 u_texel_size;\n"                          \
+"varying mediump vec4 v_color;\n"                               \
+"varying SDL_TEXCOORD_PRECISION vec2 v_texCoord;\n"             \
+
 #define RGB_SHADER_PROLOGUE                                     \
 "uniform sampler2D u_texture;\n"                                \
 "varying mediump vec4 v_color;\n"                               \
@@ -100,18 +113,42 @@ static const char GLES2_Fragment_Solid[] =
 "varying SDL_TEXCOORD_PRECISION vec2 v_texCoord;\n"             \
 
 #ifdef OPENGLES_300 // This is required for fwidth() and textureGrad()
+#define PALETTE_PIXELART_GETCOLOR                                                               \
+"    mediump vec2 boxSize = clamp(fwidth(v_texCoord) * u_texel_size.zw, 1e-5, 1.0);\n"          \
+"    mediump vec2 tx = v_texCoord * u_texel_size.zw - 0.5 * boxSize;\n"                         \
+"    mediump vec2 txOffset = smoothstep(vec2(1.0) - boxSize, vec2(1.0), fract(tx));\n"          \
+"    mediump vec2 uv = (floor(tx) + 0.5 + txOffset) * u_texel_size.xy;\n"                       \
+"    mediump float index = textureGrad(u_texture, uv, dFdx(v_texCoord), dFdy(v_texCoord)).r * 255.0;\n" \
+"    SDL_TEXCOORD_PRECISION vec2 paletteCoords = vec2((index + 0.5) / 256.0, 0.5);\n"           \
+"    mediump vec4 color = texture2D(u_palette, paletteCoords);\n"
 #define RGB_PIXELART_GETCOLOR                                                                   \
 "    mediump vec2 boxSize = clamp(fwidth(v_texCoord) * u_texel_size.zw, 1e-5, 1.0);\n"          \
 "    mediump vec2 tx = v_texCoord * u_texel_size.zw - 0.5 * boxSize;\n"                         \
 "    mediump vec2 txOffset = smoothstep(vec2(1.0) - boxSize, vec2(1.0), fract(tx));\n"          \
 "    mediump vec2 uv = (floor(tx) + 0.5 + txOffset) * u_texel_size.xy;\n"                       \
-"    mediump vec4 color = textureGrad(u_texture, uv, dFdx(v_texCoord), dFdy(v_texCoord));\n"    \
-"    mediump vec4 color = texture2D(u_texture, uv);\n"
+"    mediump vec4 color = textureGrad(u_texture, uv, dFdx(v_texCoord), dFdy(v_texCoord));\n"
 #else
+#define PALETTE_PIXELART_GETCOLOR                                                               \
+"    mediump float index = texture2D(u_texture, v_texCoord).r * 255.0;\n"                       \
+"    SDL_TEXCOORD_PRECISION vec2 paletteCoords = vec2((index + 0.5) / 256.0, 0.5);\n"           \
+"    mediump vec4 color = texture2D(u_palette, paletteCoords);\n"
 #define RGB_PIXELART_GETCOLOR                                                                   \
 "    mediump vec4 color = texture2D(u_texture, v_texCoord);\n"
 #endif
 
+static const char GLES2_Fragment_TexturePalette[] =
+    PALETTE_SHADER_PROLOGUE
+"\n"
+"void main()\n"
+"{\n"
+"    mediump float index = texture2D(u_texture, v_texCoord).r * 255.0;\n"
+"    SDL_TEXCOORD_PRECISION vec2 paletteCoords = vec2((index + 0.5) / 256.0, 0.5);\n"
+"    mediump vec4 color = texture2D(u_palette, paletteCoords);\n"
+"    gl_FragColor = color;\n"
+"    gl_FragColor *= v_color;\n"
+"}\n"
+;
+
 static const char GLES2_Fragment_TextureABGR[] =
     RGB_SHADER_PROLOGUE
 "\n"
@@ -165,6 +202,17 @@ static const char GLES2_Fragment_TextureBGR[] =
 "}\n"
 ;
 
+static const char GLES2_Fragment_TexturePalette_PixelArt[] =
+    PALETTE_PIXELART_SHADER_PROLOGUE
+"\n"
+"void main()\n"
+"{\n"
+    PALETTE_PIXELART_GETCOLOR
+"    gl_FragColor = color;\n"
+"    gl_FragColor *= v_color;\n"
+"}\n"
+;
+
 static const char GLES2_Fragment_TextureABGR_PixelArt[] =
     RGB_PIXELART_SHADER_PROLOGUE
 "\n"
@@ -427,6 +475,8 @@ const char *GLES2_GetShader(GLES2_ShaderType type)
         return GLES2_Vertex_Default;
     case GLES2_SHADER_FRAGMENT_SOLID:
         return GLES2_Fragment_Solid;
+    case GLES2_SHADER_FRAGMENT_TEXTURE_PALETTE:
+        return GLES2_Fragment_TexturePalette;
     case GLES2_SHADER_FRAGMENT_TEXTURE_ABGR:
         return GLES2_Fragment_TextureABGR;
     case GLES2_SHADER_FRAGMENT_TEXTURE_ARGB:
@@ -435,6 +485,8 @@ const char *GLES2_GetShader(GLES2_ShaderType type)
         return GLES2_Fragment_TextureRGB;
     case GLES2_SHADER_FRAGMENT_TEXTURE_BGR:
         return GLES2_Fragment_TextureBGR;
+    case GLES2_SHADER_FRAGMENT_TEXTURE_PALETTE_PIXELART:
+        return GLES2_Fragment_TexturePalette_PixelArt;
     case GLES2_SHADER_FRAGMENT_TEXTURE_ABGR_PIXELART:
         return GLES2_Fragment_TextureABGR_PixelArt;
     case GLES2_SHADER_FRAGMENT_TEXTURE_ARGB_PIXELART:

+ 2 - 0
src/render/opengles2/SDL_shaders_gles2.h

@@ -39,10 +39,12 @@ typedef enum
 {
     GLES2_SHADER_VERTEX_DEFAULT = 0,
     GLES2_SHADER_FRAGMENT_SOLID,
+    GLES2_SHADER_FRAGMENT_TEXTURE_PALETTE,
     GLES2_SHADER_FRAGMENT_TEXTURE_ABGR,
     GLES2_SHADER_FRAGMENT_TEXTURE_ARGB,
     GLES2_SHADER_FRAGMENT_TEXTURE_BGR,
     GLES2_SHADER_FRAGMENT_TEXTURE_RGB,
+    GLES2_SHADER_FRAGMENT_TEXTURE_PALETTE_PIXELART,
     GLES2_SHADER_FRAGMENT_TEXTURE_ABGR_PIXELART,
     GLES2_SHADER_FRAGMENT_TEXTURE_ARGB_PIXELART,
     GLES2_SHADER_FRAGMENT_TEXTURE_BGR_PIXELART,

Some files were not shown because too many files changed in this diff