--------------------------------------------------------------------------- 
    Copyright ( c ) 2013 The gg programmers . All rights reserved . 
    Distributed under the ISC license , see terms at the end of the file . 
   ---------------------------------------------------------------------------
   Copyright (c) 2013 The gg programmers. All rights reserved.
   Distributed under the ISC license, see terms at the end of the file.
  ---------------------------------------------------------------------------*)

  ColorBrewer Color Schemes are Copyright 2002   ,   
    and the Pennsylvania State University . Licensed under the Apache License 
    version 2.0 . 
    See -2.0 

    The fixed qualitative color scheme `  and the generated color 
    schemes are taken from : 

    M. Wijffelaars , Synthesis of Color Palettes , Technische Universiteit 
    Eindhoven , 2008 . 

    M. Wijfeelaars et al , Generating Color Palettes using Intuitive 
    Parameters , Eurographics 2008 . 
    -8659.2008.01203.x 

    The turbo color scheme is Copyright 2019 Google LLC . Licensed under 
    the Apache License version 2.0 . 
    See -2.0 

    The sinebow color scheme is by   and   . 

    The magma , inferno , plasma and viridis schemes are by    , 
        , and ( in the case of  )   . They 
    are distributed under the  license .
   and the Pennsylvania State University. Licensed under the Apache License
   version 2.0.
   See -2.0

   The fixed qualitative color scheme `Wijffelaars_17 and the generated color
   schemes are taken from:

   M. Wijffelaars, Synthesis of Color Palettes, Technische Universiteit
   Eindhoven, 2008.

   M. Wijfeelaars et al, Generating Color Palettes using Intuitive
   Parameters, Eurographics 2008.
   -8659.2008.01203.x

   The turbo color scheme is Copyright 2019 Google LLC. Licensed under
   the Apache License version 2.0.
   See -2.0

   The sinebow color scheme is by Jim Bumgardner and Charlie Loyd.

   The magma, inferno, plasma and viridis schemes are by Nathaniel J. Smith,
   Stefan van der Walt, and (in the case of viridis) Eric Firing. They
   are distributed under the CC0 license. *)

open Gg

type continuous = float -> Gg.color
type discrete = int -> Gg.color

let r_lch_uv_c = 179.0413773582776
  yellow LCH_uv .

(* Quadratic interpolation *)

let quad a b0 b1 b2 t =
  let omt = 1. -. t in
  let c0 = omt *. omt in
  let c1 = 2. *. omt *. t in
  let c2 = t *. t in
  V3.(V4.v ((c0 *. (x b0)) +. (c1 *. (x b1)) +. (c2 *. (x b2)))
        ((c0 *. (y b0)) +. (c1 *. (y b1)) +. (c2 *. (y b2)))
        ((c0 *. (z b0)) +. (c1 *. (z b1)) +. (c2 *. (z b2)))
        a)

let inv_quad b0 b1 b2 v =
  let c = b0 -. (2. *. b1) +. b2 in
  let r = (b0 -. b1 +. sqrt ((b1 *. b1) -. (b0 *. b2) +. (c *. v))) /. c in
  r

(* Hue functions *)

let mod_hue h =
  let h = mod_float h Float.two_pi in
  if h < 0. then h +. Float.two_pi else h

let mix_hue h0 h1 t =          (* mixes hue using shortest path on circle. *)
  let d = (mod_hue (h1 -. h0 +. Float.pi)) -. Float.pi in
  mod_hue (h0 +. t *. d)

let diff_hue h0 h1 =
  let d = abs_float (h1 -. h0) in
  if d < Float.pi then d else Float.two_pi -. d

let rgb2xyz = M3.v
    0.4124564 0.3575761 0.1804375
    0.2126729 0.7151522 0.0721750
    0.0193339 0.1191920 0.9503041

  most satured color of [ h ] , see Wijffelaars 2008 , p. 36 .
  let u'n = 0.1978398 in
  let v'n = 0.4683363 in
  LCH_uv hue of RGB 1 . 0 . 0 .
  LCH_uv hue of RGB 1 . 1 . 0 .
  LCH_uv hue of RGB 0 . 1 . 0 .
  LCH_uv hue of RGB 0 . 1 . 1 .
  LCH_uv hue of RGB 0 . 0 . 1 .
  LCH_uv hue of RGB 1 . 0 . 1 .
  let r, s, t =
    if h0 <= h && h < h1 then 1, 2, 0 else
    if h1 <= h && h < h2 then 0, 2, 1 else
    if h2 <= h && h < h3 then 2, 0, 1 else
    if h3 <= h && h < h4 then 1, 0, 2 else
    if h4 <= h && h < h5 then 0, 1, 2 else
    if h5 <= h || h < h0 then 2, 1, 0 else
    assert false
  in
  let alpha = -. sin h in
  let beta = cos h in
  let f = alpha *. u'n +. beta *. v'n in
  let coeff p =
    let c0 = V3.(f *. ((x p) +. (15. *. (y p)) +. (3. *. (z p)))) in
    let c1 = V3.((4. *. alpha *. (x p)) +. (9. *. beta *. (y p))) in
    c0 -. c1
  in
  let rv = -. (coeff (M3.col t rgb2xyz)) /. (coeff (M3.col r rgb2xyz)) in
  let a = [|0.; 0.; 0.|] in
  a.(r) <- rv; a.(s) <- 0.; a.(t) <- 1.;
  match a with [|r; g; b|] -> Color.v r g b 1.0 | _ -> assert false

(* Saturation functions. *)

let max_s l h =
  let pmid = Color.to_lch_uv (msc h) in
  let pendL = if l <= V4.x pmid then 0. else 100. in
  let alpha = (l -. pendL) /. (V4.x pmid -. pendL) in
  alpha *. V4.y pmid

(* Sequential schemes *)

  see Wijffelaars 2008 p. 747 table 2 .
  let pb = y_lch_uv in
  let p2l = (1. -. w) *. 100. +. (w *. V3.x pb) in
  let p2h = mix_hue h (V3.z pb) w in
  let p2s = min (max_s p2l p2h) (w *. s *. V3.y pb) in
  V3.v p2l p2s p2h

  see Wijffelaars 2008 p. 747 table 1 .
    ?(a = 1.) ?(w = 0.) ?(s = 0.6) ?(b = 0.75) ?(c = 0.88) ~h ()
  =
  let p0 = V3.v 0. 0. h in
  let p1 = V3.of_v4 (Color.to_lch_uv (msc h)) in
  let p2 = if w > 0. then p2_multi_hue w s h else V3.v 100. 0. h in
  let q0 = V3.((1. -. s) * p0 + s * p1) in
  let q2 = V3.((1. -. s) * p2 + s * p1) in
  let q1 = V3.(0.5 * (q0 + q2)) in
  fun t ->
    let l t = 125. -. 125. *. (0.2 ** ((1. -. c) *. b +. t *. c)) in
    let t_ l =
      if l <= V3.x q1
      then 0.5 *. (inv_quad (V3.x p0) (V3.x q0) (V3.x q1) l)
      else
      if l <= V3.x p2 then
        0.5 *. (inv_quad (V3.x q1) (V3.x q2) (V3.x p2) l) +. 0.5
      else
  This can happen with w ! = 0 . , in which case inv_quad returns 
              NaN , just return the max .
             NaN, just return the max. *)
      1.
    in
    let cseq t =
      if t <= 0.5
      then quad a p0 q0 q1 (2. *. t)
      else quad a q1 q2 p2 (2. *. (t -. 0.5))
    in
    Color.clamp (Color.of_lch_uv (cseq (t_ (l t))))

let sequential_wijffelaars' ?a ?w ?s ?b ?c ~h ~size:n () =
  let c = match c with
  | None -> min 0.88 (0.34 +. (float n) *. 0.06)
  | Some c -> c
  in
  let seq = sequential_wijffelaars ?a ?w ?s ?b ~c ~h () in
  let max = float (n - 1) in
  let colors = Array.init n (fun i -> seq ((float i) /. max)) in
  fun i -> Array.get colors i

(* -work/0d177465a8151eb6ede1768d51d476c7 *)
let sequential_turbo ?(a = 1.0) () = fun t ->
  let[@inline] dot4 x0 y0 z0 w0 x1 y1 z1 w1 =
    (x0 *. x1) +. (y0 *. y1) +. (z0 *. z1) +. (w0 *. w1)
  in
  let[@inline] dot2 x0 y0 x1 y1 = (x0 *. x1) +. (y0 *. y1) in
  let r4_x = 0.13572138 and r4_y = 4.61539260
  and r4_z = -42.66032258 and r4_w = 132.13108234 in
  let g4_x = 0.09140261 and g4_y = 2.19418839
  and g4_z = 4.84296658 and g4_w = -14.18503333 in
  let b4_x = 0.10667330 and b4_y = 12.64194608
  and b4_z = -60.58204836 and b4_w = 110.36276771 in
  let r2_x = -152.94239396 and r2_y = 59.28637943 in
  let g2_x = 4.27729857 and g2_y = 2.82956604 in
  let b2_x = -89.90310912 and b2_y = 27.34824973 in
  let v4_x = 1.0 and v4_y = t and v4_z = t *. t in let v4_w = t *. v4_z in
  let v2_x = v4_z *. v4_z in
  let v2_y = v4_w *. v4_z in
  let r =
    (dot4 v4_x v4_y v4_z v4_w r4_x r4_y r4_z r4_w) +.
    (dot2 v2_x v2_y r2_x r2_y)
  in
  let g =
    (dot4 v4_x v4_y v4_z v4_w g4_x g4_y g4_z g4_w) +.
    (dot2 v2_x v2_y g2_x g2_y)
  in
  let b =
    (dot4 v4_x v4_y v4_z v4_w b4_x b4_y b4_z b4_w) +.
    (dot2 v2_x v2_y b2_x b2_y)
  in
  Color.v_srgb r g b ~a

(* Diverging schemes *)

  see Wijffelaars 2008 p. 53 table 1 .
    ?(a = 1.) ?(w = 0.) ?(s = 0.6) ?(b = 0.75) ?(c = 0.88) ?(m = 0.5)
    ~h0 ~h1 ()
  =
  let seq0 = sequential_wijffelaars ~a ~w ~s ~b ~c ~h:h0 () in
  let seq1 = sequential_wijffelaars ~a ~w ~s ~b ~c ~h:h1 () in
  let e2 = 2. *. abs_float (m -. 0.5) in
  let t' =
    if m < 0.5 then (fun t -> (t +. e2) /. (1. +. e2)) else
    fun t -> t /. (1. +. e2)
  in
  let cm =
    let c0 = Color.to_lch_uv (seq0 1.) in
    let c1 = Color.to_lch_uv (seq1 1.) in
    let l = 0.5 *. (V4.x c0 +. V4.x c1) in
    let h = V3.z y_lch_uv in
    let s =
      let smax = w *. 0.5 *. (V4.y c0 +. V4.y c1) in
      min (max_s l h) smax
    in
    Color.of_lch_uv (V4.v l s h a)
  in
  fun t ->
    let t' = t' t in
    if Float.equal_tol ~eps:1e-8 t' 0.5 then cm else
    if t' < 0.5 then seq0 (2. *. t') else seq1 (2. *. (1. -. t'))

let diverging_wijffelaars' ?a ?w ?s ?b ?c ?(m = 0.5) ~h0 ~h1 ~size:n () =
  let c = match c with
  | None -> min 0.88 (1.0 -. 0.06 *. (11. -. (float (n / 2 + 1))))
  | Some c -> c
  in
  let m' = floor (2. *. m *. ((float n) -. 1.) +. 0.5) /. 2. in
  if mod_float (2. *. m') 2. = 0. then
    let max = float (n - 1) in
    let div = diverging_wijffelaars ?a ?w ?s ?b ~c ~m:(m' /. max) ~h0 ~h1 () in
    let colors = Array.init n (fun i -> div ((float i) /. max)) in
    fun i -> Array.get colors i
  else
  let max = float n in
  let m = ((m' +. 0.5) /. max) in
  let div = diverging_wijffelaars ?a ?w ?s ?b ~c ~m ~h0 ~h1 () in
  let colors =
    Array.init n
      (fun i ->
         let i = float i in
         if i < m' +. 0.5
         then div (i /. max)
         else div ((i +. 1.) /. max))
  in
  fun i -> Array.get colors i

  Cyclic schemes

let pi_1_div_3 = Float.pi /. 3.
let pi_2_div_3 = Float.two_pi /. 3.
let cyclic_sinebow ?(a = 1.0) () = fun t ->
  let t = (0.5 -. t) *. Float.pi in
  let r = let v = Float.sin t in v *. v in
  let g = let v = Float.sin (t +. pi_1_div_3) in v *. v in
  let b = let v = Float.sin (t +. pi_2_div_3) in v *. v in
  Color.v_srgb r g b ~a

(* Qualitative schemes *)

type qualitative =
[ `Brewer_accent_8 | `Brewer_dark2_8 | `Brewer_paired_12
| `Brewer_pastel1_9 | `Brewer_pastel2_8 | `Brewer_set1_9
| `Brewer_set2_8 | `Brewer_set3_12 | `Tableau_10 | `Wijffelaars_17 ]

let qualitative_size = function
| `Brewer_accent_8 -> 8 | `Brewer_dark2_8 -> 8 | `Brewer_paired_12 -> 12
| `Brewer_pastel1_9 -> 9 | `Brewer_pastel2_8 -> 8 | `Brewer_set1_9 -> 9
| `Brewer_set2_8 -> 8 | `Brewer_set3_12 -> 12 | `Tableau_10 -> 10
| `Wijffelaars_17 -> 17

let rgb = Color.v_srgbi

let brewer_accent_8 ~a =
  [| rgb 127 201 127 ~a; rgb 190 174 212 ~a; rgb 253 192 134 ~a;
     rgb 255 255 153 ~a; rgb 56  108 176 ~a; rgb 240 2   127 ~a;
     rgb 191 91   23 ~a; rgb 102 102 102 ~a; |]

let brewer_dark2_8 ~a =
  [| rgb 27  158 119 ~a; rgb 217 95   2  ~a; rgb 117 112 179 ~a;
     rgb 231 41  138 ~a; rgb 102 166 30  ~a; rgb 230 171 2   ~a;
     rgb 166 118 29  ~a; rgb 102 102 102 ~a; |]

let brewer_paired_12 ~a =
  [| rgb 166 206 227 ~a; rgb 31  120 180 ~a; rgb 178 223 138 ~a;
     rgb 51  160 44  ~a; rgb 251 154 153 ~a; rgb 227 26  28  ~a;
     rgb 253 191 111 ~a; rgb 255 127 0   ~a; rgb 202 178 214 ~a;
     rgb 106 61  154 ~a; rgb 255 255 153 ~a; rgb 177 89  40  ~a; |]

let brewer_pastel1_9 ~a =
  [| rgb 251 180 174 ~a; rgb 179 205 227 ~a; rgb 204 235 197 ~a;
     rgb 222 203 228 ~a; rgb 254 217 166 ~a; rgb 255 255 204 ~a;
     rgb 229 216 189 ~a; rgb 253 218 236 ~a; rgb 242 242 242 ~a; |]

let brewer_pastel2_8 ~a =
  [| rgb 179 226 205 ~a; rgb 253 205 172 ~a; rgb 203 213 232 ~a;
     rgb 244 202 228 ~a; rgb 230 245 201 ~a; rgb 255 242 174 ~a;
     rgb 241 226 204 ~a; rgb 204 204 204 ~a; |]

let brewer_set1_9 ~a =
  [| rgb 228 26  28  ~a; rgb 55  126 184 ~a; rgb 77  175 74  ~a;
     rgb 152 78  163 ~a; rgb 255 127 0   ~a; rgb 255 255 51  ~a;
     rgb 166 86  40  ~a; rgb 247 129 191 ~a; rgb 153 153 153 ~a; |]

let brewer_set2_8 ~a =
  [| rgb 102 194 165 ~a; rgb 252 141 98  ~a; rgb 141 160 203 ~a;
     rgb 231 138 195 ~a; rgb 166 216 84  ~a; rgb 255 217 47  ~a;
     rgb 229 196 148 ~a; rgb 179 179 179 ~a; |]

let brewer_set3_12 ~a =
  [| rgb 141 211 199 ~a; rgb 255 255 179 ~a; rgb 190 186 218 ~a;
     rgb 251 128 114 ~a; rgb 128 177 211 ~a; rgb 253 180 98  ~a;
     rgb 179 222 105 ~a; rgb 252 205 229 ~a; rgb 217 217 217 ~a;
     rgb 188 128 189 ~a; rgb 204 235 197 ~a; rgb 255 237 111 ~a; |]

let tableau_10 ~a =
  [| rgb 0x4e 0x79 0xa7 ~a; rgb 0xf2 0x8e 0x2b ~a; rgb 0xe1 0x57 0x59 ~a;
     rgb 0x76 0xb7 0xb2 ~a; rgb 0x59 0xa1 0x4f ~a; rgb 0xed 0xc9 0x48 ~a;
     rgb 0xb0 0x7a 0xa1 ~a; rgb 0xff 0x9d 0xa7 ~a; rgb 0x9c 0x75 0x5f ~a;
     rgb 0xba 0xb0 0xab ~a; |]

let wijffelaars_17 ~a =
  [| rgb 92  107 247 ~a; rgb 255 89  89  ~a; rgb 92  203 92  ~a;
     rgb 255 177 17  ~a; rgb 170 97  187 ~a; rgb 255 255 95  ~a;
     rgb 255 137 235 ~a; rgb 145 101 62  ~a; rgb 193 193 193 ~a;
     rgb 92  229 214 ~a; rgb 201 255 135 ~a; rgb 255 224 204 ~a;
     rgb 173  45  92 ~a; rgb 227 196 239 ~a; rgb 226 212 149 ~a;
     rgb 204 241 255 ~a; rgb  87 142  82 ~a; |]

let qualitative ?(a = 1.) q () =
  let colors = match q with
  | `Brewer_accent_8 -> brewer_accent_8 ~a
  | `Brewer_dark2_8 -> brewer_dark2_8 ~a
  | `Brewer_paired_12 -> brewer_paired_12 ~a
  | `Brewer_pastel1_9 -> brewer_pastel1_9 ~a
  | `Brewer_pastel2_8 -> brewer_pastel2_8 ~a
  | `Brewer_set1_9 -> brewer_set1_9 ~a
  | `Brewer_set2_8 -> brewer_set2_8 ~a
  | `Brewer_set3_12 -> brewer_set3_12 ~a
  | `Tableau_10 -> tableau_10 ~a
  | `Wijffelaars_17 -> wijffelaars_17 ~a
  in
  fun i -> Array.get colors i

  see Wijffelaars 2008 , p. 65 .
    ?(a = 1.) ?(eps = 0.) ?(r = 1.) ?(s = 0.5) ?(b = 1.) ?(c = 0.5) ~size ()
  =
  let qual t =
    let h = mod_hue ((V3.z y_lch_uv) +. Float.two_pi *. (eps +. t *. r)) in
    let alpha = (diff_hue h (V3.z y_lch_uv)) /. Float.two_pi in
    let l0 = b *. V3.x y_lch_uv in
    let l1 = (1. -. c) *. l0 in
    let l = (1. -. alpha) *. l0 +. alpha *. l1 in
    let s = min (max_s l h) (s *. r_lch_uv_c) in
    Color.clamp (Color.of_lch_uv (V4.v l s h a))
  in
  let max = float size in
  let colors = Array.init size (fun i -> qual ((float i) /. max)) in
  fun i -> Array.get colors i

(* Viridis colormaps
   As found in  *)

let c r g b ~a = Color.v_srgb r g b ~a

let sequential_magma ?(a = 1.0) () =
  let d = [|
    c 0.001462 0.000466 0.013866 ~a;
    c 0.002258 0.001295 0.018331 ~a;
    c 0.003279 0.002305 0.023708 ~a;
    c 0.004512 0.003490 0.029965 ~a;
    c 0.005950 0.004843 0.037130 ~a;
    c 0.007588 0.006356 0.044973 ~a;
    c 0.009426 0.008022 0.052844 ~a;
    c 0.011465 0.009828 0.060750 ~a;
    c 0.013708 0.011771 0.068667 ~a;
    c 0.016156 0.013840 0.076603 ~a;
    c 0.018815 0.016026 0.084584 ~a;
    c 0.021692 0.018320 0.092610 ~a;
    c 0.024792 0.020715 0.100676 ~a;
    c 0.028123 0.023201 0.108787 ~a;
    c 0.031696 0.025765 0.116965 ~a;
    c 0.035520 0.028397 0.125209 ~a;
    c 0.039608 0.031090 0.133515 ~a;
    c 0.043830 0.033830 0.141886 ~a;
    c 0.048062 0.036607 0.150327 ~a;
    c 0.052320 0.039407 0.158841 ~a;
    c 0.056615 0.042160 0.167446 ~a;
    c 0.060949 0.044794 0.176129 ~a;
    c 0.065330 0.047318 0.184892 ~a;
    c 0.069764 0.049726 0.193735 ~a;
    c 0.074257 0.052017 0.202660 ~a;
    c 0.078815 0.054184 0.211667 ~a;
    c 0.083446 0.056225 0.220755 ~a;
    c 0.088155 0.058133 0.229922 ~a;
    c 0.092949 0.059904 0.239164 ~a;
    c 0.097833 0.061531 0.248477 ~a;
    c 0.102815 0.063010 0.257854 ~a;
    c 0.107899 0.064335 0.267289 ~a;
    c 0.113094 0.065492 0.276784 ~a;
    c 0.118405 0.066479 0.286321 ~a;
    c 0.123833 0.067295 0.295879 ~a;
    c 0.129380 0.067935 0.305443 ~a;
    c 0.135053 0.068391 0.315000 ~a;
    c 0.140858 0.068654 0.324538 ~a;
    c 0.146785 0.068738 0.334011 ~a;
    c 0.152839 0.068637 0.343404 ~a;
    c 0.159018 0.068354 0.352688 ~a;
    c 0.165308 0.067911 0.361816 ~a;
    c 0.171713 0.067305 0.370771 ~a;
    c 0.178212 0.066576 0.379497 ~a;
    c 0.184801 0.065732 0.387973 ~a;
    c 0.191460 0.064818 0.396152 ~a;
    c 0.198177 0.063862 0.404009 ~a;
    c 0.204935 0.062907 0.411514 ~a;
    c 0.211718 0.061992 0.418647 ~a;
    c 0.218512 0.061158 0.425392 ~a;
    c 0.225302 0.060445 0.431742 ~a;
    c 0.232077 0.059889 0.437695 ~a;
    c 0.238826 0.059517 0.443256 ~a;
    c 0.245543 0.059352 0.448436 ~a;
    c 0.252220 0.059415 0.453248 ~a;
    c 0.258857 0.059706 0.457710 ~a;
    c 0.265447 0.060237 0.461840 ~a;
    c 0.271994 0.060994 0.465660 ~a;
    c 0.278493 0.061978 0.469190 ~a;
    c 0.284951 0.063168 0.472451 ~a;
    c 0.291366 0.064553 0.475462 ~a;
    c 0.297740 0.066117 0.478243 ~a;
    c 0.304081 0.067835 0.480812 ~a;
    c 0.310382 0.069702 0.483186 ~a;
    c 0.316654 0.071690 0.485380 ~a;
    c 0.322899 0.073782 0.487408 ~a;
    c 0.329114 0.075972 0.489287 ~a;
    c 0.335308 0.078236 0.491024 ~a;
    c 0.341482 0.080564 0.492631 ~a;
    c 0.347636 0.082946 0.494121 ~a;
    c 0.353773 0.085373 0.495501 ~a;
    c 0.359898 0.087831 0.496778 ~a;
    c 0.366012 0.090314 0.497960 ~a;
    c 0.372116 0.092816 0.499053 ~a;
    c 0.378211 0.095332 0.500067 ~a;
    c 0.384299 0.097855 0.501002 ~a;
    c 0.390384 0.100379 0.501864 ~a;
    c 0.396467 0.102902 0.502658 ~a;
    c 0.402548 0.105420 0.503386 ~a;
    c 0.408629 0.107930 0.504052 ~a;
    c 0.414709 0.110431 0.504662 ~a;
    c 0.420791 0.112920 0.505215 ~a;
    c 0.426877 0.115395 0.505714 ~a;
    c 0.432967 0.117855 0.506160 ~a;
    c 0.439062 0.120298 0.506555 ~a;
    c 0.445163 0.122724 0.506901 ~a;
    c 0.451271 0.125132 0.507198 ~a;
    c 0.457386 0.127522 0.507448 ~a;
    c 0.463508 0.129893 0.507652 ~a;
    c 0.469640 0.132245 0.507809 ~a;
    c 0.475780 0.134577 0.507921 ~a;
    c 0.481929 0.136891 0.507989 ~a;
    c 0.488088 0.139186 0.508011 ~a;
    c 0.494258 0.141462 0.507988 ~a;
    c 0.500438 0.143719 0.507920 ~a;
    c 0.506629 0.145958 0.507806 ~a;
    c 0.512831 0.148179 0.507648 ~a;
    c 0.519045 0.150383 0.507443 ~a;
    c 0.525270 0.152569 0.507192 ~a;
    c 0.531507 0.154739 0.506895 ~a;
    c 0.537755 0.156894 0.506551 ~a;
    c 0.544015 0.159033 0.506159 ~a;
    c 0.550287 0.161158 0.505719 ~a;
    c 0.556571 0.163269 0.505230 ~a;
    c 0.562866 0.165368 0.504692 ~a;
    c 0.569172 0.167454 0.504105 ~a;
    c 0.575490 0.169530 0.503466 ~a;
    c 0.581819 0.171596 0.502777 ~a;
    c 0.588158 0.173652 0.502035 ~a;
    c 0.594508 0.175701 0.501241 ~a;
    c 0.600868 0.177743 0.500394 ~a;
    c 0.607238 0.179779 0.499492 ~a;
    c 0.613617 0.181811 0.498536 ~a;
    c 0.620005 0.183840 0.497524 ~a;
    c 0.626401 0.185867 0.496456 ~a;
    c 0.632805 0.187893 0.495332 ~a;
    c 0.639216 0.189921 0.494150 ~a;
    c 0.645633 0.191952 0.492910 ~a;
    c 0.652056 0.193986 0.491611 ~a;
    c 0.658483 0.196027 0.490253 ~a;
    c 0.664915 0.198075 0.488836 ~a;
    c 0.671349 0.200133 0.487358 ~a;
    c 0.677786 0.202203 0.485819 ~a;
    c 0.684224 0.204286 0.484219 ~a;
    c 0.690661 0.206384 0.482558 ~a;
    c 0.697098 0.208501 0.480835 ~a;
    c 0.703532 0.210638 0.479049 ~a;
    c 0.709962 0.212797 0.477201 ~a;
    c 0.716387 0.214982 0.475290 ~a;
    c 0.722805 0.217194 0.473316 ~a;
    c 0.729216 0.219437 0.471279 ~a;
    c 0.735616 0.221713 0.469180 ~a;
    c 0.742004 0.224025 0.467018 ~a;
    c 0.748378 0.226377 0.464794 ~a;
    c 0.754737 0.228772 0.462509 ~a;
    c 0.761077 0.231214 0.460162 ~a;
    c 0.767398 0.233705 0.457755 ~a;
    c 0.773695 0.236249 0.455289 ~a;
    c 0.779968 0.238851 0.452765 ~a;
    c 0.786212 0.241514 0.450184 ~a;
    c 0.792427 0.244242 0.447543 ~a;
    c 0.798608 0.247040 0.444848 ~a;
    c 0.804752 0.249911 0.442102 ~a;
    c 0.810855 0.252861 0.439305 ~a;
    c 0.816914 0.255895 0.436461 ~a;
    c 0.822926 0.259016 0.433573 ~a;
    c 0.828886 0.262229 0.430644 ~a;
    c 0.834791 0.265540 0.427671 ~a;
    c 0.840636 0.268953 0.424666 ~a;
    c 0.846416 0.272473 0.421631 ~a;
    c 0.852126 0.276106 0.418573 ~a;
    c 0.857763 0.279857 0.415496 ~a;
    c 0.863320 0.283729 0.412403 ~a;
    c 0.868793 0.287728 0.409303 ~a;
    c 0.874176 0.291859 0.406205 ~a;
    c 0.879464 0.296125 0.403118 ~a;
    c 0.884651 0.300530 0.400047 ~a;
    c 0.889731 0.305079 0.397002 ~a;
    c 0.894700 0.309773 0.393995 ~a;
    c 0.899552 0.314616 0.391037 ~a;
    c 0.904281 0.319610 0.388137 ~a;
    c 0.908884 0.324755 0.385308 ~a;
    c 0.913354 0.330052 0.382563 ~a;
    c 0.917689 0.335500 0.379915 ~a;
    c 0.921884 0.341098 0.377376 ~a;
    c 0.925937 0.346844 0.374959 ~a;
    c 0.929845 0.352734 0.372677 ~a;
    c 0.933606 0.358764 0.370541 ~a;
    c 0.937221 0.364929 0.368567 ~a;
    c 0.940687 0.371224 0.366762 ~a;
    c 0.944006 0.377643 0.365136 ~a;
    c 0.947180 0.384178 0.363701 ~a;
    c 0.950210 0.390820 0.362468 ~a;
    c 0.953099 0.397563 0.361438 ~a;
    c 0.955849 0.404400 0.360619 ~a;
    c 0.958464 0.411324 0.360014 ~a;
    c 0.960949 0.418323 0.359630 ~a;
    c 0.963310 0.425390 0.359469 ~a;
    c 0.965549 0.432519 0.359529 ~a;
    c 0.967671 0.439703 0.359810 ~a;
    c 0.969680 0.446936 0.360311 ~a;
    c 0.971582 0.454210 0.361030 ~a;
    c 0.973381 0.461520 0.361965 ~a;
    c 0.975082 0.468861 0.363111 ~a;
    c 0.976690 0.476226 0.364466 ~a;
    c 0.978210 0.483612 0.366025 ~a;
    c 0.979645 0.491014 0.367783 ~a;
    c 0.981000 0.498428 0.369734 ~a;
    c 0.982279 0.505851 0.371874 ~a;
    c 0.983485 0.513280 0.374198 ~a;
    c 0.984622 0.520713 0.376698 ~a;
    c 0.985693 0.528148 0.379371 ~a;
    c 0.986700 0.535582 0.382210 ~a;
    c 0.987646 0.543015 0.385210 ~a;
    c 0.988533 0.550446 0.388365 ~a;
    c 0.989363 0.557873 0.391671 ~a;
    c 0.990138 0.565296 0.395122 ~a;
    c 0.990871 0.572706 0.398714 ~a;
    c 0.991558 0.580107 0.402441 ~a;
    c 0.992196 0.587502 0.406299 ~a;
    c 0.992785 0.594891 0.410283 ~a;
    c 0.993326 0.602275 0.414390 ~a;
    c 0.993834 0.609644 0.418613 ~a;
    c 0.994309 0.616999 0.422950 ~a;
    c 0.994738 0.624350 0.427397 ~a;
    c 0.995122 0.631696 0.431951 ~a;
    c 0.995480 0.639027 0.436607 ~a;
    c 0.995810 0.646344 0.441361 ~a;
    c 0.996096 0.653659 0.446213 ~a;
    c 0.996341 0.660969 0.451160 ~a;
    c 0.996580 0.668256 0.456192 ~a;
    c 0.996775 0.675541 0.461314 ~a;
    c 0.996925 0.682828 0.466526 ~a;
    c 0.997077 0.690088 0.471811 ~a;
    c 0.997186 0.697349 0.477182 ~a;
    c 0.997254 0.704611 0.482635 ~a;
    c 0.997325 0.711848 0.488154 ~a;
    c 0.997351 0.719089 0.493755 ~a;
    c 0.997351 0.726324 0.499428 ~a;
    c 0.997341 0.733545 0.505167 ~a;
    c 0.997285 0.740772 0.510983 ~a;
    c 0.997228 0.747981 0.516859 ~a;
    c 0.997138 0.755190 0.522806 ~a;
    c 0.997019 0.762398 0.528821 ~a;
    c 0.996898 0.769591 0.534892 ~a;
    c 0.996727 0.776795 0.541039 ~a;
    c 0.996571 0.783977 0.547233 ~a;
    c 0.996369 0.791167 0.553499 ~a;
    c 0.996162 0.798348 0.559820 ~a;
    c 0.995932 0.805527 0.566202 ~a;
    c 0.995680 0.812706 0.572645 ~a;
    c 0.995424 0.819875 0.579140 ~a;
    c 0.995131 0.827052 0.585701 ~a;
    c 0.994851 0.834213 0.592307 ~a;
    c 0.994524 0.841387 0.598983 ~a;
    c 0.994222 0.848540 0.605696 ~a;
    c 0.993866 0.855711 0.612482 ~a;
    c 0.993545 0.862859 0.619299 ~a;
    c 0.993170 0.870024 0.626189 ~a;
    c 0.992831 0.877168 0.633109 ~a;
    c 0.992440 0.884330 0.640099 ~a;
    c 0.992089 0.891470 0.647116 ~a;
    c 0.991688 0.898627 0.654202 ~a;
    c 0.991332 0.905763 0.661309 ~a;
    c 0.990930 0.912915 0.668481 ~a;
    c 0.990570 0.920049 0.675675 ~a;
    c 0.990175 0.927196 0.682926 ~a;
    c 0.989815 0.934329 0.690198 ~a;
    c 0.989434 0.941470 0.697519 ~a;
    c 0.989077 0.948604 0.704863 ~a;
    c 0.988717 0.955742 0.712242 ~a;
    c 0.988367 0.962878 0.719649 ~a;
    c 0.988033 0.970012 0.727077 ~a;
    c 0.987691 0.977154 0.734536 ~a;
    c 0.987387 0.984288 0.742002 ~a;
    c 0.987053 0.991438 0.749504 ~a|]
  in
  fun t -> d.(Int.max 0 (Int.min 255 (truncate (t *. 256.))))

let sequential_inferno ?(a = 1.0) () =
  let d = [|
    c 0.001462 0.000466 0.013866 ~a;
    c 0.002267 0.001270 0.018570 ~a;
    c 0.003299 0.002249 0.024239 ~a;
    c 0.004547 0.003392 0.030909 ~a;
    c 0.006006 0.004692 0.038558 ~a;
    c 0.007676 0.006136 0.046836 ~a;
    c 0.009561 0.007713 0.055143 ~a;
    c 0.011663 0.009417 0.063460 ~a;
    c 0.013995 0.011225 0.071862 ~a;
    c 0.016561 0.013136 0.080282 ~a;
    c 0.019373 0.015133 0.088767 ~a;
    c 0.022447 0.017199 0.097327 ~a;
    c 0.025793 0.019331 0.105930 ~a;
    c 0.029432 0.021503 0.114621 ~a;
    c 0.033385 0.023702 0.123397 ~a;
    c 0.037668 0.025921 0.132232 ~a;
    c 0.042253 0.028139 0.141141 ~a;
    c 0.046915 0.030324 0.150164 ~a;
    c 0.051644 0.032474 0.159254 ~a;
    c 0.056449 0.034569 0.168414 ~a;
    c 0.061340 0.036590 0.177642 ~a;
    c 0.066331 0.038504 0.186962 ~a;
    c 0.071429 0.040294 0.196354 ~a;
    c 0.076637 0.041905 0.205799 ~a;
    c 0.081962 0.043328 0.215289 ~a;
    c 0.087411 0.044556 0.224813 ~a;
    c 0.092990 0.045583 0.234358 ~a;
    c 0.098702 0.046402 0.243904 ~a;
    c 0.104551 0.047008 0.253430 ~a;
    c 0.110536 0.047399 0.262912 ~a;
    c 0.116656 0.047574 0.272321 ~a;
    c 0.122908 0.047536 0.281624 ~a;
    c 0.129285 0.047293 0.290788 ~a;
    c 0.135778 0.046856 0.299776 ~a;
    c 0.142378 0.046242 0.308553 ~a;
    c 0.149073 0.045468 0.317085 ~a;
    c 0.155850 0.044559 0.325338 ~a;
    c 0.162689 0.043554 0.333277 ~a;
    c 0.169575 0.042489 0.340874 ~a;
    c 0.176493 0.041402 0.348111 ~a;
    c 0.183429 0.040329 0.354971 ~a;
    c 0.190367 0.039309 0.361447 ~a;
    c 0.197297 0.038400 0.367535 ~a;
    c 0.204209 0.037632 0.373238 ~a;
    c 0.211095 0.037030 0.378563 ~a;
    c 0.217949 0.036615 0.383522 ~a;
    c 0.224763 0.036405 0.388129 ~a;
    c 0.231538 0.036405 0.392400 ~a;
    c 0.238273 0.036621 0.396353 ~a;
    c 0.244967 0.037055 0.400007 ~a;
    c 0.251620 0.037705 0.403378 ~a;
    c 0.258234 0.038571 0.406485 ~a;
    c 0.264810 0.039647 0.409345 ~a;
    c 0.271347 0.040922 0.411976 ~a;
    c 0.277850 0.042353 0.414392 ~a;
    c 0.284321 0.043933 0.416608 ~a;
    c 0.290763 0.045644 0.418637 ~a;
    c 0.297178 0.047470 0.420491 ~a;
    c 0.303568 0.049396 0.422182 ~a;
    c 0.309935 0.051407 0.423721 ~a;
    c 0.316282 0.053490 0.425116 ~a;
    c 0.322610 0.055634 0.426377 ~a;
    c 0.328921 0.057827 0.427511 ~a;
    c 0.335217 0.060060 0.428524 ~a;
    c 0.341500 0.062325 0.429425 ~a;
    c 0.347771 0.064616 0.430217 ~a;
    c 0.354032 0.066925 0.430906 ~a;
    c 0.360284 0.069247 0.431497 ~a;
    c 0.366529 0.071579 0.431994 ~a;
    c 0.372768 0.073915 0.432400 ~a;
    c 0.379001 0.076253 0.432719 ~a;
    c 0.385228 0.078591 0.432955 ~a;
    c 0.391453 0.080927 0.433109 ~a;
    c 0.397674 0.083257 0.433183 ~a;
    c 0.403894 0.085580 0.433179 ~a;
    c 0.410113 0.087896 0.433098 ~a;
    c 0.416331 0.090203 0.432943 ~a;
    c 0.422549 0.092501 0.432714 ~a;
    c 0.428768 0.094790 0.432412 ~a;
    c 0.434987 0.097069 0.432039 ~a;
    c 0.441207 0.099338 0.431594 ~a;
    c 0.447428 0.101597 0.431080 ~a;
    c 0.453651 0.103848 0.430498 ~a;
    c 0.459875 0.106089 0.429846 ~a;
    c 0.466100 0.108322 0.429125 ~a;
    c 0.472328 0.110547 0.428334 ~a;
    c 0.478558 0.112764 0.427475 ~a;
    c 0.484789 0.114974 0.426548 ~a;
    c 0.491022 0.117179 0.425552 ~a;
    c 0.497257 0.119379 0.424488 ~a;
    c 0.503493 0.121575 0.423356 ~a;
    c 0.509730 0.123769 0.422156 ~a;
    c 0.515967 0.125960 0.420887 ~a;
    c 0.522206 0.128150 0.419549 ~a;
    c 0.528444 0.130341 0.418142 ~a;
    c 0.534683 0.132534 0.416667 ~a;
    c 0.540920 0.134729 0.415123 ~a;
    c 0.547157 0.136929 0.413511 ~a;
    c 0.553392 0.139134 0.411829 ~a;
    c 0.559624 0.141346 0.410078 ~a;
    c 0.565854 0.143567 0.408258 ~a;
    c 0.572081 0.145797 0.406369 ~a;
    c 0.578304 0.148039 0.404411 ~a;
    c 0.584521 0.150294 0.402385 ~a;
    c 0.590734 0.152563 0.400290 ~a;
    c 0.596940 0.154848 0.398125 ~a;
    c 0.603139 0.157151 0.395891 ~a;
    c 0.609330 0.159474 0.393589 ~a;
    c 0.615513 0.161817 0.391219 ~a;
    c 0.621685 0.164184 0.388781 ~a;
    c 0.627847 0.166575 0.386276 ~a;
    c 0.633998 0.168992 0.383704 ~a;
    c 0.640135 0.171438 0.381065 ~a;
    c 0.646260 0.173914 0.378359 ~a;
    c 0.652369 0.176421 0.375586 ~a;
    c 0.658463 0.178962 0.372748 ~a;
    c 0.664540 0.181539 0.369846 ~a;
    c 0.670599 0.184153 0.366879 ~a;
    c 0.676638 0.186807 0.363849 ~a;
    c 0.682656 0.189501 0.360757 ~a;
    c 0.688653 0.192239 0.357603 ~a;
    c 0.694627 0.195021 0.354388 ~a;
    c 0.700576 0.197851 0.351113 ~a;
    c 0.706500 0.200728 0.347777 ~a;
    c 0.712396 0.203656 0.344383 ~a;
    c 0.718264 0.206636 0.340931 ~a;
    c 0.724103 0.209670 0.337424 ~a;
    c 0.729909 0.212759 0.333861 ~a;
    c 0.735683 0.215906 0.330245 ~a;
    c 0.741423 0.219112 0.326576 ~a;
    c 0.747127 0.222378 0.322856 ~a;
    c 0.752794 0.225706 0.319085 ~a;
    c 0.758422 0.229097 0.315266 ~a;
    c 0.764010 0.232554 0.311399 ~a;
    c 0.769556 0.236077 0.307485 ~a;
    c 0.775059 0.239667 0.303526 ~a;
    c 0.780517 0.243327 0.299523 ~a;
    c 0.785929 0.247056 0.295477 ~a;
    c 0.791293 0.250856 0.291390 ~a;
    c 0.796607 0.254728 0.287264 ~a;
    c 0.801871 0.258674 0.283099 ~a;
    c 0.807082 0.262692 0.278898 ~a;
    c 0.812239 0.266786 0.274661 ~a;
    c 0.817341 0.270954 0.270390 ~a;
    c 0.822386 0.275197 0.266085 ~a;
    c 0.827372 0.279517 0.261750 ~a;
    c 0.832299 0.283913 0.257383 ~a;
    c 0.837165 0.288385 0.252988 ~a;
    c 0.841969 0.292933 0.248564 ~a;
    c 0.846709 0.297559 0.244113 ~a;
    c 0.851384 0.302260 0.239636 ~a;
    c 0.855992 0.307038 0.235133 ~a;
    c 0.860533 0.311892 0.230606 ~a;
    c 0.865006 0.316822 0.226055 ~a;
    c 0.869409 0.321827 0.221482 ~a;
    c 0.873741 0.326906 0.216886 ~a;
    c 0.878001 0.332060 0.212268 ~a;
    c 0.882188 0.337287 0.207628 ~a;
    c 0.886302 0.342586 0.202968 ~a;
    c 0.890341 0.347957 0.198286 ~a;
    c 0.894305 0.353399 0.193584 ~a;
    c 0.898192 0.358911 0.188860 ~a;
    c 0.902003 0.364492 0.184116 ~a;
    c 0.905735 0.370140 0.179350 ~a;
    c 0.909390 0.375856 0.174563 ~a;
    c 0.912966 0.381636 0.169755 ~a;
    c 0.916462 0.387481 0.164924 ~a;
    c 0.919879 0.393389 0.160070 ~a;
    c 0.923215 0.399359 0.155193 ~a;
    c 0.926470 0.405389 0.150292 ~a;
    c 0.929644 0.411479 0.145367 ~a;
    c 0.932737 0.417627 0.140417 ~a;
    c 0.935747 0.423831 0.135440 ~a;
    c 0.938675 0.430091 0.130438 ~a;
    c 0.941521 0.436405 0.125409 ~a;
    c 0.944285 0.442772 0.120354 ~a;
    c 0.946965 0.449191 0.115272 ~a;
    c 0.949562 0.455660 0.110164 ~a;
    c 0.952075 0.462178 0.105031 ~a;
    c 0.954506 0.468744 0.099874 ~a;
    c 0.956852 0.475356 0.094695 ~a;
    c 0.959114 0.482014 0.089499 ~a;
    c 0.961293 0.488716 0.084289 ~a;
    c 0.963387 0.495462 0.079073 ~a;
    c 0.965397 0.502249 0.073859 ~a;
    c 0.967322 0.509078 0.068659 ~a;
    c 0.969163 0.515946 0.063488 ~a;
    c 0.970919 0.522853 0.058367 ~a;
    c 0.972590 0.529798 0.053324 ~a;
    c 0.974176 0.536780 0.048392 ~a;
    c 0.975677 0.543798 0.043618 ~a;
    c 0.977092 0.550850 0.039050 ~a;
    c 0.978422 0.557937 0.034931 ~a;
    c 0.979666 0.565057 0.031409 ~a;
    c 0.980824 0.572209 0.028508 ~a;
    c 0.981895 0.579392 0.026250 ~a;
    c 0.982881 0.586606 0.024661 ~a;
    c 0.983779 0.593849 0.023770 ~a;
    c 0.984591 0.601122 0.023606 ~a;
    c 0.985315 0.608422 0.024202 ~a;
    c 0.985952 0.615750 0.025592 ~a;
    c 0.986502 0.623105 0.027814 ~a;
    c 0.986964 0.630485 0.030908 ~a;
    c 0.987337 0.637890 0.034916 ~a;
    c 0.987622 0.645320 0.039886 ~a;
    c 0.987819 0.652773 0.045581 ~a;
    c 0.987926 0.660250 0.051750 ~a;
    c 0.987945 0.667748 0.058329 ~a;
    c 0.987874 0.675267 0.065257 ~a;
    c 0.987714 0.682807 0.072489 ~a;
    c 0.987464 0.690366 0.079990 ~a;
    c 0.987124 0.697944 0.087731 ~a;
    c 0.986694 0.705540 0.095694 ~a;
    c 0.986175 0.713153 0.103863 ~a;
    c 0.985566 0.720782 0.112229 ~a;
    c 0.984865 0.728427 0.120785 ~a;
    c 0.984075 0.736087 0.129527 ~a;
    c 0.983196 0.743758 0.138453 ~a;
    c 0.982228 0.751442 0.147565 ~a;
    c 0.981173 0.759135 0.156863 ~a;
    c 0.980032 0.766837 0.166353 ~a;
    c 0.978806 0.774545 0.176037 ~a;
    c 0.977497 0.782258 0.185923 ~a;
    c 0.976108 0.789974 0.196018 ~a;
    c 0.974638 0.797692 0.206332 ~a;
    c 0.973088 0.805409 0.216877 ~a;
    c 0.971468 0.813122 0.227658 ~a;
    c 0.969783 0.820825 0.238686 ~a;
    c 0.968041 0.828515 0.249972 ~a;
    c 0.966243 0.836191 0.261534 ~a;
    c 0.964394 0.843848 0.273391 ~a;
    c 0.962517 0.851476 0.285546 ~a;
    c 0.960626 0.859069 0.298010 ~a;
    c 0.958720 0.866624 0.310820 ~a;
    c 0.956834 0.874129 0.323974 ~a;
    c 0.954997 0.881569 0.337475 ~a;
    c 0.953215 0.888942 0.351369 ~a;
    c 0.951546 0.896226 0.365627 ~a;
    c 0.950018 0.903409 0.380271 ~a;
    c 0.948683 0.910473 0.395289 ~a;
    c 0.947594 0.917399 0.410665 ~a;
    c 0.946809 0.924168 0.426373 ~a;
    c 0.946392 0.930761 0.442367 ~a;
    c 0.946403 0.937159 0.458592 ~a;
    c 0.946903 0.943348 0.474970 ~a;
    c 0.947937 0.949318 0.491426 ~a;
    c 0.949545 0.955063 0.507860 ~a;
    c 0.951740 0.960587 0.524203 ~a;
    c 0.954529 0.965896 0.540361 ~a;
    c 0.957896 0.971003 0.556275 ~a;
    c 0.961812 0.975924 0.571925 ~a;
    c 0.966249 0.980678 0.587206 ~a;
    c 0.971162 0.985282 0.602154 ~a;
    c 0.976511 0.989753 0.616760 ~a;
    c 0.982257 0.994109 0.631017 ~a;
    c 0.988362 0.998364 0.644924 ~a|]
  in
  fun t -> d.(Int.max 0 (Int.min 255 (truncate (t *. 256.))))

let sequential_plasma ?(a = 1.0) () =
  let d = [|
    c 0.050383 0.029803 0.527975 ~a;
    c 0.063536 0.028426 0.533124 ~a;
    c 0.075353 0.027206 0.538007 ~a;
    c 0.086222 0.026125 0.542658 ~a;
    c 0.096379 0.025165 0.547103 ~a;
    c 0.105980 0.024309 0.551368 ~a;
    c 0.115124 0.023556 0.555468 ~a;
    c 0.123903 0.022878 0.559423 ~a;
    c 0.132381 0.022258 0.563250 ~a;
    c 0.140603 0.021687 0.566959 ~a;
    c 0.148607 0.021154 0.570562 ~a;
    c 0.156421 0.020651 0.574065 ~a;
    c 0.164070 0.020171 0.577478 ~a;
    c 0.171574 0.019706 0.580806 ~a;
    c 0.178950 0.019252 0.584054 ~a;
    c 0.186213 0.018803 0.587228 ~a;
    c 0.193374 0.018354 0.590330 ~a;
    c 0.200445 0.017902 0.593364 ~a;
    c 0.207435 0.017442 0.596333 ~a;
    c 0.214350 0.016973 0.599239 ~a;
    c 0.221197 0.016497 0.602083 ~a;
    c 0.227983 0.016007 0.604867 ~a;
    c 0.234715 0.015502 0.607592 ~a;
    c 0.241396 0.014979 0.610259 ~a;
    c 0.248032 0.014439 0.612868 ~a;
    c 0.254627 0.013882 0.615419 ~a;
    c 0.261183 0.013308 0.617911 ~a;
    c 0.267703 0.012716 0.620346 ~a;
    c 0.274191 0.012109 0.622722 ~a;
    c 0.280648 0.011488 0.625038 ~a;
    c 0.287076 0.010855 0.627295 ~a;
    c 0.293478 0.010213 0.629490 ~a;
    c 0.299855 0.009561 0.631624 ~a;
    c 0.306210 0.008902 0.633694 ~a;
    c 0.312543 0.008239 0.635700 ~a;
    c 0.318856 0.007576 0.637640 ~a;
    c 0.325150 0.006915 0.639512 ~a;
    c 0.331426 0.006261 0.641316 ~a;
    c 0.337683 0.005618 0.643049 ~a;
    c 0.343925 0.004991 0.644710 ~a;
    c 0.350150 0.004382 0.646298 ~a;
    c 0.356359 0.003798 0.647810 ~a;
    c 0.362553 0.003243 0.649245 ~a;
    c 0.368733 0.002724 0.650601 ~a;
    c 0.374897 0.002245 0.651876 ~a;
    c 0.381047 0.001814 0.653068 ~a;
    c 0.387183 0.001434 0.654177 ~a;
    c 0.393304 0.001114 0.655199 ~a;
    c 0.399411 0.000859 0.656133 ~a;
    c 0.405503 0.000678 0.656977 ~a;
    c 0.411580 0.000577 0.657730 ~a;
    c 0.417642 0.000564 0.658390 ~a;
    c 0.423689 0.000646 0.658956 ~a;
    c 0.429719 0.000831 0.659425 ~a;
    c 0.435734 0.001127 0.659797 ~a;
    c 0.441732 0.001540 0.660069 ~a;
    c 0.447714 0.002080 0.660240 ~a;
    c 0.453677 0.002755 0.660310 ~a;
    c 0.459623 0.003574 0.660277 ~a;
    c 0.465550 0.004545 0.660139 ~a;
    c 0.471457 0.005678 0.659897 ~a;
    c 0.477344 0.006980 0.659549 ~a;
    c 0.483210 0.008460 0.659095 ~a;
    c 0.489055 0.010127 0.658534 ~a;
    c 0.494877 0.011990 0.657865 ~a;
    c 0.500678 0.014055 0.657088 ~a;
    c 0.506454 0.016333 0.656202 ~a;
    c 0.512206 0.018833 0.655209 ~a;
    c 0.517933 0.021563 0.654109 ~a;
    c 0.523633 0.024532 0.652901 ~a;
    c 0.529306 0.027747 0.651586 ~a;
    c 0.534952 0.031217 0.650165 ~a;
    c 0.540570 0.034950 0.648640 ~a;
    c 0.546157 0.038954 0.647010 ~a;
    c 0.551715 0.043136 0.645277 ~a;
    c 0.557243 0.047331 0.643443 ~a;
    c 0.562738 0.051545 0.641509 ~a;
    c 0.568201 0.055778 0.639477 ~a;
    c 0.573632 0.060028 0.637349 ~a;
    c 0.579029 0.064296 0.635126 ~a;
    c 0.584391 0.068579 0.632812 ~a;
    c 0.589719 0.072878 0.630408 ~a;
    c 0.595011 0.077190 0.627917 ~a;
    c 0.600266 0.081516 0.625342 ~a;
    c 0.605485 0.085854 0.622686 ~a;
    c 0.610667 0.090204 0.619951 ~a;
    c 0.615812 0.094564 0.617140 ~a;
    c 0.620919 0.098934 0.614257 ~a;
    c 0.625987 0.103312 0.611305 ~a;
    c 0.631017 0.107699 0.608287 ~a;
    c 0.636008 0.112092 0.605205 ~a;
    c 0.640959 0.116492 0.602065 ~a;
    c 0.645872 0.120898 0.598867 ~a;
    c 0.650746 0.125309 0.595617 ~a;
    c 0.655580 0.129725 0.592317 ~a;
    c 0.660374 0.134144 0.588971 ~a;
    c 0.665129 0.138566 0.585582 ~a;
    c 0.669845 0.142992 0.582154 ~a;
    c 0.674522 0.147419 0.578688 ~a;
    c 0.679160 0.151848 0.575189 ~a;
    c 0.683758 0.156278 0.571660 ~a;
    c 0.688318 0.160709 0.568103 ~a;
    c 0.692840 0.165141 0.564522 ~a;
    c 0.697324 0.169573 0.560919 ~a;
    c 0.701769 0.174005 0.557296 ~a;
    c 0.706178 0.178437 0.553657 ~a;
    c 0.710549 0.182868 0.550004 ~a;
    c 0.714883 0.187299 0.546338 ~a;
    c 0.719181 0.191729 0.542663 ~a;
    c 0.723444 0.196158 0.538981 ~a;
    c 0.727670 0.200586 0.535293 ~a;
    c 0.731862 0.205013 0.531601 ~a;
    c 0.736019 0.209439 0.527908 ~a;
    c 0.740143 0.213864 0.524216 ~a;
    c 0.744232 0.218288 0.520524 ~a;
    c 0.748289 0.222711 0.516834 ~a;
    c 0.752312 0.227133 0.513149 ~a;
    c 0.756304 0.231555 0.509468 ~a;
    c 0.760264 0.235976 0.505794 ~a;
    c 0.764193 0.240396 0.502126 ~a;
    c 0.768090 0.244817 0.498465 ~a;
    c 0.771958 0.249237 0.494813 ~a;
    c 0.775796 0.253658 0.491171 ~a;
    c 0.779604 0.258078 0.487539 ~a;
    c 0.783383 0.262500 0.483918 ~a;
    c 0.787133 0.266922 0.480307 ~a;
    c 0.790855 0.271345 0.476706 ~a;
    c 0.794549 0.275770 0.473117 ~a;
    c 0.798216 0.280197 0.469538 ~a;
    c 0.801855 0.284626 0.465971 ~a;
    c 0.805467 0.289057 0.462415 ~a;
    c 0.809052 0.293491 0.458870 ~a;
    c 0.812612 0.297928 0.455338 ~a;
    c 0.816144 0.302368 0.451816 ~a;
    c 0.819651 0.306812 0.448306 ~a;
    c 0.823132 0.311261 0.444806 ~a;
    c 0.826588 0.315714 0.441316 ~a;
    c 0.830018 0.320172 0.437836 ~a;
    c 0.833422 0.324635 0.434366 ~a;
    c 0.836801 0.329105 0.430905 ~a;
    c 0.840155 0.333580 0.427455 ~a;
    c 0.843484 0.338062 0.424013 ~a;
    c 0.846788 0.342551 0.420579 ~a;
    c 0.850066 0.347048 0.417153 ~a;
    c 0.853319 0.351553 0.413734 ~a;
    c 0.856547 0.356066 0.410322 ~a;
    c 0.859750 0.360588 0.406917 ~a;
    c 0.862927 0.365119 0.403519 ~a;
    c 0.866078 0.369660 0.400126 ~a;
    c 0.869203 0.374212 0.396738 ~a;
    c 0.872303 0.378774 0.393355 ~a;
    c 0.875376 0.383347 0.389976 ~a;
    c 0.878423 0.387932 0.386600 ~a;
    c 0.881443 0.392529 0.383229 ~a;
    c 0.884436 0.397139 0.379860 ~a;
    c 0.887402 0.401762 0.376494 ~a;
    c 0.890340 0.406398 0.373130 ~a;
    c 0.893250 0.411048 0.369768 ~a;
    c 0.896131 0.415712 0.366407 ~a;
    c 0.898984 0.420392 0.363047 ~a;
    c 0.901807 0.425087 0.359688 ~a;
    c 0.904601 0.429797 0.356329 ~a;
    c 0.907365 0.434524 0.352970 ~a;
    c 0.910098 0.439268 0.349610 ~a;
    c 0.912800 0.444029 0.346251 ~a;
    c 0.915471 0.448807 0.342890 ~a;
    c 0.918109 0.453603 0.339529 ~a;
    c 0.920714 0.458417 0.336166 ~a;
    c 0.923287 0.463251 0.332801 ~a;
    c 0.925825 0.468103 0.329435 ~a;
    c 0.928329 0.472975 0.326067 ~a;
    c 0.930798 0.477867 0.322697 ~a;
    c 0.933232 0.482780 0.319325 ~a;
    c 0.935630 0.487712 0.315952 ~a;
    c 0.937990 0.492667 0.312575 ~a;
    c 0.940313 0.497642 0.309197 ~a;
    c 0.942598 0.502639 0.305816 ~a;
    c 0.944844 0.507658 0.302433 ~a;
    c 0.947051 0.512699 0.299049 ~a;
    c 0.949217 0.517763 0.295662 ~a;
    c 0.951344 0.522850 0.292275 ~a;
    c 0.953428 0.527960 0.288883 ~a;
    c 0.955470 0.533093 0.285490 ~a;
    c 0.957469 0.538250 0.282096 ~a;
    c 0.959424 0.543431 0.278701 ~a;
    c 0.961336 0.548636 0.275305 ~a;
    c 0.963203 0.553865 0.271909 ~a;
    c 0.965024 0.559118 0.268513 ~a;
    c 0.966798 0.564396 0.265118 ~a;
    c 0.968526 0.569700 0.261721 ~a;
    c 0.970205 0.575028 0.258325 ~a;
    c 0.971835 0.580382 0.254931 ~a;
    c 0.973416 0.585761 0.251540 ~a;
    c 0.974947 0.591165 0.248151 ~a;
    c 0.976428 0.596595 0.244767 ~a;
    c 0.977856 0.602051 0.241387 ~a;
    c 0.979233 0.607532 0.238013 ~a;
    c 0.980556 0.613039 0.234646 ~a;
    c 0.981826 0.618572 0.231287 ~a;
    c 0.983041 0.624131 0.227937 ~a;
    c 0.984199 0.629718 0.224595 ~a;
    c 0.985301 0.635330 0.221265 ~a;
    c 0.986345 0.640969 0.217948 ~a;
    c 0.987332 0.646633 0.214648 ~a;
    c 0.988260 0.652325 0.211364 ~a;
    c 0.989128 0.658043 0.208100 ~a;
    c 0.989935 0.663787 0.204859 ~a;
    c 0.990681 0.669558 0.201642 ~a;
    c 0.991365 0.675355 0.198453 ~a;
    c 0.991985 0.681179 0.195295 ~a;
    c 0.992541 0.687030 0.192170 ~a;
    c 0.993032 0.692907 0.189084 ~a;
    c 0.993456 0.698810 0.186041 ~a;
    c 0.993814 0.704741 0.183043 ~a;
    c 0.994103 0.710698 0.180097 ~a;
    c 0.994324 0.716681 0.177208 ~a;
    c 0.994474 0.722691 0.174381 ~a;
    c 0.994553 0.728728 0.171622 ~a;
    c 0.994561 0.734791 0.168938 ~a;
    c 0.994495 0.740880 0.166335 ~a;
    c 0.994355 0.746995 0.163821 ~a;
    c 0.994141 0.753137 0.161404 ~a;
    c 0.993851 0.759304 0.159092 ~a;
    c 0.993482 0.765499 0.156891 ~a;
    c 0.993033 0.771720 0.154808 ~a;
    c 0.992505 0.777967 0.152855 ~a;
    c 0.991897 0.784239 0.151042 ~a;
    c 0.991209 0.790537 0.149377 ~a;
    c 0.990439 0.796859 0.147870 ~a;
    c 0.989587 0.803205 0.146529 ~a;
    c 0.988648 0.809579 0.145357 ~a;
    c 0.987621 0.815978 0.144363 ~a;
    c 0.986509 0.822401 0.143557 ~a;
    c 0.985314 0.828846 0.142945 ~a;
    c 0.984031 0.835315 0.142528 ~a;
    c 0.982653 0.841812 0.142303 ~a;
    c 0.981190 0.848329 0.142279 ~a;
    c 0.979644 0.854866 0.142453 ~a;
    c 0.977995 0.861432 0.142808 ~a;
    c 0.976265 0.868016 0.143351 ~a;
    c 0.974443 0.874622 0.144061 ~a;
    c 0.972530 0.881250 0.144923 ~a;
    c 0.970533 0.887896 0.145919 ~a;
    c 0.968443 0.894564 0.147014 ~a;
    c 0.966271 0.901249 0.148180 ~a;
    c 0.964021 0.907950 0.149370 ~a;
    c 0.961681 0.914672 0.150520 ~a;
    c 0.959276 0.921407 0.151566 ~a;
    c 0.956808 0.928152 0.152409 ~a;
    c 0.954287 0.934908 0.152921 ~a;
    c 0.951726 0.941671 0.152925 ~a;
    c 0.949151 0.948435 0.152178 ~a;
    c 0.946602 0.955190 0.150328 ~a;
    c 0.944152 0.961916 0.146861 ~a;
    c 0.941896 0.968590 0.140956 ~a;
    c 0.940015 0.975158 0.131326 ~a|]
  in
  fun t -> d.(Int.max 0 (Int.min 255 (truncate (t *. 256.))))

let sequential_viridis ?(a = 1.0) () =
  let d = [|
    c 0.267004 0.004874 0.329415 ~a;
    c 0.268510 0.009605 0.335427 ~a;
    c 0.269944 0.014625 0.341379 ~a;
    c 0.271305 0.019942 0.347269 ~a;
    c 0.272594 0.025563 0.353093 ~a;
    c 0.273809 0.031497 0.358853 ~a;
    c 0.274952 0.037752 0.364543 ~a;
    c 0.276022 0.044167 0.370164 ~a;
    c 0.277018 0.050344 0.375715 ~a;
    c 0.277941 0.056324 0.381191 ~a;
    c 0.278791 0.062145 0.386592 ~a;
    c 0.279566 0.067836 0.391917 ~a;
    c 0.280267 0.073417 0.397163 ~a;
    c 0.280894 0.078907 0.402329 ~a;
    c 0.281446 0.084320 0.407414 ~a;
    c 0.281924 0.089666 0.412415 ~a;
    c 0.282327 0.094955 0.417331 ~a;
    c 0.282656 0.100196 0.422160 ~a;
    c 0.282910 0.105393 0.426902 ~a;
    c 0.283091 0.110553 0.431554 ~a;
    c 0.283197 0.115680 0.436115 ~a;
    c 0.283229 0.120777 0.440584 ~a;
    c 0.283187 0.125848 0.444960 ~a;
    c 0.283072 0.130895 0.449241 ~a;
    c 0.282884 0.135920 0.453427 ~a;
    c 0.282623 0.140926 0.457517 ~a;
    c 0.282290 0.145912 0.461510 ~a;
    c 0.281887 0.150881 0.465405 ~a;
    c 0.281412 0.155834 0.469201 ~a;
    c 0.280868 0.160771 0.472899 ~a;
    c 0.280255 0.165693 0.476498 ~a;
    c 0.279574 0.170599 0.479997 ~a;
    c 0.278826 0.175490 0.483397 ~a;
    c 0.278012 0.180367 0.486697 ~a;
    c 0.277134 0.185228 0.489898 ~a;
    c 0.276194 0.190074 0.493001 ~a;
    c 0.275191 0.194905 0.496005 ~a;
    c 0.274128 0.199721 0.498911 ~a;
    c 0.273006 0.204520 0.501721 ~a;
    c 0.271828 0.209303 0.504434 ~a;
    c 0.270595 0.214069 0.507052 ~a;
    c 0.269308 0.218818 0.509577 ~a;
    c 0.267968 0.223549 0.512008 ~a;
    c 0.266580 0.228262 0.514349 ~a;
    c 0.265145 0.232956 0.516599 ~a;
    c 0.263663 0.237631 0.518762 ~a;
    c 0.262138 0.242286 0.520837 ~a;
    c 0.260571 0.246922 0.522828 ~a;
    c 0.258965 0.251537 0.524736 ~a;
    c 0.257322 0.256130 0.526563 ~a;
    c 0.255645 0.260703 0.528312 ~a;
    c 0.253935 0.265254 0.529983 ~a;
    c 0.252194 0.269783 0.531579 ~a;
    c 0.250425 0.274290 0.533103 ~a;
    c 0.248629 0.278775 0.534556 ~a;
    c 0.246811 0.283237 0.535941 ~a;
    c 0.244972 0.287675 0.537260 ~a;
    c 0.243113 0.292092 0.538516 ~a;
    c 0.241237 0.296485 0.539709 ~a;
    c 0.239346 0.300855 0.540844 ~a;
    c 0.237441 0.305202 0.541921 ~a;
    c 0.235526 0.309527 0.542944 ~a;
    c 0.233603 0.313828 0.543914 ~a;
    c 0.231674 0.318106 0.544834 ~a;
    c 0.229739 0.322361 0.545706 ~a;
    c 0.227802 0.326594 0.546532 ~a;
    c 0.225863 0.330805 0.547314 ~a;
    c 0.223925 0.334994 0.548053 ~a;
    c 0.221989 0.339161 0.548752 ~a;
    c 0.220057 0.343307 0.549413 ~a;
    c 0.218130 0.347432 0.550038 ~a;
    c 0.216210 0.351535 0.550627 ~a;
    c 0.214298 0.355619 0.551184 ~a;
    c 0.212395 0.359683 0.551710 ~a;
    c 0.210503 0.363727 0.552206 ~a;
    c 0.208623 0.367752 0.552675 ~a;
    c 0.206756 0.371758 0.553117 ~a;
    c 0.204903 0.375746 0.553533 ~a;
    c 0.203063 0.379716 0.553925 ~a;
    c 0.201239 0.383670 0.554294 ~a;
    c 0.199430 0.387607 0.554642 ~a;
    c 0.197636 0.391528 0.554969 ~a;
    c 0.195860 0.395433 0.555276 ~a;
    c 0.194100 0.399323 0.555565 ~a;
    c 0.192357 0.403199 0.555836 ~a;
    c 0.190631 0.407061 0.556089 ~a;
    c 0.188923 0.410910 0.556326 ~a;
    c 0.187231 0.414746 0.556547 ~a;
    c 0.185556 0.418570 0.556753 ~a;
    c 0.183898 0.422383 0.556944 ~a;
    c 0.182256 0.426184 0.557120 ~a;
    c 0.180629 0.429975 0.557282 ~a;
    c 0.179019 0.433756 0.557430 ~a;
    c 0.177423 0.437527 0.557565 ~a;
    c 0.175841 0.441290 0.557685 ~a;
    c 0.174274 0.445044 0.557792 ~a;
    c 0.172719 0.448791 0.557885 ~a;
    c 0.171176 0.452530 0.557965 ~a;
    c 0.169646 0.456262 0.558030 ~a;
    c 0.168126 0.459988 0.558082 ~a;
    c 0.166617 0.463708 0.558119 ~a;
    c 0.165117 0.467423 0.558141 ~a;
    c 0.163625 0.471133 0.558148 ~a;
    c 0.162142 0.474838 0.558140 ~a;
    c 0.160665 0.478540 0.558115 ~a;
    c 0.159194 0.482237 0.558073 ~a;
    c 0.157729 0.485932 0.558013 ~a;
    c 0.156270 0.489624 0.557936 ~a;
    c 0.154815 0.493313 0.557840 ~a;
    c 0.153364 0.497000 0.557724 ~a;
    c 0.151918 0.500685 0.557587 ~a;
    c 0.150476 0.504369 0.557430 ~a;
    c 0.149039 0.508051 0.557250 ~a;
    c 0.147607 0.511733 0.557049 ~a;
    c 0.146180 0.515413 0.556823 ~a;
    c 0.144759 0.519093 0.556572 ~a;
    c 0.143343 0.522773 0.556295 ~a;
    c 0.141935 0.526453 0.555991 ~a;
    c 0.140536 0.530132 0.555659 ~a;
    c 0.139147 0.533812 0.555298 ~a;
    c 0.137770 0.537492 0.554906 ~a;
    c 0.136408 0.541173 0.554483 ~a;
    c 0.135066 0.544853 0.554029 ~a;
    c 0.133743 0.548535 0.553541 ~a;
    c 0.132444 0.552216 0.553018 ~a;
    c 0.131172 0.555899 0.552459 ~a;
    c 0.129933 0.559582 0.551864 ~a;
    c 0.128729 0.563265 0.551229 ~a;
    c 0.127568 0.566949 0.550556 ~a;
    c 0.126453 0.570633 0.549841 ~a;
    c 0.125394 0.574318 0.549086 ~a;
    c 0.124395 0.578002 0.548287 ~a;
    c 0.123463 0.581687 0.547445 ~a;
    c 0.122606 0.585371 0.546557 ~a;
    c 0.121831 0.589055 0.545623 ~a;
    c 0.121148 0.592739 0.544641 ~a;
    c 0.120565 0.596422 0.543611 ~a;
    c 0.120092 0.600104 0.542530 ~a;
    c 0.119738 0.603785 0.541400 ~a;
    c 0.119512 0.607464 0.540218 ~a;
    c 0.119423 0.611141 0.538982 ~a;
    c 0.119483 0.614817 0.537692 ~a;
    c 0.119699 0.618490 0.536347 ~a;
    c 0.120081 0.622161 0.534946 ~a;
    c 0.120638 0.625828 0.533488 ~a;
    c 0.121380 0.629492 0.531973 ~a;
    c 0.122312 0.633153 0.530398 ~a;
    c 0.123444 0.636809 0.528763 ~a;
    c 0.124780 0.640461 0.527068 ~a;
    c 0.126326 0.644107 0.525311 ~a;
    c 0.128087 0.647749 0.523491 ~a;
    c 0.130067 0.651384 0.521608 ~a;
    c 0.132268 0.655014 0.519661 ~a;
    c 0.134692 0.658636 0.517649 ~a;
    c 0.137339 0.662252 0.515571 ~a;
    c 0.140210 0.665859 0.513427 ~a;
    c 0.143303 0.669459 0.511215 ~a;
    c 0.146616 0.673050 0.508936 ~a;
    c 0.150148 0.676631 0.506589 ~a;
    c 0.153894 0.680203 0.504172 ~a;
    c 0.157851 0.683765 0.501686 ~a;
    c 0.162016 0.687316 0.499129 ~a;
    c 0.166383 0.690856 0.496502 ~a;
    c 0.170948 0.694384 0.493803 ~a;
    c 0.175707 0.697900 0.491033 ~a;
    c 0.180653 0.701402 0.488189 ~a;
    c 0.185783 0.704891 0.485273 ~a;
    c 0.191090 0.708366 0.482284 ~a;
    c 0.196571 0.711827 0.479221 ~a;
    c 0.202219 0.715272 0.476084 ~a;
    c 0.208030 0.718701 0.472873 ~a;
    c 0.214000 0.722114 0.469588 ~a;
    c 0.220124 0.725509 0.466226 ~a;
    c 0.226397 0.728888 0.462789 ~a;
    c 0.232815 0.732247 0.459277 ~a;
    c 0.239374 0.735588 0.455688 ~a;
    c 0.246070 0.738910 0.452024 ~a;
    c 0.252899 0.742211 0.448284 ~a;
    c 0.259857 0.745492 0.444467 ~a;
    c 0.266941 0.748751 0.440573 ~a;
    c 0.274149 0.751988 0.436601 ~a;
    c 0.281477 0.755203 0.432552 ~a;
    c 0.288921 0.758394 0.428426 ~a;
    c 0.296479 0.761561 0.424223 ~a;
    c 0.304148 0.764704 0.419943 ~a;
    c 0.311925 0.767822 0.415586 ~a;
    c 0.319809 0.770914 0.411152 ~a;
    c 0.327796 0.773980 0.406640 ~a;
    c 0.335885 0.777018 0.402049 ~a;
    c 0.344074 0.780029 0.397381 ~a;
    c 0.352360 0.783011 0.392636 ~a;
    c 0.360741 0.785964 0.387814 ~a;
    c 0.369214 0.788888 0.382914 ~a;
    c 0.377779 0.791781 0.377939 ~a;
    c 0.386433 0.794644 0.372886 ~a;
    c 0.395174 0.797475 0.367757 ~a;
    c 0.404001 0.800275 0.362552 ~a;
    c 0.412913 0.803041 0.357269 ~a;
    c 0.421908 0.805774 0.351910 ~a;
    c 0.430983 0.808473 0.346476 ~a;
    c 0.440137 0.811138 0.340967 ~a;
    c 0.449368 0.813768 0.335384 ~a;
    c 0.458674 0.816363 0.329727 ~a;
    c 0.468053 0.818921 0.323998 ~a;
    c 0.477504 0.821444 0.318195 ~a;
    c 0.487026 0.823929 0.312321 ~a;
    c 0.496615 0.826376 0.306377 ~a;
    c 0.506271 0.828786 0.300362 ~a;
    c 0.515992 0.831158 0.294279 ~a;
    c 0.525776 0.833491 0.288127 ~a;
    c 0.535621 0.835785 0.281908 ~a;
    c 0.545524 0.838039 0.275626 ~a;
    c 0.555484 0.840254 0.269281 ~a;
    c 0.565498 0.842430 0.262877 ~a;
    c 0.575563 0.844566 0.256415 ~a;
    c 0.585678 0.846661 0.249897 ~a;
    c 0.595839 0.848717 0.243329 ~a;
    c 0.606045 0.850733 0.236712 ~a;
    c 0.616293 0.852709 0.230052 ~a;
    c 0.626579 0.854645 0.223353 ~a;
    c 0.636902 0.856542 0.216620 ~a;
    c 0.647257 0.858400 0.209861 ~a;
    c 0.657642 0.860219 0.203082 ~a;
    c 0.668054 0.861999 0.196293 ~a;
    c 0.678489 0.863742 0.189503 ~a;
    c 0.688944 0.865448 0.182725 ~a;
    c 0.699415 0.867117 0.175971 ~a;
    c 0.709898 0.868751 0.169257 ~a;
    c 0.720391 0.870350 0.162603 ~a;
    c 0.730889 0.871916 0.156029 ~a;
    c 0.741388 0.873449 0.149561 ~a;
    c 0.751884 0.874951 0.143228 ~a;
    c 0.762373 0.876424 0.137064 ~a;
    c 0.772852 0.877868 0.131109 ~a;
    c 0.783315 0.879285 0.125405 ~a;
    c 0.793760 0.880678 0.120005 ~a;
    c 0.804182 0.882046 0.114965 ~a;
    c 0.814576 0.883393 0.110347 ~a;
    c 0.824940 0.884720 0.106217 ~a;
    c 0.835270 0.886029 0.102646 ~a;
    c 0.845561 0.887322 0.099702 ~a;
    c 0.855810 0.888601 0.097452 ~a;
    c 0.866013 0.889868 0.095953 ~a;
    c 0.876168 0.891125 0.095250 ~a;
    c 0.886271 0.892374 0.095374 ~a;
    c 0.896320 0.893616 0.096335 ~a;
    c 0.906311 0.894855 0.098125 ~a;
    c 0.916242 0.896091 0.100717 ~a;
    c 0.926106 0.897330 0.104071 ~a;
    c 0.935904 0.898570 0.108131 ~a;
    c 0.945636 0.899815 0.112838 ~a;
    c 0.955300 0.901065 0.118128 ~a;
    c 0.964894 0.902323 0.123941 ~a;
    c 0.974417 0.903590 0.130215 ~a;
    c 0.983868 0.904867 0.136897 ~a;
    c 0.993248 0.906157 0.143936 ~a|]
  in
  fun t -> d.(Int.max 0 (Int.min 255 (truncate (t *. 256.))))

--------------------------------------------------------------------------- 
    Copyright ( c ) 2013 The gg programmers 

    Permission to use , copy , modify , and/or distribute this software for any 
    purpose with or without fee is hereby granted , provided that the above 
    copyright notice and this permission notice appear in all copies . 

    THE SOFTWARE IS PROVIDED " AS IS " AND THE AUTHOR DISCLAIMS ALL WARRANTIES 
    WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 
    MERCHANTABILITY AND FITNESS . IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 
    ANY SPECIAL , DIRECT , INDIRECT , OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 
     RESULTING FROM LOSS OF USE , DATA OR PROFITS , WHETHER IN AN 
    ACTION OF CONTRACT , NEGLIGENCE OR OTHER TORTIOUS ACTION , ARISING OUT OF 
    OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE . 
   ---------------------------------------------------------------------------
   Copyright (c) 2013 The gg programmers

   Permission to use, copy, modify, and/or distribute this software for any
   purpose with or without fee is hereby granted, provided that the above
   copyright notice and this permission notice appear in all copies.

   THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
   WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
   MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
   ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  ---------------------------------------------------------------------------*)

 Quadratic interpolation 
 Hue functions 
 mixes hue using shortest path on circle. 
 Saturation functions. 
 Sequential schemes 
 -work/0d177465a8151eb6ede1768d51d476c7 
 Diverging schemes 
 Qualitative schemes 
 Viridis colormaps
   As found in  
--------------------------------------------------------------------------- 
    Copyright ( c ) 2013 The gg programmers . All rights reserved . 
    Distributed under the ISC license , see terms at the end of the file . 
   ---------------------------------------------------------------------------
   Copyright (c) 2013 The gg programmers. All rights reserved.
   Distributed under the ISC license, see terms at the end of the file.
  ---------------------------------------------------------------------------*)

  ColorBrewer Color Schemes are Copyright 2002   ,   
    and the Pennsylvania State University . Licensed under the Apache License 
    version 2.0 . 
    See -2.0 

    The fixed qualitative color scheme `  and the generated color 
    schemes are taken from : 

    M. Wijffelaars , Synthesis of Color Palettes , Technische Universiteit 
    Eindhoven , 2008 . 

    M. Wijfeelaars et al , Generating Color Palettes using Intuitive 
    Parameters , Eurographics 2008 . 
    -8659.2008.01203.x 

    The turbo color scheme is Copyright 2019 Google LLC . Licensed under 
    the Apache License version 2.0 . 
    See -2.0 

    The sinebow color scheme is by   and   . 

    The magma , inferno , plasma and viridis schemes are by    , 
        , and ( in the case of  )   . They 
    are distributed under the  license .
   and the Pennsylvania State University. Licensed under the Apache License
   version 2.0.
   See -2.0

   The fixed qualitative color scheme `Wijffelaars_17 and the generated color
   schemes are taken from:

   M. Wijffelaars, Synthesis of Color Palettes, Technische Universiteit
   Eindhoven, 2008.

   M. Wijfeelaars et al, Generating Color Palettes using Intuitive
   Parameters, Eurographics 2008.
   -8659.2008.01203.x

   The turbo color scheme is Copyright 2019 Google LLC. Licensed under
   the Apache License version 2.0.
   See -2.0

   The sinebow color scheme is by Jim Bumgardner and Charlie Loyd.

   The magma, inferno, plasma and viridis schemes are by Nathaniel J. Smith,
   Stefan van der Walt, and (in the case of viridis) Eric Firing. They
   are distributed under the CC0 license. *)

open Gg

type continuous = float -> Gg.color
type discrete = int -> Gg.color

let r_lch_uv_c = 179.0413773582776
  yellow LCH_uv .


let quad a b0 b1 b2 t =
  let omt = 1. -. t in
  let c0 = omt *. omt in
  let c1 = 2. *. omt *. t in
  let c2 = t *. t in
  V3.(V4.v ((c0 *. (x b0)) +. (c1 *. (x b1)) +. (c2 *. (x b2)))
        ((c0 *. (y b0)) +. (c1 *. (y b1)) +. (c2 *. (y b2)))
        ((c0 *. (z b0)) +. (c1 *. (z b1)) +. (c2 *. (z b2)))
        a)

let inv_quad b0 b1 b2 v =
  let c = b0 -. (2. *. b1) +. b2 in
  let r = (b0 -. b1 +. sqrt ((b1 *. b1) -. (b0 *. b2) +. (c *. v))) /. c in
  r


let mod_hue h =
  let h = mod_float h Float.two_pi in
  if h < 0. then h +. Float.two_pi else h

  let d = (mod_hue (h1 -. h0 +. Float.pi)) -. Float.pi in
  mod_hue (h0 +. t *. d)

let diff_hue h0 h1 =
  let d = abs_float (h1 -. h0) in
  if d < Float.pi then d else Float.two_pi -. d

let rgb2xyz = M3.v
    0.4124564 0.3575761 0.1804375
    0.2126729 0.7151522 0.0721750
    0.0193339 0.1191920 0.9503041

  most satured color of [ h ] , see Wijffelaars 2008 , p. 36 .
  let u'n = 0.1978398 in
  let v'n = 0.4683363 in
  LCH_uv hue of RGB 1 . 0 . 0 .
  LCH_uv hue of RGB 1 . 1 . 0 .
  LCH_uv hue of RGB 0 . 1 . 0 .
  LCH_uv hue of RGB 0 . 1 . 1 .
  LCH_uv hue of RGB 0 . 0 . 1 .
  LCH_uv hue of RGB 1 . 0 . 1 .
  let r, s, t =
    if h0 <= h && h < h1 then 1, 2, 0 else
    if h1 <= h && h < h2 then 0, 2, 1 else
    if h2 <= h && h < h3 then 2, 0, 1 else
    if h3 <= h && h < h4 then 1, 0, 2 else
    if h4 <= h && h < h5 then 0, 1, 2 else
    if h5 <= h || h < h0 then 2, 1, 0 else
    assert false
  in
  let alpha = -. sin h in
  let beta = cos h in
  let f = alpha *. u'n +. beta *. v'n in
  let coeff p =
    let c0 = V3.(f *. ((x p) +. (15. *. (y p)) +. (3. *. (z p)))) in
    let c1 = V3.((4. *. alpha *. (x p)) +. (9. *. beta *. (y p))) in
    c0 -. c1
  in
  let rv = -. (coeff (M3.col t rgb2xyz)) /. (coeff (M3.col r rgb2xyz)) in
  let a = [|0.; 0.; 0.|] in
  a.(r) <- rv; a.(s) <- 0.; a.(t) <- 1.;
  match a with [|r; g; b|] -> Color.v r g b 1.0 | _ -> assert false


let max_s l h =
  let pmid = Color.to_lch_uv (msc h) in
  let pendL = if l <= V4.x pmid then 0. else 100. in
  let alpha = (l -. pendL) /. (V4.x pmid -. pendL) in
  alpha *. V4.y pmid


  see Wijffelaars 2008 p. 747 table 2 .
  let pb = y_lch_uv in
  let p2l = (1. -. w) *. 100. +. (w *. V3.x pb) in
  let p2h = mix_hue h (V3.z pb) w in
  let p2s = min (max_s p2l p2h) (w *. s *. V3.y pb) in
  V3.v p2l p2s p2h

  see Wijffelaars 2008 p. 747 table 1 .
    ?(a = 1.) ?(w = 0.) ?(s = 0.6) ?(b = 0.75) ?(c = 0.88) ~h ()
  =
  let p0 = V3.v 0. 0. h in
  let p1 = V3.of_v4 (Color.to_lch_uv (msc h)) in
  let p2 = if w > 0. then p2_multi_hue w s h else V3.v 100. 0. h in
  let q0 = V3.((1. -. s) * p0 + s * p1) in
  let q2 = V3.((1. -. s) * p2 + s * p1) in
  let q1 = V3.(0.5 * (q0 + q2)) in
  fun t ->
    let l t = 125. -. 125. *. (0.2 ** ((1. -. c) *. b +. t *. c)) in
    let t_ l =
      if l <= V3.x q1
      then 0.5 *. (inv_quad (V3.x p0) (V3.x q0) (V3.x q1) l)
      else
      if l <= V3.x p2 then
        0.5 *. (inv_quad (V3.x q1) (V3.x q2) (V3.x p2) l) +. 0.5
      else
  This can happen with w ! = 0 . , in which case inv_quad returns 
              NaN , just return the max .
             NaN, just return the max. *)
      1.
    in
    let cseq t =
      if t <= 0.5
      then quad a p0 q0 q1 (2. *. t)
      else quad a q1 q2 p2 (2. *. (t -. 0.5))
    in
    Color.clamp (Color.of_lch_uv (cseq (t_ (l t))))

let sequential_wijffelaars' ?a ?w ?s ?b ?c ~h ~size:n () =
  let c = match c with
  | None -> min 0.88 (0.34 +. (float n) *. 0.06)
  | Some c -> c
  in
  let seq = sequential_wijffelaars ?a ?w ?s ?b ~c ~h () in
  let max = float (n - 1) in
  let colors = Array.init n (fun i -> seq ((float i) /. max)) in
  fun i -> Array.get colors i

let sequential_turbo ?(a = 1.0) () = fun t ->
  let[@inline] dot4 x0 y0 z0 w0 x1 y1 z1 w1 =
    (x0 *. x1) +. (y0 *. y1) +. (z0 *. z1) +. (w0 *. w1)
  in
  let[@inline] dot2 x0 y0 x1 y1 = (x0 *. x1) +. (y0 *. y1) in
  let r4_x = 0.13572138 and r4_y = 4.61539260
  and r4_z = -42.66032258 and r4_w = 132.13108234 in
  let g4_x = 0.09140261 and g4_y = 2.19418839
  and g4_z = 4.84296658 and g4_w = -14.18503333 in
  let b4_x = 0.10667330 and b4_y = 12.64194608
  and b4_z = -60.58204836 and b4_w = 110.36276771 in
  let r2_x = -152.94239396 and r2_y = 59.28637943 in
  let g2_x = 4.27729857 and g2_y = 2.82956604 in
  let b2_x = -89.90310912 and b2_y = 27.34824973 in
  let v4_x = 1.0 and v4_y = t and v4_z = t *. t in let v4_w = t *. v4_z in
  let v2_x = v4_z *. v4_z in
  let v2_y = v4_w *. v4_z in
  let r =
    (dot4 v4_x v4_y v4_z v4_w r4_x r4_y r4_z r4_w) +.
    (dot2 v2_x v2_y r2_x r2_y)
  in
  let g =
    (dot4 v4_x v4_y v4_z v4_w g4_x g4_y g4_z g4_w) +.
    (dot2 v2_x v2_y g2_x g2_y)
  in
  let b =
    (dot4 v4_x v4_y v4_z v4_w b4_x b4_y b4_z b4_w) +.
    (dot2 v2_x v2_y b2_x b2_y)
  in
  Color.v_srgb r g b ~a


  see Wijffelaars 2008 p. 53 table 1 .
    ?(a = 1.) ?(w = 0.) ?(s = 0.6) ?(b = 0.75) ?(c = 0.88) ?(m = 0.5)
    ~h0 ~h1 ()
  =
  let seq0 = sequential_wijffelaars ~a ~w ~s ~b ~c ~h:h0 () in
  let seq1 = sequential_wijffelaars ~a ~w ~s ~b ~c ~h:h1 () in
  let e2 = 2. *. abs_float (m -. 0.5) in
  let t' =
    if m < 0.5 then (fun t -> (t +. e2) /. (1. +. e2)) else
    fun t -> t /. (1. +. e2)
  in
  let cm =
    let c0 = Color.to_lch_uv (seq0 1.) in
    let c1 = Color.to_lch_uv (seq1 1.) in
    let l = 0.5 *. (V4.x c0 +. V4.x c1) in
    let h = V3.z y_lch_uv in
    let s =
      let smax = w *. 0.5 *. (V4.y c0 +. V4.y c1) in
      min (max_s l h) smax
    in
    Color.of_lch_uv (V4.v l s h a)
  in
  fun t ->
    let t' = t' t in
    if Float.equal_tol ~eps:1e-8 t' 0.5 then cm else
    if t' < 0.5 then seq0 (2. *. t') else seq1 (2. *. (1. -. t'))

let diverging_wijffelaars' ?a ?w ?s ?b ?c ?(m = 0.5) ~h0 ~h1 ~size:n () =
  let c = match c with
  | None -> min 0.88 (1.0 -. 0.06 *. (11. -. (float (n / 2 + 1))))
  | Some c -> c
  in
  let m' = floor (2. *. m *. ((float n) -. 1.) +. 0.5) /. 2. in
  if mod_float (2. *. m') 2. = 0. then
    let max = float (n - 1) in
    let div = diverging_wijffelaars ?a ?w ?s ?b ~c ~m:(m' /. max) ~h0 ~h1 () in
    let colors = Array.init n (fun i -> div ((float i) /. max)) in
    fun i -> Array.get colors i
  else
  let max = float n in
  let m = ((m' +. 0.5) /. max) in
  let div = diverging_wijffelaars ?a ?w ?s ?b ~c ~m ~h0 ~h1 () in
  let colors =
    Array.init n
      (fun i ->
         let i = float i in
         if i < m' +. 0.5
         then div (i /. max)
         else div ((i +. 1.) /. max))
  in
  fun i -> Array.get colors i

  Cyclic schemes

let pi_1_div_3 = Float.pi /. 3.
let pi_2_div_3 = Float.two_pi /. 3.
let cyclic_sinebow ?(a = 1.0) () = fun t ->
  let t = (0.5 -. t) *. Float.pi in
  let r = let v = Float.sin t in v *. v in
  let g = let v = Float.sin (t +. pi_1_div_3) in v *. v in
  let b = let v = Float.sin (t +. pi_2_div_3) in v *. v in
  Color.v_srgb r g b ~a


type qualitative =
[ `Brewer_accent_8 | `Brewer_dark2_8 | `Brewer_paired_12
| `Brewer_pastel1_9 | `Brewer_pastel2_8 | `Brewer_set1_9
| `Brewer_set2_8 | `Brewer_set3_12 | `Tableau_10 | `Wijffelaars_17 ]

let qualitative_size = function
| `Brewer_accent_8 -> 8 | `Brewer_dark2_8 -> 8 | `Brewer_paired_12 -> 12
| `Brewer_pastel1_9 -> 9 | `Brewer_pastel2_8 -> 8 | `Brewer_set1_9 -> 9
| `Brewer_set2_8 -> 8 | `Brewer_set3_12 -> 12 | `Tableau_10 -> 10
| `Wijffelaars_17 -> 17

let rgb = Color.v_srgbi

let brewer_accent_8 ~a =
  [| rgb 127 201 127 ~a; rgb 190 174 212 ~a; rgb 253 192 134 ~a;
     rgb 255 255 153 ~a; rgb 56  108 176 ~a; rgb 240 2   127 ~a;
     rgb 191 91   23 ~a; rgb 102 102 102 ~a; |]

let brewer_dark2_8 ~a =
  [| rgb 27  158 119 ~a; rgb 217 95   2  ~a; rgb 117 112 179 ~a;
     rgb 231 41  138 ~a; rgb 102 166 30  ~a; rgb 230 171 2   ~a;
     rgb 166 118 29  ~a; rgb 102 102 102 ~a; |]

let brewer_paired_12 ~a =
  [| rgb 166 206 227 ~a; rgb 31  120 180 ~a; rgb 178 223 138 ~a;
     rgb 51  160 44  ~a; rgb 251 154 153 ~a; rgb 227 26  28  ~a;
     rgb 253 191 111 ~a; rgb 255 127 0   ~a; rgb 202 178 214 ~a;
     rgb 106 61  154 ~a; rgb 255 255 153 ~a; rgb 177 89  40  ~a; |]

let brewer_pastel1_9 ~a =
  [| rgb 251 180 174 ~a; rgb 179 205 227 ~a; rgb 204 235 197 ~a;
     rgb 222 203 228 ~a; rgb 254 217 166 ~a; rgb 255 255 204 ~a;
     rgb 229 216 189 ~a; rgb 253 218 236 ~a; rgb 242 242 242 ~a; |]

let brewer_pastel2_8 ~a =
  [| rgb 179 226 205 ~a; rgb 253 205 172 ~a; rgb 203 213 232 ~a;
     rgb 244 202 228 ~a; rgb 230 245 201 ~a; rgb 255 242 174 ~a;
     rgb 241 226 204 ~a; rgb 204 204 204 ~a; |]

let brewer_set1_9 ~a =
  [| rgb 228 26  28  ~a; rgb 55  126 184 ~a; rgb 77  175 74  ~a;
     rgb 152 78  163 ~a; rgb 255 127 0   ~a; rgb 255 255 51  ~a;
     rgb 166 86  40  ~a; rgb 247 129 191 ~a; rgb 153 153 153 ~a; |]

let brewer_set2_8 ~a =
  [| rgb 102 194 165 ~a; rgb 252 141 98  ~a; rgb 141 160 203 ~a;
     rgb 231 138 195 ~a; rgb 166 216 84  ~a; rgb 255 217 47  ~a;
     rgb 229 196 148 ~a; rgb 179 179 179 ~a; |]

let brewer_set3_12 ~a =
  [| rgb 141 211 199 ~a; rgb 255 255 179 ~a; rgb 190 186 218 ~a;
     rgb 251 128 114 ~a; rgb 128 177 211 ~a; rgb 253 180 98  ~a;
     rgb 179 222 105 ~a; rgb 252 205 229 ~a; rgb 217 217 217 ~a;
     rgb 188 128 189 ~a; rgb 204 235 197 ~a; rgb 255 237 111 ~a; |]

let tableau_10 ~a =
  [| rgb 0x4e 0x79 0xa7 ~a; rgb 0xf2 0x8e 0x2b ~a; rgb 0xe1 0x57 0x59 ~a;
     rgb 0x76 0xb7 0xb2 ~a; rgb 0x59 0xa1 0x4f ~a; rgb 0xed 0xc9 0x48 ~a;
     rgb 0xb0 0x7a 0xa1 ~a; rgb 0xff 0x9d 0xa7 ~a; rgb 0x9c 0x75 0x5f ~a;
     rgb 0xba 0xb0 0xab ~a; |]

let wijffelaars_17 ~a =
  [| rgb 92  107 247 ~a; rgb 255 89  89  ~a; rgb 92  203 92  ~a;
     rgb 255 177 17  ~a; rgb 170 97  187 ~a; rgb 255 255 95  ~a;
     rgb 255 137 235 ~a; rgb 145 101 62  ~a; rgb 193 193 193 ~a;
     rgb 92  229 214 ~a; rgb 201 255 135 ~a; rgb 255 224 204 ~a;
     rgb 173  45  92 ~a; rgb 227 196 239 ~a; rgb 226 212 149 ~a;
     rgb 204 241 255 ~a; rgb  87 142  82 ~a; |]

let qualitative ?(a = 1.) q () =
  let colors = match q with
  | `Brewer_accent_8 -> brewer_accent_8 ~a
  | `Brewer_dark2_8 -> brewer_dark2_8 ~a
  | `Brewer_paired_12 -> brewer_paired_12 ~a
  | `Brewer_pastel1_9 -> brewer_pastel1_9 ~a
  | `Brewer_pastel2_8 -> brewer_pastel2_8 ~a
  | `Brewer_set1_9 -> brewer_set1_9 ~a
  | `Brewer_set2_8 -> brewer_set2_8 ~a
  | `Brewer_set3_12 -> brewer_set3_12 ~a
  | `Tableau_10 -> tableau_10 ~a
  | `Wijffelaars_17 -> wijffelaars_17 ~a
  in
  fun i -> Array.get colors i

  see Wijffelaars 2008 , p. 65 .
    ?(a = 1.) ?(eps = 0.) ?(r = 1.) ?(s = 0.5) ?(b = 1.) ?(c = 0.5) ~size ()
  =
  let qual t =
    let h = mod_hue ((V3.z y_lch_uv) +. Float.two_pi *. (eps +. t *. r)) in
    let alpha = (diff_hue h (V3.z y_lch_uv)) /. Float.two_pi in
    let l0 = b *. V3.x y_lch_uv in
    let l1 = (1. -. c) *. l0 in
    let l = (1. -. alpha) *. l0 +. alpha *. l1 in
    let s = min (max_s l h) (s *. r_lch_uv_c) in
    Color.clamp (Color.of_lch_uv (V4.v l s h a))
  in
  let max = float size in
  let colors = Array.init size (fun i -> qual ((float i) /. max)) in
  fun i -> Array.get colors i


let c r g b ~a = Color.v_srgb r g b ~a

let sequential_magma ?(a = 1.0) () =
  let d = [|
    c 0.001462 0.000466 0.013866 ~a;
    c 0.002258 0.001295 0.018331 ~a;
    c 0.003279 0.002305 0.023708 ~a;
    c 0.004512 0.003490 0.029965 ~a;
    c 0.005950 0.004843 0.037130 ~a;
    c 0.007588 0.006356 0.044973 ~a;
    c 0.009426 0.008022 0.052844 ~a;
    c 0.011465 0.009828 0.060750 ~a;
    c 0.013708 0.011771 0.068667 ~a;
    c 0.016156 0.013840 0.076603 ~a;
    c 0.018815 0.016026 0.084584 ~a;
    c 0.021692 0.018320 0.092610 ~a;
    c 0.024792 0.020715 0.100676 ~a;
    c 0.028123 0.023201 0.108787 ~a;
    c 0.031696 0.025765 0.116965 ~a;
    c 0.035520 0.028397 0.125209 ~a;
    c 0.039608 0.031090 0.133515 ~a;
    c 0.043830 0.033830 0.141886 ~a;
    c 0.048062 0.036607 0.150327 ~a;
    c 0.052320 0.039407 0.158841 ~a;
    c 0.056615 0.042160 0.167446 ~a;
    c 0.060949 0.044794 0.176129 ~a;
    c 0.065330 0.047318 0.184892 ~a;
    c 0.069764 0.049726 0.193735 ~a;
    c 0.074257 0.052017 0.202660 ~a;
    c 0.078815 0.054184 0.211667 ~a;
    c 0.083446 0.056225 0.220755 ~a;
    c 0.088155 0.058133 0.229922 ~a;
    c 0.092949 0.059904 0.239164 ~a;
    c 0.097833 0.061531 0.248477 ~a;
    c 0.102815 0.063010 0.257854 ~a;
    c 0.107899 0.064335 0.267289 ~a;
    c 0.113094 0.065492 0.276784 ~a;
    c 0.118405 0.066479 0.286321 ~a;
    c 0.123833 0.067295 0.295879 ~a;
    c 0.129380 0.067935 0.305443 ~a;
    c 0.135053 0.068391 0.315000 ~a;
    c 0.140858 0.068654 0.324538 ~a;
    c 0.146785 0.068738 0.334011 ~a;
    c 0.152839 0.068637 0.343404 ~a;
    c 0.159018 0.068354 0.352688 ~a;
    c 0.165308 0.067911 0.361816 ~a;
    c 0.171713 0.067305 0.370771 ~a;
    c 0.178212 0.066576 0.379497 ~a;
    c 0.184801 0.065732 0.387973 ~a;
    c 0.191460 0.064818 0.396152 ~a;
    c 0.198177 0.063862 0.404009 ~a;
    c 0.204935 0.062907 0.411514 ~a;
    c 0.211718 0.061992 0.418647 ~a;
    c 0.218512 0.061158 0.425392 ~a;
    c 0.225302 0.060445 0.431742 ~a;
    c 0.232077 0.059889 0.437695 ~a;
    c 0.238826 0.059517 0.443256 ~a;
    c 0.245543 0.059352 0.448436 ~a;
    c 0.252220 0.059415 0.453248 ~a;
    c 0.258857 0.059706 0.457710 ~a;
    c 0.265447 0.060237 0.461840 ~a;
    c 0.271994 0.060994 0.465660 ~a;
    c 0.278493 0.061978 0.469190 ~a;
    c 0.284951 0.063168 0.472451 ~a;
    c 0.291366 0.064553 0.475462 ~a;
    c 0.297740 0.066117 0.478243 ~a;
    c 0.304081 0.067835 0.480812 ~a;
    c 0.310382 0.069702 0.483186 ~a;
    c 0.316654 0.071690 0.485380 ~a;
    c 0.322899 0.073782 0.487408 ~a;
    c 0.329114 0.075972 0.489287 ~a;
    c 0.335308 0.078236 0.491024 ~a;
    c 0.341482 0.080564 0.492631 ~a;
    c 0.347636 0.082946 0.494121 ~a;
    c 0.353773 0.085373 0.495501 ~a;
    c 0.359898 0.087831 0.496778 ~a;
    c 0.366012 0.090314 0.497960 ~a;
    c 0.372116 0.092816 0.499053 ~a;
    c 0.378211 0.095332 0.500067 ~a;
    c 0.384299 0.097855 0.501002 ~a;
    c 0.390384 0.100379 0.501864 ~a;
    c 0.396467 0.102902 0.502658 ~a;
    c 0.402548 0.105420 0.503386 ~a;
    c 0.408629 0.107930 0.504052 ~a;
    c 0.414709 0.110431 0.504662 ~a;
    c 0.420791 0.112920 0.505215 ~a;
    c 0.426877 0.115395 0.505714 ~a;
    c 0.432967 0.117855 0.506160 ~a;
    c 0.439062 0.120298 0.506555 ~a;
    c 0.445163 0.122724 0.506901 ~a;
    c 0.451271 0.125132 0.507198 ~a;
    c 0.457386 0.127522 0.507448 ~a;
    c 0.463508 0.129893 0.507652 ~a;
    c 0.469640 0.132245 0.507809 ~a;
    c 0.475780 0.134577 0.507921 ~a;
    c 0.481929 0.136891 0.507989 ~a;
    c 0.488088 0.139186 0.508011 ~a;
    c 0.494258 0.141462 0.507988 ~a;
    c 0.500438 0.143719 0.507920 ~a;
    c 0.506629 0.145958 0.507806 ~a;
    c 0.512831 0.148179 0.507648 ~a;
    c 0.519045 0.150383 0.507443 ~a;
    c 0.525270 0.152569 0.507192 ~a;
    c 0.531507 0.154739 0.506895 ~a;
    c 0.537755 0.156894 0.506551 ~a;
    c 0.544015 0.159033 0.506159 ~a;
    c 0.550287 0.161158 0.505719 ~a;
    c 0.556571 0.163269 0.505230 ~a;
    c 0.562866 0.165368 0.504692 ~a;
    c 0.569172 0.167454 0.504105 ~a;
    c 0.575490 0.169530 0.503466 ~a;
    c 0.581819 0.171596 0.502777 ~a;
    c 0.588158 0.173652 0.502035 ~a;
    c 0.594508 0.175701 0.501241 ~a;
    c 0.600868 0.177743 0.500394 ~a;
    c 0.607238 0.179779 0.499492 ~a;
    c 0.613617 0.181811 0.498536 ~a;
    c 0.620005 0.183840 0.497524 ~a;
    c 0.626401 0.185867 0.496456 ~a;
    c 0.632805 0.187893 0.495332 ~a;
    c 0.639216 0.189921 0.494150 ~a;
    c 0.645633 0.191952 0.492910 ~a;
    c 0.652056 0.193986 0.491611 ~a;
    c 0.658483 0.196027 0.490253 ~a;
    c 0.664915 0.198075 0.488836 ~a;
    c 0.671349 0.200133 0.487358 ~a;
    c 0.677786 0.202203 0.485819 ~a;
    c 0.684224 0.204286 0.484219 ~a;
    c 0.690661 0.206384 0.482558 ~a;
    c 0.697098 0.208501 0.480835 ~a;
    c 0.703532 0.210638 0.479049 ~a;
    c 0.709962 0.212797 0.477201 ~a;
    c 0.716387 0.214982 0.475290 ~a;
    c 0.722805 0.217194 0.473316 ~a;
    c 0.729216 0.219437 0.471279 ~a;
    c 0.735616 0.221713 0.469180 ~a;
    c 0.742004 0.224025 0.467018 ~a;
    c 0.748378 0.226377 0.464794 ~a;
    c 0.754737 0.228772 0.462509 ~a;
    c 0.761077 0.231214 0.460162 ~a;
    c 0.767398 0.233705 0.457755 ~a;
    c 0.773695 0.236249 0.455289 ~a;
    c 0.779968 0.238851 0.452765 ~a;
    c 0.786212 0.241514 0.450184 ~a;
    c 0.792427 0.244242 0.447543 ~a;
    c 0.798608 0.247040 0.444848 ~a;
    c 0.804752 0.249911 0.442102 ~a;
    c 0.810855 0.252861 0.439305 ~a;
    c 0.816914 0.255895 0.436461 ~a;
    c 0.822926 0.259016 0.433573 ~a;
    c 0.828886 0.262229 0.430644 ~a;
    c 0.834791 0.265540 0.427671 ~a;
    c 0.840636 0.268953 0.424666 ~a;
    c 0.846416 0.272473 0.421631 ~a;
    c 0.852126 0.276106 0.418573 ~a;
    c 0.857763 0.279857 0.415496 ~a;
    c 0.863320 0.283729 0.412403 ~a;
    c 0.868793 0.287728 0.409303 ~a;
    c 0.874176 0.291859 0.406205 ~a;
    c 0.879464 0.296125 0.403118 ~a;
    c 0.884651 0.300530 0.400047 ~a;
    c 0.889731 0.305079 0.397002 ~a;
    c 0.894700 0.309773 0.393995 ~a;
    c 0.899552 0.314616 0.391037 ~a;
    c 0.904281 0.319610 0.388137 ~a;
    c 0.908884 0.324755 0.385308 ~a;
    c 0.913354 0.330052 0.382563 ~a;
    c 0.917689 0.335500 0.379915 ~a;
    c 0.921884 0.341098 0.377376 ~a;
    c 0.925937 0.346844 0.374959 ~a;
    c 0.929845 0.352734 0.372677 ~a;
    c 0.933606 0.358764 0.370541 ~a;
    c 0.937221 0.364929 0.368567 ~a;
    c 0.940687 0.371224 0.366762 ~a;
    c 0.944006 0.377643 0.365136 ~a;
    c 0.947180 0.384178 0.363701 ~a;
    c 0.950210 0.390820 0.362468 ~a;
    c 0.953099 0.397563 0.361438 ~a;
    c 0.955849 0.404400 0.360619 ~a;
    c 0.958464 0.411324 0.360014 ~a;
    c 0.960949 0.418323 0.359630 ~a;
    c 0.963310 0.425390 0.359469 ~a;
    c 0.965549 0.432519 0.359529 ~a;
    c 0.967671 0.439703 0.359810 ~a;
    c 0.969680 0.446936 0.360311 ~a;
    c 0.971582 0.454210 0.361030 ~a;
    c 0.973381 0.461520 0.361965 ~a;
    c 0.975082 0.468861 0.363111 ~a;
    c 0.976690 0.476226 0.364466 ~a;
    c 0.978210 0.483612 0.366025 ~a;
    c 0.979645 0.491014 0.367783 ~a;
    c 0.981000 0.498428 0.369734 ~a;
    c 0.982279 0.505851 0.371874 ~a;
    c 0.983485 0.513280 0.374198 ~a;
    c 0.984622 0.520713 0.376698 ~a;
    c 0.985693 0.528148 0.379371 ~a;
    c 0.986700 0.535582 0.382210 ~a;
    c 0.987646 0.543015 0.385210 ~a;
    c 0.988533 0.550446 0.388365 ~a;
    c 0.989363 0.557873 0.391671 ~a;
    c 0.990138 0.565296 0.395122 ~a;
    c 0.990871 0.572706 0.398714 ~a;
    c 0.991558 0.580107 0.402441 ~a;
    c 0.992196 0.587502 0.406299 ~a;
    c 0.992785 0.594891 0.410283 ~a;
    c 0.993326 0.602275 0.414390 ~a;
    c 0.993834 0.609644 0.418613 ~a;
    c 0.994309 0.616999 0.422950 ~a;
    c 0.994738 0.624350 0.427397 ~a;
    c 0.995122 0.631696 0.431951 ~a;
    c 0.995480 0.639027 0.436607 ~a;
    c 0.995810 0.646344 0.441361 ~a;
    c 0.996096 0.653659 0.446213 ~a;
    c 0.996341 0.660969 0.451160 ~a;
    c 0.996580 0.668256 0.456192 ~a;
    c 0.996775 0.675541 0.461314 ~a;
    c 0.996925 0.682828 0.466526 ~a;
    c 0.997077 0.690088 0.471811 ~a;
    c 0.997186 0.697349 0.477182 ~a;
    c 0.997254 0.704611 0.482635 ~a;
    c 0.997325 0.711848 0.488154 ~a;
    c 0.997351 0.719089 0.493755 ~a;
    c 0.997351 0.726324 0.499428 ~a;
    c 0.997341 0.733545 0.505167 ~a;
    c 0.997285 0.740772 0.510983 ~a;
    c 0.997228 0.747981 0.516859 ~a;
    c 0.997138 0.755190 0.522806 ~a;
    c 0.997019 0.762398 0.528821 ~a;
    c 0.996898 0.769591 0.534892 ~a;
    c 0.996727 0.776795 0.541039 ~a;
    c 0.996571 0.783977 0.547233 ~a;
    c 0.996369 0.791167 0.553499 ~a;
    c 0.996162 0.798348 0.559820 ~a;
    c 0.995932 0.805527 0.566202 ~a;
    c 0.995680 0.812706 0.572645 ~a;
    c 0.995424 0.819875 0.579140 ~a;
    c 0.995131 0.827052 0.585701 ~a;
    c 0.994851 0.834213 0.592307 ~a;
    c 0.994524 0.841387 0.598983 ~a;
    c 0.994222 0.848540 0.605696 ~a;
    c 0.993866 0.855711 0.612482 ~a;
    c 0.993545 0.862859 0.619299 ~a;
    c 0.993170 0.870024 0.626189 ~a;
    c 0.992831 0.877168 0.633109 ~a;
    c 0.992440 0.884330 0.640099 ~a;
    c 0.992089 0.891470 0.647116 ~a;
    c 0.991688 0.898627 0.654202 ~a;
    c 0.991332 0.905763 0.661309 ~a;
    c 0.990930 0.912915 0.668481 ~a;
    c 0.990570 0.920049 0.675675 ~a;
    c 0.990175 0.927196 0.682926 ~a;
    c 0.989815 0.934329 0.690198 ~a;
    c 0.989434 0.941470 0.697519 ~a;
    c 0.989077 0.948604 0.704863 ~a;
    c 0.988717 0.955742 0.712242 ~a;
    c 0.988367 0.962878 0.719649 ~a;
    c 0.988033 0.970012 0.727077 ~a;
    c 0.987691 0.977154 0.734536 ~a;
    c 0.987387 0.984288 0.742002 ~a;
    c 0.987053 0.991438 0.749504 ~a|]
  in
  fun t -> d.(Int.max 0 (Int.min 255 (truncate (t *. 256.))))

let sequential_inferno ?(a = 1.0) () =
  let d = [|
    c 0.001462 0.000466 0.013866 ~a;
    c 0.002267 0.001270 0.018570 ~a;
    c 0.003299 0.002249 0.024239 ~a;
    c 0.004547 0.003392 0.030909 ~a;
    c 0.006006 0.004692 0.038558 ~a;
    c 0.007676 0.006136 0.046836 ~a;
    c 0.009561 0.007713 0.055143 ~a;
    c 0.011663 0.009417 0.063460 ~a;
    c 0.013995 0.011225 0.071862 ~a;
    c 0.016561 0.013136 0.080282 ~a;
    c 0.019373 0.015133 0.088767 ~a;
    c 0.022447 0.017199 0.097327 ~a;
    c 0.025793 0.019331 0.105930 ~a;
    c 0.029432 0.021503 0.114621 ~a;
    c 0.033385 0.023702 0.123397 ~a;
    c 0.037668 0.025921 0.132232 ~a;
    c 0.042253 0.028139 0.141141 ~a;
    c 0.046915 0.030324 0.150164 ~a;
    c 0.051644 0.032474 0.159254 ~a;
    c 0.056449 0.034569 0.168414 ~a;
    c 0.061340 0.036590 0.177642 ~a;
    c 0.066331 0.038504 0.186962 ~a;
    c 0.071429 0.040294 0.196354 ~a;
    c 0.076637 0.041905 0.205799 ~a;
    c 0.081962 0.043328 0.215289 ~a;
    c 0.087411 0.044556 0.224813 ~a;
    c 0.092990 0.045583 0.234358 ~a;
    c 0.098702 0.046402 0.243904 ~a;
    c 0.104551 0.047008 0.253430 ~a;
    c 0.110536 0.047399 0.262912 ~a;
    c 0.116656 0.047574 0.272321 ~a;
    c 0.122908 0.047536 0.281624 ~a;
    c 0.129285 0.047293 0.290788 ~a;
    c 0.135778 0.046856 0.299776 ~a;
    c 0.142378 0.046242 0.308553 ~a;
    c 0.149073 0.045468 0.317085 ~a;
    c 0.155850 0.044559 0.325338 ~a;
    c 0.162689 0.043554 0.333277 ~a;
    c 0.169575 0.042489 0.340874 ~a;
    c 0.176493 0.041402 0.348111 ~a;
    c 0.183429 0.040329 0.354971 ~a;
    c 0.190367 0.039309 0.361447 ~a;
    c 0.197297 0.038400 0.367535 ~a;
    c 0.204209 0.037632 0.373238 ~a;
    c 0.211095 0.037030 0.378563 ~a;
    c 0.217949 0.036615 0.383522 ~a;
    c 0.224763 0.036405 0.388129 ~a;
    c 0.231538 0.036405 0.392400 ~a;
    c 0.238273 0.036621 0.396353 ~a;
    c 0.244967 0.037055 0.400007 ~a;
    c 0.251620 0.037705 0.403378 ~a;
    c 0.258234 0.038571 0.406485 ~a;
    c 0.264810 0.039647 0.409345 ~a;
    c 0.271347 0.040922 0.411976 ~a;
    c 0.277850 0.042353 0.414392 ~a;
    c 0.284321 0.043933 0.416608 ~a;
    c 0.290763 0.045644 0.418637 ~a;
    c 0.297178 0.047470 0.420491 ~a;
    c 0.303568 0.049396 0.422182 ~a;
    c 0.309935 0.051407 0.423721 ~a;
    c 0.316282 0.053490 0.425116 ~a;
    c 0.322610 0.055634 0.426377 ~a;
    c 0.328921 0.057827 0.427511 ~a;
    c 0.335217 0.060060 0.428524 ~a;
    c 0.341500 0.062325 0.429425 ~a;
    c 0.347771 0.064616 0.430217 ~a;
    c 0.354032 0.066925 0.430906 ~a;
    c 0.360284 0.069247 0.431497 ~a;
    c 0.366529 0.071579 0.431994 ~a;
    c 0.372768 0.073915 0.432400 ~a;
    c 0.379001 0.076253 0.432719 ~a;
    c 0.385228 0.078591 0.432955 ~a;
    c 0.391453 0.080927 0.433109 ~a;
    c 0.397674 0.083257 0.433183 ~a;
    c 0.403894 0.085580 0.433179 ~a;
    c 0.410113 0.087896 0.433098 ~a;
    c 0.416331 0.090203 0.432943 ~a;
    c 0.422549 0.092501 0.432714 ~a;
    c 0.428768 0.094790 0.432412 ~a;
    c 0.434987 0.097069 0.432039 ~a;
    c 0.441207 0.099338 0.431594 ~a;
    c 0.447428 0.101597 0.431080 ~a;
    c 0.453651 0.103848 0.430498 ~a;
    c 0.459875 0.106089 0.429846 ~a;
    c 0.466100 0.108322 0.429125 ~a;
    c 0.472328 0.110547 0.428334 ~a;
    c 0.478558 0.112764 0.427475 ~a;
    c 0.484789 0.114974 0.426548 ~a;
    c 0.491022 0.117179 0.425552 ~a;
    c 0.497257 0.119379 0.424488 ~a;
    c 0.503493 0.121575 0.423356 ~a;
    c 0.509730 0.123769 0.422156 ~a;
    c 0.515967 0.125960 0.420887 ~a;
    c 0.522206 0.128150 0.419549 ~a;
    c 0.528444 0.130341 0.418142 ~a;
    c 0.534683 0.132534 0.416667 ~a;
    c 0.540920 0.134729 0.415123 ~a;
    c 0.547157 0.136929 0.413511 ~a;
    c 0.553392 0.139134 0.411829 ~a;
    c 0.559624 0.141346 0.410078 ~a;
    c 0.565854 0.143567 0.408258 ~a;
    c 0.572081 0.145797 0.406369 ~a;
    c 0.578304 0.148039 0.404411 ~a;
    c 0.584521 0.150294 0.402385 ~a;
    c 0.590734 0.152563 0.400290 ~a;
    c 0.596940 0.154848 0.398125 ~a;
    c 0.603139 0.157151 0.395891 ~a;
    c 0.609330 0.159474 0.393589 ~a;
    c 0.615513 0.161817 0.391219 ~a;
    c 0.621685 0.164184 0.388781 ~a;
    c 0.627847 0.166575 0.386276 ~a;
    c 0.633998 0.168992 0.383704 ~a;
    c 0.640135 0.171438 0.381065 ~a;
    c 0.646260 0.173914 0.378359 ~a;
    c 0.652369 0.176421 0.375586 ~a;
    c 0.658463 0.178962 0.372748 ~a;
    c 0.664540 0.181539 0.369846 ~a;
    c 0.670599 0.184153 0.366879 ~a;
    c 0.676638 0.186807 0.363849 ~a;
    c 0.682656 0.189501 0.360757 ~a;
    c 0.688653 0.192239 0.357603 ~a;
    c 0.694627 0.195021 0.354388 ~a;
    c 0.700576 0.197851 0.351113 ~a;
    c 0.706500 0.200728 0.347777 ~a;
    c 0.712396 0.203656 0.344383 ~a;
    c 0.718264 0.206636 0.340931 ~a;
    c 0.724103 0.209670 0.337424 ~a;
    c 0.729909 0.212759 0.333861 ~a;
    c 0.735683 0.215906 0.330245 ~a;
    c 0.741423 0.219112 0.326576 ~a;
    c 0.747127 0.222378 0.322856 ~a;
    c 0.752794 0.225706 0.319085 ~a;
    c 0.758422 0.229097 0.315266 ~a;
    c 0.764010 0.232554 0.311399 ~a;
    c 0.769556 0.236077 0.307485 ~a;
    c 0.775059 0.239667 0.303526 ~a;
    c 0.780517 0.243327 0.299523 ~a;
    c 0.785929 0.247056 0.295477 ~a;
    c 0.791293 0.250856 0.291390 ~a;
    c 0.796607 0.254728 0.287264 ~a;
    c 0.801871 0.258674 0.283099 ~a;
    c 0.807082 0.262692 0.278898 ~a;
    c 0.812239 0.266786 0.274661 ~a;
    c 0.817341 0.270954 0.270390 ~a;
    c 0.822386 0.275197 0.266085 ~a;
    c 0.827372 0.279517 0.261750 ~a;
    c 0.832299 0.283913 0.257383 ~a;
    c 0.837165 0.288385 0.252988 ~a;
    c 0.841969 0.292933 0.248564 ~a;
    c 0.846709 0.297559 0.244113 ~a;
    c 0.851384 0.302260 0.239636 ~a;
    c 0.855992 0.307038 0.235133 ~a;
    c 0.860533 0.311892 0.230606 ~a;
    c 0.865006 0.316822 0.226055 ~a;
    c 0.869409 0.321827 0.221482 ~a;
    c 0.873741 0.326906 0.216886 ~a;
    c 0.878001 0.332060 0.212268 ~a;
    c 0.882188 0.337287 0.207628 ~a;
    c 0.886302 0.342586 0.202968 ~a;
    c 0.890341 0.347957 0.198286 ~a;
    c 0.894305 0.353399 0.193584 ~a;
    c 0.898192 0.358911 0.188860 ~a;
    c 0.902003 0.364492 0.184116 ~a;
    c 0.905735 0.370140 0.179350 ~a;
    c 0.909390 0.375856 0.174563 ~a;
    c 0.912966 0.381636 0.169755 ~a;
    c 0.916462 0.387481 0.164924 ~a;
    c 0.919879 0.393389 0.160070 ~a;
    c 0.923215 0.399359 0.155193 ~a;
    c 0.926470 0.405389 0.150292 ~a;
    c 0.929644 0.411479 0.145367 ~a;
    c 0.932737 0.417627 0.140417 ~a;
    c 0.935747 0.423831 0.135440 ~a;
    c 0.938675 0.430091 0.130438 ~a;
    c 0.941521 0.436405 0.125409 ~a;
    c 0.944285 0.442772 0.120354 ~a;
    c 0.946965 0.449191 0.115272 ~a;
    c 0.949562 0.455660 0.110164 ~a;
    c 0.952075 0.462178 0.105031 ~a;
    c 0.954506 0.468744 0.099874 ~a;
    c 0.956852 0.475356 0.094695 ~a;
    c 0.959114 0.482014 0.089499 ~a;
    c 0.961293 0.488716 0.084289 ~a;
    c 0.963387 0.495462 0.079073 ~a;
    c 0.965397 0.502249 0.073859 ~a;
    c 0.967322 0.509078 0.068659 ~a;
    c 0.969163 0.515946 0.063488 ~a;
    c 0.970919 0.522853 0.058367 ~a;
    c 0.972590 0.529798 0.053324 ~a;
    c 0.974176 0.536780 0.048392 ~a;
    c 0.975677 0.543798 0.043618 ~a;
    c 0.977092 0.550850 0.039050 ~a;
    c 0.978422 0.557937 0.034931 ~a;
    c 0.979666 0.565057 0.031409 ~a;
    c 0.980824 0.572209 0.028508 ~a;
    c 0.981895 0.579392 0.026250 ~a;
    c 0.982881 0.586606 0.024661 ~a;
    c 0.983779 0.593849 0.023770 ~a;
    c 0.984591 0.601122 0.023606 ~a;
    c 0.985315 0.608422 0.024202 ~a;
    c 0.985952 0.615750 0.025592 ~a;
    c 0.986502 0.623105 0.027814 ~a;
    c 0.986964 0.630485 0.030908 ~a;
    c 0.987337 0.637890 0.034916 ~a;
    c 0.987622 0.645320 0.039886 ~a;
    c 0.987819 0.652773 0.045581 ~a;
    c 0.987926 0.660250 0.051750 ~a;
    c 0.987945 0.667748 0.058329 ~a;
    c 0.987874 0.675267 0.065257 ~a;
    c 0.987714 0.682807 0.072489 ~a;
    c 0.987464 0.690366 0.079990 ~a;
    c 0.987124 0.697944 0.087731 ~a;
    c 0.986694 0.705540 0.095694 ~a;
    c 0.986175 0.713153 0.103863 ~a;
    c 0.985566 0.720782 0.112229 ~a;
    c 0.984865 0.728427 0.120785 ~a;
    c 0.984075 0.736087 0.129527 ~a;
    c 0.983196 0.743758 0.138453 ~a;
    c 0.982228 0.751442 0.147565 ~a;
    c 0.981173 0.759135 0.156863 ~a;
    c 0.980032 0.766837 0.166353 ~a;
    c 0.978806 0.774545 0.176037 ~a;
    c 0.977497 0.782258 0.185923 ~a;
    c 0.976108 0.789974 0.196018 ~a;
    c 0.974638 0.797692 0.206332 ~a;
    c 0.973088 0.805409 0.216877 ~a;
    c 0.971468 0.813122 0.227658 ~a;
    c 0.969783 0.820825 0.238686 ~a;
    c 0.968041 0.828515 0.249972 ~a;
    c 0.966243 0.836191 0.261534 ~a;
    c 0.964394 0.843848 0.273391 ~a;
    c 0.962517 0.851476 0.285546 ~a;
    c 0.960626 0.859069 0.298010 ~a;
    c 0.958720 0.866624 0.310820 ~a;
    c 0.956834 0.874129 0.323974 ~a;
    c 0.954997 0.881569 0.337475 ~a;
    c 0.953215 0.888942 0.351369 ~a;
    c 0.951546 0.896226 0.365627 ~a;
    c 0.950018 0.903409 0.380271 ~a;
    c 0.948683 0.910473 0.395289 ~a;
    c 0.947594 0.917399 0.410665 ~a;
    c 0.946809 0.924168 0.426373 ~a;
    c 0.946392 0.930761 0.442367 ~a;
    c 0.946403 0.937159 0.458592 ~a;
    c 0.946903 0.943348 0.474970 ~a;
    c 0.947937 0.949318 0.491426 ~a;
    c 0.949545 0.955063 0.507860 ~a;
    c 0.951740 0.960587 0.524203 ~a;
    c 0.954529 0.965896 0.540361 ~a;
    c 0.957896 0.971003 0.556275 ~a;
    c 0.961812 0.975924 0.571925 ~a;
    c 0.966249 0.980678 0.587206 ~a;
    c 0.971162 0.985282 0.602154 ~a;
    c 0.976511 0.989753 0.616760 ~a;
    c 0.982257 0.994109 0.631017 ~a;
    c 0.988362 0.998364 0.644924 ~a|]
  in
  fun t -> d.(Int.max 0 (Int.min 255 (truncate (t *. 256.))))

let sequential_plasma ?(a = 1.0) () =
  let d = [|
    c 0.050383 0.029803 0.527975 ~a;
    c 0.063536 0.028426 0.533124 ~a;
    c 0.075353 0.027206 0.538007 ~a;
    c 0.086222 0.026125 0.542658 ~a;
    c 0.096379 0.025165 0.547103 ~a;
    c 0.105980 0.024309 0.551368 ~a;
    c 0.115124 0.023556 0.555468 ~a;
    c 0.123903 0.022878 0.559423 ~a;
    c 0.132381 0.022258 0.563250 ~a;
    c 0.140603 0.021687 0.566959 ~a;
    c 0.148607 0.021154 0.570562 ~a;
    c 0.156421 0.020651 0.574065 ~a;
    c 0.164070 0.020171 0.577478 ~a;
    c 0.171574 0.019706 0.580806 ~a;
    c 0.178950 0.019252 0.584054 ~a;
    c 0.186213 0.018803 0.587228 ~a;
    c 0.193374 0.018354 0.590330 ~a;
    c 0.200445 0.017902 0.593364 ~a;
    c 0.207435 0.017442 0.596333 ~a;
    c 0.214350 0.016973 0.599239 ~a;
    c 0.221197 0.016497 0.602083 ~a;
    c 0.227983 0.016007 0.604867 ~a;
    c 0.234715 0.015502 0.607592 ~a;
    c 0.241396 0.014979 0.610259 ~a;
    c 0.248032 0.014439 0.612868 ~a;
    c 0.254627 0.013882 0.615419 ~a;
    c 0.261183 0.013308 0.617911 ~a;
    c 0.267703 0.012716 0.620346 ~a;
    c 0.274191 0.012109 0.622722 ~a;
    c 0.280648 0.011488 0.625038 ~a;
    c 0.287076 0.010855 0.627295 ~a;
    c 0.293478 0.010213 0.629490 ~a;
    c 0.299855 0.009561 0.631624 ~a;
    c 0.306210 0.008902 0.633694 ~a;
    c 0.312543 0.008239 0.635700 ~a;
    c 0.318856 0.007576 0.637640 ~a;
    c 0.325150 0.006915 0.639512 ~a;
    c 0.331426 0.006261 0.641316 ~a;
    c 0.337683 0.005618 0.643049 ~a;
    c 0.343925 0.004991 0.644710 ~a;
    c 0.350150 0.004382 0.646298 ~a;
    c 0.356359 0.003798 0.647810 ~a;
    c 0.362553 0.003243 0.649245 ~a;
    c 0.368733 0.002724 0.650601 ~a;
    c 0.374897 0.002245 0.651876 ~a;
    c 0.381047 0.001814 0.653068 ~a;
    c 0.387183 0.001434 0.654177 ~a;
    c 0.393304 0.001114 0.655199 ~a;
    c 0.399411 0.000859 0.656133 ~a;
    c 0.405503 0.000678 0.656977 ~a;
    c 0.411580 0.000577 0.657730 ~a;
    c 0.417642 0.000564 0.658390 ~a;
    c 0.423689 0.000646 0.658956 ~a;
    c 0.429719 0.000831 0.659425 ~a;
    c 0.435734 0.001127 0.659797 ~a;
    c 0.441732 0.001540 0.660069 ~a;
    c 0.447714 0.002080 0.660240 ~a;
    c 0.453677 0.002755 0.660310 ~a;
    c 0.459623 0.003574 0.660277 ~a;
    c 0.465550 0.004545 0.660139 ~a;
    c 0.471457 0.005678 0.659897 ~a;
    c 0.477344 0.006980 0.659549 ~a;
    c 0.483210 0.008460 0.659095 ~a;
    c 0.489055 0.010127 0.658534 ~a;
    c 0.494877 0.011990 0.657865 ~a;
    c 0.500678 0.014055 0.657088 ~a;
    c 0.506454 0.016333 0.656202 ~a;
    c 0.512206 0.018833 0.655209 ~a;
    c 0.517933 0.021563 0.654109 ~a;
    c 0.523633 0.024532 0.652901 ~a;
    c 0.529306 0.027747 0.651586 ~a;
    c 0.534952 0.031217 0.650165 ~a;
    c 0.540570 0.034950 0.648640 ~a;
    c 0.546157 0.038954 0.647010 ~a;
    c 0.551715 0.043136 0.645277 ~a;
    c 0.557243 0.047331 0.643443 ~a;
    c 0.562738 0.051545 0.641509 ~a;
    c 0.568201 0.055778 0.639477 ~a;
    c 0.573632 0.060028 0.637349 ~a;
    c 0.579029 0.064296 0.635126 ~a;
    c 0.584391 0.068579 0.632812 ~a;
    c 0.589719 0.072878 0.630408 ~a;
    c 0.595011 0.077190 0.627917 ~a;
    c 0.600266 0.081516 0.625342 ~a;
    c 0.605485 0.085854 0.622686 ~a;
    c 0.610667 0.090204 0.619951 ~a;
    c 0.615812 0.094564 0.617140 ~a;
    c 0.620919 0.098934 0.614257 ~a;
    c 0.625987 0.103312 0.611305 ~a;
    c 0.631017 0.107699 0.608287 ~a;
    c 0.636008 0.112092 0.605205 ~a;
    c 0.640959 0.116492 0.602065 ~a;
    c 0.645872 0.120898 0.598867 ~a;
    c 0.650746 0.125309 0.595617 ~a;
    c 0.655580 0.129725 0.592317 ~a;
    c 0.660374 0.134144 0.588971 ~a;
    c 0.665129 0.138566 0.585582 ~a;
    c 0.669845 0.142992 0.582154 ~a;
    c 0.674522 0.147419 0.578688 ~a;
    c 0.679160 0.151848 0.575189 ~a;
    c 0.683758 0.156278 0.571660 ~a;
    c 0.688318 0.160709 0.568103 ~a;
    c 0.692840 0.165141 0.564522 ~a;
    c 0.697324 0.169573 0.560919 ~a;
    c 0.701769 0.174005 0.557296 ~a;
    c 0.706178 0.178437 0.553657 ~a;
    c 0.710549 0.182868 0.550004 ~a;
    c 0.714883 0.187299 0.546338 ~a;
    c 0.719181 0.191729 0.542663 ~a;
    c 0.723444 0.196158 0.538981 ~a;
    c 0.727670 0.200586 0.535293 ~a;
    c 0.731862 0.205013 0.531601 ~a;
    c 0.736019 0.209439 0.527908 ~a;
    c 0.740143 0.213864 0.524216 ~a;
    c 0.744232 0.218288 0.520524 ~a;
    c 0.748289 0.222711 0.516834 ~a;
    c 0.752312 0.227133 0.513149 ~a;
    c 0.756304 0.231555 0.509468 ~a;
    c 0.760264 0.235976 0.505794 ~a;
    c 0.764193 0.240396 0.502126 ~a;
    c 0.768090 0.244817 0.498465 ~a;
    c 0.771958 0.249237 0.494813 ~a;
    c 0.775796 0.253658 0.491171 ~a;
    c 0.779604 0.258078 0.487539 ~a;
    c 0.783383 0.262500 0.483918 ~a;
    c 0.787133 0.266922 0.480307 ~a;
    c 0.790855 0.271345 0.476706 ~a;
    c 0.794549 0.275770 0.473117 ~a;
    c 0.798216 0.280197 0.469538 ~a;
    c 0.801855 0.284626 0.465971 ~a;
    c 0.805467 0.289057 0.462415 ~a;
    c 0.809052 0.293491 0.458870 ~a;
    c 0.812612 0.297928 0.455338 ~a;
    c 0.816144 0.302368 0.451816 ~a;
    c 0.819651 0.306812 0.448306 ~a;
    c 0.823132 0.311261 0.444806 ~a;
    c 0.826588 0.315714 0.441316 ~a;
    c 0.830018 0.320172 0.437836 ~a;
    c 0.833422 0.324635 0.434366 ~a;
    c 0.836801 0.329105 0.430905 ~a;
    c 0.840155 0.333580 0.427455 ~a;
    c 0.843484 0.338062 0.424013 ~a;
    c 0.846788 0.342551 0.420579 ~a;
    c 0.850066 0.347048 0.417153 ~a;
    c 0.853319 0.351553 0.413734 ~a;
    c 0.856547 0.356066 0.410322 ~a;
    c 0.859750 0.360588 0.406917 ~a;
    c 0.862927 0.365119 0.403519 ~a;
    c 0.866078 0.369660 0.400126 ~a;
    c 0.869203 0.374212 0.396738 ~a;
    c 0.872303 0.378774 0.393355 ~a;
    c 0.875376 0.383347 0.389976 ~a;
    c 0.878423 0.387932 0.386600 ~a;
    c 0.881443 0.392529 0.383229 ~a;
    c 0.884436 0.397139 0.379860 ~a;
    c 0.887402 0.401762 0.376494 ~a;
    c 0.890340 0.406398 0.373130 ~a;
    c 0.893250 0.411048 0.369768 ~a;
    c 0.896131 0.415712 0.366407 ~a;
    c 0.898984 0.420392 0.363047 ~a;
    c 0.901807 0.425087 0.359688 ~a;
    c 0.904601 0.429797 0.356329 ~a;
    c 0.907365 0.434524 0.352970 ~a;
    c 0.910098 0.439268 0.349610 ~a;
    c 0.912800 0.444029 0.346251 ~a;
    c 0.915471 0.448807 0.342890 ~a;
    c 0.918109 0.453603 0.339529 ~a;
    c 0.920714 0.458417 0.336166 ~a;
    c 0.923287 0.463251 0.332801 ~a;
    c 0.925825 0.468103 0.329435 ~a;
    c 0.928329 0.472975 0.326067 ~a;
    c 0.930798 0.477867 0.322697 ~a;
    c 0.933232 0.482780 0.319325 ~a;
    c 0.935630 0.487712 0.315952 ~a;
    c 0.937990 0.492667 0.312575 ~a;
    c 0.940313 0.497642 0.309197 ~a;
    c 0.942598 0.502639 0.305816 ~a;
    c 0.944844 0.507658 0.302433 ~a;
    c 0.947051 0.512699 0.299049 ~a;
    c 0.949217 0.517763 0.295662 ~a;
    c 0.951344 0.522850 0.292275 ~a;
    c 0.953428 0.527960 0.288883 ~a;
    c 0.955470 0.533093 0.285490 ~a;
    c 0.957469 0.538250 0.282096 ~a;
    c 0.959424 0.543431 0.278701 ~a;
    c 0.961336 0.548636 0.275305 ~a;
    c 0.963203 0.553865 0.271909 ~a;
    c 0.965024 0.559118 0.268513 ~a;
    c 0.966798 0.564396 0.265118 ~a;
    c 0.968526 0.569700 0.261721 ~a;
    c 0.970205 0.575028 0.258325 ~a;
    c 0.971835 0.580382 0.254931 ~a;
    c 0.973416 0.585761 0.251540 ~a;
    c 0.974947 0.591165 0.248151 ~a;
    c 0.976428 0.596595 0.244767 ~a;
    c 0.977856 0.602051 0.241387 ~a;
    c 0.979233 0.607532 0.238013 ~a;
    c 0.980556 0.613039 0.234646 ~a;
    c 0.981826 0.618572 0.231287 ~a;
    c 0.983041 0.624131 0.227937 ~a;
    c 0.984199 0.629718 0.224595 ~a;
    c 0.985301 0.635330 0.221265 ~a;
    c 0.986345 0.640969 0.217948 ~a;
    c 0.987332 0.646633 0.214648 ~a;
    c 0.988260 0.652325 0.211364 ~a;
    c 0.989128 0.658043 0.208100 ~a;
    c 0.989935 0.663787 0.204859 ~a;
    c 0.990681 0.669558 0.201642 ~a;
    c 0.991365 0.675355 0.198453 ~a;
    c 0.991985 0.681179 0.195295 ~a;
    c 0.992541 0.687030 0.192170 ~a;
    c 0.993032 0.692907 0.189084 ~a;
    c 0.993456 0.698810 0.186041 ~a;
    c 0.993814 0.704741 0.183043 ~a;
    c 0.994103 0.710698 0.180097 ~a;
    c 0.994324 0.716681 0.177208 ~a;
    c 0.994474 0.722691 0.174381 ~a;
    c 0.994553 0.728728 0.171622 ~a;
    c 0.994561 0.734791 0.168938 ~a;
    c 0.994495 0.740880 0.166335 ~a;
    c 0.994355 0.746995 0.163821 ~a;
    c 0.994141 0.753137 0.161404 ~a;
    c 0.993851 0.759304 0.159092 ~a;
    c 0.993482 0.765499 0.156891 ~a;
    c 0.993033 0.771720 0.154808 ~a;
    c 0.992505 0.777967 0.152855 ~a;
    c 0.991897 0.784239 0.151042 ~a;
    c 0.991209 0.790537 0.149377 ~a;
    c 0.990439 0.796859 0.147870 ~a;
    c 0.989587 0.803205 0.146529 ~a;
    c 0.988648 0.809579 0.145357 ~a;
    c 0.987621 0.815978 0.144363 ~a;
    c 0.986509 0.822401 0.143557 ~a;
    c 0.985314 0.828846 0.142945 ~a;
    c 0.984031 0.835315 0.142528 ~a;
    c 0.982653 0.841812 0.142303 ~a;
    c 0.981190 0.848329 0.142279 ~a;
    c 0.979644 0.854866 0.142453 ~a;
    c 0.977995 0.861432 0.142808 ~a;
    c 0.976265 0.868016 0.143351 ~a;
    c 0.974443 0.874622 0.144061 ~a;
    c 0.972530 0.881250 0.144923 ~a;
    c 0.970533 0.887896 0.145919 ~a;
    c 0.968443 0.894564 0.147014 ~a;
    c 0.966271 0.901249 0.148180 ~a;
    c 0.964021 0.907950 0.149370 ~a;
    c 0.961681 0.914672 0.150520 ~a;
    c 0.959276 0.921407 0.151566 ~a;
    c 0.956808 0.928152 0.152409 ~a;
    c 0.954287 0.934908 0.152921 ~a;
    c 0.951726 0.941671 0.152925 ~a;
    c 0.949151 0.948435 0.152178 ~a;
    c 0.946602 0.955190 0.150328 ~a;
    c 0.944152 0.961916 0.146861 ~a;
    c 0.941896 0.968590 0.140956 ~a;
    c 0.940015 0.975158 0.131326 ~a|]
  in
  fun t -> d.(Int.max 0 (Int.min 255 (truncate (t *. 256.))))

let sequential_viridis ?(a = 1.0) () =
  let d = [|
    c 0.267004 0.004874 0.329415 ~a;
    c 0.268510 0.009605 0.335427 ~a;
    c 0.269944 0.014625 0.341379 ~a;
    c 0.271305 0.019942 0.347269 ~a;
    c 0.272594 0.025563 0.353093 ~a;
    c 0.273809 0.031497 0.358853 ~a;
    c 0.274952 0.037752 0.364543 ~a;
    c 0.276022 0.044167 0.370164 ~a;
    c 0.277018 0.050344 0.375715 ~a;
    c 0.277941 0.056324 0.381191 ~a;
    c 0.278791 0.062145 0.386592 ~a;
    c 0.279566 0.067836 0.391917 ~a;
    c 0.280267 0.073417 0.397163 ~a;
    c 0.280894 0.078907 0.402329 ~a;
    c 0.281446 0.084320 0.407414 ~a;
    c 0.281924 0.089666 0.412415 ~a;
    c 0.282327 0.094955 0.417331 ~a;
    c 0.282656 0.100196 0.422160 ~a;
    c 0.282910 0.105393 0.426902 ~a;
    c 0.283091 0.110553 0.431554 ~a;
    c 0.283197 0.115680 0.436115 ~a;
    c 0.283229 0.120777 0.440584 ~a;
    c 0.283187 0.125848 0.444960 ~a;
    c 0.283072 0.130895 0.449241 ~a;
    c 0.282884 0.135920 0.453427 ~a;
    c 0.282623 0.140926 0.457517 ~a;
    c 0.282290 0.145912 0.461510 ~a;
    c 0.281887 0.150881 0.465405 ~a;
    c 0.281412 0.155834 0.469201 ~a;
    c 0.280868 0.160771 0.472899 ~a;
    c 0.280255 0.165693 0.476498 ~a;
    c 0.279574 0.170599 0.479997 ~a;
    c 0.278826 0.175490 0.483397 ~a;
    c 0.278012 0.180367 0.486697 ~a;
    c 0.277134 0.185228 0.489898 ~a;
    c 0.276194 0.190074 0.493001 ~a;
    c 0.275191 0.194905 0.496005 ~a;
    c 0.274128 0.199721 0.498911 ~a;
    c 0.273006 0.204520 0.501721 ~a;
    c 0.271828 0.209303 0.504434 ~a;
    c 0.270595 0.214069 0.507052 ~a;
    c 0.269308 0.218818 0.509577 ~a;
    c 0.267968 0.223549 0.512008 ~a;
    c 0.266580 0.228262 0.514349 ~a;
    c 0.265145 0.232956 0.516599 ~a;
    c 0.263663 0.237631 0.518762 ~a;
    c 0.262138 0.242286 0.520837 ~a;
    c 0.260571 0.246922 0.522828 ~a;
    c 0.258965 0.251537 0.524736 ~a;
    c 0.257322 0.256130 0.526563 ~a;
    c 0.255645 0.260703 0.528312 ~a;
    c 0.253935 0.265254 0.529983 ~a;
    c 0.252194 0.269783 0.531579 ~a;
    c 0.250425 0.274290 0.533103 ~a;
    c 0.248629 0.278775 0.534556 ~a;
    c 0.246811 0.283237 0.535941 ~a;
    c 0.244972 0.287675 0.537260 ~a;
    c 0.243113 0.292092 0.538516 ~a;
    c 0.241237 0.296485 0.539709 ~a;
    c 0.239346 0.300855 0.540844 ~a;
    c 0.237441 0.305202 0.541921 ~a;
    c 0.235526 0.309527 0.542944 ~a;
    c 0.233603 0.313828 0.543914 ~a;
    c 0.231674 0.318106 0.544834 ~a;
    c 0.229739 0.322361 0.545706 ~a;
    c 0.227802 0.326594 0.546532 ~a;
    c 0.225863 0.330805 0.547314 ~a;
    c 0.223925 0.334994 0.548053 ~a;
    c 0.221989 0.339161 0.548752 ~a;
    c 0.220057 0.343307 0.549413 ~a;
    c 0.218130 0.347432 0.550038 ~a;
    c 0.216210 0.351535 0.550627 ~a;
    c 0.214298 0.355619 0.551184 ~a;
    c 0.212395 0.359683 0.551710 ~a;
    c 0.210503 0.363727 0.552206 ~a;
    c 0.208623 0.367752 0.552675 ~a;
    c 0.206756 0.371758 0.553117 ~a;
    c 0.204903 0.375746 0.553533 ~a;
    c 0.203063 0.379716 0.553925 ~a;
    c 0.201239 0.383670 0.554294 ~a;
    c 0.199430 0.387607 0.554642 ~a;
    c 0.197636 0.391528 0.554969 ~a;
    c 0.195860 0.395433 0.555276 ~a;
    c 0.194100 0.399323 0.555565 ~a;
    c 0.192357 0.403199 0.555836 ~a;
    c 0.190631 0.407061 0.556089 ~a;
    c 0.188923 0.410910 0.556326 ~a;
    c 0.187231 0.414746 0.556547 ~a;
    c 0.185556 0.418570 0.556753 ~a;
    c 0.183898 0.422383 0.556944 ~a;
    c 0.182256 0.426184 0.557120 ~a;
    c 0.180629 0.429975 0.557282 ~a;
    c 0.179019 0.433756 0.557430 ~a;
    c 0.177423 0.437527 0.557565 ~a;
    c 0.175841 0.441290 0.557685 ~a;
    c 0.174274 0.445044 0.557792 ~a;
    c 0.172719 0.448791 0.557885 ~a;
    c 0.171176 0.452530 0.557965 ~a;
    c 0.169646 0.456262 0.558030 ~a;
    c 0.168126 0.459988 0.558082 ~a;
    c 0.166617 0.463708 0.558119 ~a;
    c 0.165117 0.467423 0.558141 ~a;
    c 0.163625 0.471133 0.558148 ~a;
    c 0.162142 0.474838 0.558140 ~a;
    c 0.160665 0.478540 0.558115 ~a;
    c 0.159194 0.482237 0.558073 ~a;
    c 0.157729 0.485932 0.558013 ~a;
    c 0.156270 0.489624 0.557936 ~a;
    c 0.154815 0.493313 0.557840 ~a;
    c 0.153364 0.497000 0.557724 ~a;
    c 0.151918 0.500685 0.557587 ~a;
    c 0.150476 0.504369 0.557430 ~a;
    c 0.149039 0.508051 0.557250 ~a;
    c 0.147607 0.511733 0.557049 ~a;
    c 0.146180 0.515413 0.556823 ~a;
    c 0.144759 0.519093 0.556572 ~a;
    c 0.143343 0.522773 0.556295 ~a;
    c 0.141935 0.526453 0.555991 ~a;
    c 0.140536 0.530132 0.555659 ~a;
    c 0.139147 0.533812 0.555298 ~a;
    c 0.137770 0.537492 0.554906 ~a;
    c 0.136408 0.541173 0.554483 ~a;
    c 0.135066 0.544853 0.554029 ~a;
    c 0.133743 0.548535 0.553541 ~a;
    c 0.132444 0.552216 0.553018 ~a;
    c 0.131172 0.555899 0.552459 ~a;
    c 0.129933 0.559582 0.551864 ~a;
    c 0.128729 0.563265 0.551229 ~a;
    c 0.127568 0.566949 0.550556 ~a;
    c 0.126453 0.570633 0.549841 ~a;
    c 0.125394 0.574318 0.549086 ~a;
    c 0.124395 0.578002 0.548287 ~a;
    c 0.123463 0.581687 0.547445 ~a;
    c 0.122606 0.585371 0.546557 ~a;
    c 0.121831 0.589055 0.545623 ~a;
    c 0.121148 0.592739 0.544641 ~a;
    c 0.120565 0.596422 0.543611 ~a;
    c 0.120092 0.600104 0.542530 ~a;
    c 0.119738 0.603785 0.541400 ~a;
    c 0.119512 0.607464 0.540218 ~a;
    c 0.119423 0.611141 0.538982 ~a;
    c 0.119483 0.614817 0.537692 ~a;
    c 0.119699 0.618490 0.536347 ~a;
    c 0.120081 0.622161 0.534946 ~a;
    c 0.120638 0.625828 0.533488 ~a;
    c 0.121380 0.629492 0.531973 ~a;
    c 0.122312 0.633153 0.530398 ~a;
    c 0.123444 0.636809 0.528763 ~a;
    c 0.124780 0.640461 0.527068 ~a;
    c 0.126326 0.644107 0.525311 ~a;
    c 0.128087 0.647749 0.523491 ~a;
    c 0.130067 0.651384 0.521608 ~a;
    c 0.132268 0.655014 0.519661 ~a;
    c 0.134692 0.658636 0.517649 ~a;
    c 0.137339 0.662252 0.515571 ~a;
    c 0.140210 0.665859 0.513427 ~a;
    c 0.143303 0.669459 0.511215 ~a;
    c 0.146616 0.673050 0.508936 ~a;
    c 0.150148 0.676631 0.506589 ~a;
    c 0.153894 0.680203 0.504172 ~a;
    c 0.157851 0.683765 0.501686 ~a;
    c 0.162016 0.687316 0.499129 ~a;
    c 0.166383 0.690856 0.496502 ~a;
    c 0.170948 0.694384 0.493803 ~a;
    c 0.175707 0.697900 0.491033 ~a;
    c 0.180653 0.701402 0.488189 ~a;
    c 0.185783 0.704891 0.485273 ~a;
    c 0.191090 0.708366 0.482284 ~a;
    c 0.196571 0.711827 0.479221 ~a;
    c 0.202219 0.715272 0.476084 ~a;
    c 0.208030 0.718701 0.472873 ~a;
    c 0.214000 0.722114 0.469588 ~a;
    c 0.220124 0.725509 0.466226 ~a;
    c 0.226397 0.728888 0.462789 ~a;
    c 0.232815 0.732247 0.459277 ~a;
    c 0.239374 0.735588 0.455688 ~a;
    c 0.246070 0.738910 0.452024 ~a;
    c 0.252899 0.742211 0.448284 ~a;
    c 0.259857 0.745492 0.444467 ~a;
    c 0.266941 0.748751 0.440573 ~a;
    c 0.274149 0.751988 0.436601 ~a;
    c 0.281477 0.755203 0.432552 ~a;
    c 0.288921 0.758394 0.428426 ~a;
    c 0.296479 0.761561 0.424223 ~a;
    c 0.304148 0.764704 0.419943 ~a;
    c 0.311925 0.767822 0.415586 ~a;
    c 0.319809 0.770914 0.411152 ~a;
    c 0.327796 0.773980 0.406640 ~a;
    c 0.335885 0.777018 0.402049 ~a;
    c 0.344074 0.780029 0.397381 ~a;
    c 0.352360 0.783011 0.392636 ~a;
    c 0.360741 0.785964 0.387814 ~a;
    c 0.369214 0.788888 0.382914 ~a;
    c 0.377779 0.791781 0.377939 ~a;
    c 0.386433 0.794644 0.372886 ~a;
    c 0.395174 0.797475 0.367757 ~a;
    c 0.404001 0.800275 0.362552 ~a;
    c 0.412913 0.803041 0.357269 ~a;
    c 0.421908 0.805774 0.351910 ~a;
    c 0.430983 0.808473 0.346476 ~a;
    c 0.440137 0.811138 0.340967 ~a;
    c 0.449368 0.813768 0.335384 ~a;
    c 0.458674 0.816363 0.329727 ~a;
    c 0.468053 0.818921 0.323998 ~a;
    c 0.477504 0.821444 0.318195 ~a;
    c 0.487026 0.823929 0.312321 ~a;
    c 0.496615 0.826376 0.306377 ~a;
    c 0.506271 0.828786 0.300362 ~a;
    c 0.515992 0.831158 0.294279 ~a;
    c 0.525776 0.833491 0.288127 ~a;
    c 0.535621 0.835785 0.281908 ~a;
    c 0.545524 0.838039 0.275626 ~a;
    c 0.555484 0.840254 0.269281 ~a;
    c 0.565498 0.842430 0.262877 ~a;
    c 0.575563 0.844566 0.256415 ~a;
    c 0.585678 0.846661 0.249897 ~a;
    c 0.595839 0.848717 0.243329 ~a;
    c 0.606045 0.850733 0.236712 ~a;
    c 0.616293 0.852709 0.230052 ~a;
    c 0.626579 0.854645 0.223353 ~a;
    c 0.636902 0.856542 0.216620 ~a;
    c 0.647257 0.858400 0.209861 ~a;
    c 0.657642 0.860219 0.203082 ~a;
    c 0.668054 0.861999 0.196293 ~a;
    c 0.678489 0.863742 0.189503 ~a;
    c 0.688944 0.865448 0.182725 ~a;
    c 0.699415 0.867117 0.175971 ~a;
    c 0.709898 0.868751 0.169257 ~a;
    c 0.720391 0.870350 0.162603 ~a;
    c 0.730889 0.871916 0.156029 ~a;
    c 0.741388 0.873449 0.149561 ~a;
    c 0.751884 0.874951 0.143228 ~a;
    c 0.762373 0.876424 0.137064 ~a;
    c 0.772852 0.877868 0.131109 ~a;
    c 0.783315 0.879285 0.125405 ~a;
    c 0.793760 0.880678 0.120005 ~a;
    c 0.804182 0.882046 0.114965 ~a;
    c 0.814576 0.883393 0.110347 ~a;
    c 0.824940 0.884720 0.106217 ~a;
    c 0.835270 0.886029 0.102646 ~a;
    c 0.845561 0.887322 0.099702 ~a;
    c 0.855810 0.888601 0.097452 ~a;
    c 0.866013 0.889868 0.095953 ~a;
    c 0.876168 0.891125 0.095250 ~a;
    c 0.886271 0.892374 0.095374 ~a;
    c 0.896320 0.893616 0.096335 ~a;
    c 0.906311 0.894855 0.098125 ~a;
    c 0.916242 0.896091 0.100717 ~a;
    c 0.926106 0.897330 0.104071 ~a;
    c 0.935904 0.898570 0.108131 ~a;
    c 0.945636 0.899815 0.112838 ~a;
    c 0.955300 0.901065 0.118128 ~a;
    c 0.964894 0.902323 0.123941 ~a;
    c 0.974417 0.903590 0.130215 ~a;
    c 0.983868 0.904867 0.136897 ~a;
    c 0.993248 0.906157 0.143936 ~a|]
  in
  fun t -> d.(Int.max 0 (Int.min 255 (truncate (t *. 256.))))

--------------------------------------------------------------------------- 
    Copyright ( c ) 2013 The gg programmers 

    Permission to use , copy , modify , and/or distribute this software for any 
    purpose with or without fee is hereby granted , provided that the above 
    copyright notice and this permission notice appear in all copies . 

    THE SOFTWARE IS PROVIDED " AS IS " AND THE AUTHOR DISCLAIMS ALL WARRANTIES 
    WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 
    MERCHANTABILITY AND FITNESS . IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 
    ANY SPECIAL , DIRECT , INDIRECT , OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 
     RESULTING FROM LOSS OF USE , DATA OR PROFITS , WHETHER IN AN 
    ACTION OF CONTRACT , NEGLIGENCE OR OTHER TORTIOUS ACTION , ARISING OUT OF 
    OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE . 
   ---------------------------------------------------------------------------
   Copyright (c) 2013 The gg programmers

   Permission to use, copy, modify, and/or distribute this software for any
   purpose with or without fee is hereby granted, provided that the above
   copyright notice and this permission notice appear in all copies.

   THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
   WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
   MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
   ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  ---------------------------------------------------------------------------*)
