diff --git a/README.md b/README.md
index 6867fd482c9f3cd626d4a78ffb23c9c4ec0583b0..87ac9605fc35ee835e74e5dd9529fa46c4e1053d 100644
--- a/README.md
+++ b/README.md
@@ -1,12 +1,30 @@
---
-title: Counterfactual Demo
-emoji: 🐢
-colorFrom: red
-colorTo: indigo
+title: Counterfactuals
+emoji: 🌖
+colorFrom: purple
+colorTo: green
sdk: gradio
-sdk_version: 4.14.0
+sdk_version: 3.27.0
app_file: app.py
pinned: false
+license: mit
+duplicated_from: fabio-deep/counterfactuals
---
-Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
+Code for the **ICML 2023** paper:
+
+[**High Fidelity Image Counterfactuals with Probabilistic Causal Models**](https://arxiv.org/abs/2306.15764)
+
+Fabio De Sousa Ribeiro1, Tian Xia1, Miguel Monteiro1, Nick Pawlowski2, Ben Glocker1\
+1Imperial College London, 2Microsoft Research Cambridge, UK
+
+```
+@misc{ribeiro2023high,
+ title={High Fidelity Image Counterfactuals with Probabilistic Causal Models},
+ author={Fabio De Sousa Ribeiro and Tian Xia and Miguel Monteiro and Nick Pawlowski and Ben Glocker},
+ year={2023},
+ eprint={2306.15764},
+ archivePrefix={arXiv},
+ primaryClass={cs.LG}
+}
+```
\ No newline at end of file
diff --git a/app.py b/app.py
new file mode 100644
index 0000000000000000000000000000000000000000..67539f0c89bbc7b59718b4983b691850b3731f41
--- /dev/null
+++ b/app.py
@@ -0,0 +1,632 @@
+import torch
+import numpy as np
+import gradio as gr
+import matplotlib.pylab as plt
+import torch.nn.functional as F
+
+from vae import HVAE
+from datasets import morphomnist, ukbb, mimic, get_attr_max_min
+from pgm.flow_pgm import MorphoMNISTPGM, FlowPGM, ChestPGM
+from app_utils import (
+ mnist_graph,
+ brain_graph,
+ chest_graph,
+ vae_preprocess,
+ normalize,
+ preprocess_brain,
+ get_fig_arr,
+ postprocess,
+ MidpointNormalize,
+)
+
+DATA, MODELS = {}, {}
+for k in ["Morpho-MNIST", "Brain MRI", "Chest X-ray"]:
+ DATA[k], MODELS[k] = {}, {}
+
+# mnist
+DIGITS = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
+# brain
+MRISEQ_CAT = ["T1", "T2-FLAIR"] # 0,1
+SEX_CAT = ["female", "male"] # 0,1
+HEIGHT, WIDTH = 270, 270
+# chest
+SEX_CAT_CHEST = ["male", "female"] # 0,1
+RACE_CAT = ["white", "asian", "black"] # 0,1,2
+FIND_CAT = ["no disease", "pleural effusion"]
+DEVICE = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
+
+
+class Hparams:
+ def update(self, dict):
+ for k, v in dict.items():
+ setattr(self, k, v)
+
+
+def get_paths(dataset_id):
+ if "MNIST" in dataset_id:
+ data_path = "./data/morphomnist"
+ pgm_path = "./checkpoints/t_i_d/sup_pgm/checkpoint.pt"
+ vae_path = "./checkpoints/t_i_d/dgauss_cond_big_beta1_dropexo/checkpoint.pt"
+ elif "Brain" in dataset_id:
+ data_path = "./data/ukbb_subset"
+ pgm_path = "./checkpoints/m_b_v_s/sup_pgm/checkpoint.pt"
+ vae_path = "./checkpoints/m_b_v_s/ukbb192_beta5_dgauss_b33/checkpoint.pt"
+ elif "Chest" in dataset_id:
+ data_path = "./data/mimic_subset"
+ pgm_path = "./checkpoints/a_r_s_f/sup_pgm_mimic/checkpoint.pt"
+ vae_path = [
+ "./checkpoints/a_r_s_f/mimic_beta9_gelu_dgauss_1_lr3/checkpoint.pt", # base vae
+ "./checkpoints/a_r_s_f/mimic_dscm_lr_1e5_lagrange_lr_1_damping_10/6500_checkpoint.pt", # cf trained DSCM
+ ]
+ return data_path, vae_path, pgm_path
+
+
+def load_pgm(dataset_id, pgm_path):
+ checkpoint = torch.load(pgm_path, map_location=DEVICE)
+ args = Hparams()
+ args.update(checkpoint["hparams"])
+ args.device = DEVICE
+ if "MNIST" in dataset_id:
+ pgm = MorphoMNISTPGM(args).to(args.device)
+ elif "Brain" in dataset_id:
+ pgm = FlowPGM(args).to(args.device)
+ elif "Chest" in dataset_id:
+ pgm = ChestPGM(args).to(args.device)
+ pgm.load_state_dict(checkpoint["ema_model_state_dict"])
+ MODELS[dataset_id]["pgm"] = pgm
+ MODELS[dataset_id]["pgm_args"] = args
+
+
+def load_vae(dataset_id, vae_path):
+ if "Chest" in dataset_id:
+ vae_path, dscm_path = vae_path[0], vae_path[1]
+ checkpoint = torch.load(vae_path, map_location=DEVICE)
+ args = Hparams()
+ args.update(checkpoint["hparams"])
+ # backwards compatibility hack
+ if not hasattr(args, "vae"):
+ args.vae = "hierarchical"
+ if not hasattr(args, "cond_prior"):
+ args.cond_prior = False
+ if hasattr(args, "free_bits"):
+ args.kl_free_bits = args.free_bits
+ args.device = DEVICE
+ vae = HVAE(args).to(args.device)
+
+ if "Chest" in dataset_id:
+ dscm_ckpt = torch.load(dscm_path, map_location=DEVICE)
+ vae.load_state_dict(
+ {
+ k[4:]: v
+ for k, v in dscm_ckpt["ema_model_state_dict"].items()
+ if "vae." in k
+ }
+ )
+ else:
+ vae.load_state_dict(checkpoint["ema_model_state_dict"])
+ MODELS[dataset_id]["vae"] = vae
+ MODELS[dataset_id]["vae_args"] = args
+
+
+def get_dataloader(dataset_id, data_path):
+ MODELS[dataset_id]["pgm_args"].data_dir = data_path
+ args = MODELS[dataset_id]["pgm_args"]
+ if "MNIST" in dataset_id:
+ datasets = morphomnist(args)
+ elif "Brain" in dataset_id:
+ datasets = ukbb(args)
+ elif "Chest" in dataset_id:
+ datasets = mimic(args)
+ DATA[dataset_id]["test"] = torch.utils.data.DataLoader(
+ datasets["test"], shuffle=False, batch_size=args.bs, num_workers=4
+ )
+
+
+def load_dataset(dataset_id):
+ data_path, _, pgm_path = get_paths(dataset_id)
+ checkpoint = torch.load(pgm_path, map_location=DEVICE)
+ args = Hparams()
+ args.update(checkpoint["hparams"])
+ args.device = DEVICE
+ MODELS[dataset_id]["pgm_args"] = args
+ get_dataloader(dataset_id, data_path)
+
+
+def load_model(dataset_id):
+ _, vae_path, pgm_path = get_paths(dataset_id)
+ load_pgm(dataset_id, pgm_path)
+ load_vae(dataset_id, vae_path)
+
+
+@torch.no_grad()
+def counterfactual_inference(dataset_id, obs, do_pa):
+ pa = {k: v.clone() for k, v in obs.items() if k != "x"}
+ cf_pa = MODELS[dataset_id]["pgm"].counterfactual(
+ obs=pa, intervention=do_pa, num_particles=1
+ )
+ args, vae = MODELS[dataset_id]["vae_args"], MODELS[dataset_id]["vae"]
+ _pa = vae_preprocess(args, {k: v.clone() for k, v in pa.items()})
+ _cf_pa = vae_preprocess(args, {k: v.clone() for k, v in cf_pa.items()})
+ z_t = 0.1 if "mnist" in args.hps else 1.0
+ z = vae.abduct(x=obs["x"], parents=_pa, t=z_t)
+ if vae.cond_prior:
+ z = [z[j]["z"] for j in range(len(z))]
+ px_loc, px_scale = vae.forward_latents(latents=z, parents=_pa)
+ cf_loc, cf_scale = vae.forward_latents(latents=z, parents=_cf_pa)
+ u = (obs["x"] - px_loc) / px_scale.clamp(min=1e-12)
+ u_t = 0.1 if "mnist" in args.hps else 1.0 # cf sampling temp
+ cf_scale = cf_scale * u_t
+ cf_x = torch.clamp(cf_loc + cf_scale * u, min=-1, max=1)
+ return {"cf_x": cf_x, "rec_x": px_loc, "cf_pa": cf_pa}
+
+
+def get_obs_item(dataset_id, idx=None):
+ if idx is None:
+ n_test = len(DATA[dataset_id]["test"].dataset)
+ idx = torch.randperm(n_test)[0]
+ idx = int(idx)
+ return idx, DATA[dataset_id]["test"].dataset.__getitem__(idx)
+
+
+def get_mnist_obs(idx=None):
+ dataset_id = "Morpho-MNIST"
+ if not DATA[dataset_id]:
+ load_dataset(dataset_id)
+ idx, obs = get_obs_item(dataset_id, idx)
+ x = get_fig_arr(obs["x"].clone().squeeze().numpy())
+ t = (obs["thickness"].clone() + 1) / 2 * (6.255515 - 0.87598526) + 0.87598526
+ i = (obs["intensity"].clone() + 1) / 2 * (254.90317 - 66.601204) + 66.601204
+ y = DIGITS[obs["digit"].clone().argmax(-1)]
+ return (idx, x, float(np.round(t, 2)), float(np.round(i, 2)), y)
+
+
+def get_brain_obs(idx=None):
+ dataset_id = "Brain MRI"
+ if not DATA[dataset_id]:
+ load_dataset(dataset_id)
+ idx, obs = get_obs_item(dataset_id, idx)
+ x = get_fig_arr(obs["x"].clone().squeeze().numpy())
+ m = MRISEQ_CAT[int(obs["mri_seq"].clone().item())]
+ s = SEX_CAT[int(obs["sex"].clone().item())]
+ a = obs["age"].clone().item()
+ b = obs["brain_volume"].clone().item() / 1000 # in ml
+ v = obs["ventricle_volume"].clone().item() / 1000 # in ml
+ return (idx, x, m, s, a, float(np.round(b, 2)), float(np.round(v, 2)))
+
+
+def get_chest_obs(idx=None):
+ dataset_id = "Chest X-ray"
+ if not DATA[dataset_id]:
+ load_dataset(dataset_id)
+ idx, obs = get_obs_item(dataset_id, idx)
+ x = get_fig_arr(postprocess(obs["x"].clone()))
+ s = SEX_CAT_CHEST[int(obs["sex"].clone().squeeze().numpy())]
+ f = FIND_CAT[int(obs["finding"].clone().squeeze().numpy())]
+ r = RACE_CAT[obs["race"].clone().squeeze().numpy().argmax(-1)]
+ a = (obs["age"].clone().squeeze().numpy() + 1) * 50
+ return (idx, x, r, s, f, float(np.round(a, 1)))
+
+
+def infer_mnist_cf(*args):
+ dataset_id = "Morpho-MNIST"
+ idx, _, t, i, y, do_t, do_i, do_y = args
+ n_particles = 32
+ # preprocess
+ obs = DATA[dataset_id]["test"].dataset.__getitem__(int(idx))
+ obs["x"] = (obs["x"] - 127.5) / 127.5
+ for k, v in obs.items():
+ obs[k] = v.view(1, 1) if len(v.shape) < 1 else v.unsqueeze(0)
+ obs[k] = obs[k].to(MODELS[dataset_id]["vae_args"].device).float()
+ if n_particles > 1:
+ ndims = (1,) * 3 if k == "x" else (1,)
+ obs[k] = obs[k].repeat(n_particles, *ndims)
+ # intervention(s)
+ do_pa = {}
+ if do_t:
+ do_pa["thickness"] = torch.tensor(
+ normalize(t, x_max=6.255515, x_min=0.87598526)
+ ).view(1, 1)
+ if do_i:
+ do_pa["intensity"] = torch.tensor(
+ normalize(i, x_max=254.90317, x_min=66.601204)
+ ).view(1, 1)
+ if do_y:
+ do_pa["digit"] = F.one_hot(torch.tensor(DIGITS.index(y)), num_classes=10).view(
+ 1, 10
+ )
+
+ for k, v in do_pa.items():
+ do_pa[k] = (
+ v.to(MODELS[dataset_id]["vae_args"].device).float().repeat(n_particles, 1)
+ )
+ # infer counterfactual
+ out = counterfactual_inference(dataset_id, obs, do_pa)
+ # avg cf particles
+ cf_x = out["cf_x"].mean(0)
+ cf_x_std = out["cf_x"].std(0)
+ rec_x = out["rec_x"].mean(0)
+ cf_t = out["cf_pa"]["thickness"].mean(0)
+ cf_i = out["cf_pa"]["intensity"].mean(0)
+ cf_y = out["cf_pa"]["digit"].mean(0)
+ # post process
+ cf_x = postprocess(cf_x)
+ cf_x_std = cf_x_std.squeeze().detach().cpu().numpy()
+ rec_x = postprocess(rec_x)
+ cf_t = np.round((cf_t.item() + 1) / 2 * (6.255515 - 0.87598526) + 0.87598526, 2)
+ cf_i = np.round((cf_i.item() + 1) / 2 * (254.90317 - 66.601204) + 66.601204, 2)
+ cf_y = DIGITS[cf_y.argmax(-1)]
+ # plots
+ # plt.close('all')
+ effect = cf_x - rec_x
+ effect = get_fig_arr(
+ effect, cmap="RdBu_r", norm=MidpointNormalize(vmin=-255, midpoint=0, vmax=255)
+ )
+ cf_x = get_fig_arr(cf_x)
+ cf_x_std = get_fig_arr(cf_x_std, cmap="jet")
+ return (cf_x, cf_x_std, effect, cf_t, cf_i, cf_y)
+
+
+def infer_brain_cf(*args):
+ dataset_id = "Brain MRI"
+ idx, _, m, s, a, b, v = args[:7]
+ do_m, do_s, do_a, do_b, do_v = args[7:]
+ n_particles = 16
+ # preprocessing
+ obs = DATA[dataset_id]["test"].dataset.__getitem__(int(idx))
+ obs = preprocess_brain(MODELS[dataset_id]["vae_args"], obs)
+ for k, _v in obs.items():
+ if n_particles > 1:
+ ndims = (1,) * 3 if k == "x" else (1,)
+ obs[k] = _v.repeat(n_particles, *ndims)
+ # interventions(s)
+ do_pa = {}
+ if do_m:
+ do_pa["mri_seq"] = torch.tensor(MRISEQ_CAT.index(m)).view(1, 1)
+ if do_s:
+ do_pa["sex"] = torch.tensor(SEX_CAT.index(s)).view(1, 1)
+ if do_a:
+ do_pa["age"] = torch.tensor(a).view(1, 1)
+ if do_b:
+ do_pa["brain_volume"] = torch.tensor(b * 1000).view(1, 1)
+ if do_v:
+ do_pa["ventricle_volume"] = torch.tensor(v * 1000).view(1, 1)
+ # normalize continuous attributes
+ for k in ["age", "brain_volume", "ventricle_volume"]:
+ if k in do_pa.keys():
+ k_max, k_min = get_attr_max_min(k)
+ do_pa[k] = (do_pa[k] - k_min) / (k_max - k_min) # [0,1]
+ do_pa[k] = 2 * do_pa[k] - 1 # [-1,1]
+
+ for k, _v in do_pa.items():
+ do_pa[k] = (
+ _v.to(MODELS[dataset_id]["vae_args"].device).float().repeat(n_particles, 1)
+ )
+ # infer counterfactual
+ out = counterfactual_inference(dataset_id, obs, do_pa)
+ # avg cf particles
+ cf_x = out["cf_x"].mean(0)
+ cf_x_std = out["cf_x"].std(0)
+ rec_x = out["rec_x"].mean(0)
+ cf_m = out["cf_pa"]["mri_seq"].mean(0)
+ cf_s = out["cf_pa"]["sex"].mean(0)
+ # post process
+ cf_x = postprocess(cf_x)
+ cf_x_std = cf_x_std.squeeze().detach().cpu().numpy()
+ rec_x = postprocess(rec_x)
+ cf_m = MRISEQ_CAT[int(cf_m.item())]
+ cf_s = SEX_CAT[int(cf_s.item())]
+ cf_ = {}
+ for k in ["age", "brain_volume", "ventricle_volume"]: # unnormalize
+ k_max, k_min = get_attr_max_min(k)
+ cf_[k] = (out["cf_pa"][k].mean(0).item() + 1) / 2 * (k_max - k_min) + k_min
+ # plots
+ # plt.close('all')
+ effect = cf_x - rec_x
+ effect = get_fig_arr(
+ effect,
+ cmap="RdBu_r",
+ norm=MidpointNormalize(vmin=effect.min(), midpoint=0, vmax=effect.max()),
+ )
+ cf_x = get_fig_arr(cf_x)
+ cf_x_std = get_fig_arr(cf_x_std, cmap="jet")
+ return (
+ cf_x,
+ cf_x_std,
+ effect,
+ cf_m,
+ cf_s,
+ np.round(cf_["age"], 1),
+ np.round(cf_["brain_volume"] / 1000, 2),
+ np.round(cf_["ventricle_volume"] / 1000, 2),
+ )
+
+
+def infer_chest_cf(*args):
+ dataset_id = "Chest X-ray"
+ idx, _, r, s, f, a = args[:6]
+ do_r, do_s, do_f, do_a = args[6:]
+ n_particles = 16
+ # preprocessing
+ obs = DATA[dataset_id]["test"].dataset.__getitem__(int(idx))
+ for k, v in obs.items():
+ obs[k] = v.to(MODELS[dataset_id]["vae_args"].device).float()
+ if n_particles > 1:
+ ndims = (1,) * 3 if k == "x" else (1,)
+ obs[k] = obs[k].repeat(n_particles, *ndims)
+ # intervention(s)
+ do_pa = {}
+ with torch.no_grad():
+ if do_s:
+ do_pa["sex"] = torch.tensor(SEX_CAT_CHEST.index(s)).view(1, 1)
+ if do_f:
+ do_pa["finding"] = torch.tensor(FIND_CAT.index(f)).view(1, 1)
+ if do_r:
+ do_pa["race"] = F.one_hot(
+ torch.tensor(RACE_CAT.index(r)), num_classes=3
+ ).view(1, 3)
+ if do_a:
+ do_pa["age"] = torch.tensor(a / 100 * 2 - 1).view(1, 1)
+ for k, v in do_pa.items():
+ do_pa[k] = (
+ v.to(MODELS[dataset_id]["vae_args"].device).float().repeat(n_particles, 1)
+ )
+ # infer counterfactual
+ out = counterfactual_inference(dataset_id, obs, do_pa)
+ # avg cf particles
+ cf_x = out["cf_x"].mean(0)
+ cf_x_std = out["cf_x"].std(0)
+ rec_x = out["rec_x"].mean(0)
+ cf_r = out["cf_pa"]["race"].mean(0)
+ cf_s = out["cf_pa"]["sex"].mean(0)
+ cf_f = out["cf_pa"]["finding"].mean(0)
+ cf_a = out["cf_pa"]["age"].mean(0)
+ # post process
+ cf_x = postprocess(cf_x)
+ cf_x_std = cf_x_std.squeeze().detach().cpu().numpy()
+ rec_x = postprocess(rec_x)
+ cf_r = RACE_CAT[cf_r.argmax(-1)]
+ cf_s = SEX_CAT_CHEST[int(cf_s.item())]
+ cf_f = FIND_CAT[int(cf_f.item())]
+ cf_a = (cf_a.item() + 1) * 50
+ # plots
+ # plt.close('all')
+ effect = cf_x - rec_x
+ effect = get_fig_arr(
+ effect,
+ cmap="RdBu_r",
+ norm=MidpointNormalize(vmin=effect.min(), midpoint=0, vmax=effect.max()),
+ )
+ cf_x = get_fig_arr(cf_x)
+ cf_x_std = get_fig_arr(cf_x_std, cmap="jet")
+ return (cf_x, cf_x_std, effect, cf_r, cf_s, cf_f, np.round(cf_a, 1))
+
+
+with gr.Blocks(theme=gr.themes.Default()) as demo:
+ with gr.Tabs():
+
+ with gr.TabItem("Brain MRI") as brain_tab:
+ brain_id = gr.Textbox(value=brain_tab.label, visible=False)
+
+ with gr.Row().style(equal_height=True):
+ idx_brain = gr.Number(value=0, visible=False)
+ with gr.Column(scale=1, min_width=200):
+ x_brain = gr.Image(label="Observation", interactive=False).style(
+ height=HEIGHT
+ )
+ with gr.Column(scale=1, min_width=200):
+ cf_x_brain = gr.Image(
+ label="Counterfactual", interactive=False
+ ).style(height=HEIGHT)
+ with gr.Column(scale=1, min_width=200):
+ cf_x_std_brain = gr.Image(
+ label="Counterfactual Uncertainty", interactive=False
+ ).style(height=HEIGHT)
+ with gr.Column(scale=1, min_width=200):
+ effect_brain = gr.Image(
+ label="Direct Causal Effect", interactive=False
+ ).style(height=HEIGHT)
+ with gr.Row():
+ with gr.Column(scale=2.55):
+ gr.Markdown(
+ "**Intervention**"
+ # + 20 * " "
+ # + "[arXiv paper](https://arxiv.org/abs/2306.15764) | [GitHub code](https://github.com/biomedia-mira/causal-gen)"
+ # + " | Hint: try 90% zoom"
+ )
+ with gr.Row():
+ with gr.Column(min_width=200):
+ do_a = gr.Checkbox(label="do(age)", value=False)
+ a = gr.Slider(
+ label="\u00A0",
+ value=50,
+ minimum=44,
+ maximum=73,
+ step=1,
+ interactive=False,
+ )
+ with gr.Column(min_width=200):
+ do_s = gr.Checkbox(label="do(sex)", value=False)
+ s = gr.Radio(
+ ["female", "male"], label="", interactive=False
+ )
+ with gr.Row():
+ with gr.Column(min_width=200):
+ do_b = gr.Checkbox(label="do(brain volume)", value=False)
+ b = gr.Slider(
+ label="\u00A0",
+ value=1000,
+ minimum=850,
+ maximum=1550,
+ step=20,
+ interactive=False,
+ )
+ with gr.Column(min_width=200):
+ do_v = gr.Checkbox(
+ label="do(ventricle volume)", value=False
+ )
+ v = gr.Slider(
+ label="\u00A0",
+ value=40,
+ minimum=10,
+ maximum=125,
+ step=2,
+ interactive=False,
+ )
+ with gr.Row():
+ new_brain = gr.Button("New Observation")
+ reset_brain = gr.Button("Reset", variant="stop")
+ submit_brain = gr.Button("Submit", variant="primary")
+ with gr.Column(scale=1):
+ # gr.Markdown("### ")
+ causal_graph_brain = gr.Image(
+ label="Causal Graph", interactive=False
+ ).style(height=340)
+
+ with gr.TabItem("Chest X-ray") as chest_tab:
+ chest_id = gr.Textbox(value=chest_tab.label, visible=False)
+
+ with gr.Row().style(equal_height=True):
+ idx_chest = gr.Number(value=0, visible=False)
+ with gr.Column(scale=1, min_width=200):
+ x_chest = gr.Image(label="Observation", interactive=False).style(
+ height=HEIGHT
+ )
+ with gr.Column(scale=1, min_width=200):
+ cf_x_chest = gr.Image(
+ label="Counterfactual", interactive=False
+ ).style(height=HEIGHT)
+ with gr.Column(scale=1, min_width=200):
+ cf_x_std_chest = gr.Image(
+ label="Counterfactual Uncertainty", interactive=False
+ ).style(height=HEIGHT)
+ with gr.Column(scale=1, min_width=200):
+ effect_chest = gr.Image(
+ label="Direct Causal Effect", interactive=False
+ ).style(height=HEIGHT)
+
+ with gr.Row():
+ with gr.Column(scale=2.55):
+ gr.Markdown(
+ "**Intervention**"
+ # + 20 * " "
+ # + "[arXiv paper](https://arxiv.org/abs/2306.15764) | [GitHub code](https://github.com/biomedia-mira/causal-gen)"
+ # + " | Hint: try 90% zoom"
+ )
+ with gr.Row().style(equal_height=True):
+ with gr.Column(min_width=200):
+ do_a_chest = gr.Checkbox(label="do(age)", value=False)
+ a_chest = gr.Slider(
+ label="\u00A0", minimum=18, maximum=98, step=1
+ )
+ with gr.Column(min_width=200):
+ do_s_chest = gr.Checkbox(label="do(sex)", value=False)
+ s_chest = gr.Radio(
+ SEX_CAT_CHEST, label="", interactive=False
+ )
+
+ with gr.Row():
+ with gr.Column(min_width=200):
+ do_r_chest = gr.Checkbox(label="do(race)", value=False)
+ r_chest = gr.Radio(RACE_CAT, label="", interactive=False)
+ with gr.Column(min_width=200):
+ do_f_chest = gr.Checkbox(label="do(disease)", value=False)
+ f_chest = gr.Radio(FIND_CAT, label="", interactive=False)
+
+ with gr.Row():
+ new_chest = gr.Button("New Observation")
+ reset_chest = gr.Button("Reset", variant="stop")
+ submit_chest = gr.Button("Submit", variant="primary")
+ with gr.Column(scale=1):
+ # gr.Markdown("### ")
+ causal_graph_chest = gr.Image(
+ label="Causal Graph", interactive=False
+ ).style(height=345)
+
+ # morphomnist
+ # do = [do_t, do_i, do_y]
+ # obs = [idx, x, t, i, y]
+ # cf_out = [cf_x, cf_x_std, effect]
+
+ # brain
+ do_brain = [do_s, do_a, do_b, do_v] # intervention checkboxes
+ obs_brain = [idx_brain, x_brain, s, a, b, v] # observed image/attributes
+ cf_out_brain = [cf_x_brain, cf_x_std_brain, effect_brain] # counterfactual outputs
+
+ # chest
+ do_chest = [do_r_chest, do_s_chest, do_f_chest, do_a_chest]
+ obs_chest = [idx_chest, x_chest, r_chest, s_chest, f_chest, a_chest]
+ cf_out_chest = [cf_x_chest, cf_x_std_chest, effect_chest]
+
+ # on start: load new observations & causal graph
+ demo.load(fn=get_brain_obs, inputs=None, outputs=obs_brain)
+ demo.load(fn=get_chest_obs, inputs=None, outputs=obs_chest)
+
+ demo.load(fn=brain_graph, inputs=do_brain, outputs=causal_graph_brain)
+ demo.load(fn=chest_graph, inputs=do_chest, outputs=causal_graph_chest)
+
+ # on tab select: load models
+ brain_tab.select(fn=load_model, inputs=brain_id, outputs=None)
+ chest_tab.select(fn=load_model, inputs=chest_id, outputs=None)
+
+ # "new" button: load new observations
+ new_chest.click(fn=get_chest_obs, inputs=None, outputs=obs_chest)
+ new_brain.click(fn=get_brain_obs, inputs=None, outputs=obs_brain)
+
+ # "new" button: reset causal graphs
+ new_brain.click(fn=brain_graph, inputs=do_brain, outputs=causal_graph_brain)
+ new_chest.click(fn=chest_graph, inputs=do_chest, outputs=causal_graph_chest)
+
+ # "new" button: reset cf output panels
+ for _k, _v in zip(
+ [new_brain, new_chest], [cf_out_brain, cf_out_chest]
+ ):
+ _k.click(fn=lambda: (gr.update(value=None),) * 3, inputs=None, outputs=_v)
+
+ # "reset" button: reload current observations
+ reset_brain.click(fn=get_brain_obs, inputs=idx_brain, outputs=obs_brain)
+ reset_chest.click(fn=get_chest_obs, inputs=idx_chest, outputs=obs_chest)
+
+ # "reset" button: deselect intervention checkboxes
+ reset_brain.click(
+ fn=lambda: (gr.update(value=False),) * len(do_brain),
+ inputs=None,
+ outputs=do_brain,
+ )
+ reset_chest.click(
+ fn=lambda: (gr.update(value=False),) * len(do_chest),
+ inputs=None,
+ outputs=do_chest,
+ )
+
+ # "reset" button: reset cf output panels
+ for _k, _v in zip(
+ [reset_brain, reset_chest], [cf_out_brain, cf_out_chest]
+ ):
+ _k.click(fn=lambda: plt.close("all"), inputs=None, outputs=None)
+ _k.click(fn=lambda: (gr.update(value=None),) * 3, inputs=None, outputs=_v)
+
+ # enable brain interventions when checkbox is selected & update graph
+ for _k, _v in zip(do_brain, [s, a, b, v]):
+ _k.change(fn=lambda x: gr.update(interactive=x), inputs=_k, outputs=_v)
+ _k.change(brain_graph, inputs=do_brain, outputs=causal_graph_brain)
+
+ # enable chest interventions when checkbox is selected & update graph
+ for _k, _v in zip(do_chest, [r_chest, s_chest, f_chest, a_chest]):
+ _k.change(fn=lambda x: gr.update(interactive=x), inputs=_k, outputs=_v)
+ _k.change(chest_graph, inputs=do_chest, outputs=causal_graph_chest)
+
+ # "submit" button: infer countefactuals
+ submit_brain.click(
+ fn=infer_brain_cf,
+ inputs=obs_brain + do_brain,
+ outputs=cf_out_brain + [s, a, b, v],
+ )
+ submit_chest.click(
+ fn=infer_chest_cf,
+ inputs=obs_chest + do_chest,
+ outputs=cf_out_chest + [r_chest, s_chest, f_chest, a_chest],
+ )
+
+if __name__ == "__main__":
+ demo.queue()
+ demo.launch()
diff --git a/app_utils.py b/app_utils.py
new file mode 100644
index 0000000000000000000000000000000000000000..e423b8c2bc87c636005fbceb744ed3f1f3f2db74
--- /dev/null
+++ b/app_utils.py
@@ -0,0 +1,435 @@
+import torch
+import numpy as np
+import networkx as nx
+import matplotlib.pyplot as plt
+
+from PIL import Image
+
+from matplotlib import rc, patches, colors
+
+rc("font", **{"family": "serif", "serif": ["Roman"]})
+rc("text", usetex=True)
+rc("image", interpolation="none")
+rc("text.latex", preamble=r"\usepackage{amsmath} \usepackage{amssymb}")
+
+from datasets import get_attr_max_min
+
+HAMMER = np.array(Image.open("./hammer.png").resize((35, 35))) / 255
+
+
+class MidpointNormalize(colors.Normalize):
+ def __init__(self, vmin=None, vmax=None, midpoint=None, clip=False):
+ self.midpoint = midpoint
+ colors.Normalize.__init__(self, vmin, vmax, clip)
+
+ def __call__(self, value, clip=None):
+ v_ext = np.max([np.abs(self.vmin), np.abs(self.vmax)])
+ x, y = [-v_ext, self.midpoint, v_ext], [0, 0.5, 1]
+ return np.ma.masked_array(np.interp(value, x, y))
+
+
+def postprocess(x):
+ return ((x + 1.0) * 127.5).squeeze().detach().cpu().numpy()
+
+
+def mnist_graph(*args):
+ x, t, i, y = r"$\mathbf{x}$", r"$t$", r"$i$", r"$y$"
+ ut, ui, uy = r"$\mathbf{U}_t$", r"$\mathbf{U}_i$", r"$\mathbf{U}_y$"
+ zx, ex = r"$\mathbf{z}_{1:L}$", r"$\boldsymbol{\epsilon}$"
+
+ G = nx.DiGraph()
+ G.add_edge(t, x)
+ G.add_edge(i, x)
+ G.add_edge(y, x)
+ G.add_edge(t, i)
+ G.add_edge(ut, t)
+ G.add_edge(ui, i)
+ G.add_edge(uy, y)
+ G.add_edge(zx, x)
+ G.add_edge(ex, x)
+
+ pos = {
+ y: (0, 0),
+ uy: (-1, 0),
+ t: (0, 0.5),
+ ut: (0, 1),
+ x: (1, 0),
+ zx: (2, 0.375),
+ ex: (2, 0),
+ i: (1, 0.5),
+ ui: (1, 1),
+ }
+
+ node_c = {}
+ for node in G:
+ node_c[node] = "lightgrey" if node in [x, t, i, y] else "white"
+ node_line_c = {k: "black" for k, _ in node_c.items()}
+ edge_c = {e: "black" for e in G.edges}
+
+ if args[0]: # do_t
+ edge_c[(ut, t)] = "lightgrey"
+ # G.remove_edge(ut, t)
+ node_line_c[t] = "red"
+ if args[1]: # do_i
+ edge_c[(ui, i)] = "lightgrey"
+ edge_c[(t, i)] = "lightgrey"
+ # G.remove_edges_from([(ui, i), (t, i)])
+ node_line_c[i] = "red"
+ if args[2]: # do_y
+ edge_c[(uy, y)] = "lightgrey"
+ # G.remove_edge(uy, y)
+ node_line_c[y] = "red"
+
+ fs = 30
+ options = {
+ "font_size": fs,
+ "node_size": 3000,
+ "node_color": list(node_c.values()),
+ "edgecolors": list(node_line_c.values()),
+ "edge_color": list(edge_c.values()),
+ "linewidths": 2,
+ "width": 2,
+ }
+ plt.close("all")
+ fig, ax = plt.subplots(1, 1, figsize=(6, 4.1)) # , constrained_layout=True)
+ # fig.patch.set_visible(False)
+ ax.margins(x=0.06, y=0.15, tight=False)
+ ax.axis("off")
+ nx.draw_networkx(G, pos, **options, arrowsize=25, arrowstyle="-|>", ax=ax)
+ # need to reuse x, y limits so that the graphs plot the same way before and after removing edges
+ x_lim = (-1.348, 2.348)
+ y_lim = (-0.215, 1.215)
+ ax.set_xlim(x_lim)
+ ax.set_ylim(y_lim)
+ rect = patches.FancyBboxPatch(
+ (1.75, -0.16),
+ 0.5,
+ 0.7,
+ boxstyle="round, pad=0.05, rounding_size=0",
+ linewidth=2,
+ edgecolor="black",
+ facecolor="none",
+ linestyle="-",
+ )
+ ax.add_patch(rect)
+ ax.text(1.85, 0.65, r"$\mathbf{U}_{\mathbf{x}}$", fontsize=fs)
+
+ if args[0]: # do_t
+ fig.figimage(HAMMER, 0.26 * fig.bbox.xmax, 0.525 * fig.bbox.ymax, zorder=10)
+ if args[1]: # do_i
+ fig.figimage(HAMMER, 0.5175 * fig.bbox.xmax, 0.525 * fig.bbox.ymax, zorder=11)
+ if args[2]: # do_y
+ fig.figimage(HAMMER, 0.26 * fig.bbox.xmax, 0.2 * fig.bbox.ymax, zorder=12)
+
+ fig.tight_layout()
+ fig.canvas.draw()
+ return np.array(fig.canvas.renderer.buffer_rgba())
+
+
+def brain_graph(*args):
+ x, m, s, a, b, v = r"$\mathbf{x}$", r"$m$", r"$s$", r"$a$", r"$b$", r"$v$"
+ um, us, ua, ub, uv = (
+ r"$\mathbf{U}_m$",
+ r"$\mathbf{U}_s$",
+ r"$\mathbf{U}_a$",
+ r"$\mathbf{U}_b$",
+ r"$\mathbf{U}_v$",
+ )
+ zx, ex = r"$\mathbf{z}_{1:L}$", r"$\boldsymbol{\epsilon}$"
+
+ G = nx.DiGraph()
+ G.add_edge(m, x)
+ G.add_edge(s, x)
+ G.add_edge(b, x)
+ G.add_edge(v, x)
+ G.add_edge(zx, x)
+ G.add_edge(ex, x)
+ G.add_edge(a, b)
+ G.add_edge(a, v)
+ G.add_edge(s, b)
+ G.add_edge(um, m)
+ G.add_edge(us, s)
+ G.add_edge(ua, a)
+ G.add_edge(ub, b)
+ G.add_edge(uv, v)
+
+ pos = {
+ x: (0, 0),
+ zx: (-0.25, -1),
+ ex: (0.25, -1),
+ a: (0, 1),
+ ua: (0, 2),
+ s: (1, 0),
+ us: (1, -1),
+ b: (1, 1),
+ ub: (1, 2),
+ m: (-1, 0),
+ um: (-1, -1),
+ v: (-1, 1),
+ uv: (-1, 2),
+ }
+
+ node_c = {}
+ for node in G:
+ node_c[node] = "lightgrey" if node in [x, m, s, a, b, v] else "white"
+ node_line_c = {k: "black" for k, _ in node_c.items()}
+ edge_c = {e: "black" for e in G.edges}
+
+ if args[0]: # do_m
+ # G.remove_edge(um, m)
+ edge_c[(um, m)] = "lightgrey"
+ node_line_c[m] = "red"
+ if args[1]: # do_s
+ # G.remove_edge(us, s)
+ edge_c[(us, s)] = "lightgrey"
+ node_line_c[s] = "red"
+ if args[2]: # do_a
+ # G.remove_edge(ua, a)
+ edge_c[(ua, a)] = "lightgrey"
+ node_line_c[a] = "red"
+ if args[3]: # do_b
+ # G.remove_edges_from([(ub, b), (s, b), (a, b)])
+ edge_c[(ub, b)] = "lightgrey"
+ edge_c[(s, b)] = "lightgrey"
+ edge_c[(a, b)] = "lightgrey"
+ node_line_c[b] = "red"
+ if args[4]: # do_v
+ # G.remove_edges_from([(uv, v), (a, v), (b, v)])
+ edge_c[(uv, v)] = "lightgrey"
+ edge_c[(a, v)] = "lightgrey"
+ edge_c[(b, v)] = "lightgrey"
+ node_line_c[v] = "red"
+
+ fs = 30
+ options = {
+ "font_size": fs,
+ "node_size": 3000,
+ "node_color": list(node_c.values()),
+ "edgecolors": list(node_line_c.values()),
+ "edge_color": list(edge_c.values()),
+ "linewidths": 2,
+ "width": 2,
+ }
+
+ plt.close("all")
+ fig, ax = plt.subplots(1, 1, figsize=(5, 5)) # , constrained_layout=True)
+ # fig.patch.set_visible(False)
+ ax.margins(x=0.1, y=0.08, tight=False)
+ ax.axis("off")
+ nx.draw_networkx(G, pos, **options, arrowsize=25, arrowstyle="-|>", ax=ax)
+ # need to reuse x, y limits so that the graphs plot the same way before and after removing edges
+ x_lim = (-1.32, 1.32)
+ y_lim = (-1.414, 2.414)
+ ax.set_xlim(x_lim)
+ ax.set_ylim(y_lim)
+ rect = patches.FancyBboxPatch(
+ (-0.5, -1.325),
+ 1,
+ 0.65,
+ boxstyle="round, pad=0.05, rounding_size=0",
+ linewidth=2,
+ edgecolor="black",
+ facecolor="none",
+ linestyle="-",
+ )
+ ax.add_patch(rect)
+ # ax.text(1.85, 0.65, r"$\mathbf{U}_{\mathbf{x}}$", fontsize=fs)
+
+ if args[0]: # do_m
+ fig.figimage(HAMMER, 0.0075 * fig.bbox.xmax, 0.395 * fig.bbox.ymax, zorder=10)
+ if args[1]: # do_s
+ fig.figimage(HAMMER, 0.72 * fig.bbox.xmax, 0.395 * fig.bbox.ymax, zorder=11)
+ if args[2]: # do_a
+ fig.figimage(HAMMER, 0.363 * fig.bbox.xmax, 0.64 * fig.bbox.ymax, zorder=12)
+ if args[3]: # do_b
+ fig.figimage(HAMMER, 0.72 * fig.bbox.xmax, 0.64 * fig.bbox.ymax, zorder=13)
+ if args[4]: # do_v
+ fig.figimage(HAMMER, 0.0075 * fig.bbox.xmax, 0.64 * fig.bbox.ymax, zorder=14)
+ else: # b -> v
+ a3 = patches.FancyArrowPatch(
+ (0.86, 1.21),
+ (-0.86, 1.21),
+ connectionstyle="arc3,rad=.3",
+ linewidth=2,
+ arrowstyle="simple, head_width=10, head_length=10",
+ color="k",
+ )
+ ax.add_patch(a3)
+ # print(ax.get_xlim())
+ # print(ax.get_ylim())
+ fig.tight_layout()
+ fig.canvas.draw()
+ return np.array(fig.canvas.renderer.buffer_rgba())
+
+
+def chest_graph(*args):
+ x, a, d, r, s = r"$\mathbf{x}$", r"$a$", r"$d$", r"$r$", r"$s$"
+ ua, ud, ur, us = (
+ r"$\mathbf{U}_a$",
+ r"$\mathbf{U}_d$",
+ r"$\mathbf{U}_r$",
+ r"$\mathbf{U}_s$",
+ )
+ zx, ex = r"$\mathbf{z}_{1:L}$", r"$\boldsymbol{\epsilon}$"
+
+ G = nx.DiGraph()
+ G.add_edge(ua, a)
+ G.add_edge(ud, d)
+ G.add_edge(ur, r)
+ G.add_edge(us, s)
+ G.add_edge(a, d)
+ G.add_edge(d, x)
+ G.add_edge(r, x)
+ G.add_edge(s, x)
+ G.add_edge(ex, x)
+ G.add_edge(zx, x)
+ G.add_edge(a, x)
+
+ pos = {
+ x: (0, 0),
+ a: (-1, 1),
+ d: (0, 1),
+ r: (1, 1),
+ s: (1, 0),
+ ua: (-1, 2),
+ ud: (0, 2),
+ ur: (1, 2),
+ us: (1, -1),
+ zx: (-0.25, -1),
+ ex: (0.25, -1),
+ }
+
+ node_c = {}
+ for node in G:
+ node_c[node] = "lightgrey" if node in [x, a, d, r, s] else "white"
+
+ edge_c = {e: "black" for e in G.edges}
+ node_line_c = {k: "black" for k, _ in node_c.items()}
+
+ if args[0]: # do_r
+ # G.remove_edge(ur, r)
+ edge_c[(ur, r)] = "lightgrey"
+ node_line_c[r] = "red"
+ if args[1]: # do_s
+ # G.remove_edges_from([(us, s)])
+ edge_c[(us, s)] = "lightgrey"
+ node_line_c[s] = "red"
+ if args[2]: # do_f (do_d)
+ # G.remove_edges_from([(ud, d), (a, d)])
+ edge_c[(ud, d)] = "lightgrey"
+ edge_c[(a, d)] = "lightgrey"
+ node_line_c[d] = "red"
+ if args[3]: # do_a
+ # G.remove_edge(ua, a)
+ edge_c[(ua, a)] = "lightgrey"
+ node_line_c[a] = "red"
+
+ fs = 30
+ options = {
+ "font_size": fs,
+ "node_size": 3000,
+ "node_color": list(node_c.values()),
+ "edgecolors": list(node_line_c.values()),
+ "edge_color": list(edge_c.values()),
+ "linewidths": 2,
+ "width": 2,
+ }
+ plt.close("all")
+ fig, ax = plt.subplots(1, 1, figsize=(5, 5)) # , constrained_layout=True)
+ # fig.patch.set_visible(False)
+ ax.margins(x=0.1, y=0.08, tight=False)
+ ax.axis("off")
+ nx.draw_networkx(G, pos, **options, arrowsize=25, arrowstyle="-|>", ax=ax)
+ # need to reuse x, y limits so that the graphs plot the same way before and after removing edges
+ x_lim = (-1.32, 1.32)
+ y_lim = (-1.414, 2.414)
+ ax.set_xlim(x_lim)
+ ax.set_ylim(y_lim)
+ rect = patches.FancyBboxPatch(
+ (-0.5, -1.325),
+ 1,
+ 0.65,
+ boxstyle="round, pad=0.05, rounding_size=0",
+ linewidth=2,
+ edgecolor="black",
+ facecolor="none",
+ linestyle="-",
+ )
+ ax.add_patch(rect)
+ ax.text(-0.9, -1.075, r"$\mathbf{U}_{\mathbf{x}}$", fontsize=fs)
+
+ if args[0]: # do_r
+ fig.figimage(HAMMER, 0.72 * fig.bbox.xmax, 0.64 * fig.bbox.ymax, zorder=10)
+ if args[1]: # do_s
+ fig.figimage(HAMMER, 0.72 * fig.bbox.xmax, 0.395 * fig.bbox.ymax, zorder=11)
+ if args[2]: # do_f
+ fig.figimage(HAMMER, 0.363 * fig.bbox.xmax, 0.64 * fig.bbox.ymax, zorder=12)
+ if args[3]: # do_a
+ fig.figimage(HAMMER, 0.0075 * fig.bbox.xmax, 0.64 * fig.bbox.ymax, zorder=13)
+
+ fig.tight_layout()
+ fig.canvas.draw()
+ return np.array(fig.canvas.renderer.buffer_rgba())
+
+
+def vae_preprocess(args, pa):
+ if "ukbb" in args.hps:
+ # preprocessing ukbb parents for the vae which was originally trained using
+ # log standardized parents. The pgm was trained using [-1,1] normalization
+ # first undo [-1,1] parent preprocessing back to original range
+ for k, v in pa.items():
+ if k != "mri_seq" and k != "sex":
+ pa[k] = (v + 1) / 2 # [-1,1] -> [0,1]
+ _max, _min = get_attr_max_min(k)
+ pa[k] = pa[k] * (_max - _min) + _min
+ # log_standardize parents for vae input
+ for k, v in pa.items():
+ logpa_k = torch.log(v.clamp(min=1e-12))
+ if k == "age":
+ pa[k] = (logpa_k - 4.112339973449707) / 0.11769197136163712
+ elif k == "brain_volume":
+ pa[k] = (logpa_k - 13.965583801269531) / 0.09537758678197861
+ elif k == "ventricle_volume":
+ pa[k] = (logpa_k - 10.345998764038086) / 0.43127763271331787
+ # concatenate parents expand to input res for conditioning the vae
+ pa = torch.cat(
+ [pa[k] if len(pa[k].shape) > 1 else pa[k][..., None] for k in args.parents_x],
+ dim=1,
+ )
+ pa = (
+ pa[..., None, None].repeat(1, 1, *(args.input_res,) * 2).to(args.device).float()
+ )
+ return pa
+
+
+def preprocess_brain(args, obs):
+ obs["x"] = (obs["x"][None, ...].float().to(args.device) - 127.5) / 127.5 # [-1,1]
+ # for all other variables except x
+ for k in [k for k in obs.keys() if k != "x"]:
+ obs[k] = obs[k].float().to(args.device).view(1, 1)
+ if k in ["age", "brain_volume", "ventricle_volume"]:
+ k_max, k_min = get_attr_max_min(k)
+ obs[k] = (obs[k] - k_min) / (k_max - k_min) # [0,1]
+ obs[k] = 2 * obs[k] - 1 # [-1,1]
+ return obs
+
+
+def get_fig_arr(x, width=4, height=4, dpi=144, cmap="Greys_r", norm=None):
+ fig = plt.figure(figsize=(width, height), dpi=dpi)
+ ax = plt.axes([0, 0, 1, 1], frameon=False)
+ if cmap == "Greys_r":
+ ax.imshow(x, cmap=cmap, vmin=0, vmax=255)
+ else:
+ ax.imshow(x, cmap=cmap, norm=norm)
+ ax.axis("off")
+ fig.canvas.draw()
+ return np.array(fig.canvas.renderer.buffer_rgba())
+
+
+def normalize(x, x_min=None, x_max=None, zero_one=False):
+ if x_min is None:
+ x_min = x.min()
+ if x_max is None:
+ x_max = x.max()
+ x = (x - x_min) / (x_max - x_min) # [0,1]
+ return x if zero_one else 2 * x - 1 # else [-1,1]
diff --git a/checkpoints/a_r_s_f/mimic_beta9_gelu_dgauss_1_lr3/checkpoint.pt b/checkpoints/a_r_s_f/mimic_beta9_gelu_dgauss_1_lr3/checkpoint.pt
new file mode 100644
index 0000000000000000000000000000000000000000..b11a3e0bf04433e5b9ab0212c4b3423f86be8c76
--- /dev/null
+++ b/checkpoints/a_r_s_f/mimic_beta9_gelu_dgauss_1_lr3/checkpoint.pt
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:eaab2e017c753c90183239bf6e149a0cebe83155a1749eab95305f068bdb552f
+size 134
diff --git a/checkpoints/a_r_s_f/mimic_dscm_lr_1e5_lagrange_lr_1_damping_10/6500_checkpoint.pt b/checkpoints/a_r_s_f/mimic_dscm_lr_1e5_lagrange_lr_1_damping_10/6500_checkpoint.pt
new file mode 100644
index 0000000000000000000000000000000000000000..76f2caffd1749fb7d1eac3c4de5d15a6c294edd4
--- /dev/null
+++ b/checkpoints/a_r_s_f/mimic_dscm_lr_1e5_lagrange_lr_1_damping_10/6500_checkpoint.pt
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:114b8f0f1677605417c99dc7f091ece828e89bc75ee9550e9d0f8048aa43d587
+size 134
diff --git a/checkpoints/a_r_s_f/sup_pgm_mimic/checkpoint.pt b/checkpoints/a_r_s_f/sup_pgm_mimic/checkpoint.pt
new file mode 100644
index 0000000000000000000000000000000000000000..79c92366d88a63225a163c949dbee71198cfbf78
--- /dev/null
+++ b/checkpoints/a_r_s_f/sup_pgm_mimic/checkpoint.pt
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:109dda6b72d38390aabd6e590a27bd6eeb2eb6c92c3ecd753a2fe7c014ac319d
+size 132
diff --git a/checkpoints/a_r_s_f/sup_pgm_mimic/checkpoint_current.pt b/checkpoints/a_r_s_f/sup_pgm_mimic/checkpoint_current.pt
new file mode 100644
index 0000000000000000000000000000000000000000..8b8904a29f40622f446de9cd1be90ede3fdd2f24
--- /dev/null
+++ b/checkpoints/a_r_s_f/sup_pgm_mimic/checkpoint_current.pt
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e686cff0a6a6656c248acdc0873f3e5711665d1420217d89ae550b3bba9f8d59
+size 132
diff --git a/checkpoints/m_b_v_s/sup_pgm/checkpoint.pt b/checkpoints/m_b_v_s/sup_pgm/checkpoint.pt
new file mode 100644
index 0000000000000000000000000000000000000000..834d6eb4700207fc3b1c7416b580a30569de4e17
--- /dev/null
+++ b/checkpoints/m_b_v_s/sup_pgm/checkpoint.pt
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8f1a873caf6a96f607034e7cbc8d8abaab5971d1297e51160b07b4ffe39b2c66
+size 132
diff --git a/checkpoints/m_b_v_s/ukbb192_beta5_dgauss_b33/checkpoint.pt b/checkpoints/m_b_v_s/ukbb192_beta5_dgauss_b33/checkpoint.pt
new file mode 100644
index 0000000000000000000000000000000000000000..46cbfd13746cb4e7c5968f00adb6f6d205bdf5f5
--- /dev/null
+++ b/checkpoints/m_b_v_s/ukbb192_beta5_dgauss_b33/checkpoint.pt
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0eb4df03d7573187ee962297735e626af6104769d50f2d5211656cc81276a79b
+size 134
diff --git a/checkpoints/t_i_d/dgauss_cond_big_beta1_dropexo/checkpoint.pt b/checkpoints/t_i_d/dgauss_cond_big_beta1_dropexo/checkpoint.pt
new file mode 100644
index 0000000000000000000000000000000000000000..73bb8820bdd3949795f55ef61ce80918f25745aa
--- /dev/null
+++ b/checkpoints/t_i_d/dgauss_cond_big_beta1_dropexo/checkpoint.pt
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f3122e11cce58d2e2cafcdb952bb8dbca57e65298aaced86eb700131e2cff632
+size 133
diff --git a/checkpoints/t_i_d/sup_pgm/checkpoint.pt b/checkpoints/t_i_d/sup_pgm/checkpoint.pt
new file mode 100644
index 0000000000000000000000000000000000000000..852b5b63a92035625c212cfcb39c1dd54b1cb0eb
--- /dev/null
+++ b/checkpoints/t_i_d/sup_pgm/checkpoint.pt
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8cb53124e1a91a8f4254d4cb3eaa1a0d2623b79eb8ec453207d2e6bc65ebcfb6
+size 130
diff --git a/data/mimic_subset/0.jpg b/data/mimic_subset/0.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..c60902b48cd856221a1a521963e9b76b7322c10d
Binary files /dev/null and b/data/mimic_subset/0.jpg differ
diff --git a/data/mimic_subset/1.jpg b/data/mimic_subset/1.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..169bb806ce28d93880c8b9e19d0900afe872ecaf
Binary files /dev/null and b/data/mimic_subset/1.jpg differ
diff --git a/data/mimic_subset/10.jpg b/data/mimic_subset/10.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..6e09fab6d1d4f1e849f48080ef41c4e66f6bfd08
Binary files /dev/null and b/data/mimic_subset/10.jpg differ
diff --git a/data/mimic_subset/11.jpg b/data/mimic_subset/11.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..f6f7cac22279d80465fe5bd5acb017c106591d1e
Binary files /dev/null and b/data/mimic_subset/11.jpg differ
diff --git a/data/mimic_subset/12.jpg b/data/mimic_subset/12.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..e9b069d585d9a546c6352eb27535a514d9a3f9b7
Binary files /dev/null and b/data/mimic_subset/12.jpg differ
diff --git a/data/mimic_subset/13.jpg b/data/mimic_subset/13.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..69fc7709302d0883ad8a9bae4e9c18ab2e8d5f84
Binary files /dev/null and b/data/mimic_subset/13.jpg differ
diff --git a/data/mimic_subset/14.jpg b/data/mimic_subset/14.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..a22e01a3c4d378b820d598f214892c14cd2c7ab1
Binary files /dev/null and b/data/mimic_subset/14.jpg differ
diff --git a/data/mimic_subset/15.jpg b/data/mimic_subset/15.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..c9499f81694a3c06a3538c2c03d23bf82896fede
Binary files /dev/null and b/data/mimic_subset/15.jpg differ
diff --git a/data/mimic_subset/16.jpg b/data/mimic_subset/16.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..7e30aa14627b5dc53bac95e3c8e4cff7a00bcdc8
Binary files /dev/null and b/data/mimic_subset/16.jpg differ
diff --git a/data/mimic_subset/17.jpg b/data/mimic_subset/17.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..20bd042d875d3f77863d4d3fde15af612d94c9c6
Binary files /dev/null and b/data/mimic_subset/17.jpg differ
diff --git a/data/mimic_subset/18.jpg b/data/mimic_subset/18.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..5cf80eb4749c29a859f894c58e30ed96b5f067d9
Binary files /dev/null and b/data/mimic_subset/18.jpg differ
diff --git a/data/mimic_subset/19.jpg b/data/mimic_subset/19.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..d3efaf117b2da762dea9c5b4194a88c666e07a09
Binary files /dev/null and b/data/mimic_subset/19.jpg differ
diff --git a/data/mimic_subset/2.jpg b/data/mimic_subset/2.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..bc06f37bede6117287dab080aadc5f659786b677
Binary files /dev/null and b/data/mimic_subset/2.jpg differ
diff --git a/data/mimic_subset/20.jpg b/data/mimic_subset/20.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..21907fb2a42d502c2640daf5a2e157063f074dfa
Binary files /dev/null and b/data/mimic_subset/20.jpg differ
diff --git a/data/mimic_subset/21.jpg b/data/mimic_subset/21.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..f74a2cdff26a4a2ecd39a37e636e22b4a69dc795
Binary files /dev/null and b/data/mimic_subset/21.jpg differ
diff --git a/data/mimic_subset/22.jpg b/data/mimic_subset/22.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..5d8f08461006ce8a22d70f3413f3103f4ee63143
Binary files /dev/null and b/data/mimic_subset/22.jpg differ
diff --git a/data/mimic_subset/23.jpg b/data/mimic_subset/23.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..06152c1a98594c3c965f5b7276f18998b22fe162
Binary files /dev/null and b/data/mimic_subset/23.jpg differ
diff --git a/data/mimic_subset/24.jpg b/data/mimic_subset/24.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..cf76874f71dce53ee9b4e474278de7c3405e5ad3
Binary files /dev/null and b/data/mimic_subset/24.jpg differ
diff --git a/data/mimic_subset/25.jpg b/data/mimic_subset/25.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..364fffab70778b153a9c4c1456a1245aa91b4ec6
Binary files /dev/null and b/data/mimic_subset/25.jpg differ
diff --git a/data/mimic_subset/26.jpg b/data/mimic_subset/26.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..487e5bbc3d1cd50617a13708a18b3606796db0e3
Binary files /dev/null and b/data/mimic_subset/26.jpg differ
diff --git a/data/mimic_subset/27.jpg b/data/mimic_subset/27.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..c8dc477d9b4a5b04bc9927c09855c0a92180af69
Binary files /dev/null and b/data/mimic_subset/27.jpg differ
diff --git a/data/mimic_subset/28.jpg b/data/mimic_subset/28.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..646a525c6f259ed2749a6e1bf0c89458352cbbc3
Binary files /dev/null and b/data/mimic_subset/28.jpg differ
diff --git a/data/mimic_subset/29.jpg b/data/mimic_subset/29.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..b20338329f47cccf9a2304bf3a3ea32be5a85716
Binary files /dev/null and b/data/mimic_subset/29.jpg differ
diff --git a/data/mimic_subset/3.jpg b/data/mimic_subset/3.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..ee36839ade96aba8acb53151f939737e3e6fa03a
Binary files /dev/null and b/data/mimic_subset/3.jpg differ
diff --git a/data/mimic_subset/30.jpg b/data/mimic_subset/30.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..723087b8abc1c1e902991b90215e6687fd9221b2
Binary files /dev/null and b/data/mimic_subset/30.jpg differ
diff --git a/data/mimic_subset/31.jpg b/data/mimic_subset/31.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..a4455558cddf17805c7f4a180b7cf9c2e8ce8832
Binary files /dev/null and b/data/mimic_subset/31.jpg differ
diff --git a/data/mimic_subset/32.jpg b/data/mimic_subset/32.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..cb006353282ddb8cc8cea7a891e310441b8b16aa
Binary files /dev/null and b/data/mimic_subset/32.jpg differ
diff --git a/data/mimic_subset/33.jpg b/data/mimic_subset/33.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..7da926aaff8553605b9b6d76ebb61c3e546681c9
Binary files /dev/null and b/data/mimic_subset/33.jpg differ
diff --git a/data/mimic_subset/34.jpg b/data/mimic_subset/34.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..b4e21110d7225f1a15393dcd0fab39d6d2aafce8
Binary files /dev/null and b/data/mimic_subset/34.jpg differ
diff --git a/data/mimic_subset/35.jpg b/data/mimic_subset/35.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..b1e0e8c000caa5b7f568c90323575183f2db6015
Binary files /dev/null and b/data/mimic_subset/35.jpg differ
diff --git a/data/mimic_subset/36.jpg b/data/mimic_subset/36.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..802c3100d13d066d8fe0beaef5633cc4d4217d72
Binary files /dev/null and b/data/mimic_subset/36.jpg differ
diff --git a/data/mimic_subset/37.jpg b/data/mimic_subset/37.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..db4c89aecfb60750a2d9ac71442ce6b0ae19375a
Binary files /dev/null and b/data/mimic_subset/37.jpg differ
diff --git a/data/mimic_subset/38.jpg b/data/mimic_subset/38.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..036de4b2719941387fc26cd51deef5f72b5cdf62
Binary files /dev/null and b/data/mimic_subset/38.jpg differ
diff --git a/data/mimic_subset/39.jpg b/data/mimic_subset/39.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..aa43c1d6f709d79512b00558c32c297cf3f838e0
Binary files /dev/null and b/data/mimic_subset/39.jpg differ
diff --git a/data/mimic_subset/4.jpg b/data/mimic_subset/4.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..b1c3d8e8e475819d12eeaae151a48f855d2386d8
Binary files /dev/null and b/data/mimic_subset/4.jpg differ
diff --git a/data/mimic_subset/40.jpg b/data/mimic_subset/40.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..0ea9809492848682e9818c2ad3d0f48b61a88b45
Binary files /dev/null and b/data/mimic_subset/40.jpg differ
diff --git a/data/mimic_subset/41.jpg b/data/mimic_subset/41.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..0d8ff20727124efb8569021608b943a7b1130b5f
Binary files /dev/null and b/data/mimic_subset/41.jpg differ
diff --git a/data/mimic_subset/42.jpg b/data/mimic_subset/42.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..8a45fa33cb47709e9b5fa6d709dedef66bed8261
Binary files /dev/null and b/data/mimic_subset/42.jpg differ
diff --git a/data/mimic_subset/43.jpg b/data/mimic_subset/43.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..d3ff1123a17ec4b572c32dc7b1a700fd5a6b5c5d
Binary files /dev/null and b/data/mimic_subset/43.jpg differ
diff --git a/data/mimic_subset/44.jpg b/data/mimic_subset/44.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..8c041a4de5294f228ab101bb1566bfed85c3e338
Binary files /dev/null and b/data/mimic_subset/44.jpg differ
diff --git a/data/mimic_subset/45.jpg b/data/mimic_subset/45.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..70abb0da248e8659bec690f6f2afc51dcea6aebb
Binary files /dev/null and b/data/mimic_subset/45.jpg differ
diff --git a/data/mimic_subset/46.jpg b/data/mimic_subset/46.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..a5f920e875593e9470cb7103cb4e56348d949bdd
Binary files /dev/null and b/data/mimic_subset/46.jpg differ
diff --git a/data/mimic_subset/47.jpg b/data/mimic_subset/47.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..f3edac182dd32136e16472d332194be9341f745c
Binary files /dev/null and b/data/mimic_subset/47.jpg differ
diff --git a/data/mimic_subset/48.jpg b/data/mimic_subset/48.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..768383c4cf010725d3592edf0ab4895331c6cf6b
Binary files /dev/null and b/data/mimic_subset/48.jpg differ
diff --git a/data/mimic_subset/49.jpg b/data/mimic_subset/49.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..3db46e2e1b4336585a93d4c2be164681a5a3712e
Binary files /dev/null and b/data/mimic_subset/49.jpg differ
diff --git a/data/mimic_subset/5.jpg b/data/mimic_subset/5.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..405b77112deef32de45643002395b76b8e47e8d8
Binary files /dev/null and b/data/mimic_subset/5.jpg differ
diff --git a/data/mimic_subset/50.jpg b/data/mimic_subset/50.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..5974b71c5cdbd30bff15830d03e0ad39ce2b514c
Binary files /dev/null and b/data/mimic_subset/50.jpg differ
diff --git a/data/mimic_subset/6.jpg b/data/mimic_subset/6.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..9f52ffdd39c3daa94cd02f55740587245ff23ec3
Binary files /dev/null and b/data/mimic_subset/6.jpg differ
diff --git a/data/mimic_subset/7.jpg b/data/mimic_subset/7.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..e5d239fc54a3ec6c6253aabcf3ac057d4c785163
Binary files /dev/null and b/data/mimic_subset/7.jpg differ
diff --git a/data/mimic_subset/8.jpg b/data/mimic_subset/8.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..4817dfa6b0c84f97dcb3f3181889afecd65eba0e
Binary files /dev/null and b/data/mimic_subset/8.jpg differ
diff --git a/data/mimic_subset/9.jpg b/data/mimic_subset/9.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..9919baada98e0b0334d305b49344a23fb71fd351
Binary files /dev/null and b/data/mimic_subset/9.jpg differ
diff --git a/data/mimic_subset/mimic.sample.test.csv b/data/mimic_subset/mimic.sample.test.csv
new file mode 100644
index 0000000000000000000000000000000000000000..76a16d7a2e82401ec7b7694851ab5d2678c7d2ce
--- /dev/null
+++ b/data/mimic_subset/mimic.sample.test.csv
@@ -0,0 +1,52 @@
+,path,PerformedProcedureStepDescription,split,ViewPosition,Rows,Columns,StudyDate,StudyTime,ProcedureCodeSequence_CodeMeaning,ViewCodeSequence_CodeMeaning,PatientOrientationCodeSequence_CodeMeaning,Atelectasis,Cardiomegaly,Consolidation,Edema,Enlarged Cardiomediastinum,Fracture,Lung Lesion,Lung Opacity,No Finding,Pleural Effusion,Pleural Other,Pneumonia,Pneumothorax,Support Devices,race,sex,age,anchor_year,anchor_year_group,dod,race_label,sex_label,disease,disease_label,path_preproc
+0,p16/p16394447/s50003676/c5e0182b-436be488-dc7c03a1-73f4038b-97edf019.jpg,CHEST (PA AND LAT),test,PA,3056,2544,21350225,194829.703,CHEST (PA AND LAT),postero-anterior,Erect,,,,,,,,,1.0,,,,,,Black,Female,44.0,2128,2008 - 2010,,2,1,No Finding,0,0.jpg
+1,p17/p17735335/s52949889/60d00570-f4d2bba9-04001e62-774b616b-0c6b09bb.jpg,CHEST (PORTABLE AP),test,AP,2712,2544,21190110,184154.625,CHEST (PORTABLE AP),antero-posterior,Erect,1.0,,,-1.0,,,,1.0,,1.0,,1.0,,1.0,White,Female,74.0,2118,2011 - 2013,2119-01-27,0,1,Pleural Effusion,1,1.jpg
+2,p18/p18201582/s58089447/f681073e-a00d021f-f8078458-8e5786d7-bd1b8f58.jpg,CHEST (PORTABLE AP),test,AP,2942,2539,21670609,140138.531,CHEST (PORTABLE AP),antero-posterior,,,1.0,,,,,,,,1.0,,,0.0,,White,Male,79.0,2163,2011 - 2013,,0,0,Pleural Effusion,1,2.jpg
+3,p11/p11984647/s50912149/1fe0ab1f-2e69077b-64cbe536-639e7abd-c56ffc35.jpg,CHEST (PORTABLE AP),test,AP,3050,2539,21280330,185753.64,CHEST (PORTABLE AP),antero-posterior,,,1.0,,1.0,,,,1.0,,1.0,,,0.0,1.0,White,Male,52.0,2128,2014 - 2016,,0,0,Pleural Effusion,1,3.jpg
+4,p17/p17843033/s55692716/bef1b267-3b916df3-2bcb9ab7-40269cd9-de065978.jpg,CHEST (PORTABLE AP),test,AP,3056,2544,21630815,35853.015,CHEST (PORTABLE AP),antero-posterior,Erect,1.0,,,,,,,1.0,,1.0,,-1.0,0.0,1.0,Asian,Male,82.0,2163,2011 - 2013,,1,0,Pleural Effusion,1,4.jpg
+5,p11/p11740173/s50574105/bc923ff4-85d3bf88-bee46f78-f5d38e9d-db100517.jpg,CHEST (PORTABLE AP),test,AP,3050,2539,21721110,124229.0,CHEST (PORTABLE AP),antero-posterior,Erect,,1.0,1.0,1.0,,,1.0,,,1.0,,,0.0,1.0,White,Female,68.0,2172,2014 - 2016,,0,1,Pleural Effusion,1,5.jpg
+6,p15/p15104675/s52995159/74027416-55d7fe0b-be7ced34-1876a1e5-eea1da02.jpg,CHEST (PORTABLE AP),test,AP,2544,3056,21881221,114627.796,CHEST (PORTABLE AP),antero-posterior,Erect,,,1.0,1.0,,,,1.0,,1.0,,,0.0,1.0,White,Male,64.0,2188,2014 - 2016,,0,0,Pleural Effusion,1,6.jpg
+7,p14/p14538785/s56163294/ba73ed90-024f44a5-c30cdf28-df4aa17a-ee9e8d3c.jpg,CHEST (PORTABLE AP),test,AP,2544,3056,21200204,53142.578,CHEST (PORTABLE AP),antero-posterior,Erect,,,,,,,,,1.0,,,,,,White,Male,76.0,2120,2014 - 2016,,0,0,No Finding,0,7.jpg
+8,p12/p12445879/s51758043/3c72a2f1-6c45bd25-3eb6fa75-0a93c82e-2006c372.jpg,,test,PA,2022,2022,21830507,171249.0,CHEST (PA AND LAT),postero-anterior,Erect,1.0,,,,,,,,,1.0,,,,,White,Male,71.0,2181,2011 - 2013,,0,0,Pleural Effusion,1,8.jpg
+9,p13/p13896515/s58088717/4f4c1ed7-5e3e7b32-534f3142-60dfa8a1-b5350381.jpg,CHEST (PORTABLE AP),test,AP,3056,2544,21730116,120127.187,CHEST (PORTABLE AP),antero-posterior,Erect,,,,,,,,,1.0,,,,,1.0,White,Male,79.0,2165,2008 - 2010,,0,0,No Finding,0,9.jpg
+10,p16/p16008484/s56921303/69a7ce6b-3da6ef04-aba99696-962b2c0a-2163fe46.jpg,CHEST (PORTABLE AP),test,AP,2866,2457,21430108,123424.718,CHEST (PORTABLE AP),antero-posterior,Erect,,,,,,,,,1.0,,,,,,White,Female,46.0,2143,2011 - 2013,,0,1,No Finding,0,10.jpg
+11,p13/p13358526/s50260231/28605298-faed1815-717412fa-4badb4e6-bd9632e1.jpg,CHEST (PORTABLE AP),test,AP,2539,3050,21330312,50705.765,CHEST (PORTABLE AP),antero-posterior,Recumbent,,1.0,,1.0,1.0,,,,,1.0,,,0.0,1.0,White,Male,68.0,2133,2014 - 2016,,0,0,Pleural Effusion,1,11.jpg
+12,p19/p19736038/s51052347/a2bb31e1-1fc247a6-ef2e8e80-83c722c8-c87ecfdd.jpg,,test,PA,2022,2022,21690108,100151.0,CHEST (PA AND LAT),postero-anterior,Erect,,,,,,,,,,1.0,,,,,White,Female,60.0,2167,2014 - 2016,,0,1,Pleural Effusion,1,12.jpg
+13,p13/p13582491/s57856319/729bdbc4-b3d98878-adc44de2-8e5bc537-a801eb2c.jpg,CHEST (PA AND LAT),test,PA,3056,2544,21300518,133559.109,CHEST (PA AND LAT),postero-anterior,Erect,,,,,,,,,1.0,,,,,,Black,Female,85.0,2127,2008 - 2010,2131-01-14,2,1,No Finding,0,13.jpg
+14,p14/p14181616/s58270165/f88ac608-8e313eb7-3184daa1-169fb736-12d64d5f.jpg,CHEST (PORTABLE AP),test,AP,2539,3050,21971025,45640.171,CHEST (PORTABLE AP),antero-posterior,Erect,,,,0.0,,,,,,1.0,,,,1.0,White,Female,65.0,2197,2014 - 2016,,0,1,Pleural Effusion,1,14.jpg
+15,p16/p16783577/s54728959/4ebff787-20664d84-85d1854e-ae058355-caf8060a.jpg,CHEST (PORTABLE AP),test,AP,3050,2539,21801226,35707.234,CHEST (PORTABLE AP),antero-posterior,Erect,,1.0,,1.0,,,,,,1.0,,,0.0,1.0,Asian,Male,73.0,2173,2008 - 2010,2180-12-30,1,0,Pleural Effusion,1,15.jpg
+16,p10/p10826816/s59137955/0fa748ba-83fc5b52-96b6dd32-26a4b345-1aab9005.jpg,CHEST (PORTABLE AP),test,AP,2544,3056,21740814,120751.015,CHEST (PORTABLE AP),antero-posterior,Erect,,,,1.0,,,,,,1.0,,,,1.0,White,Male,81.0,2172,2008 - 2010,2174-08-15,0,0,Pleural Effusion,1,16.jpg
+17,p11/p11404988/s55668449/e36414c5-8362ccc2-14b8abc1-155b1c88-09a874f2.jpg,CHEST (PA AND LAT),test,AP,2544,3056,21800506,224003.437,CHEST (PA AND LAT),antero-posterior,Erect,,,0.0,,,,,,1.0,,,,,,Black,Female,68.0,2180,2014 - 2016,,2,1,No Finding,0,17.jpg
+18,p14/p14488269/s54552917/508a9999-a2a78b71-e05b7925-bfb7ebdb-6e2e000f.jpg,CHEST (PA AND LAT),test,PA,2607,2544,21780204,174727.312,CHEST (PA AND LAT),postero-anterior,Erect,,,,,,,,,1.0,,,,,,Black,Female,57.0,2174,2011 - 2013,,2,1,No Finding,0,18.jpg
+19,p19/p19254962/s56252844/c7b38e29-6d2d4b7d-6213d761-5a0ca7b2-07f213e2.jpg,CHEST (PORTABLE AP),test,AP,3050,2539,21180920,51711.0,CHEST (PORTABLE AP),antero-posterior,Erect,,,,,,,,,1.0,,,,,,White,Female,66.0,2118,2011 - 2013,,0,1,No Finding,0,19.jpg
+20,p16/p16598160/s50930334/16c358e6-490381ee-77ecdedb-c6c8adbc-6138de0d.jpg,CHEST (PA AND LAT),test,PA,3056,2544,21610127,105046.562,CHEST (PA AND LAT),postero-anterior,Erect,,,,,,,,,1.0,,,,,,White,Male,44.0,2161,2014 - 2016,,0,0,No Finding,0,20.jpg
+21,p12/p12654170/s58892257/60d9d278-e01eeed6-9d2631b1-453d773c-1c912db2.jpg,CHEST (PORTABLE AP),test,AP,2544,3056,21830720,173829.828,CHEST (PORTABLE AP),antero-posterior,Erect,,,,1.0,,,,,,1.0,,1.0,,,White,Male,79.0,2178,2008 - 2010,,0,0,Pleural Effusion,1,21.jpg
+22,p15/p15425725/s59210491/c9418557-3fe462e7-83ce49ba-54341df2-fc0e3941.jpg,CHEST (PORTABLE AP),test,AP,3056,2544,21421218,30944.968,CHEST (PORTABLE AP),antero-posterior,Erect,,,,0.0,,,,0.0,1.0,,,0.0,,1.0,White,Female,54.0,2142,2011 - 2013,,0,1,No Finding,0,22.jpg
+23,p15/p15345462/s55790218/5ac076c5-0c16d5bd-16fbc289-be6ef9f8-06e8a7f0.jpg,CHEST (PA AND LAT),test,PA,2544,2926,22041001,104831.593,CHEST (PA AND LAT),postero-anterior,Erect,,,,,,,,,1.0,,,,,,White,Male,36.0,2196,2008 - 2010,,0,0,No Finding,0,23.jpg
+24,p17/p17639884/s53217733/212a56d0-7eb46f71-b708bd44-eb698da4-8602abb4.jpg,CHEST (PA AND LAT),test,PA,3056,2532,21530622,150109.703,CHEST (PA AND LAT),postero-anterior,Erect,,,,,,,,,1.0,,,,0.0,,White,Male,20.0,2153,2011 - 2013,,0,0,No Finding,0,24.jpg
+25,p19/p19279951/s52215754/a24fa5ed-1aa4ee08-418ecea4-a245c14f-f9eff1fb.jpg,CHEST (PA AND LAT),test,PA,3056,2544,21720605,161124.062,CHEST (PA AND LAT),postero-anterior,Erect,,,,,,,,,1.0,,,,,,White,Female,24.0,2172,2011 - 2013,,0,1,No Finding,0,25.jpg
+26,p13/p13028893/s51810673/590d274c-9db31af1-351be54c-1f647e23-d31e94ed.jpg,CHEST (PORTABLE AP),test,AP,2539,3050,21211018,51144.531,CHEST (PORTABLE AP),antero-posterior,,,,,,,,,,1.0,,,0.0,,,White,Male,65.0,2116,2008 - 2010,,0,0,No Finding,0,26.jpg
+27,p16/p16773746/s50446568/97a3ddfc-14ed5726-9c111bac-0b5817e3-f2e24280.jpg,CHEST (PORTABLE AP),test,AP,2539,3028,21791012,215503.593,CHEST (PORTABLE AP),antero-posterior,,,0.0,,,,,,,1.0,0.0,,0.0,0.0,,White,Male,84.0,2179,2014 - 2016,,0,0,No Finding,0,27.jpg
+28,p19/p19106574/s55918447/eb4bebd6-b3c88829-da9d46f7-a4ccbbde-5b755126.jpg,Performed Desc,test,PA,2021,2021,21820630,95958.0,CHEST (PA AND LAT),postero-anterior,Recumbent,,,,,,,1.0,,,1.0,,,0.0,,Black,Female,80.0,2182,2014 - 2016,,2,1,Pleural Effusion,1,28.jpg
+29,p16/p16833001/s51430879/b11738da-615bee27-b84dea4c-3ad79432-812033d8.jpg,CHEST (PA AND LAT),test,AP,2544,3056,21740514,145239.656,CHEST (PA AND LAT),antero-posterior,Erect,1.0,,,,,,,,,1.0,,,,,White,Male,65.0,2168,2008 - 2010,,0,0,Pleural Effusion,1,29.jpg
+30,p16/p16960471/s50068717/d2074c7c-eaac2601-2b2caff7-81507022-113d57ae.jpg,CHEST (PA AND LAT),test,PA,2544,3056,21490804,131405.421,CHEST (PA AND LAT),postero-anterior,Erect,,,,,,,,,1.0,,,,,,White,Male,53.0,2149,2014 - 2016,,0,0,No Finding,0,30.jpg
+31,p13/p13919434/s57821150/68b1f143-7ea360e0-f0a67f35-7e8ad0ec-748c8942.jpg,CHEST (PORTABLE AP),test,AP,2544,3056,21890213,210502.828,CHEST (PORTABLE AP),antero-posterior,Erect,,-1.0,,,-1.0,,,1.0,,1.0,,,,1.0,White,Male,82.0,2188,2014 - 2016,,0,0,Pleural Effusion,1,31.jpg
+32,p19/p19276413/s54431291/45695d2e-7b8261cf-ad9bdb25-00435044-457d2907.jpg,CHEST (PA AND LAT),test,PA,3056,2544,21260121,102101.187,CHEST (PA AND LAT),postero-anterior,Erect,1.0,,,,,,-1.0,,,1.0,,,,,White,Female,87.0,2121,2008 - 2010,2129-07-13,0,1,Pleural Effusion,1,32.jpg
+33,p19/p19800188/s52849099/c4caf8fc-faccd41c-d6443d23-37fb2204-1444eab6.jpg,,test,PA,2022,1636,21330607,120854.0,CHEST (PA AND LAT),postero-anterior,Erect,,,,,,,,0.0,1.0,,,,,,Black,Female,77.0,2129,2008 - 2010,,2,1,No Finding,0,33.jpg
+34,p12/p12912569/s55468473/ce30f8d2-54952d1d-d10ea581-824d578d-990ff08e.jpg,CHEST (PA AND LAT),test,PA,3056,2544,21590601,144118.265,CHEST (PA AND LAT),postero-anterior,Erect,,,,,,,,,1.0,,,,,,White,Male,67.0,2154,2011 - 2013,,0,0,No Finding,0,34.jpg
+35,p18/p18232511/s56646752/45abc995-02a94561-19fd7a59-00ad34dd-829f20e1.jpg,CHEST (PORTABLE AP),test,AP,3056,2544,21280830,170057.859,CHEST (PORTABLE AP),antero-posterior,,1.0,1.0,,-1.0,-1.0,,,,,1.0,,,0.0,1.0,White,Male,88.0,2128,2011 - 2013,2128-09-08,0,0,Pleural Effusion,1,35.jpg
+36,p19/p19807371/s50496092/2b7d811f-b9d6b82b-5b565ce1-541ed6f7-4d57f055.jpg,Performed Desc,test,PA,1867,1829,21500411,203638.0,CHEST (PA AND LAT),postero-anterior,Recumbent,,,,,,,,,1.0,,,,,,White,Male,62.0,2146,2008 - 2010,,0,0,No Finding,0,36.jpg
+37,p14/p14776642/s59556092/b5db2600-ab2d895a-4eacc917-96045060-69c5ddf3.jpg,CHEST (PA AND LAT),test,PA,3056,2544,21730413,204306.983,CHEST (PA AND LAT),postero-anterior,Erect,,,,,,,,,1.0,,,,,,White,Female,88.0,2171,2014 - 2016,,0,1,No Finding,0,37.jpg
+38,p14/p14170425/s57683293/d4224ddd-8aa6156b-cd29c9d9-348705e1-b788d738.jpg,CHEST (PORTABLE AP),test,AP,2706,2509,21491214,153207.953,CHEST (PORTABLE AP),antero-posterior,Recumbent,1.0,,,,,,,1.0,,1.0,,-1.0,,1.0,White,Female,67.0,2149,2011 - 2013,,0,1,Pleural Effusion,1,38.jpg
+39,p16/p16851334/s59719450/8505b9e9-8b3fecaf-a0566263-8ce70bf5-a937460d.jpg,CHEST (PA AND LAT),test,PA,3056,2544,21511113,211152.359,CHEST (PA AND LAT),postero-anterior,Erect,,,,,,,,,1.0,,,,,,White,Female,60.0,2151,2011 - 2013,,0,1,No Finding,0,39.jpg
+40,p14/p14412677/s58769341/49bb997d-f4161c0d-99213469-a08d59b6-bc635cdd.jpg,CHEST (PA AND LAT),test,AP,2260,3056,21680810,110725.234,CHEST (PA AND LAT),antero-posterior,Erect,,,,,,,,,1.0,,,,,,Black,Male,68.0,2165,2008 - 2010,,2,0,No Finding,0,40.jpg
+41,p13/p13971613/s54858442/f1f31a24-299a993f-9d3cffa7-377b8b93-d7b85909.jpg,CHEST (PA AND LAT),test,PA,3056,2544,21290626,30728.281000000003,CHEST (PA AND LAT),postero-anterior,Erect,,,,,,,,,1.0,,,,,,Black,Female,47.0,2123,2008 - 2010,,2,1,No Finding,0,41.jpg
+42,p16/p16132012/s53066662/58faeda6-ac72ab8d-5ecf67e5-445585c3-5fb602b5.jpg,CHEST (PORTABLE AP),test,AP,2544,3056,21701006,42234.64,CHEST (PORTABLE AP),antero-posterior,Erect,,,1.0,,,,,,,1.0,,,0.0,1.0,White,Male,67.0,2170,2014 - 2016,,0,0,Pleural Effusion,1,42.jpg
+43,p12/p12709045/s51630219/e90bca50-23ea826d-44292992-64f1f150-eafbf035.jpg,CHEST (PORTABLE AP),test,AP,2544,3056,21170412,113656.562,CHEST (PORTABLE AP),antero-posterior,Erect,,0.0,,0.0,,,,,1.0,0.0,,0.0,,1.0,White,Male,40.0,2117,2011 - 2013,,0,0,No Finding,0,43.jpg
+44,p17/p17639480/s51056784/111b5f65-fe385262-3eaef61a-bf50a9f5-61ecd0fa.jpg,CHEST (PA AND LAT),test,AP,2544,3056,21251003,135051.296,CHEST (PA AND LAT),antero-posterior,Erect,,,,,,,,,1.0,,,,,,Black,Male,63.0,2121,2008 - 2010,,2,0,No Finding,0,44.jpg
+45,p19/p19467588/s55028214/58505eb6-3059b00b-7ca76e6f-8e6f29c9-58136da3.jpg,CHEST (PORTABLE AP),test,AP,2544,3056,21550810,233507.781,CHEST (PORTABLE AP),antero-posterior,Erect,,,,,,,,,1.0,,,0.0,,,White,Male,50.0,2151,2008 - 2010,,0,0,No Finding,0,45.jpg
+46,p14/p14798598/s52112755/b5d54c2b-3c976d41-4cfaf756-3aa4c341-fee6e69a.jpg,CHEST (PORTABLE AP),test,AP,2287,3050,21710507,120639.843,CHEST (PORTABLE AP),antero-posterior,Erect,,,,-1.0,,,,,,1.0,,,,,Black,Male,60.0,2167,2011 - 2013,,2,0,Pleural Effusion,1,46.jpg
+47,p18/p18028180/s50287111/2a240148-cbd4d113-36f18e92-4a93807b-9bbefb0f.jpg,,test,PA,2022,1886,21630823,121711.0,CHEST (PA AND LAT),postero-anterior,Erect,,,,,,,,,1.0,,,,,,White,Male,71.0,2161,2008 - 2010,,0,0,No Finding,0,47.jpg
+48,p11/p11140108/s50465343/0b506cd2-337fba7a-55ffab8a-781091e7-667dcd37.jpg,CHEST (PA AND LAT),test,PA,2544,3056,21830925,193407.796,CHEST (PA AND LAT),postero-anterior,Erect,,,,,,,,,1.0,,,,,,Black,Male,45.0,2183,2011 - 2013,,2,0,No Finding,0,48.jpg
+49,p14/p14460495/s57211021/87d8e7b7-819a0c2c-87dd4fe4-48362be0-6c726a02.jpg,,test,PA,2022,1736,21550131,92656.0,CHEST (PA AND LAT),postero-anterior,Erect,,,,,,,,,,1.0,,,1.0,,White,Female,55.0,2152,2014 - 2016,,0,1,Pleural Effusion,1,49.jpg
+50,p10/p10336114/s58646090/fc1d55da-bcd0ea7b-37c8124c-4af23324-c4be4c77.jpg,CHEST (PA AND LAT),test,AP,3056,2544,21720822,182659.984,CHEST (PA AND LAT),antero-posterior,Erect,-1.0,,,1.0,,,,1.0,,1.0,,-1.0,1.0,,White,Male,91.0,2172,2014 - 2016,,0,0,Pleural Effusion,1,50.jpg
diff --git a/data/mimic_subset/subset.csv b/data/mimic_subset/subset.csv
new file mode 100644
index 0000000000000000000000000000000000000000..76a16d7a2e82401ec7b7694851ab5d2678c7d2ce
--- /dev/null
+++ b/data/mimic_subset/subset.csv
@@ -0,0 +1,52 @@
+,path,PerformedProcedureStepDescription,split,ViewPosition,Rows,Columns,StudyDate,StudyTime,ProcedureCodeSequence_CodeMeaning,ViewCodeSequence_CodeMeaning,PatientOrientationCodeSequence_CodeMeaning,Atelectasis,Cardiomegaly,Consolidation,Edema,Enlarged Cardiomediastinum,Fracture,Lung Lesion,Lung Opacity,No Finding,Pleural Effusion,Pleural Other,Pneumonia,Pneumothorax,Support Devices,race,sex,age,anchor_year,anchor_year_group,dod,race_label,sex_label,disease,disease_label,path_preproc
+0,p16/p16394447/s50003676/c5e0182b-436be488-dc7c03a1-73f4038b-97edf019.jpg,CHEST (PA AND LAT),test,PA,3056,2544,21350225,194829.703,CHEST (PA AND LAT),postero-anterior,Erect,,,,,,,,,1.0,,,,,,Black,Female,44.0,2128,2008 - 2010,,2,1,No Finding,0,0.jpg
+1,p17/p17735335/s52949889/60d00570-f4d2bba9-04001e62-774b616b-0c6b09bb.jpg,CHEST (PORTABLE AP),test,AP,2712,2544,21190110,184154.625,CHEST (PORTABLE AP),antero-posterior,Erect,1.0,,,-1.0,,,,1.0,,1.0,,1.0,,1.0,White,Female,74.0,2118,2011 - 2013,2119-01-27,0,1,Pleural Effusion,1,1.jpg
+2,p18/p18201582/s58089447/f681073e-a00d021f-f8078458-8e5786d7-bd1b8f58.jpg,CHEST (PORTABLE AP),test,AP,2942,2539,21670609,140138.531,CHEST (PORTABLE AP),antero-posterior,,,1.0,,,,,,,,1.0,,,0.0,,White,Male,79.0,2163,2011 - 2013,,0,0,Pleural Effusion,1,2.jpg
+3,p11/p11984647/s50912149/1fe0ab1f-2e69077b-64cbe536-639e7abd-c56ffc35.jpg,CHEST (PORTABLE AP),test,AP,3050,2539,21280330,185753.64,CHEST (PORTABLE AP),antero-posterior,,,1.0,,1.0,,,,1.0,,1.0,,,0.0,1.0,White,Male,52.0,2128,2014 - 2016,,0,0,Pleural Effusion,1,3.jpg
+4,p17/p17843033/s55692716/bef1b267-3b916df3-2bcb9ab7-40269cd9-de065978.jpg,CHEST (PORTABLE AP),test,AP,3056,2544,21630815,35853.015,CHEST (PORTABLE AP),antero-posterior,Erect,1.0,,,,,,,1.0,,1.0,,-1.0,0.0,1.0,Asian,Male,82.0,2163,2011 - 2013,,1,0,Pleural Effusion,1,4.jpg
+5,p11/p11740173/s50574105/bc923ff4-85d3bf88-bee46f78-f5d38e9d-db100517.jpg,CHEST (PORTABLE AP),test,AP,3050,2539,21721110,124229.0,CHEST (PORTABLE AP),antero-posterior,Erect,,1.0,1.0,1.0,,,1.0,,,1.0,,,0.0,1.0,White,Female,68.0,2172,2014 - 2016,,0,1,Pleural Effusion,1,5.jpg
+6,p15/p15104675/s52995159/74027416-55d7fe0b-be7ced34-1876a1e5-eea1da02.jpg,CHEST (PORTABLE AP),test,AP,2544,3056,21881221,114627.796,CHEST (PORTABLE AP),antero-posterior,Erect,,,1.0,1.0,,,,1.0,,1.0,,,0.0,1.0,White,Male,64.0,2188,2014 - 2016,,0,0,Pleural Effusion,1,6.jpg
+7,p14/p14538785/s56163294/ba73ed90-024f44a5-c30cdf28-df4aa17a-ee9e8d3c.jpg,CHEST (PORTABLE AP),test,AP,2544,3056,21200204,53142.578,CHEST (PORTABLE AP),antero-posterior,Erect,,,,,,,,,1.0,,,,,,White,Male,76.0,2120,2014 - 2016,,0,0,No Finding,0,7.jpg
+8,p12/p12445879/s51758043/3c72a2f1-6c45bd25-3eb6fa75-0a93c82e-2006c372.jpg,,test,PA,2022,2022,21830507,171249.0,CHEST (PA AND LAT),postero-anterior,Erect,1.0,,,,,,,,,1.0,,,,,White,Male,71.0,2181,2011 - 2013,,0,0,Pleural Effusion,1,8.jpg
+9,p13/p13896515/s58088717/4f4c1ed7-5e3e7b32-534f3142-60dfa8a1-b5350381.jpg,CHEST (PORTABLE AP),test,AP,3056,2544,21730116,120127.187,CHEST (PORTABLE AP),antero-posterior,Erect,,,,,,,,,1.0,,,,,1.0,White,Male,79.0,2165,2008 - 2010,,0,0,No Finding,0,9.jpg
+10,p16/p16008484/s56921303/69a7ce6b-3da6ef04-aba99696-962b2c0a-2163fe46.jpg,CHEST (PORTABLE AP),test,AP,2866,2457,21430108,123424.718,CHEST (PORTABLE AP),antero-posterior,Erect,,,,,,,,,1.0,,,,,,White,Female,46.0,2143,2011 - 2013,,0,1,No Finding,0,10.jpg
+11,p13/p13358526/s50260231/28605298-faed1815-717412fa-4badb4e6-bd9632e1.jpg,CHEST (PORTABLE AP),test,AP,2539,3050,21330312,50705.765,CHEST (PORTABLE AP),antero-posterior,Recumbent,,1.0,,1.0,1.0,,,,,1.0,,,0.0,1.0,White,Male,68.0,2133,2014 - 2016,,0,0,Pleural Effusion,1,11.jpg
+12,p19/p19736038/s51052347/a2bb31e1-1fc247a6-ef2e8e80-83c722c8-c87ecfdd.jpg,,test,PA,2022,2022,21690108,100151.0,CHEST (PA AND LAT),postero-anterior,Erect,,,,,,,,,,1.0,,,,,White,Female,60.0,2167,2014 - 2016,,0,1,Pleural Effusion,1,12.jpg
+13,p13/p13582491/s57856319/729bdbc4-b3d98878-adc44de2-8e5bc537-a801eb2c.jpg,CHEST (PA AND LAT),test,PA,3056,2544,21300518,133559.109,CHEST (PA AND LAT),postero-anterior,Erect,,,,,,,,,1.0,,,,,,Black,Female,85.0,2127,2008 - 2010,2131-01-14,2,1,No Finding,0,13.jpg
+14,p14/p14181616/s58270165/f88ac608-8e313eb7-3184daa1-169fb736-12d64d5f.jpg,CHEST (PORTABLE AP),test,AP,2539,3050,21971025,45640.171,CHEST (PORTABLE AP),antero-posterior,Erect,,,,0.0,,,,,,1.0,,,,1.0,White,Female,65.0,2197,2014 - 2016,,0,1,Pleural Effusion,1,14.jpg
+15,p16/p16783577/s54728959/4ebff787-20664d84-85d1854e-ae058355-caf8060a.jpg,CHEST (PORTABLE AP),test,AP,3050,2539,21801226,35707.234,CHEST (PORTABLE AP),antero-posterior,Erect,,1.0,,1.0,,,,,,1.0,,,0.0,1.0,Asian,Male,73.0,2173,2008 - 2010,2180-12-30,1,0,Pleural Effusion,1,15.jpg
+16,p10/p10826816/s59137955/0fa748ba-83fc5b52-96b6dd32-26a4b345-1aab9005.jpg,CHEST (PORTABLE AP),test,AP,2544,3056,21740814,120751.015,CHEST (PORTABLE AP),antero-posterior,Erect,,,,1.0,,,,,,1.0,,,,1.0,White,Male,81.0,2172,2008 - 2010,2174-08-15,0,0,Pleural Effusion,1,16.jpg
+17,p11/p11404988/s55668449/e36414c5-8362ccc2-14b8abc1-155b1c88-09a874f2.jpg,CHEST (PA AND LAT),test,AP,2544,3056,21800506,224003.437,CHEST (PA AND LAT),antero-posterior,Erect,,,0.0,,,,,,1.0,,,,,,Black,Female,68.0,2180,2014 - 2016,,2,1,No Finding,0,17.jpg
+18,p14/p14488269/s54552917/508a9999-a2a78b71-e05b7925-bfb7ebdb-6e2e000f.jpg,CHEST (PA AND LAT),test,PA,2607,2544,21780204,174727.312,CHEST (PA AND LAT),postero-anterior,Erect,,,,,,,,,1.0,,,,,,Black,Female,57.0,2174,2011 - 2013,,2,1,No Finding,0,18.jpg
+19,p19/p19254962/s56252844/c7b38e29-6d2d4b7d-6213d761-5a0ca7b2-07f213e2.jpg,CHEST (PORTABLE AP),test,AP,3050,2539,21180920,51711.0,CHEST (PORTABLE AP),antero-posterior,Erect,,,,,,,,,1.0,,,,,,White,Female,66.0,2118,2011 - 2013,,0,1,No Finding,0,19.jpg
+20,p16/p16598160/s50930334/16c358e6-490381ee-77ecdedb-c6c8adbc-6138de0d.jpg,CHEST (PA AND LAT),test,PA,3056,2544,21610127,105046.562,CHEST (PA AND LAT),postero-anterior,Erect,,,,,,,,,1.0,,,,,,White,Male,44.0,2161,2014 - 2016,,0,0,No Finding,0,20.jpg
+21,p12/p12654170/s58892257/60d9d278-e01eeed6-9d2631b1-453d773c-1c912db2.jpg,CHEST (PORTABLE AP),test,AP,2544,3056,21830720,173829.828,CHEST (PORTABLE AP),antero-posterior,Erect,,,,1.0,,,,,,1.0,,1.0,,,White,Male,79.0,2178,2008 - 2010,,0,0,Pleural Effusion,1,21.jpg
+22,p15/p15425725/s59210491/c9418557-3fe462e7-83ce49ba-54341df2-fc0e3941.jpg,CHEST (PORTABLE AP),test,AP,3056,2544,21421218,30944.968,CHEST (PORTABLE AP),antero-posterior,Erect,,,,0.0,,,,0.0,1.0,,,0.0,,1.0,White,Female,54.0,2142,2011 - 2013,,0,1,No Finding,0,22.jpg
+23,p15/p15345462/s55790218/5ac076c5-0c16d5bd-16fbc289-be6ef9f8-06e8a7f0.jpg,CHEST (PA AND LAT),test,PA,2544,2926,22041001,104831.593,CHEST (PA AND LAT),postero-anterior,Erect,,,,,,,,,1.0,,,,,,White,Male,36.0,2196,2008 - 2010,,0,0,No Finding,0,23.jpg
+24,p17/p17639884/s53217733/212a56d0-7eb46f71-b708bd44-eb698da4-8602abb4.jpg,CHEST (PA AND LAT),test,PA,3056,2532,21530622,150109.703,CHEST (PA AND LAT),postero-anterior,Erect,,,,,,,,,1.0,,,,0.0,,White,Male,20.0,2153,2011 - 2013,,0,0,No Finding,0,24.jpg
+25,p19/p19279951/s52215754/a24fa5ed-1aa4ee08-418ecea4-a245c14f-f9eff1fb.jpg,CHEST (PA AND LAT),test,PA,3056,2544,21720605,161124.062,CHEST (PA AND LAT),postero-anterior,Erect,,,,,,,,,1.0,,,,,,White,Female,24.0,2172,2011 - 2013,,0,1,No Finding,0,25.jpg
+26,p13/p13028893/s51810673/590d274c-9db31af1-351be54c-1f647e23-d31e94ed.jpg,CHEST (PORTABLE AP),test,AP,2539,3050,21211018,51144.531,CHEST (PORTABLE AP),antero-posterior,,,,,,,,,,1.0,,,0.0,,,White,Male,65.0,2116,2008 - 2010,,0,0,No Finding,0,26.jpg
+27,p16/p16773746/s50446568/97a3ddfc-14ed5726-9c111bac-0b5817e3-f2e24280.jpg,CHEST (PORTABLE AP),test,AP,2539,3028,21791012,215503.593,CHEST (PORTABLE AP),antero-posterior,,,0.0,,,,,,,1.0,0.0,,0.0,0.0,,White,Male,84.0,2179,2014 - 2016,,0,0,No Finding,0,27.jpg
+28,p19/p19106574/s55918447/eb4bebd6-b3c88829-da9d46f7-a4ccbbde-5b755126.jpg,Performed Desc,test,PA,2021,2021,21820630,95958.0,CHEST (PA AND LAT),postero-anterior,Recumbent,,,,,,,1.0,,,1.0,,,0.0,,Black,Female,80.0,2182,2014 - 2016,,2,1,Pleural Effusion,1,28.jpg
+29,p16/p16833001/s51430879/b11738da-615bee27-b84dea4c-3ad79432-812033d8.jpg,CHEST (PA AND LAT),test,AP,2544,3056,21740514,145239.656,CHEST (PA AND LAT),antero-posterior,Erect,1.0,,,,,,,,,1.0,,,,,White,Male,65.0,2168,2008 - 2010,,0,0,Pleural Effusion,1,29.jpg
+30,p16/p16960471/s50068717/d2074c7c-eaac2601-2b2caff7-81507022-113d57ae.jpg,CHEST (PA AND LAT),test,PA,2544,3056,21490804,131405.421,CHEST (PA AND LAT),postero-anterior,Erect,,,,,,,,,1.0,,,,,,White,Male,53.0,2149,2014 - 2016,,0,0,No Finding,0,30.jpg
+31,p13/p13919434/s57821150/68b1f143-7ea360e0-f0a67f35-7e8ad0ec-748c8942.jpg,CHEST (PORTABLE AP),test,AP,2544,3056,21890213,210502.828,CHEST (PORTABLE AP),antero-posterior,Erect,,-1.0,,,-1.0,,,1.0,,1.0,,,,1.0,White,Male,82.0,2188,2014 - 2016,,0,0,Pleural Effusion,1,31.jpg
+32,p19/p19276413/s54431291/45695d2e-7b8261cf-ad9bdb25-00435044-457d2907.jpg,CHEST (PA AND LAT),test,PA,3056,2544,21260121,102101.187,CHEST (PA AND LAT),postero-anterior,Erect,1.0,,,,,,-1.0,,,1.0,,,,,White,Female,87.0,2121,2008 - 2010,2129-07-13,0,1,Pleural Effusion,1,32.jpg
+33,p19/p19800188/s52849099/c4caf8fc-faccd41c-d6443d23-37fb2204-1444eab6.jpg,,test,PA,2022,1636,21330607,120854.0,CHEST (PA AND LAT),postero-anterior,Erect,,,,,,,,0.0,1.0,,,,,,Black,Female,77.0,2129,2008 - 2010,,2,1,No Finding,0,33.jpg
+34,p12/p12912569/s55468473/ce30f8d2-54952d1d-d10ea581-824d578d-990ff08e.jpg,CHEST (PA AND LAT),test,PA,3056,2544,21590601,144118.265,CHEST (PA AND LAT),postero-anterior,Erect,,,,,,,,,1.0,,,,,,White,Male,67.0,2154,2011 - 2013,,0,0,No Finding,0,34.jpg
+35,p18/p18232511/s56646752/45abc995-02a94561-19fd7a59-00ad34dd-829f20e1.jpg,CHEST (PORTABLE AP),test,AP,3056,2544,21280830,170057.859,CHEST (PORTABLE AP),antero-posterior,,1.0,1.0,,-1.0,-1.0,,,,,1.0,,,0.0,1.0,White,Male,88.0,2128,2011 - 2013,2128-09-08,0,0,Pleural Effusion,1,35.jpg
+36,p19/p19807371/s50496092/2b7d811f-b9d6b82b-5b565ce1-541ed6f7-4d57f055.jpg,Performed Desc,test,PA,1867,1829,21500411,203638.0,CHEST (PA AND LAT),postero-anterior,Recumbent,,,,,,,,,1.0,,,,,,White,Male,62.0,2146,2008 - 2010,,0,0,No Finding,0,36.jpg
+37,p14/p14776642/s59556092/b5db2600-ab2d895a-4eacc917-96045060-69c5ddf3.jpg,CHEST (PA AND LAT),test,PA,3056,2544,21730413,204306.983,CHEST (PA AND LAT),postero-anterior,Erect,,,,,,,,,1.0,,,,,,White,Female,88.0,2171,2014 - 2016,,0,1,No Finding,0,37.jpg
+38,p14/p14170425/s57683293/d4224ddd-8aa6156b-cd29c9d9-348705e1-b788d738.jpg,CHEST (PORTABLE AP),test,AP,2706,2509,21491214,153207.953,CHEST (PORTABLE AP),antero-posterior,Recumbent,1.0,,,,,,,1.0,,1.0,,-1.0,,1.0,White,Female,67.0,2149,2011 - 2013,,0,1,Pleural Effusion,1,38.jpg
+39,p16/p16851334/s59719450/8505b9e9-8b3fecaf-a0566263-8ce70bf5-a937460d.jpg,CHEST (PA AND LAT),test,PA,3056,2544,21511113,211152.359,CHEST (PA AND LAT),postero-anterior,Erect,,,,,,,,,1.0,,,,,,White,Female,60.0,2151,2011 - 2013,,0,1,No Finding,0,39.jpg
+40,p14/p14412677/s58769341/49bb997d-f4161c0d-99213469-a08d59b6-bc635cdd.jpg,CHEST (PA AND LAT),test,AP,2260,3056,21680810,110725.234,CHEST (PA AND LAT),antero-posterior,Erect,,,,,,,,,1.0,,,,,,Black,Male,68.0,2165,2008 - 2010,,2,0,No Finding,0,40.jpg
+41,p13/p13971613/s54858442/f1f31a24-299a993f-9d3cffa7-377b8b93-d7b85909.jpg,CHEST (PA AND LAT),test,PA,3056,2544,21290626,30728.281000000003,CHEST (PA AND LAT),postero-anterior,Erect,,,,,,,,,1.0,,,,,,Black,Female,47.0,2123,2008 - 2010,,2,1,No Finding,0,41.jpg
+42,p16/p16132012/s53066662/58faeda6-ac72ab8d-5ecf67e5-445585c3-5fb602b5.jpg,CHEST (PORTABLE AP),test,AP,2544,3056,21701006,42234.64,CHEST (PORTABLE AP),antero-posterior,Erect,,,1.0,,,,,,,1.0,,,0.0,1.0,White,Male,67.0,2170,2014 - 2016,,0,0,Pleural Effusion,1,42.jpg
+43,p12/p12709045/s51630219/e90bca50-23ea826d-44292992-64f1f150-eafbf035.jpg,CHEST (PORTABLE AP),test,AP,2544,3056,21170412,113656.562,CHEST (PORTABLE AP),antero-posterior,Erect,,0.0,,0.0,,,,,1.0,0.0,,0.0,,1.0,White,Male,40.0,2117,2011 - 2013,,0,0,No Finding,0,43.jpg
+44,p17/p17639480/s51056784/111b5f65-fe385262-3eaef61a-bf50a9f5-61ecd0fa.jpg,CHEST (PA AND LAT),test,AP,2544,3056,21251003,135051.296,CHEST (PA AND LAT),antero-posterior,Erect,,,,,,,,,1.0,,,,,,Black,Male,63.0,2121,2008 - 2010,,2,0,No Finding,0,44.jpg
+45,p19/p19467588/s55028214/58505eb6-3059b00b-7ca76e6f-8e6f29c9-58136da3.jpg,CHEST (PORTABLE AP),test,AP,2544,3056,21550810,233507.781,CHEST (PORTABLE AP),antero-posterior,Erect,,,,,,,,,1.0,,,0.0,,,White,Male,50.0,2151,2008 - 2010,,0,0,No Finding,0,45.jpg
+46,p14/p14798598/s52112755/b5d54c2b-3c976d41-4cfaf756-3aa4c341-fee6e69a.jpg,CHEST (PORTABLE AP),test,AP,2287,3050,21710507,120639.843,CHEST (PORTABLE AP),antero-posterior,Erect,,,,-1.0,,,,,,1.0,,,,,Black,Male,60.0,2167,2011 - 2013,,2,0,Pleural Effusion,1,46.jpg
+47,p18/p18028180/s50287111/2a240148-cbd4d113-36f18e92-4a93807b-9bbefb0f.jpg,,test,PA,2022,1886,21630823,121711.0,CHEST (PA AND LAT),postero-anterior,Erect,,,,,,,,,1.0,,,,,,White,Male,71.0,2161,2008 - 2010,,0,0,No Finding,0,47.jpg
+48,p11/p11140108/s50465343/0b506cd2-337fba7a-55ffab8a-781091e7-667dcd37.jpg,CHEST (PA AND LAT),test,PA,2544,3056,21830925,193407.796,CHEST (PA AND LAT),postero-anterior,Erect,,,,,,,,,1.0,,,,,,Black,Male,45.0,2183,2011 - 2013,,2,0,No Finding,0,48.jpg
+49,p14/p14460495/s57211021/87d8e7b7-819a0c2c-87dd4fe4-48362be0-6c726a02.jpg,,test,PA,2022,1736,21550131,92656.0,CHEST (PA AND LAT),postero-anterior,Erect,,,,,,,,,,1.0,,,1.0,,White,Female,55.0,2152,2014 - 2016,,0,1,Pleural Effusion,1,49.jpg
+50,p10/p10336114/s58646090/fc1d55da-bcd0ea7b-37c8124c-4af23324-c4be4c77.jpg,CHEST (PA AND LAT),test,AP,3056,2544,21720822,182659.984,CHEST (PA AND LAT),antero-posterior,Erect,-1.0,,,1.0,,,,1.0,,1.0,,-1.0,1.0,,White,Male,91.0,2172,2014 - 2016,,0,0,Pleural Effusion,1,50.jpg
diff --git a/data/morphomnist/args.txt b/data/morphomnist/args.txt
new file mode 100644
index 0000000000000000000000000000000000000000..0024fac7a0f717a2d2c822f91ceb9990550847ea
--- /dev/null
+++ b/data/morphomnist/args.txt
@@ -0,0 +1,2 @@
+Generated data for:
+ {'data_dir': None, 'out_dir': None, 'digit_class': None, 'scale': 0.5, 'invert': False}
diff --git a/data/morphomnist/t10k-images-idx3-ubyte.gz b/data/morphomnist/t10k-images-idx3-ubyte.gz
new file mode 100644
index 0000000000000000000000000000000000000000..1decd0e380f6f760cd9c6c1a263cfdf24b001fb4
--- /dev/null
+++ b/data/morphomnist/t10k-images-idx3-ubyte.gz
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:fca251af9e8bb975a9d96f43efc7a6df475413eccdf915aabb74dc65f4e5652e
+size 132
diff --git a/data/morphomnist/t10k-labels-idx1-ubyte.gz b/data/morphomnist/t10k-labels-idx1-ubyte.gz
new file mode 100644
index 0000000000000000000000000000000000000000..b16f659f93718844b7902babb188f65361893fc5
--- /dev/null
+++ b/data/morphomnist/t10k-labels-idx1-ubyte.gz
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2291b1b95f6c84f505c7a071a520a01cd3925a6a87fc72f5a109e39fae8f2336
+size 129
diff --git a/data/morphomnist/t10k-morpho.csv b/data/morphomnist/t10k-morpho.csv
new file mode 100644
index 0000000000000000000000000000000000000000..5edc2f3b48a122fddfee99a832ccf42e504a89f2
--- /dev/null
+++ b/data/morphomnist/t10k-morpho.csv
@@ -0,0 +1,10001 @@
+index,thickness,intensity
+0,2.2673757,145.269
+1,3.2086186,229.09312
+2,2.9266238,191.09865
+3,2.602468,134.27042
+4,2.6118739,124.75302
+5,2.7481873,169.86557
+6,3.9670238,243.42421
+7,2.274238,121.70919
+8,2.112816,103.30275
+9,3.575687,226.01262
+10,2.1956968,105.64374
+11,3.3157773,223.2632
+12,2.9447083,189.03122
+13,3.632892,242.2603
+14,3.511247,223.5301
+15,3.146798,215.69023
+16,2.2441509,127.599014
+17,1.9850459,103.87755
+18,2.447785,116.930435
+19,2.4949822,133.49014
+20,1.5686895,90.98499
+21,2.9808774,189.59213
+22,3.019344,205.9497
+23,1.6816409,112.61929
+24,2.0056744,122.38548
+25,2.306978,162.87416
+26,2.5021217,175.02821
+27,3.381744,216.67838
+28,2.7623684,205.39868
+29,2.1588445,161.63425
+30,1.4531327,101.3557
+31,3.2868595,217.7907
+32,1.7369993,133.83975
+33,2.1665843,138.93214
+34,1.9845929,112.14717
+35,2.5477767,122.86253
+36,2.8865564,190.21315
+37,2.2291188,139.14005
+38,3.239295,230.37546
+39,2.0487282,133.75041
+40,2.6465335,156.61505
+41,2.0909898,116.943115
+42,2.5802891,142.01439
+43,2.6023927,185.4331
+44,2.3954034,146.0748
+45,3.50733,239.54323
+46,2.4135566,138.0409
+47,1.2688905,98.93027
+48,1.9364803,140.81815
+49,2.6095722,189.84763
+50,1.9471502,126.02113
+51,1.710875,106.79206
+52,3.145038,184.65063
+53,2.909958,221.41014
+54,2.427731,135.36215
+55,2.6117015,172.37921
+56,2.0775468,157.86493
+57,2.1031141,115.31748
+58,1.7218287,122.004196
+59,2.7981696,210.95705
+60,2.862187,194.7292
+61,3.0382202,207.40799
+62,1.6253458,99.12088
+63,2.3943875,130.47131
+64,2.0364025,96.311905
+65,1.8539282,85.34467
+66,2.2991493,179.94786
+67,2.5008261,175.13293
+68,2.358411,146.60893
+69,2.206313,132.08783
+70,2.0772445,141.7496
+71,3.366714,231.58981
+72,2.4531004,157.10654
+73,2.9243326,190.89354
+74,2.2341926,125.05069
+75,2.6363804,183.12085
+76,1.5988505,118.33134
+77,1.9967797,118.58586
+78,1.8076907,99.08919
+79,2.3315024,161.56421
+80,2.4991834,175.56711
+81,3.1358562,232.21307
+82,3.0674736,218.18842
+83,3.0363507,191.88205
+84,2.6981902,177.27032
+85,2.2884114,155.52895
+86,2.8621264,215.73434
+87,2.9721916,184.77246
+88,1.704276,114.31651
+89,3.8123066,242.98073
+90,2.6129804,176.12265
+91,2.1094875,166.17642
+92,1.6699878,95.552246
+93,1.9285647,82.57107
+94,1.9792948,99.29985
+95,2.4722667,156.77933
+96,2.2839365,158.0548
+97,2.4767509,149.31363
+98,1.8018615,126.89961
+99,1.8415756,115.27343
+100,2.0769541,125.36293
+101,2.7043903,201.22514
+102,3.0324602,186.27078
+103,2.3139277,150.88191
+104,2.6452563,183.8222
+105,1.9682902,141.53949
+106,2.375388,127.916504
+107,2.5387733,144.44678
+108,3.7038586,249.25627
+109,2.2073188,153.06522
+110,2.1279225,115.270645
+111,2.4975402,162.62094
+112,3.546432,237.91061
+113,3.2684703,206.00992
+114,2.0161164,104.054306
+115,1.7505124,104.23308
+116,2.2832613,179.72171
+117,3.1394272,212.98482
+118,1.5518419,86.31007
+119,1.8881845,130.73328
+120,2.6360326,177.07053
+121,1.9592526,113.85046
+122,2.6667447,176.0632
+123,2.600924,157.38364
+124,2.780024,188.61682
+125,2.9626153,201.06393
+126,2.6458051,193.47693
+127,2.6495178,156.56624
+128,1.3498305,77.148186
+129,3.0577023,203.8353
+130,2.6984544,230.40785
+131,2.7537844,219.01633
+132,1.8769181,91.41308
+133,2.345368,158.77866
+134,3.0831773,201.67374
+135,3.638596,227.37868
+136,1.4238127,83.19237
+137,1.9850644,90.57391
+138,2.5225751,174.82224
+139,2.8191123,212.84056
+140,2.8809364,170.05603
+141,2.2801802,161.53482
+142,2.244582,130.01987
+143,1.6534855,91.1864
+144,2.477763,133.14174
+145,2.2678912,101.513016
+146,2.9031637,219.909
+147,2.0109127,117.92179
+148,2.1722362,126.94238
+149,3.3318057,204.41982
+150,2.41961,130.01996
+151,1.9165206,132.18385
+152,2.2280343,99.201706
+153,2.3766866,161.7127
+154,1.9627783,110.921104
+155,2.1250174,94.872696
+156,1.6925597,111.294815
+157,2.6036987,164.49945
+158,2.1434913,134.89615
+159,1.6968777,90.880516
+160,1.758213,113.8715
+161,2.5706875,148.22816
+162,1.9412643,154.92654
+163,2.9285798,193.68031
+164,4.009933,249.08939
+165,2.312398,175.03609
+166,2.6072614,175.92001
+167,2.9214072,150.66196
+168,3.2028751,233.35751
+169,1.7936461,100.34071
+170,2.5710595,181.95518
+171,3.0139384,204.11275
+172,2.5577772,164.88269
+173,2.4753385,141.77094
+174,1.4102862,76.78978
+175,2.4595344,165.88042
+176,2.1212752,145.1033
+177,2.1039338,131.75093
+178,1.7850652,99.27373
+179,3.6297977,228.22298
+180,3.3826556,222.78508
+181,3.75163,240.60196
+182,3.2521589,227.5131
+183,2.5075502,127.45083
+184,2.312299,143.43256
+185,1.9887502,116.65382
+186,2.4038682,161.00677
+187,1.9933028,111.08122
+188,2.9759183,195.29956
+189,2.9467802,185.9161
+190,2.0525117,119.772934
+191,2.2689786,130.3057
+192,1.9806349,113.36229
+193,2.3537436,110.55376
+194,2.05708,126.3394
+195,3.6734147,243.77876
+196,3.0444589,224.08107
+197,1.7531065,91.46775
+198,2.934497,204.33833
+199,1.6474679,97.870865
+200,2.275401,125.63819
+201,2.0138526,135.3632
+202,1.6583077,90.04986
+203,2.5476542,128.03873
+204,2.3399062,169.13698
+205,2.5966728,144.20627
+206,1.2474506,77.817726
+207,3.6959252,238.81898
+208,2.056226,144.87396
+209,2.6221807,192.54466
+210,1.9289778,106.37317
+211,3.545443,236.98416
+212,1.3725547,84.1521
+213,2.4111638,119.88483
+214,1.6691542,80.545975
+215,1.9290047,87.415436
+216,2.0835285,120.36631
+217,2.8285248,161.2527
+218,2.4400897,158.95071
+219,2.1871903,135.86086
+220,2.3470545,177.68353
+221,3.083964,214.05542
+222,2.4475062,175.59216
+223,2.4460816,143.14096
+224,2.7614715,165.73642
+225,3.834406,247.81685
+226,2.3982882,139.46878
+227,2.0167418,124.29111
+228,2.5287962,131.52242
+229,2.340773,142.91116
+230,2.2410572,194.73123
+231,3.0321121,209.73636
+232,1.9363112,88.175026
+233,3.0728986,186.75685
+234,1.9807231,109.70126
+235,3.0794568,220.60147
+236,3.9514472,244.66722
+237,2.384793,142.34866
+238,3.9207902,241.02686
+239,2.6768696,137.11432
+240,2.5292673,204.52466
+241,1.7953136,119.93915
+242,2.1173315,140.04306
+243,2.9216342,198.98245
+244,2.287512,129.87679
+245,2.4816294,166.95055
+246,1.5705087,99.815445
+247,2.4002879,129.11696
+248,3.666222,229.0708
+249,1.7351202,96.986755
+250,2.596482,214.65643
+251,3.2970045,205.23022
+252,3.8681495,231.98817
+253,3.4001677,245.14545
+254,2.395963,199.289
+255,2.360695,154.04462
+256,2.083621,119.20741
+257,2.2433383,98.93125
+258,2.086771,122.791695
+259,3.3675923,213.58595
+260,1.6374018,90.06726
+261,2.3209093,163.93378
+262,1.7390395,107.002144
+263,2.475526,162.5285
+264,1.4359696,88.94977
+265,4.5739517,252.7332
+266,2.5580864,220.61426
+267,2.245527,172.50708
+268,2.9102125,228.73811
+269,2.9250178,212.46947
+270,3.9895349,248.22702
+271,3.8592384,232.32495
+272,2.5792716,118.97925
+273,4.378156,248.20642
+274,2.2131612,111.34888
+275,1.9154717,147.59259
+276,2.289251,160.78316
+277,2.812851,149.4154
+278,2.2779825,145.67706
+279,2.9055815,215.315
+280,2.0445406,98.32141
+281,2.9835966,177.86594
+282,3.0409465,198.1924
+283,2.9144325,222.04988
+284,2.2719274,154.48524
+285,2.170375,120.02228
+286,2.3921888,126.71088
+287,1.7523656,96.89014
+288,2.5294034,192.66023
+289,1.7382963,116.4506
+290,2.8287766,205.02672
+291,2.8906543,175.91821
+292,2.6451974,170.58798
+293,2.0173457,138.11731
+294,1.4023157,73.24778
+295,4.1879945,250.67824
+296,1.9571459,154.29266
+297,2.1937366,141.51266
+298,2.6270397,139.03851
+299,3.2471776,236.9315
+300,2.5310833,153.77965
+301,2.5883894,166.64726
+302,2.4549828,157.6865
+303,1.4074669,113.83982
+304,1.7522256,81.42742
+305,2.4874098,131.26357
+306,3.0715675,228.24756
+307,3.9976525,246.83824
+308,1.5299016,75.41405
+309,2.0816727,119.36755
+310,2.1514187,143.62161
+311,2.4023798,144.6051
+312,3.5481129,237.59853
+313,1.8759058,108.18762
+314,2.0855553,132.43011
+315,1.6145006,88.979126
+316,2.1030576,102.576035
+317,2.8029675,210.04082
+318,2.786076,178.48718
+319,1.8007151,87.9243
+320,3.3318238,221.95135
+321,2.7504642,171.22188
+322,3.055728,169.88962
+323,2.740697,184.18698
+324,2.6141477,164.7016
+325,3.2414982,220.48062
+326,3.2596927,238.14043
+327,3.5103257,222.49457
+328,2.607817,143.9408
+329,2.7741318,194.42851
+330,2.088839,121.65741
+331,1.898196,95.807816
+332,1.9506317,90.06913
+333,3.1441302,206.14383
+334,1.3082056,71.48551
+335,2.4173167,149.40218
+336,1.4609855,73.613785
+337,2.52404,183.43353
+338,3.2323596,218.84673
+339,3.111466,238.62447
+340,2.814489,172.72614
+341,2.417461,161.47833
+342,2.7395313,177.12024
+343,2.5509858,164.24924
+344,2.2563171,107.49196
+345,2.3252368,166.8312
+346,3.4471252,227.17282
+347,1.6832631,95.66654
+348,2.6417642,200.40115
+349,3.0659497,222.12657
+350,3.1753983,232.2308
+351,2.9340076,197.19273
+352,2.018929,116.10913
+353,2.9671874,217.56912
+354,2.10576,146.99239
+355,1.8642496,102.71622
+356,3.4240937,240.77333
+357,2.596373,167.09528
+358,3.3840709,218.68674
+359,3.0496573,151.48756
+360,3.418346,235.78279
+361,2.4324305,173.23262
+362,2.1212425,138.95389
+363,2.8489203,213.79329
+364,3.5672188,231.04095
+365,2.83707,195.60204
+366,2.9406664,208.00795
+367,2.6865287,161.79242
+368,2.2604501,178.33612
+369,2.2746801,144.83609
+370,1.6559794,95.5112
+371,2.0400407,104.97896
+372,1.7437482,84.979576
+373,2.6659667,183.98154
+374,1.9834887,102.03903
+375,1.8861322,100.201035
+376,1.5810158,81.56938
+377,2.374472,135.58905
+378,2.203782,101.725266
+379,2.1513987,132.81674
+380,2.066187,109.68887
+381,2.0452733,138.47472
+382,2.4861858,152.4318
+383,3.5744803,242.4676
+384,3.4618015,227.91458
+385,2.1534922,135.16675
+386,2.836918,193.05844
+387,3.054313,223.09898
+388,3.3975005,239.7421
+389,2.7860563,175.36658
+390,1.9209157,119.11113
+391,3.0679605,227.54454
+392,2.076559,118.69217
+393,1.9998069,115.73056
+394,1.6327949,94.00953
+395,1.8236978,104.59216
+396,2.5490556,176.42554
+397,2.8095698,174.60172
+398,2.4316525,190.21739
+399,2.732707,181.72708
+400,2.581118,172.96646
+401,3.3147466,217.88234
+402,2.1600604,148.58975
+403,2.0048974,144.17564
+404,3.0403612,224.15308
+405,1.9488972,136.39801
+406,1.8629833,126.21539
+407,1.5541753,79.59771
+408,1.8106848,94.4716
+409,3.3609254,231.83356
+410,1.5077757,92.088326
+411,2.5066018,152.31409
+412,2.7011082,172.73969
+413,2.5423632,166.85025
+414,3.3897033,228.14047
+415,3.1250615,213.78036
+416,2.0863008,116.522705
+417,1.905031,106.39688
+418,1.8375726,92.55167
+419,2.381357,110.26193
+420,2.3700595,146.72322
+421,2.978291,190.54895
+422,3.5469599,211.51315
+423,2.5255353,180.24838
+424,2.948158,177.09796
+425,1.849359,96.22445
+426,1.557858,99.4989
+427,2.1946812,112.71724
+428,4.8106027,252.6722
+429,3.3203895,217.36597
+430,2.9890685,197.84198
+431,2.407825,143.62984
+432,3.7869925,242.5551
+433,2.0857768,98.63675
+434,3.4524426,235.00902
+435,2.440599,164.02332
+436,1.9934489,125.493256
+437,1.7499545,84.234085
+438,1.5435581,80.882866
+439,2.1445084,170.13718
+440,1.8514572,104.18418
+441,2.6283958,147.48727
+442,2.5786822,128.46371
+443,3.5511494,219.68349
+444,2.0663366,144.56433
+445,1.846624,151.37595
+446,1.9850447,100.7854
+447,2.162745,122.54686
+448,3.0439315,203.40427
+449,1.6632354,131.44824
+450,2.6461778,170.72467
+451,3.1268163,226.58847
+452,2.3075702,109.490875
+453,3.2752767,211.22992
+454,2.2089086,142.9559
+455,2.3756201,124.99385
+456,2.5065815,113.56018
+457,1.6393031,88.6271
+458,2.9769044,194.15623
+459,2.0522895,93.79538
+460,3.1265612,233.29483
+461,2.9726846,167.50067
+462,2.8255332,178.09871
+463,3.2396052,200.04443
+464,2.243506,127.285164
+465,1.8843446,104.102936
+466,2.741963,150.35593
+467,2.5434084,203.32965
+468,2.193556,126.08284
+469,1.9355943,98.46798
+470,2.813716,215.06558
+471,3.121945,192.97223
+472,2.6243336,162.37733
+473,2.4256845,154.50334
+474,2.3989363,167.63773
+475,1.8675029,108.6077
+476,1.999488,123.977325
+477,2.456967,112.1832
+478,1.7534175,102.95955
+479,1.8885931,112.09259
+480,3.401434,212.91121
+481,1.8621378,121.57953
+482,1.9945562,113.98045
+483,2.4729753,198.11037
+484,1.6920034,107.416725
+485,1.4443295,95.165764
+486,2.316791,150.47748
+487,2.607493,126.85961
+488,2.8530192,206.8711
+489,2.3840113,141.2804
+490,3.0518987,216.74713
+491,3.0281978,218.33469
+492,2.6393254,133.83282
+493,1.4371897,80.0811
+494,1.8848202,129.44507
+495,3.082543,208.80455
+496,2.4512777,164.27365
+497,1.3701043,79.462135
+498,2.7584717,210.14873
+499,2.8808954,212.19688
+500,2.151309,124.06328
+501,3.3100073,204.07701
+502,1.6333628,93.10405
+503,1.9147277,130.10245
+504,2.206942,141.44373
+505,3.218402,220.83969
+506,2.5351906,146.99536
+507,2.3719268,163.66238
+508,2.449987,129.4125
+509,2.0332396,138.13213
+510,2.300864,154.61917
+511,1.7322614,110.49306
+512,1.6402223,93.47202
+513,3.1021264,196.00522
+514,2.181738,114.61182
+515,2.597462,179.0495
+516,1.9014248,94.260765
+517,2.1491184,165.30309
+518,3.3954203,206.48537
+519,2.2127595,105.48334
+520,2.6949363,178.03241
+521,2.9042528,216.07883
+522,2.460948,116.45517
+523,2.813733,163.58896
+524,2.5035849,208.64616
+525,1.3230802,69.75969
+526,2.2012606,139.15533
+527,2.9555097,170.36285
+528,1.0073516,73.23634
+529,2.7292182,208.29834
+530,1.7515413,95.089096
+531,2.688682,212.54869
+532,2.7031846,197.98196
+533,2.8592415,200.46918
+534,3.5224185,244.94156
+535,1.2903184,76.7989
+536,2.3779025,164.22281
+537,3.12459,214.5191
+538,1.7010307,101.33243
+539,2.7342157,182.76906
+540,2.6131802,150.51306
+541,2.4934616,143.67447
+542,1.7298267,104.341774
+543,2.987234,194.3245
+544,1.4791113,81.664185
+545,2.6713896,151.39966
+546,3.4115143,211.39212
+547,4.1750627,251.13062
+548,3.4643693,222.78876
+549,1.9311225,104.45716
+550,3.7679474,250.16339
+551,2.170177,135.82407
+552,1.6089627,80.25726
+553,2.098222,107.10205
+554,2.1770778,97.542435
+555,1.5647262,100.353745
+556,2.774046,173.46011
+557,1.9587561,135.38467
+558,3.4407895,238.05684
+559,2.5077188,152.78061
+560,1.1732237,89.822365
+561,2.7291408,146.73189
+562,2.5380988,179.09392
+563,2.545739,140.04369
+564,3.8233795,243.51904
+565,3.077527,226.27368
+566,2.5417802,183.63168
+567,1.2278342,75.834015
+568,2.9725323,221.18205
+569,2.4954846,138.14377
+570,3.0412571,210.20538
+571,2.5204804,138.33473
+572,2.3394828,149.21527
+573,3.8147175,243.07553
+574,1.9179862,126.09141
+575,2.018475,122.199936
+576,2.9791908,194.10352
+577,2.8141594,199.79053
+578,2.2062066,139.59903
+579,1.8565625,84.44763
+580,2.4974666,168.1304
+581,1.8792437,127.8744
+582,2.9870026,200.1298
+583,1.8934834,96.17238
+584,2.38668,165.59404
+585,1.7057725,98.11966
+586,1.1077583,70.53088
+587,2.8662748,196.49269
+588,2.1868892,112.67286
+589,2.7751873,156.21295
+590,1.1790986,80.98457
+591,2.9344504,195.64377
+592,3.3024912,233.78693
+593,2.6669545,118.13446
+594,1.981948,117.43315
+595,2.611614,150.16106
+596,1.9389638,116.80342
+597,1.3671772,90.55331
+598,2.2114644,140.5159
+599,2.977294,211.36652
+600,2.7244508,145.90111
+601,2.3116076,144.47461
+602,2.1777234,129.06015
+603,2.6538882,187.21722
+604,1.9498651,112.92868
+605,2.6409557,145.32886
+606,2.6949062,183.00145
+607,1.926786,121.36192
+608,2.253798,140.17859
+609,3.505169,229.76636
+610,1.8767322,103.95375
+611,2.198637,154.9035
+612,3.697948,233.6873
+613,2.607047,141.36583
+614,2.7874706,192.79034
+615,2.2674584,138.3769
+616,3.5046675,230.77502
+617,3.328034,227.89206
+618,2.7163627,174.85242
+619,2.252126,165.55411
+620,2.2113488,145.83084
+621,2.9936206,183.02173
+622,2.163267,115.46661
+623,2.7476535,179.49638
+624,1.5860035,88.739655
+625,2.192925,129.76616
+626,1.421149,78.553635
+627,2.5520442,168.31396
+628,1.7077268,102.43266
+629,2.6444097,190.1431
+630,2.14559,100.622925
+631,2.5797195,179.7489
+632,2.2944329,200.94554
+633,2.8195796,193.71515
+634,2.5719042,186.21152
+635,1.9591191,103.611755
+636,3.3676093,227.83327
+637,3.016274,201.27113
+638,2.3481123,165.12097
+639,2.771153,152.98593
+640,2.0991595,86.30677
+641,2.0296788,138.30637
+642,2.0204701,114.74088
+643,2.267257,147.71269
+644,2.3206196,163.39363
+645,2.2971275,105.57585
+646,3.2208648,198.11046
+647,1.556935,88.5429
+648,3.3860507,217.04779
+649,2.4981496,177.38182
+650,2.5695953,161.35152
+651,2.19059,99.9715
+652,3.2091641,230.6727
+653,1.9295913,80.493484
+654,1.75646,134.53589
+655,2.3910828,189.2467
+656,2.6975427,191.86261
+657,1.8009843,115.943115
+658,3.4590223,221.65872
+659,2.420419,183.5787
+660,2.8113189,177.46248
+661,2.1393101,149.36795
+662,3.275324,221.61653
+663,3.011653,213.37216
+664,2.083859,127.711586
+665,2.7296677,156.3768
+666,3.2680302,228.35066
+667,1.9407319,119.59317
+668,2.0392923,159.50995
+669,1.7831738,93.75375
+670,3.9014823,242.5526
+671,2.0902991,140.10738
+672,1.6989249,115.89945
+673,2.171309,128.13504
+674,2.3923924,138.11407
+675,2.3400083,147.86223
+676,2.2825236,111.77162
+677,2.8957558,204.44478
+678,2.8179917,171.13515
+679,2.7330062,152.6963
+680,2.9906783,173.43637
+681,2.2642229,100.85001
+682,2.378778,113.91295
+683,3.430934,205.45518
+684,2.2894635,141.24948
+685,2.414014,187.06906
+686,2.5304875,169.96735
+687,2.6099546,179.74896
+688,3.8261352,240.8042
+689,2.4025025,168.56909
+690,1.2431136,87.507126
+691,2.396648,189.28766
+692,2.4511163,128.41866
+693,2.7627463,204.471
+694,3.340751,242.15224
+695,2.8565607,214.65009
+696,2.0904384,117.39517
+697,2.1801238,120.99103
+698,1.6758302,83.14655
+699,3.4446874,212.77417
+700,2.6584985,165.23872
+701,3.252469,186.57709
+702,2.347917,140.07196
+703,2.436295,160.4466
+704,2.0849512,128.44415
+705,3.3648112,227.71909
+706,1.4782069,93.53441
+707,2.2456937,118.11719
+708,2.4764903,138.34647
+709,2.6071901,166.5887
+710,3.4785695,232.56819
+711,2.0658402,84.264885
+712,1.6561015,115.608246
+713,2.2689686,104.42943
+714,3.178782,225.7607
+715,3.2554126,206.98624
+716,3.4480295,225.3266
+717,2.3547516,126.62516
+718,2.5842712,194.95868
+719,2.494588,171.2939
+720,1.6319675,91.249176
+721,2.1569324,154.37909
+722,2.5539975,199.31995
+723,3.347036,239.06868
+724,2.6901631,171.0432
+725,5.4481115,254.66566
+726,1.8526031,101.92
+727,2.8655417,207.97255
+728,2.5059018,126.93559
+729,4.08188,243.96864
+730,1.8716457,96.797585
+731,2.4671388,173.22916
+732,3.7454517,239.17848
+733,1.7403215,91.6774
+734,2.2599156,163.50285
+735,1.7871385,102.21379
+736,2.1996875,140.226
+737,2.720206,162.87521
+738,3.0903058,227.2435
+739,4.073458,248.09216
+740,1.7507563,102.94173
+741,3.812257,245.24484
+742,2.8571076,232.11868
+743,2.481693,211.28966
+744,1.196213,77.26831
+745,2.098187,111.48045
+746,3.343495,228.0273
+747,2.294158,129.06087
+748,1.6480187,84.80928
+749,1.6150031,88.09729
+750,2.597547,204.25383
+751,2.1208959,118.06335
+752,1.4397181,80.67963
+753,2.1522148,116.17691
+754,2.4119234,131.95337
+755,1.8985409,134.08533
+756,3.0778966,194.58868
+757,3.3366418,238.49397
+758,1.333574,78.42505
+759,2.123674,121.24074
+760,2.9525228,207.23164
+761,3.1451135,211.7525
+762,1.8316028,139.97354
+763,2.0028648,141.49274
+764,3.6252465,237.68034
+765,2.6851134,204.43219
+766,1.9860883,115.13438
+767,1.6779158,91.51277
+768,2.030801,127.977585
+769,3.514245,247.3734
+770,2.39537,160.84177
+771,3.708117,233.591
+772,3.2991161,218.71785
+773,2.1757236,130.12793
+774,1.7702166,95.19165
+775,2.4961228,173.31473
+776,2.7749202,173.47537
+777,3.4412608,239.59648
+778,1.9654002,95.45508
+779,1.883686,98.61824
+780,2.3603768,170.85287
+781,2.9259918,168.21057
+782,2.9514544,228.8432
+783,1.7556951,92.21853
+784,2.3257663,114.67501
+785,2.2551246,126.45111
+786,2.366917,193.22084
+787,2.0991724,162.62341
+788,3.125918,211.92453
+789,3.0695431,221.59602
+790,2.409638,129.72768
+791,2.7958436,198.46892
+792,2.2327247,118.94395
+793,2.8003972,211.65852
+794,1.6913928,94.9229
+795,2.7688735,213.38657
+796,2.495044,143.43512
+797,2.225243,124.55516
+798,1.801503,90.72995
+799,3.0733821,195.39464
+800,1.5629826,126.943665
+801,2.5375454,161.87564
+802,2.6606612,220.39613
+803,2.7143369,187.19415
+804,2.7397046,195.80257
+805,2.13977,137.24602
+806,3.688435,221.83185
+807,1.6770613,97.8974
+808,2.9954762,228.06377
+809,3.1557853,205.45657
+810,2.3339596,151.99075
+811,1.873076,102.73883
+812,3.5490742,246.62889
+813,2.536501,122.37503
+814,1.7315612,99.64517
+815,4.079708,248.71107
+816,1.9297782,112.72111
+817,2.0910442,142.32791
+818,2.4441204,126.46924
+819,2.397367,133.69444
+820,3.484077,216.92528
+821,2.257127,167.65738
+822,2.8833752,212.5076
+823,3.0176136,183.62427
+824,2.0322368,83.42569
+825,1.7936308,106.10354
+826,1.8699281,123.85335
+827,2.6775181,206.8682
+828,1.6676817,90.22045
+829,2.3976061,128.25735
+830,2.516984,179.83266
+831,2.6944351,160.77606
+832,2.5372987,154.6149
+833,4.3334417,246.89195
+834,0.9843708,74.07173
+835,2.8351805,211.25238
+836,2.5167482,131.34378
+837,1.9628748,96.717865
+838,3.2264814,238.93597
+839,2.7521014,182.6741
+840,1.8764505,104.25073
+841,3.1051955,235.50815
+842,3.0752003,175.3646
+843,1.8239282,103.52702
+844,2.092512,138.48386
+845,2.9706826,217.17024
+846,1.8441542,115.38051
+847,4.061463,249.04253
+848,2.5474849,134.83269
+849,1.5918691,105.20744
+850,1.8886853,118.90994
+851,2.4072642,197.00317
+852,2.0470853,98.99921
+853,2.474955,115.98555
+854,1.808093,99.90234
+855,1.8385348,87.34831
+856,3.4614549,212.77443
+857,3.289338,237.99306
+858,1.7927151,115.42755
+859,2.0398436,125.83418
+860,2.0587156,160.9301
+861,2.2115428,126.46565
+862,2.3606725,111.88037
+863,2.9298599,170.72064
+864,2.684684,156.51611
+865,3.5953863,228.73254
+866,2.315539,176.0083
+867,1.941481,114.7538
+868,2.1257052,129.32504
+869,3.366611,213.64433
+870,3.4972286,220.63557
+871,1.2798991,105.17876
+872,1.7156942,109.288864
+873,3.214073,220.95523
+874,1.1822649,71.20828
+875,2.9311736,202.08554
+876,3.1530218,214.67525
+877,2.826494,188.66199
+878,2.3988235,159.74904
+879,1.8355873,94.75213
+880,2.9371495,220.79778
+881,1.8721864,119.938034
+882,3.546993,236.02493
+883,2.4867394,176.23868
+884,2.65199,196.22034
+885,2.4724476,163.39993
+886,2.1302264,131.32523
+887,1.6461036,98.23941
+888,2.1772377,105.50893
+889,2.8598003,181.73073
+890,2.3158662,197.88405
+891,1.7578808,77.289665
+892,2.0604916,117.16753
+893,3.1758876,213.94513
+894,2.26617,155.69022
+895,2.69269,172.17245
+896,2.3150787,151.8563
+897,2.746129,177.9828
+898,2.3511226,130.52646
+899,1.6035317,95.20455
+900,2.1538675,95.14838
+901,2.1075685,119.08378
+902,2.7288578,173.69574
+903,1.8556783,114.98941
+904,3.0094419,219.17514
+905,3.1784885,214.33406
+906,1.8299861,102.88334
+907,2.715913,204.00041
+908,2.638188,151.2775
+909,1.9943314,133.46716
+910,2.158716,145.22287
+911,1.7422276,120.45285
+912,2.5885108,167.89053
+913,2.7852786,207.58607
+914,2.058637,117.22633
+915,1.9852976,97.6314
+916,2.9135005,171.88322
+917,2.284827,125.39082
+918,3.0484424,225.16983
+919,2.881353,175.51633
+920,2.3839529,134.28448
+921,2.9552348,223.41414
+922,2.7935185,187.12057
+923,2.057205,143.47708
+924,2.1439557,160.02524
+925,2.8781104,160.35342
+926,2.8320222,178.2919
+927,3.0133965,185.5932
+928,1.923046,116.67253
+929,2.142843,138.28668
+930,2.7252576,142.54694
+931,3.2420957,191.63957
+932,2.7695045,204.96318
+933,2.7556868,197.38483
+934,2.7578971,189.00156
+935,1.603425,105.66738
+936,4.0258203,246.87259
+937,2.6546261,199.54153
+938,2.3977044,138.49774
+939,2.3252695,172.09877
+940,3.3713288,230.11478
+941,2.757289,154.94695
+942,2.5459008,127.66222
+943,2.4311028,169.80847
+944,1.9584373,92.238365
+945,3.4849513,225.69545
+946,2.756508,187.93811
+947,2.0970244,128.07675
+948,2.6317945,200.94084
+949,3.8216636,242.26608
+950,2.262782,122.33086
+951,2.9475982,223.62428
+952,3.0994537,223.29651
+953,2.6435604,197.2364
+954,1.8142765,109.76402
+955,1.7931788,108.51814
+956,3.4959953,223.10594
+957,1.6995366,85.16164
+958,2.6142118,194.73901
+959,2.5190635,184.85258
+960,1.9431775,103.04782
+961,2.0012884,141.88821
+962,3.037332,208.78276
+963,2.3586903,145.7357
+964,3.1610875,224.03198
+965,1.4888593,83.28184
+966,3.2066972,215.08943
+967,3.22219,239.26978
+968,1.9814681,89.220055
+969,2.04611,116.32814
+970,2.0006456,120.552086
+971,2.4422,167.61377
+972,3.2425108,194.56673
+973,2.3191147,117.89192
+974,2.4036481,142.45026
+975,3.6705275,233.57303
+976,3.2120461,247.4265
+977,3.427094,211.89653
+978,2.6977816,171.72049
+979,1.6129655,94.594635
+980,1.9849343,100.896935
+981,4.3687277,250.00363
+982,3.1524167,211.19907
+983,2.2222931,154.43156
+984,2.8139994,181.46341
+985,2.3682008,122.0094
+986,2.2469776,153.48267
+987,2.1371202,116.99017
+988,1.7731578,109.582184
+989,2.7564108,219.27643
+990,2.0989008,127.21912
+991,3.195146,226.27025
+992,2.34858,109.28339
+993,2.3316581,121.03596
+994,3.0662284,188.48044
+995,2.665778,167.6088
+996,2.799071,174.34901
+997,3.6871135,246.06726
+998,2.6042495,191.83809
+999,2.5719054,162.17197
+1000,2.3892748,155.29953
+1001,2.1241155,129.14972
+1002,2.7799726,187.46243
+1003,1.7524145,102.123535
+1004,2.3217049,168.99527
+1005,2.271235,139.35165
+1006,1.9593472,98.890564
+1007,2.996292,215.00139
+1008,1.7849677,94.62421
+1009,3.074052,226.90175
+1010,2.7581177,165.3488
+1011,2.4686112,170.59067
+1012,1.8145607,109.36511
+1013,2.5999522,214.24602
+1014,1.7056012,95.15573
+1015,3.30715,170.9829
+1016,2.9572275,189.95299
+1017,1.7373583,91.75553
+1018,3.1607833,223.2196
+1019,3.1902804,212.3318
+1020,2.8365936,202.09528
+1021,1.7608764,106.38935
+1022,2.4176822,135.85522
+1023,3.0750506,185.90298
+1024,2.4649818,114.68857
+1025,2.7206976,156.84406
+1026,3.8385532,244.67326
+1027,1.8522716,89.31249
+1028,2.6133332,207.54962
+1029,3.1079571,218.99266
+1030,3.5180871,240.4364
+1031,2.9176881,222.49768
+1032,1.9382612,115.76288
+1033,2.209931,113.20679
+1034,2.0885441,131.47647
+1035,2.6193397,171.10638
+1036,2.6732001,141.39392
+1037,2.8712144,185.39012
+1038,2.266725,130.49583
+1039,1.4046077,81.02806
+1040,1.7608392,100.12726
+1041,2.6767318,221.82576
+1042,2.744222,183.08612
+1043,3.144222,191.04593
+1044,2.313596,131.16185
+1045,2.3697603,114.726555
+1046,1.7282801,93.99829
+1047,2.079146,140.96436
+1048,2.017712,102.721954
+1049,1.8733122,124.47958
+1050,1.7870331,118.89554
+1051,1.995332,125.090775
+1052,2.2899919,155.37773
+1053,2.1634939,126.984146
+1054,3.002873,223.97594
+1055,2.0052252,134.29703
+1056,3.415774,224.49007
+1057,3.3734345,220.7671
+1058,1.4313664,79.25989
+1059,3.4227042,227.0629
+1060,2.3000565,125.31516
+1061,2.8605654,198.6639
+1062,2.781279,187.52362
+1063,2.007361,137.76266
+1064,4.093289,248.32158
+1065,2.3385415,136.50896
+1066,3.06795,204.04918
+1067,1.8856165,95.80323
+1068,2.2450018,136.07791
+1069,4.7384443,250.99905
+1070,2.8346808,205.63889
+1071,1.9483815,105.10829
+1072,3.1207366,195.96548
+1073,3.2277792,221.4374
+1074,2.6921854,198.03464
+1075,2.4138503,184.3794
+1076,2.1673522,117.22193
+1077,3.3891542,225.21083
+1078,2.2058234,160.35309
+1079,2.4035573,147.26611
+1080,1.9606199,158.64557
+1081,1.2192969,85.8896
+1082,2.6353412,150.06604
+1083,2.1343017,134.3385
+1084,2.6830316,157.5956
+1085,2.811394,170.84555
+1086,2.516721,135.81703
+1087,1.9776555,120.80798
+1088,2.5956829,162.69904
+1089,2.4724746,186.0518
+1090,2.6054168,175.15031
+1091,1.3646436,77.283775
+1092,2.6823144,190.73296
+1093,2.488587,137.86433
+1094,3.2016037,220.4071
+1095,2.088666,145.42792
+1096,2.2321522,122.32571
+1097,1.7153122,88.41057
+1098,2.5007067,141.74982
+1099,2.2331004,113.17522
+1100,3.575787,221.23422
+1101,3.3980913,215.68501
+1102,3.5697663,235.0764
+1103,3.0444086,227.12126
+1104,3.8337986,232.92538
+1105,1.6347789,96.83423
+1106,2.0343208,102.71685
+1107,2.8894308,155.08017
+1108,2.3293357,163.66309
+1109,2.0839949,123.18423
+1110,3.7062485,241.7862
+1111,2.1389737,113.33226
+1112,2.6884675,159.73859
+1113,1.5068392,76.4131
+1114,3.4000556,239.82178
+1115,1.9436415,93.6729
+1116,2.4449408,166.88551
+1117,2.6201477,180.02719
+1118,2.3534923,163.81262
+1119,1.810106,93.03934
+1120,2.9275165,214.26628
+1121,2.6412768,167.4558
+1122,2.1142867,113.57394
+1123,3.5645785,235.29698
+1124,3.5234315,232.00545
+1125,2.0168614,119.82306
+1126,2.1923354,135.72957
+1127,2.528074,162.57288
+1128,3.3442984,229.54991
+1129,2.0319717,126.807884
+1130,2.6365256,158.98878
+1131,2.3435974,177.465
+1132,2.5948267,130.86823
+1133,2.447338,174.29681
+1134,1.833154,102.10997
+1135,1.6118315,101.1927
+1136,2.69983,129.73538
+1137,3.4878,225.9223
+1138,3.959888,242.21242
+1139,2.6257505,188.64072
+1140,4.409195,248.21548
+1141,3.1617846,230.84784
+1142,2.4293005,165.74112
+1143,2.354798,167.9358
+1144,2.7598054,184.336
+1145,2.0489097,159.25146
+1146,1.8649247,132.0807
+1147,2.3351972,124.37584
+1148,3.8573654,235.22131
+1149,2.827903,189.86673
+1150,2.3068264,101.49722
+1151,4.0605936,248.998
+1152,1.9719374,135.40018
+1153,1.5360796,71.10901
+1154,2.91997,200.7212
+1155,3.2932143,231.86436
+1156,2.406836,189.38815
+1157,2.450928,135.33609
+1158,3.5202549,215.26381
+1159,2.1544805,175.45448
+1160,2.6881185,206.58548
+1161,2.4850726,175.94145
+1162,2.3390753,133.2508
+1163,2.5741982,165.79472
+1164,1.9425826,119.789116
+1165,3.5862262,237.24162
+1166,1.638433,97.8797
+1167,2.4453406,199.08209
+1168,2.1492567,132.12398
+1169,2.5418408,192.39116
+1170,2.6546865,184.74432
+1171,3.7298558,234.2602
+1172,2.79332,177.55061
+1173,2.2012324,118.64421
+1174,2.7196565,183.75755
+1175,2.3564014,138.21918
+1176,1.6306243,88.383484
+1177,3.3171158,223.23158
+1178,2.4545636,151.95688
+1179,2.1381943,108.47006
+1180,1.5922339,85.71751
+1181,3.5510678,209.33476
+1182,2.0881157,109.72475
+1183,2.9922364,172.30254
+1184,1.6808147,107.97575
+1185,3.064955,193.30614
+1186,2.6072783,199.23729
+1187,1.9377291,127.53566
+1188,3.3131313,228.5287
+1189,3.6357017,240.6431
+1190,2.4625316,130.38945
+1191,3.04531,207.60728
+1192,1.4135506,80.240974
+1193,2.3159688,155.2195
+1194,1.3584795,84.23955
+1195,2.408623,162.03894
+1196,1.9685856,98.73157
+1197,2.1136413,168.5521
+1198,2.6907883,201.58182
+1199,2.9726639,202.16422
+1200,3.0192323,222.70453
+1201,2.989143,188.39896
+1202,2.9477937,225.57549
+1203,2.0192394,139.42421
+1204,2.023238,111.05543
+1205,2.7837186,220.3589
+1206,1.9379475,124.160904
+1207,2.5042794,154.57
+1208,2.211556,154.1203
+1209,3.11168,223.93845
+1210,2.5358956,138.3539
+1211,2.546585,114.35663
+1212,1.5616125,76.092415
+1213,4.194555,237.0438
+1214,2.9199042,206.59547
+1215,2.596156,199.52113
+1216,2.4075756,157.82697
+1217,2.4295769,125.099045
+1218,2.4520905,163.76341
+1219,2.6595182,170.86502
+1220,2.8944163,206.37184
+1221,2.7694209,175.6182
+1222,2.1841812,168.63904
+1223,2.7304888,170.53888
+1224,2.8622625,182.49037
+1225,3.2911055,212.32541
+1226,3.3725348,234.17328
+1227,2.1657608,111.232056
+1228,1.7682855,125.27641
+1229,3.3525324,235.65636
+1230,2.4182353,154.28569
+1231,2.8152657,208.47116
+1232,2.469678,152.37312
+1233,3.3012383,229.79729
+1234,1.7455171,86.6483
+1235,2.0989747,143.38443
+1236,2.1848338,140.9191
+1237,1.4797924,105.77914
+1238,2.0374472,109.624855
+1239,2.1768997,136.06964
+1240,2.6485226,199.75282
+1241,3.781971,241.27248
+1242,3.3721995,209.31177
+1243,3.1575375,209.82777
+1244,1.6949939,96.66885
+1245,1.6406723,104.05669
+1246,2.1495454,123.85858
+1247,2.039901,138.4859
+1248,1.6025802,75.86397
+1249,3.574491,228.87593
+1250,1.458462,109.57394
+1251,1.9719279,106.24542
+1252,2.163074,121.26317
+1253,2.559585,154.90952
+1254,2.2651017,149.54134
+1255,1.8553249,89.8216
+1256,2.7156816,169.79492
+1257,2.7812972,156.4502
+1258,1.8745873,89.175156
+1259,1.819888,93.28068
+1260,2.030511,169.3714
+1261,1.7532498,117.246735
+1262,1.8692923,93.95245
+1263,2.3554978,121.654526
+1264,1.7151387,88.23394
+1265,2.3045015,140.71686
+1266,2.0902882,174.46649
+1267,2.249255,139.11655
+1268,3.7906983,240.744
+1269,2.0569558,88.463745
+1270,2.5160537,144.3098
+1271,2.0856075,141.7457
+1272,2.1525338,134.77669
+1273,2.4302144,101.60477
+1274,2.324909,119.346466
+1275,2.4105022,114.67945
+1276,1.8507417,107.21312
+1277,2.2953558,166.75793
+1278,2.8006835,165.4773
+1279,3.5061948,230.43242
+1280,2.1038888,138.07097
+1281,2.426947,115.36865
+1282,2.8052673,197.75409
+1283,3.143823,226.54054
+1284,2.3990607,190.71722
+1285,2.153954,142.79733
+1286,2.1121092,123.80286
+1287,3.0617795,226.88834
+1288,2.705381,184.93889
+1289,1.3435628,79.46898
+1290,2.193626,103.385925
+1291,3.0787272,229.99887
+1292,2.24432,173.95828
+1293,1.6528207,82.73645
+1294,1.9787709,114.9279
+1295,3.1633844,232.24124
+1296,2.7012093,148.52084
+1297,3.11553,175.20529
+1298,3.672036,245.66246
+1299,3.7105193,241.52312
+1300,3.08637,231.50378
+1301,1.7681612,86.03417
+1302,2.9746547,229.3531
+1303,3.6361256,230.46136
+1304,2.4358532,107.7086
+1305,2.7467127,166.71451
+1306,2.0256593,126.789566
+1307,5.3150682,254.42719
+1308,2.2290537,116.57317
+1309,2.148981,146.2265
+1310,2.2048643,142.93457
+1311,3.4466658,222.64838
+1312,1.3453366,78.39459
+1313,3.207662,225.21524
+1314,2.2005537,129.07129
+1315,3.4361415,231.35776
+1316,3.0266175,225.5906
+1317,2.986257,194.78455
+1318,3.7580566,236.45952
+1319,3.1223829,205.611
+1320,1.998898,128.92084
+1321,3.5102124,241.94693
+1322,2.7745404,184.19958
+1323,1.7588346,99.67113
+1324,2.7677503,194.46397
+1325,1.8131605,110.660446
+1326,2.8685946,206.22343
+1327,2.427652,154.80399
+1328,1.8289697,133.98929
+1329,2.8679223,201.37978
+1330,3.5340037,236.1017
+1331,2.3393478,133.20389
+1332,1.890521,96.04161
+1333,1.9123629,100.9241
+1334,3.5507843,238.39737
+1335,1.3574774,77.45239
+1336,3.133332,187.75867
+1337,1.8209774,119.63957
+1338,2.2011237,148.52658
+1339,2.3417504,168.03235
+1340,3.1007335,224.62299
+1341,2.9726355,174.44977
+1342,2.3488224,140.91971
+1343,2.8011003,211.74062
+1344,2.023053,115.882614
+1345,2.6153088,211.65892
+1346,2.9244251,232.63745
+1347,2.0931282,142.00766
+1348,3.0436587,231.29752
+1349,3.172602,216.49197
+1350,2.6867385,161.62547
+1351,3.2923326,224.186
+1352,2.242173,152.88799
+1353,1.9548209,106.545975
+1354,1.2517182,75.35265
+1355,2.5056033,172.52545
+1356,2.789699,142.41864
+1357,2.4563022,136.81451
+1358,2.3230505,137.45511
+1359,2.3410819,96.764656
+1360,3.4432502,242.3972
+1361,2.4232707,150.70691
+1362,2.810278,178.18234
+1363,1.9339322,97.2731
+1364,2.5316272,153.3418
+1365,2.3510742,163.8805
+1366,2.0758684,106.12609
+1367,1.6111243,88.91342
+1368,2.4155688,117.781586
+1369,1.7808697,155.00919
+1370,2.7884204,203.20654
+1371,1.7891079,91.17219
+1372,2.0139487,109.147964
+1373,3.1228871,204.17767
+1374,2.72448,198.67627
+1375,1.4019592,78.3535
+1376,2.789223,168.56033
+1377,2.8662283,195.54639
+1378,2.0951083,107.43814
+1379,2.9759312,195.15321
+1380,3.0445476,217.48222
+1381,2.6097195,130.62585
+1382,1.8676137,144.38492
+1383,2.166616,162.42516
+1384,2.9405365,183.84454
+1385,2.251927,160.10382
+1386,3.1728683,225.31473
+1387,1.2965473,80.39906
+1388,2.161755,124.0096
+1389,2.7824583,143.46548
+1390,2.1383796,142.69102
+1391,2.3042462,142.42448
+1392,2.400588,185.61694
+1393,2.2747865,104.07151
+1394,2.0612438,117.79816
+1395,2.5227928,167.1113
+1396,2.074932,101.539536
+1397,3.5746784,242.8554
+1398,1.9959525,106.0972
+1399,2.191873,135.28383
+1400,1.7244847,98.1816
+1401,2.4200213,152.13837
+1402,3.2533305,228.4443
+1403,3.6270843,248.25914
+1404,2.5619073,180.58624
+1405,1.9085513,139.02014
+1406,3.3600438,231.32054
+1407,2.159453,113.185646
+1408,2.9259546,212.93509
+1409,3.1924484,229.50871
+1410,3.0268111,203.64188
+1411,3.025063,217.01335
+1412,2.3678613,115.47073
+1413,1.8210406,87.56189
+1414,2.179328,120.64
+1415,4.487629,251.74115
+1416,1.5532606,89.94888
+1417,2.8187547,154.80948
+1418,2.2985816,163.24487
+1419,2.4529529,142.23389
+1420,3.2937388,230.70511
+1421,2.0622544,108.83087
+1422,1.7395794,110.784164
+1423,2.087914,116.59224
+1424,2.1107802,100.13832
+1425,1.9810772,105.300995
+1426,1.8962204,102.58787
+1427,3.4222178,217.6831
+1428,1.981257,96.805466
+1429,3.3024764,210.54105
+1430,2.5225406,193.71913
+1431,1.5962104,104.38396
+1432,2.7064214,196.4854
+1433,2.150473,114.48076
+1434,2.3927083,167.3869
+1435,2.6113954,198.94867
+1436,2.4256926,128.80614
+1437,3.0517168,229.54594
+1438,3.6471732,216.66107
+1439,2.3056169,133.68063
+1440,2.0148482,144.31413
+1441,3.5692677,239.8728
+1442,2.1545439,125.1149
+1443,2.0648963,90.67674
+1444,2.8613412,135.49625
+1445,2.5893345,110.83284
+1446,1.7846735,81.465256
+1447,2.4969199,208.91978
+1448,1.4690678,82.80664
+1449,3.6576912,227.53714
+1450,2.2890782,160.05304
+1451,3.1915114,226.76129
+1452,3.5458372,226.2396
+1453,2.6783412,165.67679
+1454,2.9789968,206.35106
+1455,2.3589127,140.91434
+1456,2.1754947,137.0443
+1457,2.336182,155.88054
+1458,2.0333064,150.76587
+1459,2.109273,133.11987
+1460,1.679711,89.61635
+1461,1.7918122,93.33775
+1462,2.639002,178.29918
+1463,3.2545178,222.49913
+1464,2.1296031,146.57056
+1465,2.0876174,109.787865
+1466,2.5841415,176.57648
+1467,2.7757812,226.31825
+1468,4.2607775,248.39328
+1469,2.2259436,106.51841
+1470,2.394496,129.76096
+1471,3.437762,239.66269
+1472,1.7970434,87.18199
+1473,2.2490706,133.95776
+1474,2.2763278,127.56986
+1475,2.8781314,208.86116
+1476,2.2502813,115.70934
+1477,2.6451592,194.56177
+1478,2.1832871,120.22249
+1479,2.210299,155.12341
+1480,1.8796043,95.15361
+1481,2.5294735,112.31703
+1482,2.4138842,151.58801
+1483,2.267584,103.00587
+1484,2.583047,153.53345
+1485,3.4636493,217.63347
+1486,2.0251462,129.57486
+1487,2.319925,145.39062
+1488,1.9624307,108.66478
+1489,3.1568315,225.44243
+1490,2.5863402,173.60507
+1491,2.319466,124.00453
+1492,2.2481606,142.43085
+1493,1.763436,101.13257
+1494,4.513607,249.4775
+1495,1.616446,79.45548
+1496,2.8552392,177.84552
+1497,2.4613252,133.70656
+1498,3.1330323,207.44183
+1499,2.0686154,119.77623
+1500,2.031225,122.36334
+1501,2.1813502,107.09238
+1502,4.360952,250.29982
+1503,2.1846094,117.08888
+1504,2.7339175,161.11453
+1505,3.1873343,217.35165
+1506,2.092739,93.28886
+1507,3.163881,207.33363
+1508,2.570682,179.29994
+1509,3.7056623,240.99808
+1510,1.8263203,122.186554
+1511,3.3312201,245.74573
+1512,2.6873899,188.58292
+1513,3.2113957,203.72581
+1514,2.7780783,233.39516
+1515,1.5172522,85.372955
+1516,2.7956543,200.03386
+1517,2.7721536,198.56798
+1518,2.8797708,188.11505
+1519,3.6865513,240.8891
+1520,1.4353545,83.10256
+1521,1.5502673,81.9555
+1522,1.4959229,80.57883
+1523,2.2948337,139.88248
+1524,3.4546146,238.29832
+1525,2.4732862,194.48445
+1526,2.4022622,169.19946
+1527,3.0761533,212.79883
+1528,1.5250074,95.159645
+1529,1.8330519,109.270294
+1530,2.2327952,138.14943
+1531,2.7207565,196.3808
+1532,2.2666838,119.24833
+1533,1.6402974,98.32272
+1534,3.0104856,229.17172
+1535,2.053854,90.0619
+1536,3.5524068,233.22142
+1537,2.0076494,141.44382
+1538,2.0791628,115.400024
+1539,3.2099593,237.5368
+1540,4.3594503,247.62401
+1541,1.9930136,104.79591
+1542,2.1578593,113.38116
+1543,2.4653592,133.38815
+1544,2.867401,202.32149
+1545,1.845791,86.727005
+1546,2.464234,130.02802
+1547,2.1901567,161.1152
+1548,1.6175182,91.18968
+1549,2.7375774,204.17122
+1550,3.8537812,243.84628
+1551,2.222133,140.21983
+1552,2.0263517,114.31891
+1553,1.7923647,121.25368
+1554,3.847873,239.65276
+1555,1.6260121,82.80984
+1556,2.4531314,171.33719
+1557,3.940062,249.99545
+1558,3.1099913,234.18471
+1559,3.0879874,203.21494
+1560,2.4646447,180.91293
+1561,2.1661675,98.24361
+1562,3.4034467,228.04066
+1563,2.685216,162.98453
+1564,2.2320447,98.50222
+1565,2.1802726,119.91289
+1566,3.056801,222.27025
+1567,1.883077,127.1517
+1568,1.977777,136.82089
+1569,1.9076576,113.883484
+1570,2.6365116,153.28897
+1571,3.0404315,240.34094
+1572,2.6574223,126.59711
+1573,1.8791153,130.46252
+1574,1.5347493,87.276596
+1575,2.445062,193.01097
+1576,2.468779,166.57944
+1577,4.38433,247.21431
+1578,1.5663551,92.38371
+1579,1.7536844,105.40734
+1580,2.901523,184.34
+1581,1.444538,87.01894
+1582,3.2908425,236.91718
+1583,2.7470415,189.53323
+1584,2.785849,176.00172
+1585,2.2298827,145.5497
+1586,2.3297908,134.73718
+1587,2.432074,162.45155
+1588,2.7425897,132.09784
+1589,3.831756,247.07578
+1590,2.0903072,123.92178
+1591,1.8498836,145.4315
+1592,2.4463305,191.03648
+1593,1.9873085,119.21356
+1594,2.6775146,170.4884
+1595,3.4863477,236.95097
+1596,1.9450548,102.7307
+1597,2.3809123,141.47049
+1598,2.8942914,190.87326
+1599,1.9356756,101.95743
+1600,2.1364923,111.917336
+1601,2.389505,162.3816
+1602,2.2567744,175.91788
+1603,2.2656608,116.878006
+1604,1.6382482,106.79098
+1605,1.9741569,127.64412
+1606,2.092969,126.33335
+1607,1.7437458,109.443954
+1608,2.5464768,181.0286
+1609,2.1742883,149.79346
+1610,2.5129492,193.54688
+1611,2.0934436,90.20612
+1612,2.4669547,116.94701
+1613,1.9874133,130.74918
+1614,3.085468,223.10103
+1615,2.052669,93.750534
+1616,1.5480589,98.73189
+1617,4.721802,252.35466
+1618,3.9688447,240.25269
+1619,3.1042724,211.30067
+1620,2.8445277,203.75003
+1621,2.9130952,191.17258
+1622,3.7880034,241.46988
+1623,1.924421,120.51044
+1624,3.3755288,201.05168
+1625,2.6443186,157.0086
+1626,2.8071694,175.12447
+1627,1.7299739,99.49332
+1628,2.650135,204.53044
+1629,1.5618824,75.26127
+1630,2.0549183,125.15723
+1631,2.6737666,172.8445
+1632,2.867561,231.37279
+1633,2.6025424,200.30449
+1634,2.681069,175.63489
+1635,2.4574678,171.62518
+1636,2.563598,190.05698
+1637,2.7607002,168.18665
+1638,1.8603942,125.09497
+1639,2.6270068,152.04807
+1640,2.1011467,134.01035
+1641,2.441722,197.77888
+1642,2.4648724,175.62593
+1643,2.7236068,210.48473
+1644,2.080494,147.50133
+1645,3.3929112,216.16594
+1646,3.1300154,211.77129
+1647,4.2331014,249.7626
+1648,2.8408527,188.69446
+1649,2.8314211,174.27754
+1650,2.6352813,169.2307
+1651,1.6864245,77.810844
+1652,1.9408038,136.14569
+1653,1.7952602,85.26106
+1654,2.4187238,153.79681
+1655,2.7728217,188.71196
+1656,2.1247756,112.38732
+1657,2.7964547,196.66304
+1658,2.409236,136.3522
+1659,4.2168283,250.85909
+1660,2.4236674,156.91232
+1661,2.5360198,129.58618
+1662,3.4803267,237.20317
+1663,3.9774082,246.53029
+1664,2.5681784,187.98947
+1665,2.7937477,157.09937
+1666,2.5375404,150.09634
+1667,2.5667615,185.37236
+1668,3.9059823,240.40344
+1669,2.0479052,121.572174
+1670,3.9247437,247.90067
+1671,2.0952468,170.62317
+1672,2.591122,160.43002
+1673,1.9540721,107.36293
+1674,2.445876,134.51813
+1675,2.3713284,118.48785
+1676,2.8643126,203.44208
+1677,2.787504,192.72333
+1678,2.920384,223.73663
+1679,2.6626594,172.12762
+1680,2.4460592,163.86514
+1681,2.8737228,185.27826
+1682,2.3864872,163.2222
+1683,3.356726,231.7949
+1684,2.6040628,152.64589
+1685,3.5804088,233.62599
+1686,1.7018421,128.97711
+1687,2.6515198,178.10889
+1688,1.9464262,109.2753
+1689,3.6631272,242.09076
+1690,2.0344691,137.72083
+1691,3.3654082,218.39911
+1692,3.1475189,232.38675
+1693,2.4807916,175.11076
+1694,2.2757885,161.97243
+1695,2.3106666,193.26971
+1696,2.0139155,89.87937
+1697,1.38519,76.26424
+1698,2.8867316,173.47595
+1699,2.6598544,199.28189
+1700,3.672523,242.9966
+1701,3.4322488,232.95259
+1702,1.8902401,118.68135
+1703,1.6783267,86.355865
+1704,2.8653283,184.72653
+1705,1.8428767,114.4826
+1706,2.0245795,101.42534
+1707,3.4253263,240.3371
+1708,2.9541085,211.31682
+1709,2.1216998,111.088005
+1710,3.6123319,247.60701
+1711,2.189691,162.18924
+1712,2.9096296,179.86276
+1713,3.5472946,236.86769
+1714,2.3846972,127.499985
+1715,1.8150436,153.41298
+1716,1.9079483,102.798416
+1717,1.5081823,82.219795
+1718,1.764601,113.8655
+1719,2.4832914,197.55373
+1720,2.1661007,126.434204
+1721,2.4633493,151.972
+1722,3.5715199,244.9507
+1723,2.1193647,110.571304
+1724,2.0069315,106.57685
+1725,1.6832091,111.096375
+1726,1.9188652,133.27545
+1727,2.4702823,147.29825
+1728,3.0028052,168.47324
+1729,3.2465825,201.47285
+1730,2.1376686,114.84883
+1731,2.18341,145.27435
+1732,2.1922684,112.33887
+1733,1.4769604,73.50228
+1734,1.6507976,88.419495
+1735,2.107934,128.90561
+1736,1.5325792,108.58888
+1737,4.149588,249.40887
+1738,2.406459,138.68591
+1739,2.88764,200.19583
+1740,2.9419167,152.98294
+1741,2.8677769,204.94434
+1742,1.5780561,92.238235
+1743,2.2060347,124.49471
+1744,2.2822416,111.55301
+1745,2.0700948,90.34323
+1746,2.8506775,199.8164
+1747,3.1391604,222.48978
+1748,2.382925,171.57233
+1749,2.3776765,153.09117
+1750,3.1982892,219.2644
+1751,2.0823328,120.21556
+1752,2.3969045,169.44858
+1753,1.5118886,77.79789
+1754,2.112011,145.0872
+1755,2.4847064,165.55869
+1756,2.2072005,160.99298
+1757,2.969832,233.12102
+1758,1.869655,140.32788
+1759,1.5679008,79.03916
+1760,2.2057617,164.04218
+1761,3.1910536,205.37164
+1762,2.461309,145.3135
+1763,2.433763,126.79283
+1764,2.592168,186.29794
+1765,2.615045,152.93945
+1766,3.5370805,231.11188
+1767,1.7311499,105.348114
+1768,3.706086,230.3406
+1769,2.665836,190.97876
+1770,2.0628922,135.04086
+1771,2.6103835,184.94336
+1772,2.0999465,115.26796
+1773,2.1513994,165.29213
+1774,3.5746448,239.1079
+1775,1.9831549,117.51037
+1776,2.2202897,154.98422
+1777,1.9246615,123.886536
+1778,1.6758846,107.52263
+1779,2.2652812,107.12178
+1780,2.4070673,195.77394
+1781,2.0485783,122.14464
+1782,1.650622,90.48087
+1783,2.293981,118.18375
+1784,3.2457137,231.49413
+1785,2.0524883,107.42595
+1786,1.7546542,98.624695
+1787,1.7267796,125.14128
+1788,2.3559148,153.35284
+1789,2.2018037,166.64508
+1790,2.4796457,137.91853
+1791,3.334345,243.17705
+1792,2.2777624,163.20206
+1793,2.1511664,149.54755
+1794,2.8459094,196.75807
+1795,2.9218628,186.49982
+1796,2.0968285,110.48524
+1797,2.4835067,113.89432
+1798,3.740025,219.77669
+1799,3.4391923,240.644
+1800,2.3483155,120.11
+1801,3.03314,211.10994
+1802,2.3533735,158.62154
+1803,4.801441,254.00089
+1804,2.6610532,174.20447
+1805,2.9477928,197.72838
+1806,2.8385673,208.61987
+1807,2.8901548,216.96938
+1808,3.5081677,241.7911
+1809,4.0061245,239.6242
+1810,1.9267027,135.17117
+1811,2.80144,141.15265
+1812,2.3223286,170.52489
+1813,4.0939813,247.67482
+1814,4.533345,250.32098
+1815,2.8314958,219.92413
+1816,3.0024848,196.12064
+1817,2.7492418,198.24423
+1818,1.7000767,91.54349
+1819,2.8435614,204.87543
+1820,1.8726444,103.650116
+1821,2.7268555,163.387
+1822,1.266729,92.32922
+1823,1.9909158,115.38255
+1824,2.3288088,123.154816
+1825,1.6280267,97.11751
+1826,3.5936003,239.14333
+1827,2.5426989,180.50534
+1828,1.7472653,94.08429
+1829,1.9863397,92.14327
+1830,2.7325125,185.46071
+1831,2.1516593,112.66858
+1832,2.4237516,208.14766
+1833,2.4746974,168.82977
+1834,1.3737466,96.07704
+1835,3.6880858,243.93506
+1836,2.8316357,173.85709
+1837,3.7585187,250.38588
+1838,1.8045465,130.1579
+1839,4.0319033,248.87752
+1840,2.1389031,108.232956
+1841,4.463581,253.74461
+1842,2.1625903,126.72646
+1843,3.6203732,242.92433
+1844,1.8013808,95.00389
+1845,2.3491054,121.6874
+1846,2.506286,181.07936
+1847,1.834224,128.79451
+1848,1.880274,98.39627
+1849,2.084544,122.72096
+1850,1.822003,98.4423
+1851,2.019487,105.62184
+1852,2.6479878,186.14294
+1853,1.8284678,114.32992
+1854,2.3594685,143.67825
+1855,3.1204119,199.51225
+1856,2.4544322,152.85294
+1857,3.9376037,249.37569
+1858,3.2329974,214.90901
+1859,2.6828833,157.93112
+1860,1.5331943,92.532196
+1861,2.4719794,139.79028
+1862,1.93536,100.1995
+1863,2.6260457,152.78503
+1864,1.4888862,86.08925
+1865,2.7430458,172.36887
+1866,1.6828182,125.55896
+1867,2.0988123,85.197876
+1868,3.088718,206.35904
+1869,2.9027333,200.68648
+1870,2.7650483,160.71109
+1871,1.2017239,70.28776
+1872,2.6692584,181.05594
+1873,2.811795,199.62244
+1874,2.6387258,133.49286
+1875,2.5447664,156.98456
+1876,4.503401,250.11758
+1877,2.6146553,141.23172
+1878,1.7919488,104.57385
+1879,4.0903955,247.9058
+1880,1.8596749,102.11435
+1881,2.3645928,138.65573
+1882,2.2987535,123.50959
+1883,3.1221766,191.66711
+1884,3.8386295,241.7017
+1885,1.9961331,115.12999
+1886,1.5573431,84.08205
+1887,4.049805,251.24353
+1888,1.6372848,105.63629
+1889,2.6008897,178.3348
+1890,3.1945534,211.64641
+1891,3.5328565,228.74707
+1892,2.7488272,174.3182
+1893,2.0972428,125.19868
+1894,3.3095934,203.9737
+1895,3.0526702,204.9597
+1896,2.775585,201.68695
+1897,2.9230075,232.19542
+1898,1.8463477,122.59551
+1899,2.834954,185.499
+1900,2.6432364,192.9025
+1901,2.4928164,146.8589
+1902,2.5280082,174.53352
+1903,2.0998535,135.80609
+1904,1.5608276,91.50845
+1905,2.1162188,150.87296
+1906,1.8127629,125.08415
+1907,3.207532,211.06253
+1908,3.0546842,206.78271
+1909,2.087163,117.25456
+1910,2.1286197,135.14795
+1911,1.128849,74.369156
+1912,2.6640556,197.04643
+1913,1.7247488,107.37097
+1914,2.2573884,126.310524
+1915,2.3327234,166.7095
+1916,2.6249251,166.20293
+1917,2.606582,172.57208
+1918,3.2917624,216.3347
+1919,4.1073627,247.05658
+1920,2.087025,127.57297
+1921,2.5076292,157.80533
+1922,2.0852945,103.796936
+1923,4.0864906,249.01938
+1924,2.5781984,155.56544
+1925,2.4554203,114.871475
+1926,2.0664797,131.6139
+1927,2.61836,170.89093
+1928,2.2024007,151.23639
+1929,2.5034752,184.4314
+1930,2.3499024,103.73642
+1931,2.0483198,143.41324
+1932,2.101344,115.827286
+1933,3.3329327,233.69844
+1934,2.129144,132.35088
+1935,1.9770076,82.027596
+1936,3.1058393,216.39801
+1937,2.477953,139.36526
+1938,2.49981,153.46275
+1939,2.405767,199.35901
+1940,3.6216187,242.63626
+1941,2.4943933,160.9805
+1942,2.4670012,203.05962
+1943,2.3988187,139.08307
+1944,1.7663673,102.995544
+1945,3.3563104,196.12552
+1946,2.4104629,149.043
+1947,2.2605097,147.02287
+1948,2.1703002,121.14906
+1949,3.8280349,238.05933
+1950,1.4262812,80.45806
+1951,3.787908,239.0784
+1952,2.2348647,136.5835
+1953,3.0611665,226.1092
+1954,3.0011163,210.13464
+1955,2.3499713,122.21944
+1956,3.0744598,192.213
+1957,2.5227332,182.15012
+1958,3.3336189,221.81152
+1959,3.497091,234.26929
+1960,2.7106872,204.37276
+1961,1.9779031,124.171875
+1962,2.0858173,125.96007
+1963,1.9081532,121.28377
+1964,1.9256557,109.47293
+1965,2.5821197,131.4736
+1966,2.378937,148.81712
+1967,2.0820248,99.57885
+1968,2.7350574,165.25082
+1969,2.1934361,120.30141
+1970,3.0409102,205.77704
+1971,1.9357835,91.74094
+1972,2.8422766,181.08813
+1973,2.5853639,169.98322
+1974,2.086736,108.3621
+1975,2.237559,108.16828
+1976,1.5547628,76.475
+1977,3.0321958,193.37358
+1978,2.0905852,125.39853
+1979,2.0995433,136.45726
+1980,2.0761104,119.47957
+1981,1.8135269,111.28595
+1982,2.5844665,195.99243
+1983,2.08692,115.14307
+1984,1.769723,100.74513
+1985,1.6916927,95.7026
+1986,2.1439743,158.72124
+1987,2.299562,145.93338
+1988,1.9085377,102.23692
+1989,3.4997761,231.55757
+1990,1.51946,78.68146
+1991,2.988885,215.20772
+1992,1.8710127,119.189514
+1993,2.0258107,122.36539
+1994,1.7813637,104.18648
+1995,2.5032563,137.33926
+1996,2.3202522,178.87772
+1997,3.3072577,214.47754
+1998,3.6787524,236.96098
+1999,2.7693796,173.92612
+2000,2.4160924,128.85107
+2001,1.4336822,82.10747
+2002,2.6950908,181.12482
+2003,3.8365245,236.50797
+2004,3.5162714,225.2417
+2005,2.1080866,121.809525
+2006,1.798267,119.2481
+2007,1.7632729,97.86561
+2008,2.7012334,176.5444
+2009,3.147285,223.26018
+2010,1.4459724,79.13656
+2011,1.9683673,110.673065
+2012,2.5765877,212.07077
+2013,1.4982672,100.19139
+2014,2.536097,156.44098
+2015,3.6507552,220.71704
+2016,2.4235642,177.31015
+2017,2.432701,133.2814
+2018,2.2603216,109.82742
+2019,2.8111615,185.61365
+2020,2.6421244,154.58264
+2021,3.7766967,237.13043
+2022,2.571446,209.85234
+2023,3.912272,245.97725
+2024,2.4525201,158.11285
+2025,3.4607024,185.40506
+2026,2.2618291,105.21361
+2027,2.7076921,148.92014
+2028,2.8951106,208.70485
+2029,2.19551,205.7868
+2030,2.239016,97.39601
+2031,2.6694245,182.6073
+2032,2.5014925,174.15286
+2033,3.1676757,205.4506
+2034,1.2377661,84.97971
+2035,2.3946536,149.6294
+2036,1.9759148,126.55863
+2037,3.721643,247.90602
+2038,2.953105,176.04897
+2039,1.345958,78.05855
+2040,2.315244,143.4776
+2041,2.4442587,146.24544
+2042,1.8458571,87.3347
+2043,1.2955984,85.59345
+2044,4.0568395,247.5802
+2045,2.5937657,173.853
+2046,1.8052253,99.80771
+2047,2.5031123,130.25641
+2048,1.7561789,123.66684
+2049,2.0659606,145.91135
+2050,2.186048,132.54381
+2051,2.8714926,195.9112
+2052,1.9630597,106.22435
+2053,3.135882,206.06862
+2054,2.035457,132.70605
+2055,2.7496865,182.8458
+2056,2.512154,144.55826
+2057,2.9048982,224.89224
+2058,2.562878,156.64453
+2059,2.724474,141.974
+2060,1.7068878,98.15497
+2061,3.2032106,216.9835
+2062,1.9136053,128.0357
+2063,2.9518545,186.43622
+2064,2.6708934,186.28052
+2065,3.9849331,246.53134
+2066,2.5769477,203.44702
+2067,2.987371,222.69693
+2068,2.239962,127.27144
+2069,2.4206707,138.73703
+2070,2.3482578,121.004105
+2071,1.6820819,100.78777
+2072,1.9838005,114.8922
+2073,1.8660522,106.47475
+2074,2.8341713,158.72159
+2075,1.9708288,147.16449
+2076,1.9371854,94.105
+2077,2.954392,211.35074
+2078,2.853656,198.46834
+2079,2.4981322,113.90718
+2080,1.6809775,91.47298
+2081,2.3238883,180.44989
+2082,2.4997535,160.39072
+2083,4.087682,249.65007
+2084,1.538733,83.419655
+2085,1.5603321,85.51729
+2086,3.4298935,232.89714
+2087,2.6468585,131.05927
+2088,1.420822,100.73973
+2089,2.8779798,185.58966
+2090,2.0695624,170.6312
+2091,2.8597584,206.94843
+2092,1.8822792,111.10063
+2093,2.2289062,142.20209
+2094,1.7403362,106.29324
+2095,2.9428892,223.68272
+2096,2.5273807,166.85583
+2097,2.1267266,167.1388
+2098,1.9772974,154.87125
+2099,2.1224165,152.99744
+2100,4.0180273,244.98116
+2101,3.0493581,178.40088
+2102,3.2425103,177.21039
+2103,3.298022,219.6692
+2104,1.4821637,79.98679
+2105,2.538301,128.28433
+2106,2.618867,203.461
+2107,3.374807,217.63193
+2108,2.5710466,152.08664
+2109,1.978636,134.68524
+2110,4.1415,249.79324
+2111,3.9242082,247.26265
+2112,2.3248062,109.84006
+2113,2.3863604,168.38083
+2114,3.1577604,210.71191
+2115,1.8066351,90.04978
+2116,2.499131,133.07355
+2117,2.4189126,196.72536
+2118,2.1898427,109.7348
+2119,1.36085,97.71452
+2120,2.7594845,177.22842
+2121,3.744163,239.16678
+2122,1.8932747,127.8094
+2123,2.3818197,118.50815
+2124,3.3635488,231.30466
+2125,2.1197515,115.4327
+2126,1.3254211,79.186264
+2127,2.0024245,120.61043
+2128,1.7940357,130.38376
+2129,2.8975477,156.28055
+2130,1.1289239,74.88248
+2131,2.7238212,168.54172
+2132,2.0377462,126.04763
+2133,1.9707505,139.01831
+2134,1.3359648,83.32401
+2135,3.218594,233.33055
+2136,1.5154914,90.01347
+2137,3.3256292,229.49197
+2138,2.4896522,149.4783
+2139,2.5605373,176.18262
+2140,2.4179723,136.87424
+2141,2.2753756,140.24805
+2142,2.2084212,123.34863
+2143,2.5761473,186.35803
+2144,2.698905,177.76625
+2145,2.3390899,127.7404
+2146,2.192417,160.85973
+2147,3.0027776,221.05069
+2148,2.872865,205.56708
+2149,1.7502444,123.95752
+2150,2.0680046,148.45123
+2151,3.1369402,229.19545
+2152,1.8066132,77.67909
+2153,3.5697968,231.76016
+2154,2.1409478,153.58948
+2155,3.0546203,195.56128
+2156,2.3933206,161.91347
+2157,1.8601925,124.39689
+2158,2.1398888,108.421524
+2159,2.7157845,216.78954
+2160,2.294215,150.00421
+2161,3.1000922,193.46413
+2162,2.0802054,131.23975
+2163,2.326432,126.91159
+2164,2.3047032,159.80235
+2165,1.7201097,114.04735
+2166,2.9589808,220.0474
+2167,3.281343,215.90367
+2168,2.7715278,161.56445
+2169,1.8781224,123.6438
+2170,3.654255,238.33633
+2171,1.987623,97.947174
+2172,1.7804681,95.17872
+2173,2.3228426,117.26541
+2174,2.2022426,154.91873
+2175,2.9233916,191.45615
+2176,2.889904,178.91086
+2177,3.0271683,209.31099
+2178,4.3888993,253.35333
+2179,3.1149378,222.73045
+2180,1.7945954,107.84821
+2181,3.2055008,194.61961
+2182,3.0595107,223.60532
+2183,3.5269907,241.1166
+2184,2.6725879,158.17534
+2185,2.7659245,222.4429
+2186,2.2836306,158.06573
+2187,2.2918553,120.49484
+2188,2.4483218,166.289
+2189,2.7658198,191.11343
+2190,2.7128117,211.13058
+2191,2.159818,100.75872
+2192,2.1169317,146.8967
+2193,2.0083253,130.8779
+2194,2.6119,172.97058
+2195,2.3726764,115.4017
+2196,4.0981255,247.73567
+2197,2.7616494,183.259
+2198,2.6916401,144.21648
+2199,3.5570621,242.26176
+2200,1.850909,100.59085
+2201,2.269298,168.77895
+2202,1.887192,109.68921
+2203,2.0256524,137.25208
+2204,2.2582052,115.002884
+2205,2.0039117,126.63455
+2206,2.5356402,167.24107
+2207,2.1491992,119.71113
+2208,3.748183,234.60283
+2209,3.3350685,230.27948
+2210,2.8602104,171.43787
+2211,2.6037195,203.45865
+2212,2.7903724,210.68376
+2213,2.1050968,109.064865
+2214,2.7032342,204.3463
+2215,3.0729387,207.47508
+2216,2.5026422,143.68114
+2217,2.424565,174.4819
+2218,3.320117,214.88712
+2219,2.1335704,118.16612
+2220,3.0991502,216.41771
+2221,2.3740323,179.06146
+2222,2.1549153,92.678795
+2223,3.1972375,220.01373
+2224,3.4231699,238.27959
+2225,2.4988546,126.15738
+2226,3.3323889,242.74706
+2227,1.7400672,98.09241
+2228,2.714524,170.72012
+2229,2.507014,183.17377
+2230,2.4355876,139.6751
+2231,2.3312562,145.93271
+2232,1.8701969,101.771454
+2233,2.9034052,172.12439
+2234,2.2835288,150.78827
+2235,2.0083764,130.75069
+2236,2.1568305,121.47789
+2237,1.708901,98.86954
+2238,2.3547845,142.81107
+2239,2.0119925,99.23841
+2240,1.6008734,89.81596
+2241,2.398452,178.99869
+2242,2.1109936,145.79419
+2243,2.7112176,199.9224
+2244,2.250815,138.8875
+2245,2.1154258,108.377975
+2246,2.50701,176.16013
+2247,2.363158,123.69501
+2248,3.8403492,242.1833
+2249,3.2447472,191.78131
+2250,1.6351826,92.58352
+2251,2.3717804,136.41402
+2252,2.696404,163.11108
+2253,1.9325075,156.41798
+2254,2.3471706,112.44214
+2255,2.7132146,167.8721
+2256,3.6933358,228.42761
+2257,2.406929,162.48254
+2258,2.2267208,127.92764
+2259,1.6649424,108.57576
+2260,2.1791873,112.890656
+2261,2.0450459,89.78455
+2262,2.373629,138.47472
+2263,1.3593738,81.85159
+2264,2.2551816,140.05103
+2265,3.7559402,229.9522
+2266,2.7148416,173.9454
+2267,1.7497612,89.921036
+2268,1.4060643,79.657745
+2269,1.7478285,136.15369
+2270,2.9281929,211.10487
+2271,2.727205,176.00296
+2272,2.4602478,184.06267
+2273,1.9673587,123.20359
+2274,2.0976357,113.693924
+2275,2.0131085,121.68723
+2276,2.1394787,161.60143
+2277,2.6537077,187.52213
+2278,2.225101,152.79456
+2279,2.3389554,147.69733
+2280,3.8153248,222.30872
+2281,3.578329,237.97845
+2282,1.9693505,158.46112
+2283,2.759095,197.00446
+2284,2.2014732,127.882904
+2285,1.9429454,99.39052
+2286,1.7106755,81.07981
+2287,2.7492354,180.92862
+2288,2.771931,155.32076
+2289,2.2445486,135.2562
+2290,3.1412613,200.87103
+2291,2.9280856,173.93234
+2292,1.7652223,93.73466
+2293,1.6994154,109.74245
+2294,1.8747383,100.6373
+2295,3.4393039,228.59613
+2296,2.6085267,192.13982
+2297,1.8068477,90.73479
+2298,3.0390506,234.21388
+2299,2.1792474,122.87744
+2300,3.1761937,222.47165
+2301,2.2787938,142.16849
+2302,4.094256,247.73009
+2303,3.5930183,235.06563
+2304,2.0572333,145.86032
+2305,1.3402553,73.97009
+2306,2.168269,101.80246
+2307,1.9206882,164.2429
+2308,2.5916336,162.70801
+2309,2.4296205,191.24078
+2310,2.7831306,209.24655
+2311,2.0884924,99.08424
+2312,1.9207464,82.61961
+2313,2.8872766,219.239
+2314,3.2173173,197.99129
+2315,2.8415165,183.6052
+2316,2.4358544,138.33112
+2317,1.8868806,100.16254
+2318,2.6452916,174.39409
+2319,3.805345,246.49622
+2320,2.24812,112.468124
+2321,2.404173,147.6879
+2322,2.7362878,169.88428
+2323,2.7228613,183.7058
+2324,2.0285852,142.95312
+2325,2.8881946,179.42099
+2326,2.583796,176.18622
+2327,3.2952666,223.17317
+2328,2.5607526,143.62091
+2329,2.894538,195.0747
+2330,1.929368,109.890366
+2331,2.9495268,161.10907
+2332,2.176811,122.31049
+2333,1.5884962,113.99805
+2334,3.5840805,243.04181
+2335,3.6195555,239.6239
+2336,3.2029316,232.14876
+2337,1.9450241,109.533356
+2338,2.0612931,105.837616
+2339,2.2709212,193.1579
+2340,1.7815359,89.34474
+2341,3.5209796,240.18776
+2342,2.2187445,114.069435
+2343,2.5228565,151.88196
+2344,2.0593948,81.37781
+2345,2.4244475,168.15675
+2346,1.8923326,118.60605
+2347,3.5025678,231.95483
+2348,1.6365862,94.41354
+2349,1.6474415,80.89252
+2350,2.2718349,124.74196
+2351,4.041211,246.00714
+2352,2.244627,163.28839
+2353,2.4995348,189.39038
+2354,2.7024,171.86694
+2355,1.9813684,137.35783
+2356,1.9513712,132.32607
+2357,3.2434287,206.15045
+2358,2.3803964,143.87787
+2359,1.8926046,112.33209
+2360,1.867815,93.400215
+2361,2.0764318,114.48313
+2362,3.030497,215.36176
+2363,2.651558,156.55971
+2364,1.5055991,110.60188
+2365,1.8275034,110.35075
+2366,2.1119215,180.17126
+2367,3.045024,193.57831
+2368,2.733237,192.22606
+2369,2.2402902,166.18005
+2370,3.637509,243.44371
+2371,1.9071862,127.78115
+2372,2.7554479,189.47633
+2373,2.9616702,171.85757
+2374,2.5245621,151.87262
+2375,1.6896266,98.57782
+2376,1.7882116,91.11592
+2377,3.5319731,229.79181
+2378,2.3017154,116.45232
+2379,1.8267533,93.782394
+2380,2.157517,93.74838
+2381,2.9159806,220.50906
+2382,2.7449207,202.09729
+2383,1.9481919,100.193344
+2384,2.855076,194.58333
+2385,3.871138,246.87427
+2386,4.457303,251.35403
+2387,1.7923099,100.30584
+2388,2.4430833,145.73465
+2389,2.9545712,211.47572
+2390,2.609316,172.04349
+2391,1.9529859,133.08267
+2392,1.6704538,116.956985
+2393,2.3712568,115.752335
+2394,2.4860306,176.77274
+2395,3.545149,224.9296
+2396,1.6743567,113.41452
+2397,2.8625634,171.46533
+2398,2.859338,218.09021
+2399,2.1373558,139.97498
+2400,3.1361547,202.44624
+2401,2.0233192,134.51462
+2402,1.8212972,137.40636
+2403,2.9902554,176.32343
+2404,1.6145247,122.68674
+2405,3.9354439,235.30612
+2406,1.8801491,104.46832
+2407,2.4482033,190.722
+2408,2.189419,125.88874
+2409,2.2641532,125.10315
+2410,2.6556249,145.37447
+2411,2.2557402,110.60939
+2412,2.943979,218.79117
+2413,2.390428,217.72044
+2414,2.6520963,190.14635
+2415,3.1253154,205.5384
+2416,3.58365,234.713
+2417,2.3621292,122.73294
+2418,1.424873,82.71194
+2419,1.9143348,125.22543
+2420,3.2697842,227.8098
+2421,2.0788517,123.41706
+2422,2.2984118,124.05517
+2423,3.2248158,224.80713
+2424,2.7585363,190.17734
+2425,1.6909411,113.270004
+2426,2.4594955,195.64511
+2427,1.747491,88.75529
+2428,3.225347,229.00023
+2429,2.782616,182.33432
+2430,3.8360114,245.97258
+2431,1.8105152,117.0333
+2432,2.7248151,163.24854
+2433,2.9048123,209.21907
+2434,2.1895642,147.5922
+2435,2.3817708,179.24881
+2436,2.0283766,87.92473
+2437,2.6422684,174.42734
+2438,1.7950284,95.088806
+2439,2.5060449,176.78558
+2440,2.2588418,138.51157
+2441,2.5701623,186.08035
+2442,1.9386879,111.72443
+2443,2.997571,190.15146
+2444,2.4176114,174.57123
+2445,2.243905,124.961945
+2446,3.2251406,220.6427
+2447,2.1097643,109.86271
+2448,1.9167205,100.52579
+2449,2.591271,179.15747
+2450,2.3329148,124.012436
+2451,2.4139094,138.13863
+2452,1.6086639,100.52351
+2453,1.9888122,102.0406
+2454,1.8713545,104.876755
+2455,1.9618773,128.83145
+2456,1.6847776,87.96607
+2457,1.9498698,90.61089
+2458,1.8696365,98.1215
+2459,3.0041566,206.93486
+2460,2.3313668,119.46678
+2461,2.105438,171.24133
+2462,2.583464,208.00374
+2463,3.1181648,218.62914
+2464,2.6481807,157.70438
+2465,2.1069238,115.68147
+2466,2.6610866,163.50159
+2467,2.542326,203.66554
+2468,1.8122398,92.02966
+2469,3.0867848,223.71188
+2470,2.0854087,113.17177
+2471,1.6607796,95.86719
+2472,2.7080464,193.7575
+2473,2.660453,179.41171
+2474,2.5208874,168.98598
+2475,3.0518584,193.87242
+2476,1.5190979,77.78668
+2477,1.6007569,87.2994
+2478,2.2103367,142.38373
+2479,2.8827755,178.81741
+2480,4.1361446,243.69803
+2481,3.0163963,216.7134
+2482,3.0495858,235.17406
+2483,3.0363894,187.98175
+2484,3.074155,218.37428
+2485,1.9335022,87.59979
+2486,2.2586663,161.00958
+2487,2.4748728,136.19247
+2488,1.9565785,107.113106
+2489,1.8803569,100.88933
+2490,1.601385,100.27887
+2491,2.9903874,219.56967
+2492,3.68395,230.90257
+2493,2.2200418,137.76804
+2494,2.5721295,150.04279
+2495,3.0645282,188.7285
+2496,2.5638146,163.4997
+2497,1.9887062,114.871574
+2498,2.8513408,212.38327
+2499,1.8640898,109.90558
+2500,3.5300765,232.69518
+2501,4.0750566,237.56824
+2502,3.6467633,240.7032
+2503,2.3755672,111.66675
+2504,1.6439248,96.2198
+2505,1.654501,104.52011
+2506,1.7579378,90.85664
+2507,3.0872114,215.38536
+2508,2.072298,109.0883
+2509,3.5595434,243.19933
+2510,3.37648,210.98756
+2511,2.1978664,122.58936
+2512,2.8275645,196.87247
+2513,1.9109943,97.51469
+2514,3.3437486,218.13504
+2515,2.1563053,125.93407
+2516,3.576151,236.73901
+2517,2.0271971,109.353714
+2518,2.8320735,210.19672
+2519,1.5053571,92.89728
+2520,2.5510635,137.41357
+2521,1.4372132,80.99517
+2522,2.2750099,158.60153
+2523,3.410706,221.91049
+2524,2.646852,203.43307
+2525,2.1057734,129.6141
+2526,2.9940279,210.51868
+2527,2.2637193,104.70456
+2528,2.5730367,198.67834
+2529,3.0762734,189.24057
+2530,3.0983825,200.44249
+2531,3.4907799,235.89388
+2532,2.3803768,160.28879
+2533,2.4496307,166.76576
+2534,4.3842897,252.31807
+2535,2.117584,141.38458
+2536,2.3410645,157.64084
+2537,1.8999797,101.43912
+2538,1.9647601,102.97513
+2539,2.8727748,171.32547
+2540,2.088537,119.26251
+2541,1.6301348,91.09921
+2542,2.5293512,177.16772
+2543,2.80318,189.42973
+2544,2.3579016,135.58096
+2545,3.630649,225.18509
+2546,3.6479478,238.1482
+2547,2.5507748,141.57462
+2548,2.503399,182.41252
+2549,2.6537702,170.8977
+2550,3.2137697,244.17163
+2551,4.30736,251.62431
+2552,4.4140725,252.49783
+2553,1.8632647,92.18065
+2554,3.1369572,224.95937
+2555,1.7011225,102.39182
+2556,2.5946991,148.17194
+2557,3.685427,234.17093
+2558,2.249478,121.33076
+2559,2.6566882,142.30463
+2560,1.5382688,75.24498
+2561,3.7577233,243.73961
+2562,3.0612378,197.14226
+2563,1.8686632,109.83174
+2564,1.835888,155.30576
+2565,3.2659461,227.37799
+2566,1.579624,99.00691
+2567,2.8929586,197.32463
+2568,2.7009466,191.88556
+2569,2.5525534,148.17953
+2570,3.3104022,219.37785
+2571,2.7528462,222.26524
+2572,5.209964,254.2569
+2573,2.4157073,123.70674
+2574,3.8198414,232.70966
+2575,2.647574,189.28174
+2576,3.033975,180.68164
+2577,2.951107,210.35603
+2578,1.9729143,131.45476
+2579,2.7621386,187.84456
+2580,2.7775826,186.9748
+2581,2.1684022,102.83441
+2582,3.4847271,234.90495
+2583,2.6425054,170.11443
+2584,2.8037329,184.13184
+2585,2.5840838,201.01202
+2586,2.332642,126.80173
+2587,2.082417,123.644135
+2588,1.8634015,143.03787
+2589,1.6442511,82.95849
+2590,1.7449272,102.39317
+2591,3.049731,241.5052
+2592,2.4890985,141.6753
+2593,1.9259274,142.28674
+2594,2.3352513,151.7691
+2595,3.3194084,235.53995
+2596,2.7567544,208.02844
+2597,2.491268,98.70044
+2598,2.0160785,152.21588
+2599,2.0358737,94.89451
+2600,2.0283227,127.44347
+2601,2.2246554,123.32615
+2602,2.1299477,121.40193
+2603,3.1913629,211.56868
+2604,3.0318227,199.0826
+2605,3.5032701,222.49811
+2606,2.2316322,110.03142
+2607,2.1459637,148.8549
+2608,2.3524346,203.26297
+2609,2.405863,141.94553
+2610,2.918676,188.24335
+2611,1.6886351,78.79794
+2612,2.998266,216.35156
+2613,1.7337267,110.22586
+2614,3.0138326,192.40038
+2615,2.532513,148.15614
+2616,3.4039836,219.13474
+2617,1.8692852,105.3925
+2618,3.0792193,216.96158
+2619,2.4642885,133.40363
+2620,2.8716092,222.15144
+2621,2.709022,197.04771
+2622,1.6573255,96.54344
+2623,2.5969148,184.57878
+2624,2.2804973,140.1894
+2625,2.130232,146.20462
+2626,1.9815189,121.04439
+2627,2.2495544,115.74333
+2628,1.7388934,104.3416
+2629,4.5060124,249.28818
+2630,2.336851,147.78697
+2631,2.1348524,113.55519
+2632,2.0527208,153.38455
+2633,1.9351298,88.091125
+2634,2.3572574,133.22372
+2635,1.9553181,101.86295
+2636,2.8212266,202.11543
+2637,2.1025794,147.41289
+2638,3.1073985,206.66043
+2639,2.6316235,184.31361
+2640,2.9079819,168.34216
+2641,1.4885776,78.659584
+2642,2.6707518,177.71365
+2643,2.4375596,121.07988
+2644,2.6216257,154.70462
+2645,2.247393,139.05814
+2646,2.7337286,161.95834
+2647,1.2943738,80.05279
+2648,2.5491707,180.89108
+2649,3.1355855,197.25864
+2650,2.8862884,196.86346
+2651,2.53568,184.60074
+2652,2.7495942,182.50217
+2653,2.9327931,184.4617
+2654,4.150155,248.51591
+2655,3.5138793,234.22849
+2656,2.8352637,182.70374
+2657,2.0319695,122.92731
+2658,3.424533,227.65067
+2659,2.167294,114.28583
+2660,2.7283666,231.80194
+2661,2.763308,181.8269
+2662,2.5714307,174.36462
+2663,2.876041,202.45714
+2664,1.797049,115.51405
+2665,1.8301492,82.887085
+2666,1.4698511,88.841095
+2667,3.7591221,238.47159
+2668,2.3567693,135.13326
+2669,3.1603875,229.67302
+2670,1.6570237,93.15085
+2671,2.2996485,161.5219
+2672,2.3044322,178.2557
+2673,2.4312341,165.61896
+2674,2.000873,111.10979
+2675,3.1872208,225.05746
+2676,2.6078088,154.9896
+2677,2.3378015,172.8435
+2678,2.8777034,174.78442
+2679,1.9838195,106.87828
+2680,2.735336,230.71423
+2681,3.3063738,193.94379
+2682,2.0264926,96.425125
+2683,3.2139819,218.89093
+2684,3.3524423,221.09782
+2685,2.7185674,215.66867
+2686,1.7677215,85.49501
+2687,2.1452293,112.96591
+2688,3.0187602,187.7904
+2689,2.2771811,140.27388
+2690,2.9111793,189.9224
+2691,2.96444,186.27113
+2692,2.2129369,149.62212
+2693,3.4006045,242.12048
+2694,2.5332253,121.10415
+2695,3.1916404,210.74478
+2696,2.1348026,143.89902
+2697,3.702601,242.30035
+2698,2.492862,159.5279
+2699,3.0633018,206.30183
+2700,3.5358334,226.936
+2701,1.7292385,104.13309
+2702,1.9059808,87.808136
+2703,2.5799377,182.45705
+2704,2.743449,176.28781
+2705,2.4445043,174.35019
+2706,2.3803678,192.82915
+2707,2.4448256,169.45354
+2708,2.4318357,184.81575
+2709,2.034505,136.18512
+2710,4.7921286,253.66666
+2711,2.8909602,196.56923
+2712,2.5034337,111.07589
+2713,2.1113262,116.83148
+2714,2.1993952,161.66937
+2715,2.2637775,145.23883
+2716,1.6694047,103.022675
+2717,2.0922258,158.12321
+2718,2.5552535,147.56552
+2719,2.5518374,153.62442
+2720,3.465094,207.42865
+2721,1.3993763,96.88154
+2722,2.6576924,161.33514
+2723,3.0340781,214.35542
+2724,1.5945675,113.75864
+2725,2.385636,134.18192
+2726,1.7492718,92.651344
+2727,2.5728774,159.26892
+2728,3.5973704,237.124
+2729,3.7129655,242.0347
+2730,2.1579041,160.24261
+2731,2.2322402,102.94644
+2732,1.3744915,83.93269
+2733,2.2831025,121.02046
+2734,1.8892572,113.44494
+2735,3.4187586,221.54556
+2736,2.075798,97.2475
+2737,2.8177588,212.93283
+2738,1.836507,103.43239
+2739,2.5960317,133.12389
+2740,2.49804,134.16232
+2741,3.7506466,230.12863
+2742,1.9531759,105.5685
+2743,2.8013356,192.32115
+2744,1.9887279,90.19368
+2745,1.7967169,109.803894
+2746,1.8391759,112.7036
+2747,3.2350185,213.25993
+2748,1.9625874,87.32467
+2749,2.3545728,146.74976
+2750,2.7241683,183.31088
+2751,2.9682107,217.33658
+2752,2.255787,95.33246
+2753,1.818527,89.69536
+2754,2.8600001,194.35919
+2755,2.4894044,196.25348
+2756,3.0542026,226.04665
+2757,2.730716,218.0076
+2758,1.7451508,98.913864
+2759,2.629984,140.14542
+2760,1.7969505,91.526634
+2761,2.7463198,164.28369
+2762,2.0580356,107.60415
+2763,1.6297537,89.71472
+2764,3.1035562,232.1006
+2765,1.9954035,90.9504
+2766,2.5044096,164.9012
+2767,2.8072698,181.83575
+2768,1.2453113,67.86933
+2769,2.7198033,189.97995
+2770,1.403472,89.68046
+2771,2.0675795,132.8189
+2772,1.6954808,98.504234
+2773,2.7422473,185.36847
+2774,1.6956618,96.15271
+2775,3.2829766,214.22592
+2776,2.7242103,193.50607
+2777,1.8349118,83.30003
+2778,2.1597607,109.759026
+2779,2.182319,98.450356
+2780,2.876842,200.7371
+2781,1.8691685,85.227295
+2782,3.0229228,205.52791
+2783,2.3029141,170.08249
+2784,2.2327223,116.53444
+2785,2.4513812,137.97032
+2786,2.1834855,107.09572
+2787,2.1469712,147.34982
+2788,2.5380766,177.25447
+2789,2.6728842,172.70465
+2790,2.777474,152.21729
+2791,2.2707236,120.308304
+2792,1.981847,108.654976
+2793,2.2897668,143.20918
+2794,3.0809927,202.8089
+2795,2.825029,153.07642
+2796,3.4883344,223.6496
+2797,1.6981623,111.61405
+2798,3.8283474,246.60942
+2799,2.6383204,198.26697
+2800,2.1090977,96.6224
+2801,2.7843137,180.83278
+2802,2.8675666,173.96307
+2803,2.7526007,145.12631
+2804,2.137036,99.68024
+2805,1.2395074,76.769394
+2806,2.437079,153.90738
+2807,1.5295094,88.4423
+2808,1.9554279,91.03838
+2809,2.9628654,190.8551
+2810,1.966136,81.77319
+2811,2.0726707,107.34199
+2812,2.301965,177.65558
+2813,3.6777914,243.88838
+2814,2.0992007,121.4503
+2815,3.0410802,230.76152
+2816,1.4068077,85.52339
+2817,2.1731882,116.3469
+2818,2.0204024,113.43581
+2819,2.8647983,198.21149
+2820,1.989919,124.27821
+2821,2.2832127,121.881805
+2822,2.5447493,158.93114
+2823,2.2578163,178.81848
+2824,3.2751327,210.95236
+2825,2.4785838,172.46243
+2826,1.6547693,120.50279
+2827,2.012878,142.13017
+2828,2.0908048,103.63425
+2829,3.2791333,223.62521
+2830,2.4405487,135.95746
+2831,1.9914856,108.931274
+2832,2.1832385,113.21316
+2833,1.5215002,81.82225
+2834,2.749655,207.67839
+2835,2.2199156,127.8573
+2836,2.5894392,150.38245
+2837,3.0511057,187.218
+2838,2.0359406,139.5332
+2839,2.9061806,201.79184
+2840,1.9474319,162.47163
+2841,2.0669453,120.53101
+2842,3.0314722,197.8888
+2843,2.3610628,170.28795
+2844,2.1441529,131.47253
+2845,2.9632719,238.24965
+2846,2.9514232,190.90488
+2847,3.7924252,227.305
+2848,1.9704263,119.182045
+2849,2.329787,170.54214
+2850,3.5056512,240.25822
+2851,3.312756,197.17072
+2852,3.768521,246.6059
+2853,2.1984627,143.11937
+2854,2.5318844,192.84398
+2855,3.666552,247.74149
+2856,2.5944588,157.20505
+2857,1.9166234,110.698135
+2858,2.1472113,132.02237
+2859,2.0407925,99.6873
+2860,3.0145125,211.02242
+2861,2.2162492,128.00073
+2862,3.0985398,185.67542
+2863,2.705108,174.05615
+2864,1.8716859,83.489334
+2865,3.3150249,215.1643
+2866,3.0755794,177.66507
+2867,1.7714314,168.71176
+2868,3.1279793,219.44856
+2869,2.4816453,176.58118
+2870,2.5560658,153.76305
+2871,3.6791806,243.9986
+2872,1.9074975,109.74077
+2873,1.8286307,99.47121
+2874,3.078441,203.71886
+2875,1.7175683,85.38278
+2876,3.1314187,179.52777
+2877,2.119247,121.78029
+2878,3.0689363,191.82422
+2879,3.5261476,226.67645
+2880,2.4596906,121.75306
+2881,3.093515,206.52713
+2882,2.9656827,203.559
+2883,3.9134185,245.36447
+2884,1.9455688,114.46236
+2885,3.0250802,219.57845
+2886,1.8089797,93.957275
+2887,2.7868953,200.86961
+2888,2.008558,88.234505
+2889,2.2044742,181.36426
+2890,2.4802275,133.14479
+2891,3.4048417,239.3802
+2892,3.6283374,235.06166
+2893,1.8807929,99.74252
+2894,2.3272657,154.38777
+2895,2.2956111,149.46097
+2896,2.1713524,189.46678
+2897,1.7735481,118.22554
+2898,2.1430476,125.15376
+2899,2.2070723,130.78186
+2900,2.1028395,133.60666
+2901,2.300165,141.30698
+2902,2.8358207,153.82918
+2903,1.4089519,80.036385
+2904,2.3453457,143.14514
+2905,2.67867,154.3761
+2906,3.1622307,225.06989
+2907,2.3373947,126.46587
+2908,3.026356,209.04198
+2909,3.1226578,238.17601
+2910,2.47277,135.67873
+2911,3.024092,158.5362
+2912,4.413944,249.8782
+2913,2.104259,123.07034
+2914,2.3048763,135.8252
+2915,2.330194,128.64877
+2916,2.4630075,147.74722
+2917,2.3448882,141.24974
+2918,3.444439,225.38243
+2919,3.7184296,246.10802
+2920,1.6255772,122.605255
+2921,2.7509534,172.68
+2922,1.9819973,88.44062
+2923,2.3578427,141.61487
+2924,3.0674016,195.86722
+2925,2.2737212,142.78995
+2926,3.125402,222.5994
+2927,2.338842,172.43005
+2928,1.2799885,77.8021
+2929,1.4077291,75.57837
+2930,2.1328633,118.25556
+2931,2.1215081,144.46173
+2932,2.2131116,160.13898
+2933,3.000489,170.58952
+2934,2.4915826,151.95786
+2935,2.2148001,139.06122
+2936,3.1342785,215.82983
+2937,1.9734164,78.069855
+2938,2.417213,146.28577
+2939,3.2361948,196.16089
+2940,2.2095041,120.5974
+2941,1.6344467,88.72258
+2942,1.432422,96.55278
+2943,3.482199,235.05533
+2944,2.282708,152.97118
+2945,3.1325889,194.14352
+2946,3.1719613,222.90714
+2947,2.3890653,111.19482
+2948,3.18533,221.6062
+2949,2.340991,123.36789
+2950,2.2026975,98.25789
+2951,3.3618648,240.40793
+2952,3.0546288,189.30228
+2953,2.1296082,104.481445
+2954,2.0329738,137.04784
+2955,2.172357,125.539276
+2956,3.2067533,236.83072
+2957,1.8926332,100.258255
+2958,2.1358683,125.9795
+2959,2.7051687,174.67474
+2960,3.5846279,230.05267
+2961,2.6749833,166.18419
+2962,2.2730832,193.13481
+2963,2.4378097,186.09656
+2964,3.2366023,213.44319
+2965,2.1496673,112.215256
+2966,1.7921633,102.83006
+2967,4.050208,248.30777
+2968,2.7114747,187.99397
+2969,1.928252,123.208755
+2970,3.4656107,233.85136
+2971,1.9620609,97.8084
+2972,1.3878902,94.2612
+2973,1.2117139,85.63246
+2974,3.1186414,205.524
+2975,2.3042412,133.63528
+2976,1.6753519,81.84436
+2977,2.672554,187.32741
+2978,3.020781,214.79956
+2979,3.6725383,224.01392
+2980,2.5755517,216.20418
+2981,1.5810511,88.90546
+2982,2.98486,218.3151
+2983,3.5336833,234.89345
+2984,1.6447495,82.29634
+2985,3.3684845,226.5753
+2986,2.3736491,125.48483
+2987,2.527426,174.2441
+2988,2.1797707,168.2911
+2989,1.7622625,94.44149
+2990,1.8531772,121.78053
+2991,2.871515,210.73535
+2992,2.2528484,137.85764
+2993,1.3271649,90.32354
+2994,2.0121899,133.31915
+2995,2.7655518,185.92635
+2996,2.4016924,125.22303
+2997,2.4046836,122.65596
+2998,3.4593272,232.12772
+2999,1.4649346,84.67178
+3000,1.7089442,97.81559
+3001,1.7482915,123.08794
+3002,3.4248269,214.9759
+3003,2.8995001,152.03255
+3004,2.6166034,160.87405
+3005,1.8724985,107.21988
+3006,1.2935544,100.23868
+3007,2.3244832,151.54301
+3008,2.466565,134.12326
+3009,2.2596922,116.3798
+3010,2.7282238,193.43175
+3011,2.138819,145.08664
+3012,2.7249024,175.85138
+3013,2.5752487,157.00731
+3014,3.481323,232.60344
+3015,2.8210378,198.54967
+3016,2.7994149,192.97426
+3017,2.6992364,195.0231
+3018,1.9613771,117.52313
+3019,2.7539554,174.77158
+3020,3.446805,220.92712
+3021,1.7263994,96.45346
+3022,1.8718779,121.537735
+3023,1.9560354,104.98459
+3024,2.7294328,184.60628
+3025,3.000824,203.60048
+3026,2.821456,183.23936
+3027,2.2537675,158.13824
+3028,2.8918998,215.19063
+3029,1.6790359,96.37004
+3030,2.6260285,183.25723
+3031,2.5168595,174.23502
+3032,2.410214,134.54501
+3033,3.7908072,240.96059
+3034,2.0958884,139.75177
+3035,1.9998478,92.764626
+3036,2.7751412,181.71866
+3037,2.5823348,157.751
+3038,2.8932824,186.5531
+3039,3.9514294,247.05655
+3040,3.0306184,229.33382
+3041,1.9166957,127.49855
+3042,4.035105,248.98232
+3043,2.482047,160.71582
+3044,2.1537218,120.75032
+3045,2.3666015,140.96875
+3046,2.696692,172.66905
+3047,2.894449,200.289
+3048,1.6690444,95.36493
+3049,3.6247406,246.58101
+3050,2.3938308,142.73338
+3051,3.2165866,228.50778
+3052,1.999369,95.43834
+3053,2.162975,155.35211
+3054,2.4603097,176.36087
+3055,2.0862207,131.92148
+3056,3.0128045,196.19601
+3057,2.9912817,176.26012
+3058,2.7427921,147.06927
+3059,2.1036694,122.770935
+3060,1.8984885,87.183754
+3061,2.9671698,187.12442
+3062,3.4251027,215.89874
+3063,2.1967607,162.49934
+3064,2.1951752,126.70481
+3065,4.8955603,253.45999
+3066,2.5123897,169.62035
+3067,2.107438,99.44849
+3068,1.616281,100.9331
+3069,2.0548937,114.38307
+3070,2.5727363,180.86282
+3071,2.563105,165.59167
+3072,1.9141734,117.6966
+3073,1.6778266,89.61467
+3074,2.8101344,194.573
+3075,3.3070176,218.10811
+3076,2.2853444,144.61264
+3077,2.7608438,182.37885
+3078,2.8998406,202.8846
+3079,3.0937922,218.05481
+3080,2.4693146,158.69092
+3081,1.7850767,77.6698
+3082,2.6999242,188.2265
+3083,3.5571802,236.62868
+3084,3.0691257,224.8337
+3085,1.8625973,110.66318
+3086,3.7826056,242.86502
+3087,1.8707342,133.18045
+3088,3.178806,210.9531
+3089,2.0713987,150.5678
+3090,2.8593552,197.72754
+3091,2.2924159,119.576324
+3092,2.6325562,160.16623
+3093,2.7515922,184.88704
+3094,2.2775915,146.39642
+3095,1.8256019,92.96901
+3096,3.0316844,192.44424
+3097,2.3465645,170.77287
+3098,4.147357,249.52547
+3099,2.8941865,199.92447
+3100,2.0435,123.1482
+3101,1.8068266,87.92675
+3102,2.358248,161.82437
+3103,2.4831688,138.6174
+3104,1.9486512,121.416595
+3105,1.9135134,157.30981
+3106,2.5291598,180.08386
+3107,2.1121519,120.51497
+3108,4.2912307,250.46724
+3109,2.009521,98.351616
+3110,2.1146815,125.01843
+3111,3.7451606,208.04861
+3112,1.8502824,96.327545
+3113,1.8499014,109.842575
+3114,1.5871384,92.93518
+3115,1.2916081,82.92032
+3116,2.851407,212.61946
+3117,2.7589774,179.68951
+3118,2.2173219,156.04344
+3119,2.6025915,159.20374
+3120,2.9578202,237.47888
+3121,2.8108134,162.02625
+3122,2.438128,198.80545
+3123,2.4036036,154.48485
+3124,1.8470306,109.555664
+3125,1.9735869,111.417984
+3126,2.2968845,153.52536
+3127,2.648249,184.27057
+3128,2.1775222,145.54855
+3129,3.0920136,198.33788
+3130,1.7161677,86.20914
+3131,2.75299,221.375
+3132,1.9773233,118.01848
+3133,2.942767,202.47653
+3134,1.9864552,100.19571
+3135,2.1888175,157.37195
+3136,2.1318154,166.58109
+3137,1.857811,112.8547
+3138,2.1735497,140.81891
+3139,2.0806026,152.66565
+3140,3.578506,223.65417
+3141,2.641206,162.3624
+3142,2.1861808,127.75716
+3143,2.6318827,176.30052
+3144,2.6549299,174.5268
+3145,2.2978148,120.365814
+3146,2.3955579,175.02393
+3147,2.223647,152.65176
+3148,2.4021287,146.4464
+3149,2.5623846,187.69446
+3150,2.0708334,92.40561
+3151,1.7636751,107.80205
+3152,2.768959,134.71439
+3153,1.6624106,96.04066
+3154,2.7329192,149.41269
+3155,2.6315658,187.39462
+3156,2.900206,209.95728
+3157,2.2315843,128.95541
+3158,2.206926,167.92802
+3159,3.1682758,199.1096
+3160,3.0748646,214.61339
+3161,1.9404795,132.199
+3162,2.8178582,173.85043
+3163,2.1369584,123.697876
+3164,2.4429667,151.21724
+3165,2.7605553,163.54205
+3166,1.8365428,102.723724
+3167,3.2734332,220.61371
+3168,2.2599196,140.8027
+3169,3.3867114,223.69911
+3170,2.6030383,186.79611
+3171,3.9810295,248.05643
+3172,3.1375356,235.90204
+3173,2.685584,195.39684
+3174,2.6524146,156.54865
+3175,1.8706218,106.86708
+3176,2.1861002,140.29355
+3177,2.4736156,196.85915
+3178,1.5391301,77.61261
+3179,3.2815347,230.8787
+3180,1.8143581,93.52345
+3181,2.0953343,109.96571
+3182,2.6638997,161.85226
+3183,2.7636604,163.25726
+3184,2.5532665,171.83353
+3185,2.6579847,144.05106
+3186,2.8968368,204.99414
+3187,1.6258812,101.976105
+3188,3.0557961,174.40692
+3189,2.3987901,133.52884
+3190,2.5409834,127.49254
+3191,2.0527403,135.23453
+3192,2.3733165,126.03357
+3193,2.7203324,203.89066
+3194,2.0055416,92.78081
+3195,2.5776865,155.69382
+3196,3.8054264,245.02536
+3197,2.3640041,137.11911
+3198,2.4556308,145.56703
+3199,3.4068718,223.74344
+3200,1.710068,90.250496
+3201,1.7280314,92.99828
+3202,2.0901337,106.65072
+3203,3.2353816,233.68486
+3204,1.793589,94.70093
+3205,2.065292,112.8799
+3206,2.7521691,176.11185
+3207,2.099739,111.08119
+3208,1.8848332,114.38654
+3209,1.205203,73.98831
+3210,3.0590954,212.91862
+3211,2.2895474,158.94806
+3212,2.4227147,138.88477
+3213,3.0551214,193.33188
+3214,2.0199783,149.19838
+3215,1.6711462,90.760185
+3216,2.4430583,167.3923
+3217,3.409307,224.20047
+3218,2.052134,141.86105
+3219,3.0107248,217.86693
+3220,1.9659245,107.780174
+3221,3.5445845,244.75052
+3222,2.022122,108.10492
+3223,3.1196759,212.66101
+3224,1.6590565,97.1581
+3225,2.193877,119.96508
+3226,1.7079548,108.089134
+3227,2.2749226,126.91187
+3228,2.1860688,106.28813
+3229,2.33864,149.2419
+3230,3.1641998,230.13864
+3231,3.1486425,228.27046
+3232,3.1376674,221.63326
+3233,2.3661382,106.82483
+3234,3.0927782,195.3585
+3235,2.610295,197.38847
+3236,2.411382,125.91652
+3237,2.4597168,176.15045
+3238,2.8245184,183.53561
+3239,2.8700764,191.09775
+3240,2.914442,186.8198
+3241,1.5333433,76.86921
+3242,3.1042056,184.11024
+3243,1.6891999,109.46236
+3244,3.010654,183.09857
+3245,1.8635061,102.92732
+3246,2.3940988,159.7979
+3247,3.0635638,225.60507
+3248,1.6224643,93.8243
+3249,2.5338874,167.8627
+3250,2.639131,168.17496
+3251,1.911171,128.6709
+3252,1.7512542,115.65367
+3253,1.8105952,123.4507
+3254,3.5053308,237.99551
+3255,3.072416,213.19713
+3256,3.0110898,214.19312
+3257,2.532732,163.1756
+3258,2.4808004,180.15363
+3259,2.5761435,160.75548
+3260,2.211667,127.76756
+3261,2.4748783,181.18999
+3262,2.1390212,113.00423
+3263,2.5876832,193.13527
+3264,2.9776266,198.6552
+3265,2.159049,104.24661
+3266,3.5202289,225.12721
+3267,2.604594,172.45146
+3268,2.241487,126.61714
+3269,2.6931682,151.68724
+3270,1.5550147,76.68432
+3271,2.2674646,137.50656
+3272,2.2110112,199.37918
+3273,2.8372378,159.83636
+3274,3.1450584,218.00789
+3275,2.2637117,103.43494
+3276,2.0966172,97.466644
+3277,1.630299,90.49255
+3278,2.35658,142.70813
+3279,2.139733,156.03397
+3280,1.6915722,95.739716
+3281,3.330893,233.19092
+3282,1.9589067,128.65204
+3283,1.9241893,118.85474
+3284,2.2185347,106.91144
+3285,3.1461895,199.90334
+3286,3.6787038,234.62723
+3287,1.8066158,86.297005
+3288,2.5702581,196.21017
+3289,3.4412332,202.95407
+3290,2.605643,165.77211
+3291,2.0528944,130.95877
+3292,2.444428,199.22731
+3293,2.2218108,144.78433
+3294,2.9094522,151.93869
+3295,2.636701,177.98328
+3296,1.4830487,75.25252
+3297,2.812842,206.1062
+3298,3.254273,227.94058
+3299,2.3669996,173.55936
+3300,2.2825272,129.51614
+3301,2.5535865,165.56357
+3302,2.473833,143.03735
+3303,2.9978206,230.10484
+3304,2.2523942,140.5198
+3305,1.0255446,72.19818
+3306,2.9850593,198.84619
+3307,1.5333512,78.14752
+3308,2.4035528,160.84235
+3309,2.1369119,177.43677
+3310,2.9789596,161.47751
+3311,2.088284,122.26475
+3312,2.5672615,168.9739
+3313,1.9841666,153.19698
+3314,1.6623192,77.89774
+3315,2.7854648,203.74217
+3316,2.6514297,127.019394
+3317,2.2693124,171.39587
+3318,1.8065966,127.287315
+3319,2.7585833,117.545746
+3320,1.7685474,110.78032
+3321,2.6457782,145.26968
+3322,1.782892,111.42766
+3323,2.9175963,170.10571
+3324,4.5784254,253.20782
+3325,4.249083,252.0107
+3326,2.6341522,168.77542
+3327,3.0702865,199.4694
+3328,2.540843,160.32681
+3329,1.8700291,128.68013
+3330,1.8338339,89.15201
+3331,1.882684,136.62895
+3332,2.0938833,135.12613
+3333,2.045102,91.762825
+3334,2.7358575,190.22522
+3335,2.5936313,158.50635
+3336,2.0193584,123.280136
+3337,2.1366465,147.6326
+3338,4.5489774,253.16806
+3339,3.0224738,168.95676
+3340,2.2203193,168.0326
+3341,1.7057822,132.65082
+3342,3.0564466,215.7417
+3343,3.179454,204.67888
+3344,2.374482,207.48993
+3345,2.4202046,104.83821
+3346,2.391699,115.308014
+3347,3.967879,243.99753
+3348,2.8776143,190.02672
+3349,1.7709122,104.50908
+3350,2.3424065,130.69865
+3351,2.9399529,219.272
+3352,2.381106,146.13763
+3353,1.8730203,100.25077
+3354,2.4722714,172.96017
+3355,2.4161196,116.857086
+3356,3.8030288,239.13705
+3357,2.5578923,199.26059
+3358,2.7395835,176.95395
+3359,3.1996748,217.60432
+3360,2.4146268,130.48636
+3361,3.4561265,228.02048
+3362,3.696997,241.75653
+3363,2.8372052,186.95772
+3364,2.4180868,172.45595
+3365,2.7962909,188.17924
+3366,2.2792768,172.2449
+3367,2.2210407,110.511406
+3368,3.3052163,214.52966
+3369,2.5968118,181.26822
+3370,2.2783215,164.20245
+3371,2.034587,121.14466
+3372,2.3562818,142.63614
+3373,2.299569,142.46313
+3374,3.3154063,201.9182
+3375,3.3956106,225.44081
+3376,1.4799621,82.87272
+3377,3.0568235,164.3935
+3378,2.7208915,181.22754
+3379,2.316466,155.40488
+3380,3.688601,247.2309
+3381,2.1093845,108.4637
+3382,2.320633,145.59433
+3383,4.5162544,252.07193
+3384,1.9430541,114.75891
+3385,2.390364,136.89612
+3386,3.6168268,215.10965
+3387,2.8299284,183.07733
+3388,3.5672615,234.90547
+3389,2.207839,179.84668
+3390,1.9731333,109.58905
+3391,2.933512,208.09117
+3392,2.1482377,150.72993
+3393,2.215885,105.82001
+3394,3.4567282,233.88956
+3395,2.4092832,192.7884
+3396,2.1133294,116.72991
+3397,3.5612173,238.60641
+3398,1.5347111,81.24629
+3399,2.24054,165.56155
+3400,2.5583792,168.58572
+3401,1.7769485,132.46991
+3402,2.5067713,154.88419
+3403,2.4526172,173.05725
+3404,1.7584846,99.40292
+3405,1.912313,115.63089
+3406,3.3853455,238.34102
+3407,1.3700577,75.380936
+3408,3.0124898,211.96764
+3409,2.1345077,149.42511
+3410,2.101604,151.42139
+3411,2.0038624,110.9371
+3412,3.005173,193.87984
+3413,3.8700104,248.98065
+3414,1.8435707,106.36879
+3415,3.1066887,193.93134
+3416,3.2287128,177.19644
+3417,2.2373729,143.33054
+3418,3.904271,248.7679
+3419,2.173841,122.410324
+3420,3.0767817,178.9599
+3421,3.0316224,193.00418
+3422,2.7696295,204.84702
+3423,2.9162378,180.71802
+3424,3.002286,237.61133
+3425,1.5773447,75.15181
+3426,2.5448647,174.89087
+3427,1.8235186,109.87506
+3428,3.1390808,193.45198
+3429,2.6717272,155.16592
+3430,2.35511,128.04417
+3431,2.726302,195.96289
+3432,1.6729742,84.37312
+3433,2.2454028,146.66121
+3434,2.9030962,227.88313
+3435,1.6928637,91.59764
+3436,2.9593062,218.94284
+3437,2.080584,101.64468
+3438,2.2971983,147.11636
+3439,1.4015198,70.43074
+3440,2.1108365,119.86696
+3441,2.192182,123.27988
+3442,2.4296212,149.4531
+3443,1.9722643,98.58125
+3444,2.0857296,95.50679
+3445,1.8277142,110.43912
+3446,2.3594708,145.94345
+3447,2.6421123,194.60324
+3448,3.3415387,221.05373
+3449,2.0634296,99.13064
+3450,3.221062,231.55057
+3451,2.2178,136.74869
+3452,2.0260658,140.57709
+3453,2.1573887,129.7929
+3454,2.7323344,179.43259
+3455,1.340072,77.6175
+3456,1.6671519,102.65481
+3457,1.6823839,85.79865
+3458,2.401218,124.058334
+3459,2.7661362,183.0516
+3460,2.3812828,129.1837
+3461,3.4419456,229.73912
+3462,3.3166454,230.34407
+3463,1.8221443,99.09424
+3464,3.327175,232.72307
+3465,1.9577533,127.725555
+3466,2.2539935,168.27255
+3467,1.5621253,74.854805
+3468,1.7824633,84.23068
+3469,3.1243947,211.27798
+3470,1.7809174,87.74649
+3471,2.386847,150.60587
+3472,2.5851028,98.72741
+3473,2.6521056,174.33368
+3474,1.8902938,113.40999
+3475,2.9185007,162.407
+3476,2.717112,195.66382
+3477,2.1377528,153.42831
+3478,1.8762205,94.50025
+3479,2.9581218,211.46791
+3480,2.395026,157.216
+3481,1.9459736,123.203186
+3482,2.087935,113.62309
+3483,2.5681424,162.53651
+3484,2.4982917,163.3778
+3485,2.5094266,175.33617
+3486,1.950737,154.95557
+3487,2.8127956,185.24352
+3488,1.7312682,84.75473
+3489,3.3067584,215.64458
+3490,2.3536167,145.19438
+3491,1.96748,146.19156
+3492,2.033023,101.35125
+3493,2.044481,103.18448
+3494,3.4097211,245.23434
+3495,2.937133,198.8012
+3496,1.883016,120.89226
+3497,2.5701723,157.55374
+3498,3.1795485,204.23413
+3499,3.3302922,192.59798
+3500,2.540556,183.35051
+3501,2.860502,217.84572
+3502,2.264026,135.12558
+3503,1.8435166,98.21688
+3504,3.1782835,221.84087
+3505,2.1835494,170.36032
+3506,3.2615075,217.89941
+3507,2.5098848,162.3031
+3508,1.7952415,131.59283
+3509,3.2023063,182.10928
+3510,2.4358654,183.12802
+3511,1.9676178,77.25083
+3512,3.279611,238.83527
+3513,1.6666238,126.622986
+3514,3.367669,220.82405
+3515,2.2001948,137.5859
+3516,2.8062527,178.49388
+3517,2.5693462,178.33289
+3518,2.455708,141.81738
+3519,2.2738433,154.76115
+3520,1.9193332,108.08004
+3521,2.7983737,175.6889
+3522,3.24108,232.02513
+3523,2.054185,94.74042
+3524,1.4010494,92.32197
+3525,2.1860025,115.150955
+3526,2.9067132,174.5058
+3527,1.9229553,105.95171
+3528,2.3702035,137.62543
+3529,3.6970942,237.34485
+3530,3.127462,233.69348
+3531,1.5816518,90.277374
+3532,2.3852615,132.60162
+3533,2.2286804,156.9223
+3534,2.0589933,119.35658
+3535,2.3549416,118.5107
+3536,1.8627902,84.85721
+3537,2.1345458,112.57734
+3538,1.6884243,119.00079
+3539,4.083499,251.22656
+3540,2.128566,135.4764
+3541,2.804009,211.64346
+3542,1.7864298,95.015594
+3543,1.7782962,104.45581
+3544,2.961208,192.96577
+3545,2.538488,177.06552
+3546,2.5005183,123.16075
+3547,2.3382192,123.04207
+3548,2.2841926,111.04289
+3549,2.4573507,157.58981
+3550,1.5072176,85.0181
+3551,2.4993978,146.42862
+3552,2.6137729,159.29747
+3553,2.601142,156.99908
+3554,2.5941467,151.96793
+3555,3.0361464,199.98117
+3556,2.9940898,226.59793
+3557,2.1565385,147.97266
+3558,1.9941645,91.00407
+3559,2.314981,127.449615
+3560,3.033719,199.0946
+3561,2.5641985,127.1544
+3562,3.3034701,237.01001
+3563,1.6601326,107.89888
+3564,3.013747,218.85864
+3565,2.4518533,134.5466
+3566,1.5515728,83.45962
+3567,3.0532205,210.7034
+3568,1.5945272,90.720345
+3569,1.5011463,93.46988
+3570,2.484693,164.63647
+3571,2.182467,87.28871
+3572,2.1752486,151.08105
+3573,2.022248,128.22772
+3574,2.2846954,138.3039
+3575,1.6641284,84.4389
+3576,2.6491778,198.3877
+3577,2.5711694,154.14682
+3578,2.0878046,114.384674
+3579,2.642013,161.2136
+3580,2.805861,139.93652
+3581,2.7450268,186.69952
+3582,1.5678483,82.224884
+3583,1.933632,101.99013
+3584,3.0332043,206.54167
+3585,2.4416945,172.7229
+3586,2.5959067,175.92786
+3587,2.907708,190.67407
+3588,2.3064313,192.14186
+3589,3.4523094,221.24394
+3590,2.0403893,95.234146
+3591,1.5686828,109.18498
+3592,1.7361461,100.20688
+3593,2.6186922,174.2214
+3594,2.7101283,164.22723
+3595,2.671577,177.0185
+3596,2.3709953,187.59668
+3597,2.4153633,119.145004
+3598,2.3688204,143.49713
+3599,1.8904505,102.126434
+3600,2.061328,119.57499
+3601,2.1940267,94.34864
+3602,2.6061592,143.52429
+3603,3.9336014,248.21619
+3604,2.7963915,214.82526
+3605,2.5041795,172.21838
+3606,2.0200825,153.36746
+3607,2.6161501,139.15208
+3608,2.7195735,197.17204
+3609,1.6171753,127.263016
+3610,2.093045,113.321365
+3611,2.173415,142.6503
+3612,1.9587437,121.76072
+3613,2.6134694,121.97605
+3614,1.8981435,100.14876
+3615,3.3996055,233.67207
+3616,1.3444191,90.10403
+3617,1.6682451,84.50119
+3618,2.744017,217.54701
+3619,3.062462,193.7137
+3620,3.1853547,212.18297
+3621,2.404606,160.19312
+3622,1.2814516,73.06241
+3623,1.8842076,101.73683
+3624,1.7102163,114.567825
+3625,2.2953742,136.21216
+3626,2.351444,183.2191
+3627,1.7662313,122.97954
+3628,3.147904,189.99536
+3629,2.5672336,180.21353
+3630,3.274332,233.53755
+3631,2.0367856,114.09241
+3632,2.1790352,132.41724
+3633,2.5560663,102.32036
+3634,3.0176063,220.57968
+3635,2.1080227,106.76587
+3636,1.9003237,133.22644
+3637,3.2181792,225.72269
+3638,2.4686904,207.85616
+3639,2.9398623,194.78006
+3640,3.2643182,220.55489
+3641,4.398507,248.4679
+3642,2.136037,146.37163
+3643,3.4000893,234.17809
+3644,2.1441216,110.72127
+3645,2.2636366,103.879364
+3646,2.090468,125.05313
+3647,3.5881162,242.6983
+3648,2.2125192,108.16871
+3649,2.0790825,155.17938
+3650,2.655381,183.69089
+3651,2.0658,149.18073
+3652,2.864351,184.1067
+3653,2.0873706,109.63272
+3654,2.895175,171.03311
+3655,1.9286165,107.43864
+3656,2.1709394,165.05276
+3657,2.5395207,179.19318
+3658,2.3406157,159.6399
+3659,2.378883,112.03604
+3660,2.300916,138.28024
+3661,1.8952091,101.355034
+3662,1.8554107,114.416595
+3663,2.5613246,205.43878
+3664,2.4255557,155.18484
+3665,2.3869948,141.55301
+3666,1.5010397,81.10744
+3667,2.5141556,119.67508
+3668,2.9019663,216.0966
+3669,3.1152186,206.81732
+3670,2.1144488,117.782524
+3671,2.8588946,219.98155
+3672,2.2737017,143.28621
+3673,3.3467631,241.70563
+3674,2.467811,174.51424
+3675,2.3303182,159.02133
+3676,2.3430495,139.01697
+3677,2.8547397,226.51376
+3678,2.8605475,156.5868
+3679,1.5543363,87.39888
+3680,2.6753101,148.79935
+3681,3.4667323,229.36784
+3682,2.812624,178.2526
+3683,2.033574,152.07516
+3684,2.173019,130.70123
+3685,2.54102,136.55966
+3686,2.8927293,187.22491
+3687,1.6551837,88.89851
+3688,2.676675,152.96225
+3689,2.8259795,180.4673
+3690,3.5764568,246.91583
+3691,2.909586,198.92847
+3692,2.9209294,212.21846
+3693,2.7175002,150.44263
+3694,3.1745534,234.37617
+3695,2.0811558,109.33966
+3696,2.3811016,119.43228
+3697,2.8939319,197.2149
+3698,2.0628996,103.74336
+3699,1.813998,98.058876
+3700,2.653725,168.3378
+3701,2.8073516,205.59525
+3702,1.9855268,135.07318
+3703,1.6040679,88.76848
+3704,2.1488383,136.45349
+3705,2.6446328,173.46475
+3706,2.187077,169.37642
+3707,1.1464443,82.04785
+3708,3.3821023,234.96042
+3709,2.3323956,176.42657
+3710,3.0067945,190.80898
+3711,1.8125,104.06445
+3712,2.1552725,158.18118
+3713,2.2067542,153.36456
+3714,3.2194297,207.39223
+3715,2.2561972,124.869385
+3716,1.9376161,74.81394
+3717,2.3045237,139.76273
+3718,2.5530946,118.63014
+3719,3.3510013,223.37317
+3720,2.9570544,173.1553
+3721,2.4166307,167.72363
+3722,2.104048,170.96172
+3723,2.8218472,192.04033
+3724,3.0676148,200.86366
+3725,3.8178482,229.70236
+3726,1.4224654,88.67102
+3727,1.5338846,87.54872
+3728,2.3600175,176.9927
+3729,1.4833359,81.49779
+3730,1.6468247,92.679504
+3731,2.399616,150.43828
+3732,1.903567,131.5376
+3733,2.4860482,130.96683
+3734,1.9732177,139.08049
+3735,4.1033163,237.97197
+3736,2.217369,93.41345
+3737,2.3709211,142.32239
+3738,1.9252542,107.11406
+3739,2.1651947,104.384155
+3740,1.5609233,87.38355
+3741,3.216484,229.1129
+3742,2.135111,124.611465
+3743,2.6708484,167.92883
+3744,3.1735864,226.6377
+3745,2.418881,146.12227
+3746,2.7701197,196.27428
+3747,2.4693973,130.29572
+3748,2.0639338,118.127106
+3749,3.5109007,224.69437
+3750,2.0379448,95.55531
+3751,2.274012,108.08562
+3752,2.3422103,193.66519
+3753,2.2487955,189.85419
+3754,1.9444422,92.86828
+3755,2.3200228,143.36923
+3756,2.0779674,124.37639
+3757,2.558815,148.3581
+3758,2.4397032,143.04477
+3759,3.1292846,187.56265
+3760,2.74299,203.19778
+3761,2.2519662,120.896545
+3762,1.6486323,114.57742
+3763,2.3362646,167.26332
+3764,2.7037516,192.45477
+3765,3.181839,212.57881
+3766,2.9698167,238.80696
+3767,1.7306924,103.26541
+3768,2.2571182,180.27296
+3769,2.2793536,163.03613
+3770,2.9999132,209.99506
+3771,2.2879586,107.91638
+3772,2.8405528,204.63513
+3773,1.8604941,132.95757
+3774,1.898633,95.01621
+3775,2.0485082,133.10263
+3776,2.9303927,196.69646
+3777,2.6564057,154.15047
+3778,3.1338012,187.33673
+3779,3.2520714,237.15363
+3780,2.0105534,113.089264
+3781,2.002937,105.56662
+3782,3.4712644,233.1231
+3783,2.9665477,223.0966
+3784,1.8883047,97.71489
+3785,3.7656198,244.09503
+3786,1.6157047,99.97588
+3787,1.844499,84.9312
+3788,2.4978728,168.62888
+3789,1.7837596,140.28857
+3790,2.4943662,154.0914
+3791,3.3582075,185.55942
+3792,2.737527,167.05481
+3793,2.8951616,187.52115
+3794,2.1574883,155.1254
+3795,2.3158932,160.35324
+3796,2.3962922,133.74088
+3797,3.0325239,180.66696
+3798,2.9613063,190.33585
+3799,2.4603844,149.13495
+3800,2.4883294,165.97195
+3801,2.2916603,107.59523
+3802,4.04765,250.418
+3803,2.399238,157.32558
+3804,3.4414358,234.82387
+3805,2.9841378,231.9594
+3806,2.678013,121.002556
+3807,2.836485,169.67319
+3808,1.5966927,85.38184
+3809,2.2064013,136.20844
+3810,1.5948241,87.37879
+3811,2.1061502,100.54283
+3812,3.0900128,216.94275
+3813,2.3332846,170.93024
+3814,2.7745206,174.57788
+3815,2.1148295,108.66069
+3816,1.557869,85.5694
+3817,2.9551368,188.57816
+3818,2.44306,177.32086
+3819,3.2296896,217.99463
+3820,1.8171675,115.47464
+3821,2.8008416,190.83145
+3822,3.0282514,187.50488
+3823,2.4988837,172.55055
+3824,2.7116144,145.59198
+3825,2.1433444,129.85205
+3826,2.464279,108.14505
+3827,1.9193143,119.368904
+3828,2.4759731,130.4596
+3829,3.1602716,217.30853
+3830,2.2071111,126.01682
+3831,2.7820857,178.72981
+3832,2.9915457,222.18289
+3833,2.6669147,219.56093
+3834,4.0172043,248.71188
+3835,2.531905,164.33862
+3836,2.389104,117.48131
+3837,2.7832828,183.45206
+3838,2.087677,129.74487
+3839,3.699017,228.42766
+3840,3.0434346,201.61563
+3841,1.921319,145.73816
+3842,2.8220477,231.1876
+3843,1.8267564,101.23972
+3844,1.7193651,102.52965
+3845,2.2169244,136.04947
+3846,2.19339,114.06509
+3847,2.4605334,196.70105
+3848,2.780426,183.75906
+3849,2.4027057,160.20465
+3850,1.925803,79.4917
+3851,2.546782,156.18835
+3852,2.2823393,121.612564
+3853,1.732731,100.07211
+3854,2.9348662,178.7898
+3855,4.044505,238.25551
+3856,2.1127808,164.57843
+3857,1.3425847,74.57379
+3858,2.7108665,128.16013
+3859,3.1688955,217.34186
+3860,2.1123924,133.57901
+3861,2.4823923,163.21191
+3862,4.0662394,249.70294
+3863,2.5881262,120.58332
+3864,3.0730119,220.42174
+3865,2.3801608,152.4289
+3866,1.872746,93.30229
+3867,2.4627614,153.68146
+3868,2.26675,131.13464
+3869,2.6360385,194.61957
+3870,1.446852,88.175415
+3871,2.7097433,212.64188
+3872,2.7033658,215.271
+3873,2.6528182,138.25095
+3874,2.734838,168.24515
+3875,2.473676,165.81558
+3876,2.726885,177.88623
+3877,1.770554,98.979645
+3878,2.7442367,156.07529
+3879,3.0054379,151.21527
+3880,2.6802857,190.96298
+3881,2.238372,126.05243
+3882,2.274282,142.08978
+3883,3.0334456,205.41788
+3884,2.3273802,166.34189
+3885,2.9352303,197.08093
+3886,3.149283,203.19565
+3887,2.2465992,146.31898
+3888,2.4127643,172.89911
+3889,1.9150579,98.26828
+3890,2.116345,110.7577
+3891,2.0662675,154.55392
+3892,1.1530418,75.55457
+3893,2.754789,190.41602
+3894,2.3120039,126.02808
+3895,3.04911,197.81233
+3896,2.0902328,99.34955
+3897,2.9691613,228.2818
+3898,2.2523608,163.34903
+3899,1.7421616,90.97015
+3900,2.6589227,166.4212
+3901,2.0968568,145.67671
+3902,3.361095,197.525
+3903,3.3393035,230.95634
+3904,3.886612,239.60818
+3905,3.8434448,239.9045
+3906,3.1564896,203.54117
+3907,2.7152772,204.15329
+3908,1.9882734,123.90398
+3909,1.8786485,95.44388
+3910,2.0912285,172.60727
+3911,2.463071,161.00153
+3912,1.6583374,84.94782
+3913,2.0930338,124.211784
+3914,2.5384965,148.60432
+3915,3.2731528,214.00558
+3916,2.967639,179.97212
+3917,2.3590367,175.47702
+3918,1.8786714,109.48216
+3919,2.1489882,133.15448
+3920,2.187634,157.3988
+3921,1.87163,100.539246
+3922,4.075439,249.8684
+3923,3.9902241,240.294
+3924,1.5113374,82.429115
+3925,2.409967,127.01526
+3926,3.3640254,232.13815
+3927,3.2658014,228.31749
+3928,3.100113,206.00774
+3929,2.77546,178.60684
+3930,2.5952077,173.65485
+3931,2.256928,107.50012
+3932,1.4827304,93.503395
+3933,1.9237928,118.90982
+3934,2.081394,139.6131
+3935,3.8311696,239.55965
+3936,2.649184,165.53821
+3937,2.63464,144.90167
+3938,1.9066696,100.543846
+3939,2.022678,109.58685
+3940,2.0471249,109.92314
+3941,2.4658906,152.40005
+3942,1.9908031,135.64902
+3943,2.9154434,190.44202
+3944,2.6122396,189.7717
+3945,1.1628969,78.87192
+3946,2.225953,93.14499
+3947,2.258349,128.81381
+3948,3.3631368,217.79878
+3949,2.486278,172.28543
+3950,1.8206011,109.77094
+3951,2.6820264,164.32306
+3952,1.8136357,103.304695
+3953,1.8428519,98.133194
+3954,1.9916787,104.699524
+3955,3.4415572,239.07889
+3956,1.4308867,96.83565
+3957,1.8573055,96.12631
+3958,3.4226422,220.33633
+3959,2.1013837,138.7211
+3960,2.07967,112.654724
+3961,2.3333597,117.72026
+3962,1.9617629,157.80211
+3963,3.1513207,212.81203
+3964,2.1211433,125.355995
+3965,2.2307918,149.25417
+3966,2.606371,167.19852
+3967,2.6169932,170.11237
+3968,3.1251101,220.4791
+3969,1.9789623,94.358574
+3970,3.8242962,238.46721
+3971,2.11536,129.34549
+3972,3.5083337,212.41673
+3973,2.2035475,158.78284
+3974,2.3330135,144.16272
+3975,2.457643,120.315384
+3976,2.5931687,165.40611
+3977,2.100555,119.808136
+3978,2.015414,103.82282
+3979,1.7858725,93.50904
+3980,2.457893,180.01382
+3981,1.2926733,84.76035
+3982,2.7705507,215.10086
+3983,3.0246127,168.2857
+3984,1.8016481,92.770424
+3985,2.6059985,181.94412
+3986,1.7571466,82.11109
+3987,2.6656775,190.82404
+3988,2.77172,207.63042
+3989,2.130571,133.85141
+3990,2.460643,160.22647
+3991,2.93902,200.00243
+3992,1.621207,82.28519
+3993,3.1967463,200.46484
+3994,4.4562283,250.3868
+3995,2.0212908,92.642334
+3996,2.1968043,167.94696
+3997,2.0528164,111.23443
+3998,1.5675445,96.24335
+3999,2.314316,134.45676
+4000,2.1220806,94.7044
+4001,1.4274331,77.62516
+4002,3.0700393,199.63942
+4003,2.5561275,166.71858
+4004,4.023515,248.64198
+4005,2.8994482,209.05298
+4006,2.890576,215.29568
+4007,2.6563876,133.21112
+4008,2.926836,205.76392
+4009,2.7187047,212.44133
+4010,2.1840649,159.8964
+4011,2.2889903,150.58804
+4012,2.6675317,169.5128
+4013,1.6187818,99.379105
+4014,2.6888285,168.97449
+4015,1.1767544,88.872856
+4016,2.4561095,120.50059
+4017,1.8110445,94.20943
+4018,2.410838,146.57504
+4019,3.8434422,242.4028
+4020,2.5705638,124.530334
+4021,1.8262899,87.28818
+4022,2.055316,97.126144
+4023,3.217987,217.10056
+4024,3.0689282,203.69566
+4025,1.7363877,100.799866
+4026,2.0914812,132.99812
+4027,2.9817748,186.53961
+4028,1.7051345,127.18952
+4029,2.5316093,137.69432
+4030,1.7025999,84.9471
+4031,2.9236028,157.96724
+4032,2.7383637,193.49391
+4033,1.9858809,117.870926
+4034,3.3135123,228.27971
+4035,1.7938921,90.246
+4036,2.880926,213.42859
+4037,2.4041011,144.94537
+4038,2.56988,148.96326
+4039,3.4412165,233.16069
+4040,1.8983829,102.394684
+4041,2.6401553,185.73926
+4042,2.4180088,149.76346
+4043,2.2920375,158.43936
+4044,3.532384,236.1846
+4045,3.927142,246.40256
+4046,4.116599,241.78423
+4047,3.2157798,228.85999
+4048,1.5437014,101.99785
+4049,2.645344,211.61845
+4050,3.0773766,219.38992
+4051,2.1320632,188.06891
+4052,1.5262122,88.060585
+4053,3.2946088,242.54109
+4054,1.3528664,113.97089
+4055,2.155577,106.9828
+4056,2.2836108,116.19652
+4057,2.1952565,151.41278
+4058,2.81418,191.27304
+4059,3.0594745,223.6279
+4060,1.4222988,83.93866
+4061,1.8782896,84.382965
+4062,2.6111748,198.3553
+4063,2.2016137,103.52181
+4064,2.5940626,144.49751
+4065,2.0312865,125.95764
+4066,2.1115887,169.19635
+4067,1.3805984,74.863914
+4068,3.3987768,232.44382
+4069,1.7496314,95.42906
+4070,4.8588924,252.8762
+4071,3.018412,207.48378
+4072,3.3333569,229.15262
+4073,3.5678046,245.50221
+4074,2.6789596,163.28592
+4075,2.9764237,167.52197
+4076,2.304005,131.84427
+4077,3.146975,227.55782
+4078,1.6083606,87.879555
+4079,2.815178,176.20175
+4080,3.495257,234.55814
+4081,1.5393684,107.41841
+4082,3.7403045,239.37675
+4083,2.8375673,198.97707
+4084,1.7819203,93.04221
+4085,2.8477118,207.97621
+4086,2.1415095,141.00908
+4087,2.8665173,203.49811
+4088,3.5482123,245.4401
+4089,1.671951,114.11797
+4090,2.3133502,117.82355
+4091,3.132388,212.36543
+4092,3.366358,245.19713
+4093,1.910116,92.51121
+4094,1.4997826,81.12221
+4095,2.999065,186.72552
+4096,2.7547832,154.1972
+4097,2.5699067,173.87422
+4098,4.379852,252.99194
+4099,2.230578,124.056625
+4100,1.7967212,89.026596
+4101,2.07018,134.96762
+4102,2.370342,116.7061
+4103,3.0046608,207.94272
+4104,3.1622221,231.39677
+4105,2.905104,202.3507
+4106,2.3613875,144.17859
+4107,3.2191112,221.21858
+4108,1.7267796,79.19987
+4109,2.179936,149.88322
+4110,2.724779,173.70682
+4111,2.6040874,159.15846
+4112,1.6018589,79.492516
+4113,3.5108292,243.45135
+4114,1.9111028,118.47583
+4115,1.4431257,74.990364
+4116,2.185245,135.37045
+4117,1.828662,103.85582
+4118,1.4703882,73.86268
+4119,3.344708,222.97478
+4120,2.8928034,222.52821
+4121,2.5536141,154.35349
+4122,1.9272592,87.76256
+4123,2.2710357,152.98772
+4124,3.6605525,238.3342
+4125,2.145702,113.08344
+4126,2.7165372,175.59216
+4127,1.6787846,104.17187
+4128,2.1272058,134.74667
+4129,3.325054,235.25851
+4130,3.201071,222.24347
+4131,1.5706661,83.64482
+4132,2.656116,170.19754
+4133,1.8927907,111.34819
+4134,1.5057404,78.27649
+4135,2.8470626,201.54922
+4136,3.119046,205.57292
+4137,2.7179396,151.06529
+4138,3.7236717,232.36374
+4139,2.3261275,118.43498
+4140,2.193146,114.124405
+4141,2.7068756,204.27908
+4142,2.1916614,150.32387
+4143,2.108655,94.66217
+4144,2.6031084,190.79187
+4145,1.6974084,84.55554
+4146,3.4633389,214.51413
+4147,3.7062507,243.1192
+4148,2.1427958,107.414444
+4149,2.299479,162.45078
+4150,2.0690327,124.978134
+4151,2.1170309,179.29034
+4152,2.3866274,171.58803
+4153,2.4645429,178.04984
+4154,3.3085237,217.20473
+4155,2.7661517,166.12401
+4156,2.484538,149.94644
+4157,1.8254125,116.91533
+4158,2.226248,183.53851
+4159,2.4406896,136.97537
+4160,1.9193387,99.986084
+4161,1.4007753,87.286736
+4162,2.182409,111.5552
+4163,3.2915816,223.3766
+4164,1.8757702,93.30235
+4165,2.815764,176.03784
+4166,1.7129996,82.6959
+4167,3.3364494,224.65875
+4168,3.2300062,231.10172
+4169,2.464782,142.27719
+4170,2.8397892,184.0278
+4171,2.7885165,203.94595
+4172,1.8276743,96.32022
+4173,2.3027797,136.10297
+4174,2.097568,116.825806
+4175,1.7952793,99.94077
+4176,2.587422,190.197
+4177,2.8171933,156.96317
+4178,4.120992,246.35555
+4179,2.9915373,221.69452
+4180,2.4806106,188.7839
+4181,2.1992478,117.498985
+4182,3.1624904,227.97598
+4183,3.294823,228.65521
+4184,2.7282329,223.74622
+4185,2.4879591,187.26913
+4186,2.135248,111.43685
+4187,1.9217137,112.39288
+4188,1.8037587,95.65875
+4189,2.060518,139.34
+4190,2.0698938,116.665436
+4191,1.3566642,83.673836
+4192,3.3321643,194.20131
+4193,2.4155345,185.54822
+4194,3.8709254,245.49486
+4195,1.3608203,81.759384
+4196,2.1304321,116.34789
+4197,2.4316065,166.83589
+4198,2.5437586,169.69463
+4199,2.8025057,180.82327
+4200,2.7091136,192.92004
+4201,2.2149007,126.65497
+4202,2.6383867,181.29947
+4203,2.3075373,138.11316
+4204,2.4264302,154.59311
+4205,2.7037296,183.68796
+4206,1.7001721,106.94165
+4207,2.6195884,172.34521
+4208,3.104963,210.35257
+4209,2.2616634,148.99236
+4210,1.9391444,100.81752
+4211,2.5871427,184.04138
+4212,2.2722287,133.43547
+4213,4.126478,244.11049
+4214,1.9147775,92.67541
+4215,3.2233071,190.41896
+4216,2.852974,187.28967
+4217,2.0420954,145.18735
+4218,2.0446935,115.30359
+4219,2.0546055,100.29608
+4220,2.5733054,180.04254
+4221,1.7952162,98.33946
+4222,1.9164164,129.84921
+4223,1.9997302,96.76689
+4224,1.8646182,83.70332
+4225,3.3237636,229.51495
+4226,2.0499842,122.143265
+4227,2.9841082,194.71135
+4228,2.4210668,158.73044
+4229,1.334077,82.02132
+4230,1.9613385,111.57591
+4231,2.8899932,201.5151
+4232,2.124715,126.55983
+4233,1.57472,79.159485
+4234,1.6879017,89.66056
+4235,2.6680002,183.05823
+4236,1.548291,71.77466
+4237,1.8873513,99.74164
+4238,1.5527484,94.10704
+4239,2.0433948,105.13377
+4240,1.9551469,75.71862
+4241,2.1265159,182.66965
+4242,1.4469765,93.79622
+4243,3.2188644,226.86229
+4244,2.4045033,144.47629
+4245,2.3836122,131.55574
+4246,1.5094886,88.727585
+4247,2.0557532,129.40836
+4248,2.8471818,162.956
+4249,2.5292008,179.22531
+4250,1.9421713,90.85299
+4251,1.3106284,78.38758
+4252,2.5759997,194.17136
+4253,2.476216,181.48526
+4254,2.6772714,221.59006
+4255,2.5583365,158.24837
+4256,2.5896525,137.10718
+4257,2.02675,111.863495
+4258,2.1915257,120.7903
+4259,2.6526527,139.48306
+4260,2.4453223,158.09273
+4261,2.9807658,216.02145
+4262,1.9303215,105.72954
+4263,2.6136134,160.49602
+4264,2.3011448,159.0274
+4265,2.4418285,110.43758
+4266,2.4406383,152.32588
+4267,1.9413427,96.86304
+4268,3.1451125,227.19807
+4269,2.2873778,149.74945
+4270,3.574106,238.1956
+4271,3.384123,234.36072
+4272,1.6028968,92.18431
+4273,3.146797,197.59152
+4274,1.2418731,89.86974
+4275,2.2611415,158.91138
+4276,1.6230217,79.82641
+4277,1.8477517,86.45551
+4278,1.5343229,114.5075
+4279,2.3784091,146.32645
+4280,2.2532868,132.37979
+4281,2.3716786,131.39041
+4282,1.5194994,75.81701
+4283,2.1062655,92.39194
+4284,3.2584743,187.9122
+4285,3.0199351,217.71518
+4286,2.0131621,123.07178
+4287,2.3320518,158.75436
+4288,2.0757732,112.69237
+4289,2.8913085,197.32317
+4290,3.019669,197.1125
+4291,3.3731806,201.89221
+4292,2.9766839,193.82446
+4293,2.5483377,140.66261
+4294,1.956031,171.18619
+4295,2.4453745,177.49466
+4296,2.8911312,210.86714
+4297,2.4290638,119.977646
+4298,1.3478116,80.17006
+4299,1.8182738,125.19876
+4300,2.1870782,122.57415
+4301,3.045924,214.36536
+4302,2.6720707,179.31874
+4303,1.9214953,93.8695
+4304,2.811133,188.27551
+4305,2.4841952,151.75424
+4306,2.1987357,169.79056
+4307,2.2751992,126.403885
+4308,2.511723,168.875
+4309,2.4265637,140.28528
+4310,2.463245,153.38174
+4311,2.8129773,181.755
+4312,2.213606,116.960915
+4313,2.881492,189.17902
+4314,2.2609963,139.08899
+4315,1.41269,83.94302
+4316,2.9817657,222.7434
+4317,2.2589848,161.59369
+4318,2.6523452,181.0665
+4319,2.3927417,127.58751
+4320,2.8851132,207.65294
+4321,3.758105,238.49928
+4322,1.6016412,82.000824
+4323,2.7903907,186.6661
+4324,2.227282,142.13567
+4325,2.3231642,127.20982
+4326,2.2687972,131.64143
+4327,3.4758782,243.98645
+4328,3.0485466,218.4765
+4329,3.0054753,170.48116
+4330,2.4541626,179.33144
+4331,2.1058269,115.41141
+4332,2.2546308,162.61421
+4333,2.4633179,123.05021
+4334,3.2395039,188.08978
+4335,2.3447127,115.017944
+4336,2.219919,124.76761
+4337,1.9328786,119.614105
+4338,3.12422,207.12646
+4339,3.5952835,240.4045
+4340,2.7400565,182.3981
+4341,2.858553,163.00003
+4342,2.0369196,119.573586
+4343,3.2142594,182.75388
+4344,3.1160924,199.97539
+4345,2.5359418,160.0858
+4346,3.5801227,244.23024
+4347,2.6246903,209.64545
+4348,2.4384332,171.81134
+4349,2.6818519,149.88562
+4350,4.011935,245.45625
+4351,1.9489044,115.30142
+4352,1.857382,150.7313
+4353,1.9346133,127.499115
+4354,3.7204413,237.25415
+4355,2.557733,189.81993
+4356,1.8654006,96.293594
+4357,2.8413448,210.57533
+4358,2.9361856,172.92418
+4359,4.338131,249.69379
+4360,2.4240828,143.55164
+4361,2.569025,154.03091
+4362,2.9381344,155.0379
+4363,2.1615705,135.90402
+4364,2.2168329,113.977684
+4365,1.7162752,109.04959
+4366,3.6630158,222.81226
+4367,1.7929595,147.58359
+4368,2.5680144,155.3016
+4369,2.3743095,129.1913
+4370,1.6328995,96.31929
+4371,3.2720559,224.89658
+4372,3.8900857,242.26271
+4373,1.1255512,76.06173
+4374,2.7850316,180.2941
+4375,2.3389027,128.0778
+4376,2.0340078,106.46921
+4377,1.9648681,134.39746
+4378,2.213089,131.95139
+4379,3.7077293,246.49287
+4380,2.4390774,176.58005
+4381,2.1574469,137.9956
+4382,2.649652,147.79572
+4383,3.0330317,217.83867
+4384,1.6767455,96.61558
+4385,2.611939,186.01057
+4386,1.6668729,86.87556
+4387,2.1142583,134.03177
+4388,2.0012333,145.50961
+4389,1.9779214,92.05283
+4390,2.3214507,151.84329
+4391,3.7423565,242.60393
+4392,2.530546,195.60916
+4393,2.1539106,135.62341
+4394,3.0418603,182.45407
+4395,1.6912237,104.13739
+4396,2.675587,121.64761
+4397,3.3136182,228.37755
+4398,4.065196,252.03645
+4399,2.2832408,121.15442
+4400,2.1689916,133.22464
+4401,2.2996001,113.24957
+4402,1.5724957,113.52267
+4403,2.199144,114.46602
+4404,2.257587,128.52333
+4405,2.8092906,212.34875
+4406,2.546761,204.47136
+4407,2.5039697,178.03755
+4408,2.4305959,176.77382
+4409,1.654371,86.25268
+4410,3.1749861,186.65596
+4411,3.1794574,212.75557
+4412,2.591992,156.91106
+4413,3.0426748,225.01703
+4414,2.286672,138.6507
+4415,1.8471361,108.38817
+4416,2.1797848,146.53769
+4417,2.5195081,181.91289
+4418,2.5323524,119.54028
+4419,2.5301957,159.9417
+4420,1.5085559,83.79343
+4421,1.9869975,177.10956
+4422,3.2401912,208.63203
+4423,2.8366294,203.97299
+4424,3.034781,211.50601
+4425,2.2546875,170.2799
+4426,1.7708523,88.864395
+4427,3.69676,236.04729
+4428,2.6546328,135.12753
+4429,2.8666267,186.81993
+4430,1.5966351,88.04489
+4431,2.085051,118.65285
+4432,1.2636914,79.65697
+4433,2.1371565,103.626526
+4434,2.6025703,153.96767
+4435,2.0095787,93.95874
+4436,2.1632733,121.91104
+4437,1.699187,77.455376
+4438,2.341842,139.09967
+4439,2.9946005,185.43446
+4440,3.9396293,243.352
+4441,2.5824862,151.95529
+4442,2.7029066,174.71588
+4443,2.0558667,134.19034
+4444,2.9104333,169.59506
+4445,1.6011089,106.676605
+4446,2.0097077,103.102036
+4447,2.7959788,186.59601
+4448,2.8835359,203.56384
+4449,2.6268446,182.64833
+4450,2.1543164,127.87947
+4451,2.1712315,133.4863
+4452,3.4823997,229.10097
+4453,2.7601037,184.76318
+4454,2.747307,187.51726
+4455,1.591141,153.96918
+4456,2.8566604,212.28699
+4457,3.066876,221.15121
+4458,2.3675618,143.6263
+4459,2.507795,169.69565
+4460,2.4721646,129.86076
+4461,1.9712751,115.8578
+4462,3.343517,233.25308
+4463,1.9879429,117.282364
+4464,2.1705842,196.04486
+4465,3.4738197,235.50014
+4466,2.5615268,179.42622
+4467,3.8981717,246.94833
+4468,2.4254737,163.67752
+4469,4.3350444,251.64966
+4470,1.7458398,82.88456
+4471,2.7967165,221.0731
+4472,2.2998383,139.727
+4473,2.351253,157.51086
+4474,2.440588,190.14122
+4475,1.792274,86.6624
+4476,3.1482735,224.27257
+4477,3.089439,217.81224
+4478,2.5493832,146.85547
+4479,2.8157794,185.13573
+4480,2.1913004,140.64285
+4481,2.4809058,138.82214
+4482,2.7566714,173.27136
+4483,1.7905031,75.385155
+4484,3.1758053,225.91618
+4485,2.9718184,209.59428
+4486,2.1935499,115.80904
+4487,4.5902977,252.6544
+4488,2.1397152,120.402115
+4489,2.0526042,124.27028
+4490,1.8319829,128.6943
+4491,2.3904386,126.14664
+4492,4.405483,247.09888
+4493,1.9136786,94.389
+4494,2.4254146,141.25671
+4495,1.8703725,105.34461
+4496,2.802278,184.81598
+4497,3.1233487,216.32712
+4498,2.3006206,146.61102
+4499,2.6947277,129.5805
+4500,1.8267395,109.30898
+4501,2.7084491,150.96405
+4502,2.25384,137.8241
+4503,2.0146644,124.895065
+4504,2.1950383,142.48685
+4505,2.237978,103.2608
+4506,3.4775596,242.70746
+4507,2.6391208,158.47006
+4508,1.9613013,82.37593
+4509,2.732022,149.13504
+4510,3.1281085,194.86205
+4511,2.7962768,186.16656
+4512,2.1091719,110.78528
+4513,2.5100727,127.98314
+4514,2.9283702,211.76929
+4515,2.0224533,109.45477
+4516,2.2644787,136.7532
+4517,3.2662706,205.99765
+4518,2.2256057,138.00081
+4519,2.6715567,197.42236
+4520,2.0540109,144.55342
+4521,2.6866937,152.95451
+4522,1.8815863,99.74663
+4523,2.625239,209.18945
+4524,3.3749673,230.70216
+4525,2.8568296,204.09563
+4526,1.8243716,123.67538
+4527,3.8805096,245.02718
+4528,1.9739372,131.29744
+4529,2.4951909,94.65175
+4530,1.8937883,86.81317
+4531,3.5109706,240.58322
+4532,1.90614,104.18299
+4533,2.2936373,122.42291
+4534,2.4790902,199.33176
+4535,1.5080738,103.79735
+4536,1.9187527,121.41986
+4537,2.62109,153.67914
+4538,3.0166945,203.39264
+4539,3.88922,247.29465
+4540,3.1615865,220.15082
+4541,2.3804402,168.16904
+4542,1.841407,113.02656
+4543,2.5904791,151.45116
+4544,2.6448138,184.2573
+4545,2.1648092,138.1908
+4546,2.329102,122.42641
+4547,1.725022,80.64891
+4548,2.2266982,152.30731
+4549,2.2530282,126.242485
+4550,2.7498736,201.74413
+4551,3.0815787,199.24092
+4552,1.9737713,160.42424
+4553,2.1646388,99.323006
+4554,3.171397,239.18745
+4555,2.7739196,189.15408
+4556,2.4700282,127.67467
+4557,1.6066824,112.49811
+4558,2.5599933,218.94325
+4559,3.3456128,217.37254
+4560,1.6575931,84.6186
+4561,2.9068747,169.4414
+4562,2.2126188,116.45447
+4563,2.319761,131.40994
+4564,1.5168288,69.94686
+4565,2.5573845,151.05415
+4566,1.9413608,93.79501
+4567,2.6251416,150.2878
+4568,2.923717,202.88783
+4569,2.6576674,179.10217
+4570,2.4893298,136.59396
+4571,2.0580597,130.41951
+4572,1.8804225,128.7197
+4573,4.1678553,250.55171
+4574,2.832109,155.27843
+4575,2.484653,200.95853
+4576,3.6753244,237.24873
+4577,1.9435701,129.68335
+4578,2.2947056,177.15991
+4579,2.9490066,192.13136
+4580,2.5065253,136.354
+4581,4.564638,250.25626
+4582,2.1998842,164.35712
+4583,3.1595254,221.8943
+4584,2.5726237,158.37607
+4585,2.481955,180.37904
+4586,1.8039398,93.47805
+4587,2.1886125,114.478546
+4588,2.7683897,191.7792
+4589,2.6386676,211.65242
+4590,2.516931,154.54391
+4591,3.9703388,244.18097
+4592,2.8972378,209.65973
+4593,2.2853923,140.61568
+4594,2.4551919,164.21196
+4595,2.0577724,142.52863
+4596,2.909402,207.30212
+4597,1.6764029,112.45848
+4598,1.9709735,134.46834
+4599,2.4395397,124.80899
+4600,1.7409418,102.738106
+4601,3.405679,243.14383
+4602,2.9492567,217.89081
+4603,3.0561025,219.71892
+4604,2.4498773,180.10587
+4605,2.2836838,117.979225
+4606,1.8024437,97.024284
+4607,3.7793725,237.86182
+4608,3.9551525,233.7075
+4609,3.1452513,181.13776
+4610,1.3666008,86.256485
+4611,1.9875824,101.67421
+4612,2.4320142,178.12863
+4613,3.133716,219.97955
+4614,1.9617665,96.733154
+4615,2.4281719,144.62708
+4616,2.304853,93.308716
+4617,1.9913193,114.43236
+4618,2.0986252,135.90701
+4619,2.1875458,122.31436
+4620,1.9883429,126.26397
+4621,2.5771375,153.40863
+4622,2.4484224,167.59662
+4623,2.3264232,156.77522
+4624,2.3289673,186.17474
+4625,2.5546033,179.77295
+4626,2.3547597,142.03888
+4627,2.5643306,138.03864
+4628,2.3328195,178.63908
+4629,1.7632071,88.03613
+4630,2.476971,176.99806
+4631,4.4995418,249.93631
+4632,4.074403,240.18425
+4633,2.8784187,218.42696
+4634,2.5267794,178.52872
+4635,2.9960444,182.60422
+4636,3.023973,222.13466
+4637,2.324341,163.56778
+4638,2.4617152,153.48633
+4639,1.7638712,135.96075
+4640,2.388903,168.52483
+4641,1.7849872,109.783325
+4642,1.9163449,98.762924
+4643,2.3907511,154.94522
+4644,2.0913951,106.90399
+4645,2.0311413,141.60944
+4646,2.6905055,197.80736
+4647,1.9654915,107.52096
+4648,2.3644044,182.4415
+4649,2.4577765,142.10356
+4650,1.5321653,79.04583
+4651,2.2392483,157.71136
+4652,2.4428341,144.78592
+4653,2.094843,128.09048
+4654,2.6029754,146.5426
+4655,2.6383824,178.04634
+4656,3.271194,217.24338
+4657,2.9142556,174.83138
+4658,1.9362103,149.12903
+4659,2.2450602,119.1722
+4660,2.140157,115.79657
+4661,2.9975939,225.65407
+4662,1.7463752,130.51617
+4663,1.9745414,105.76701
+4664,3.6130016,243.67313
+4665,2.8130476,178.824
+4666,2.1059775,126.906296
+4667,3.2622979,233.75027
+4668,3.0125508,200.9225
+4669,3.1006835,226.66594
+4670,2.8393445,207.2943
+4671,2.1026285,138.83789
+4672,2.8232942,204.20807
+4673,2.054016,110.47423
+4674,1.9393032,95.532364
+4675,2.552348,186.39569
+4676,2.71756,174.34079
+4677,1.1794275,81.03997
+4678,3.5711896,231.71078
+4679,2.7073073,175.83946
+4680,1.7609771,82.23665
+4681,1.5302951,88.54298
+4682,2.7674136,171.85379
+4683,3.7435544,239.86423
+4684,1.903393,108.34799
+4685,2.5972533,207.54747
+4686,3.0726016,212.04807
+4687,1.6257466,100.86389
+4688,2.2161384,118.47103
+4689,1.4755315,81.63373
+4690,2.167454,122.17751
+4691,1.9347479,110.52821
+4692,2.5668395,183.15901
+4693,2.7695575,198.61516
+4694,2.6901484,174.47563
+4695,3.662102,218.00188
+4696,2.9179943,229.56415
+4697,2.689632,178.72975
+4698,1.5066515,85.70383
+4699,4.6529264,252.42554
+4700,1.933507,115.68576
+4701,1.7473577,150.02664
+4702,2.8283668,147.90729
+4703,2.0660465,152.22742
+4704,2.421288,142.00923
+4705,2.226804,117.46292
+4706,2.5243726,143.345
+4707,3.0091248,201.98918
+4708,2.8826575,211.28691
+4709,2.0112967,114.69382
+4710,5.55691,254.66841
+4711,2.5715115,169.13382
+4712,2.5676472,151.99911
+4713,2.3449874,142.29056
+4714,2.112867,163.43323
+4715,3.6884344,230.64479
+4716,2.779531,222.56665
+4717,2.547159,155.54065
+4718,1.5660862,90.91038
+4719,3.4235363,218.29189
+4720,3.432487,228.87662
+4721,1.6585381,106.91171
+4722,1.8741214,96.548615
+4723,2.1413436,104.64838
+4724,3.2105892,237.77916
+4725,1.857589,97.79628
+4726,2.6688924,195.25626
+4727,2.6031828,193.79869
+4728,1.9466063,133.04776
+4729,2.107607,96.57665
+4730,3.744868,236.41458
+4731,2.021305,117.98102
+4732,1.8795571,95.24127
+4733,2.4244256,118.12541
+4734,1.703788,93.655136
+4735,1.9897485,108.47262
+4736,3.5033798,236.02701
+4737,1.6889627,106.02022
+4738,2.592074,146.72104
+4739,2.6958385,171.48288
+4740,2.2387064,124.4077
+4741,1.9610398,135.28958
+4742,2.9476068,214.01486
+4743,2.4462032,171.0081
+4744,2.7088206,140.32236
+4745,3.2614045,209.74171
+4746,2.0112514,132.60986
+4747,3.6744757,245.38289
+4748,3.5530698,239.64594
+4749,2.7242627,165.35474
+4750,3.97331,232.57507
+4751,2.1987576,157.03894
+4752,3.0075402,185.36458
+4753,1.6898879,124.20444
+4754,3.2511706,194.58476
+4755,2.1690507,155.94862
+4756,1.9267323,110.990685
+4757,3.0799615,219.4887
+4758,2.0011094,125.15895
+4759,2.0298645,161.06941
+4760,2.3582966,136.99841
+4761,1.8790903,102.0013
+4762,2.4352183,165.90189
+4763,3.101221,210.12782
+4764,1.9572592,153.96411
+4765,2.09869,120.68061
+4766,1.6606061,113.51611
+4767,2.1678796,163.51775
+4768,2.1239274,162.0288
+4769,3.2976108,219.08167
+4770,1.9311786,115.82789
+4771,1.8151357,99.49454
+4772,3.076564,172.72809
+4773,2.4960551,150.66574
+4774,1.6668212,107.2197
+4775,1.9927082,126.82037
+4776,2.5105524,182.49762
+4777,3.3129983,209.8128
+4778,2.5067427,198.01352
+4779,2.714977,208.6775
+4780,2.9024405,198.45772
+4781,2.32764,131.09094
+4782,3.276964,212.18022
+4783,1.9281869,93.22382
+4784,2.5120282,191.60468
+4785,4.063405,249.42413
+4786,1.7713144,131.0962
+4787,2.796552,200.32585
+4788,3.8376737,242.62602
+4789,1.7670151,93.446465
+4790,2.445744,136.14514
+4791,2.3068948,160.68916
+4792,2.6419904,182.57709
+4793,2.3936005,124.08641
+4794,2.0796335,135.24057
+4795,2.509825,128.98822
+4796,2.0227349,153.06714
+4797,3.2547755,201.72566
+4798,3.4601393,231.3382
+4799,2.946956,183.81181
+4800,3.5436924,238.90382
+4801,1.9452116,111.68169
+4802,4.2982564,248.25758
+4803,3.1519837,229.77614
+4804,2.643707,156.70006
+4805,2.2138941,137.53978
+4806,3.961623,248.5683
+4807,3.3040237,224.44144
+4808,2.7523139,167.81787
+4809,2.6320775,170.25122
+4810,3.2355974,227.93004
+4811,1.8595623,91.921555
+4812,3.5367637,246.2299
+4813,2.8329163,169.29672
+4814,3.8580983,246.12003
+4815,2.5255961,175.37738
+4816,3.0736375,198.73332
+4817,2.3577447,176.89432
+4818,1.2914541,88.61249
+4819,1.8179797,106.84522
+4820,1.9759458,100.380005
+4821,3.5947223,226.056
+4822,1.5470042,84.58438
+4823,3.0572333,203.70158
+4824,2.247943,149.81313
+4825,2.0755653,126.28971
+4826,2.1143434,136.4252
+4827,3.265582,230.90105
+4828,2.9766085,188.20456
+4829,2.052412,137.9108
+4830,3.4547284,241.19449
+4831,2.42267,102.58263
+4832,2.165428,120.80572
+4833,1.8864489,120.34413
+4834,2.0622232,118.715546
+4835,4.866713,253.61343
+4836,1.4858778,75.71708
+4837,2.188478,135.44507
+4838,2.6352654,196.52078
+4839,2.0728836,95.59905
+4840,2.097035,114.88464
+4841,2.1488466,123.27078
+4842,2.5605848,153.08434
+4843,2.2733107,126.7915
+4844,2.178077,112.456924
+4845,2.7576752,143.11226
+4846,3.3881395,245.53865
+4847,3.1311634,203.50447
+4848,2.1769829,133.65262
+4849,1.9964403,117.178986
+4850,2.3151636,136.56445
+4851,1.7533381,122.75109
+4852,1.8428531,110.329865
+4853,3.1671484,211.66107
+4854,3.7889774,232.11624
+4855,2.185618,140.50119
+4856,2.6528785,177.27402
+4857,1.6618003,91.84729
+4858,2.596686,176.8659
+4859,2.851886,144.99367
+4860,2.4596195,171.38437
+4861,2.3187218,199.87503
+4862,3.1394994,206.14595
+4863,2.005091,94.358765
+4864,2.542552,215.27663
+4865,2.0416286,135.9076
+4866,1.3433646,76.01631
+4867,1.4828161,111.433334
+4868,1.551236,104.088554
+4869,1.5470793,77.89759
+4870,1.9979064,125.20493
+4871,2.5252585,121.77059
+4872,2.866488,217.01611
+4873,2.5976472,161.49849
+4874,3.2177143,213.4705
+4875,1.7356768,152.97812
+4876,2.7195606,178.25989
+4877,2.0550573,115.96295
+4878,2.4873333,150.24393
+4879,2.3663225,132.13206
+4880,2.6130505,203.97395
+4881,2.5815413,173.5727
+4882,1.7035329,77.36049
+4883,3.4826503,241.71014
+4884,2.1270616,94.051956
+4885,1.5946468,108.33569
+4886,2.3550627,154.0824
+4887,2.589313,179.2764
+4888,2.0127587,102.93948
+4889,1.994275,111.30585
+4890,5.8807974,254.87321
+4891,2.8060753,179.9183
+4892,3.3743315,229.91768
+4893,3.2506473,228.071
+4894,2.2915983,151.60637
+4895,2.4515786,148.0002
+4896,2.055589,144.67622
+4897,1.9919996,89.68958
+4898,2.4109702,148.46512
+4899,1.95379,108.24579
+4900,3.783067,246.51997
+4901,1.6773306,88.044624
+4902,2.383435,159.24536
+4903,2.9967163,171.08698
+4904,2.459247,164.99773
+4905,1.6704261,84.17767
+4906,2.5507088,131.79526
+4907,1.6238877,111.00687
+4908,2.019266,122.15646
+4909,2.043431,107.562256
+4910,1.7057996,87.35506
+4911,3.164527,212.07205
+4912,2.4686587,128.88074
+4913,2.1718738,134.36221
+4914,4.8571167,249.17897
+4915,2.2566087,140.47598
+4916,2.4906816,152.4834
+4917,2.9016762,211.3226
+4918,2.6810086,199.07013
+4919,1.3887148,89.41754
+4920,2.0427308,124.20118
+4921,3.0324626,207.5816
+4922,3.0308452,210.30449
+4923,2.1996722,142.32166
+4924,2.374022,167.68018
+4925,1.9632185,138.58868
+4926,2.6756353,140.46654
+4927,1.7524678,86.94081
+4928,2.537342,172.42456
+4929,2.4734645,128.45013
+4930,2.6556122,156.35114
+4931,2.180435,123.7639
+4932,2.7745433,180.13577
+4933,2.9113288,217.0404
+4934,1.8029275,127.03171
+4935,2.6124938,164.29782
+4936,1.9285705,104.96505
+4937,2.274229,119.13161
+4938,2.4495711,140.07523
+4939,1.8109286,112.1767
+4940,3.116329,228.48503
+4941,2.881909,199.94243
+4942,2.0572922,112.02277
+4943,2.0446405,139.61179
+4944,2.0813677,120.50188
+4945,2.445281,161.88287
+4946,3.1330695,196.8676
+4947,2.0884426,162.34041
+4948,2.006068,118.53369
+4949,2.8421361,196.02261
+4950,2.3881783,137.06845
+4951,3.2817907,240.128
+4952,2.8862674,178.67374
+4953,2.6932824,198.61143
+4954,2.4251506,172.6835
+4955,2.7566543,189.81297
+4956,2.2480245,132.53986
+4957,2.6210344,167.97472
+4958,1.8890786,117.57258
+4959,1.8214943,85.427505
+4960,2.1583457,137.3641
+4961,2.3505619,157.98137
+4962,1.3123815,86.41521
+4963,2.7037501,195.88602
+4964,2.2168794,116.096146
+4965,2.5321908,129.88336
+4966,1.5054389,80.403076
+4967,1.4219682,82.25444
+4968,1.8608298,113.79221
+4969,2.0438094,102.27903
+4970,2.173575,135.63232
+4971,1.8045533,107.190636
+4972,2.8743298,184.74973
+4973,2.4912546,140.08905
+4974,2.7712386,182.21576
+4975,2.5364966,187.22482
+4976,3.010418,219.03156
+4977,3.3671088,199.46455
+4978,2.965834,211.63548
+4979,1.6184801,95.48064
+4980,2.1523135,162.26813
+4981,1.5584109,87.69624
+4982,1.4863122,89.632675
+4983,2.3356984,132.32605
+4984,2.0104997,103.1662
+4985,1.8637056,101.804306
+4986,2.270947,147.66638
+4987,3.341436,239.80885
+4988,2.5081859,159.79974
+4989,1.8440061,103.95843
+4990,2.8561568,176.71227
+4991,3.4748678,221.96504
+4992,2.8521988,186.2254
+4993,2.602108,145.79617
+4994,2.922593,188.55183
+4995,2.4200826,159.96713
+4996,2.0361712,83.89647
+4997,3.339888,195.19444
+4998,2.4052882,161.70404
+4999,3.0681107,182.37068
+5000,2.6814113,189.32935
+5001,3.8263397,243.66307
+5002,2.70675,205.69896
+5003,2.7265494,201.5661
+5004,2.6859493,222.72404
+5005,2.317658,138.07242
+5006,3.0969195,234.19179
+5007,2.3353837,182.83316
+5008,1.7294985,94.985954
+5009,2.0376818,126.56691
+5010,1.436799,72.16797
+5011,3.231686,240.34138
+5012,2.6948888,171.47385
+5013,2.4001803,163.3148
+5014,2.1119542,120.633965
+5015,2.2183824,103.6915
+5016,2.2924454,119.79988
+5017,2.0479999,147.46426
+5018,3.20625,215.48265
+5019,2.1697567,125.30218
+5020,3.034083,196.04422
+5021,1.8562573,126.78667
+5022,2.7011905,151.6688
+5023,1.7870998,108.21054
+5024,2.7856581,136.39645
+5025,1.6088508,84.19731
+5026,1.8458307,119.61629
+5027,2.2957816,137.20322
+5028,3.677854,230.04666
+5029,2.218635,141.14078
+5030,3.3467987,228.93503
+5031,2.7915308,206.99797
+5032,2.2577355,143.76367
+5033,2.268537,116.20658
+5034,2.5458179,158.53397
+5035,2.29979,141.02872
+5036,2.962526,218.65854
+5037,1.5895419,93.19653
+5038,2.3360696,120.1051
+5039,3.0916467,210.57571
+5040,3.132934,184.5591
+5041,2.1782434,107.99429
+5042,3.6900208,243.08482
+5043,2.6501043,166.50574
+5044,3.1802661,229.36914
+5045,1.6863654,86.63578
+5046,1.8998634,117.66475
+5047,4.1206064,250.64842
+5048,3.0336869,192.23192
+5049,2.9716072,211.44585
+5050,3.5704482,230.08136
+5051,4.030995,247.94133
+5052,2.8775773,208.11192
+5053,2.2472947,145.52716
+5054,2.916781,214.3451
+5055,1.8997911,106.12184
+5056,1.8713753,96.35822
+5057,2.7694025,147.83414
+5058,2.1898496,164.32715
+5059,2.7611885,191.70268
+5060,2.5291784,181.32199
+5061,2.2769053,138.22052
+5062,2.5889344,149.15498
+5063,3.376034,222.45952
+5064,2.3150315,175.46161
+5065,2.2797768,126.29285
+5066,2.2390292,186.34854
+5067,2.0310597,124.60011
+5068,3.0434556,198.54292
+5069,1.9549191,147.02448
+5070,1.8333974,105.38299
+5071,3.2113633,221.44403
+5072,3.302746,218.90361
+5073,3.9562469,231.4022
+5074,3.4268281,232.61627
+5075,2.7168536,202.00415
+5076,2.69438,190.16501
+5077,2.5228403,181.09708
+5078,2.3563976,135.36487
+5079,2.5933435,178.9827
+5080,2.3423812,141.6241
+5081,2.9096453,165.12808
+5082,1.4873278,83.8971
+5083,3.466784,215.22353
+5084,2.567726,184.22983
+5085,2.6321585,115.915405
+5086,2.2389536,107.92007
+5087,2.7391138,198.06497
+5088,2.4802227,151.23917
+5089,2.340519,147.22232
+5090,1.6072065,87.97506
+5091,1.9694488,101.751526
+5092,1.5421418,116.43662
+5093,3.6630573,230.15387
+5094,3.579185,231.18106
+5095,3.4513059,222.63322
+5096,1.8844621,149.73639
+5097,3.2364237,227.32077
+5098,1.7285874,95.50616
+5099,3.3068848,224.84233
+5100,1.8989404,121.29957
+5101,2.0193436,114.71431
+5102,2.194347,124.94158
+5103,1.3966198,72.02599
+5104,2.3035576,145.27496
+5105,2.0508912,137.5577
+5106,1.8671389,84.09419
+5107,3.0651133,192.9466
+5108,3.791991,246.51042
+5109,2.8839226,223.5237
+5110,1.7475375,96.30184
+5111,2.2122731,148.9493
+5112,1.774828,91.980515
+5113,3.5682118,237.44472
+5114,3.0597205,197.02168
+5115,2.8159559,188.37437
+5116,1.9258491,108.46956
+5117,2.484789,137.76004
+5118,2.7252927,146.40018
+5119,3.1850944,231.91397
+5120,1.9669418,115.631775
+5121,2.9572673,197.69818
+5122,2.831018,206.27039
+5123,2.3404276,135.25111
+5124,2.1067572,108.38624
+5125,1.9431603,111.72775
+5126,4.1344886,248.00777
+5127,2.9511905,170.69272
+5128,2.6393008,136.26433
+5129,2.789173,170.48007
+5130,1.7925316,87.896706
+5131,2.5071614,164.2201
+5132,2.391173,128.31912
+5133,2.6140282,156.84015
+5134,2.6555908,145.3168
+5135,3.3994505,230.06851
+5136,2.1226337,119.439026
+5137,2.3732293,140.00772
+5138,1.6542134,85.684296
+5139,2.2244694,119.56405
+5140,2.2024205,103.403046
+5141,2.776565,157.08755
+5142,2.2482247,149.76427
+5143,1.5668249,93.70889
+5144,2.6432881,172.32053
+5145,1.8870205,79.06552
+5146,2.5577745,160.45459
+5147,1.2565017,77.60831
+5148,3.436702,230.42767
+5149,3.8472161,245.07335
+5150,1.928899,98.47498
+5151,2.9714212,222.60674
+5152,3.2228484,182.44691
+5153,1.9002692,95.62337
+5154,3.2419186,227.51704
+5155,1.4604352,79.73778
+5156,2.1883063,114.48128
+5157,1.6852617,102.4523
+5158,1.6673615,80.49711
+5159,2.7833047,220.61093
+5160,2.6888878,149.9997
+5161,2.539076,148.44629
+5162,2.6848254,169.43314
+5163,2.0222795,121.293625
+5164,1.968493,106.593544
+5165,1.7363309,87.78859
+5166,1.974376,142.02133
+5167,2.3545816,154.66461
+5168,2.483152,187.11435
+5169,2.114794,154.82477
+5170,2.4666011,144.47882
+5171,3.835395,244.1959
+5172,1.9273678,128.87494
+5173,2.752984,199.41008
+5174,4.144418,249.06021
+5175,1.9173229,108.334015
+5176,2.1771502,101.23587
+5177,2.6098502,150.78412
+5178,2.5370584,191.39655
+5179,1.2524152,85.34961
+5180,1.800803,102.44655
+5181,2.584149,182.99896
+5182,2.7486691,176.20338
+5183,2.9946322,212.78645
+5184,2.9426637,211.4554
+5185,1.70975,94.0188
+5186,3.2515779,222.27138
+5187,3.4959042,243.51031
+5188,2.7549074,173.00427
+5189,3.0372276,213.6469
+5190,1.7323062,83.369736
+5191,2.161152,163.9224
+5192,2.232553,107.650536
+5193,3.3443885,218.48434
+5194,2.8641639,201.49896
+5195,1.9750946,95.17267
+5196,2.2830567,109.54106
+5197,3.0767603,208.17558
+5198,1.2268641,78.858185
+5199,2.138501,133.52405
+5200,2.7913566,195.25426
+5201,2.770235,198.45448
+5202,1.9928378,153.9036
+5203,1.7906578,93.29189
+5204,1.9486327,118.09093
+5205,2.8063889,202.54475
+5206,2.5483012,192.65205
+5207,3.7539134,240.02103
+5208,2.560985,179.19785
+5209,2.2588112,99.94945
+5210,1.3021929,89.73877
+5211,2.7114124,201.57738
+5212,2.204761,110.8044
+5213,3.4614348,240.21678
+5214,3.863437,236.29314
+5215,2.0803685,178.0465
+5216,3.5516922,241.56836
+5217,3.1492715,237.38039
+5218,2.9739738,158.71198
+5219,2.715164,195.2411
+5220,1.9761128,123.91226
+5221,2.8239415,163.3042
+5222,4.70667,250.42288
+5223,4.353563,252.5588
+5224,3.9817684,239.62126
+5225,2.28323,120.05533
+5226,2.349512,144.5665
+5227,2.3554196,118.11566
+5228,1.8064517,130.27884
+5229,3.2591252,239.45868
+5230,2.079296,105.41128
+5231,1.9898545,104.923515
+5232,2.7974017,188.52151
+5233,2.280168,171.28683
+5234,2.6129022,150.09549
+5235,1.8775442,89.57803
+5236,2.6033647,175.3302
+5237,2.764603,188.44081
+5238,2.0183845,132.83704
+5239,3.0856555,227.9735
+5240,1.4737674,83.35859
+5241,2.598602,170.22601
+5242,2.0175204,94.08029
+5243,3.1790788,223.40318
+5244,2.9191241,197.1925
+5245,3.6861534,230.99432
+5246,1.7958697,82.677124
+5247,2.786503,202.45872
+5248,1.8085023,114.8822
+5249,2.4808598,133.97278
+5250,2.5819077,143.26123
+5251,2.6635287,180.17612
+5252,2.7288353,189.17474
+5253,2.3455098,147.39941
+5254,2.3107839,175.76456
+5255,4.289442,252.51012
+5256,3.1455655,182.92346
+5257,1.9098572,88.910515
+5258,2.0364864,138.56735
+5259,2.2346628,135.34451
+5260,2.3127432,149.6703
+5261,3.1335967,217.84227
+5262,2.008874,141.53207
+5263,1.8736786,120.58219
+5264,2.9628282,186.65192
+5265,1.7827194,94.88162
+5266,2.7313492,181.77547
+5267,2.783571,142.99777
+5268,2.8627179,210.12659
+5269,2.3640566,145.80937
+5270,2.6135848,194.50598
+5271,3.2783103,229.45906
+5272,2.3778965,134.88956
+5273,1.6246368,91.51987
+5274,3.0350184,203.01593
+5275,3.161077,218.91652
+5276,2.797692,185.34268
+5277,3.1391308,228.75484
+5278,2.6309943,158.49661
+5279,2.8002496,211.44783
+5280,1.8350751,117.95161
+5281,2.793635,196.92613
+5282,1.7136595,99.626526
+5283,2.5337596,156.8177
+5284,2.5579863,131.35764
+5285,1.7173141,111.11485
+5286,2.6990275,216.44382
+5287,1.5174048,78.09341
+5288,2.6410165,171.86469
+5289,2.67158,227.56763
+5290,2.4210799,130.99088
+5291,2.8596013,188.31973
+5292,1.7393095,96.624756
+5293,2.7607436,153.80022
+5294,2.4378138,148.61436
+5295,2.4721527,122.26361
+5296,3.0063653,220.72797
+5297,3.0582018,237.42467
+5298,2.9973378,207.76976
+5299,1.9926848,126.911446
+5300,2.5987012,158.97435
+5301,2.6585906,217.62965
+5302,2.6145473,163.50589
+5303,2.780078,205.07835
+5304,1.8491127,92.160095
+5305,2.0768085,109.25304
+5306,2.270739,147.29158
+5307,1.425816,75.17543
+5308,2.0640762,126.15971
+5309,3.0149214,217.906
+5310,3.246712,218.9894
+5311,2.5777574,172.81482
+5312,2.1398132,106.12123
+5313,3.4964242,229.41057
+5314,3.8809807,247.95123
+5315,4.1130075,244.34967
+5316,2.196654,216.15483
+5317,2.1556945,106.81406
+5318,2.0948677,156.5705
+5319,2.263144,148.00287
+5320,1.7924956,98.03284
+5321,2.1906404,146.22441
+5322,2.6827185,194.0849
+5323,3.2421453,218.9366
+5324,2.9728463,214.05696
+5325,2.7687178,151.41531
+5326,1.858775,119.698425
+5327,2.7416801,187.05508
+5328,1.5394294,104.38257
+5329,2.09025,119.55835
+5330,1.7039626,81.28433
+5331,2.2415242,137.31334
+5332,2.7810738,211.44496
+5333,2.294949,125.36319
+5334,3.015254,186.37459
+5335,1.9015596,149.79358
+5336,3.0822864,183.03915
+5337,3.987573,239.46738
+5338,1.9788997,87.5973
+5339,1.6963527,97.90358
+5340,2.5333061,155.92946
+5341,2.2802272,113.974335
+5342,2.2172582,153.1601
+5343,1.8564192,130.59105
+5344,1.612934,123.43451
+5345,2.7821336,184.69794
+5346,3.1446486,190.83206
+5347,3.4744272,234.79631
+5348,1.4356387,82.26433
+5349,2.3467987,149.56366
+5350,2.2495482,132.89096
+5351,2.5311604,167.93689
+5352,1.6951973,84.596695
+5353,2.0600724,115.92206
+5354,2.0912364,148.74014
+5355,2.14988,120.25063
+5356,1.5862156,75.232765
+5357,1.9021264,120.00246
+5358,2.7299542,175.66812
+5359,1.6440005,89.65903
+5360,2.622404,159.32869
+5361,2.329241,182.68152
+5362,2.4803042,130.16376
+5363,2.9056175,213.80759
+5364,4.436211,250.9995
+5365,2.5418434,160.51045
+5366,2.3516936,128.44919
+5367,4.390777,245.32559
+5368,3.6280642,236.45816
+5369,2.8199465,206.62889
+5370,2.344954,172.26021
+5371,2.146184,179.28735
+5372,2.3662333,169.25737
+5373,2.4782853,156.81458
+5374,3.0019572,157.07639
+5375,1.7796502,92.19322
+5376,2.3142705,148.67386
+5377,2.642209,190.12236
+5378,3.07624,196.49461
+5379,2.0197463,113.45413
+5380,3.6158452,247.38457
+5381,4.759383,251.72993
+5382,1.6675506,111.4343
+5383,3.0343468,209.57867
+5384,1.9089195,111.19919
+5385,2.415832,149.67232
+5386,1.7449105,88.476746
+5387,2.591124,174.17078
+5388,1.7231936,115.302666
+5389,2.8213658,178.57135
+5390,2.9921248,236.3398
+5391,2.421536,167.82716
+5392,2.3328757,114.90147
+5393,2.3070784,131.91896
+5394,3.1338658,216.13132
+5395,2.6291163,190.96434
+5396,1.8986808,109.65633
+5397,3.112611,184.06662
+5398,2.318907,147.0906
+5399,2.9106514,219.4677
+5400,2.999879,196.24434
+5401,2.2367854,137.69638
+5402,2.2864053,151.54611
+5403,1.9765087,112.23047
+5404,2.0105467,131.55817
+5405,2.0380106,111.43509
+5406,1.24847,80.56215
+5407,2.351351,116.50609
+5408,2.70883,193.4297
+5409,2.6839945,135.57275
+5410,3.1260228,190.26784
+5411,2.4852762,159.81644
+5412,3.1223094,215.29222
+5413,2.9591305,184.96048
+5414,2.0541086,106.41972
+5415,1.7671226,93.05611
+5416,2.0438113,136.75958
+5417,1.0525765,69.55967
+5418,2.2860966,129.04813
+5419,3.2182999,224.26437
+5420,2.0474684,89.46401
+5421,2.25677,127.411545
+5422,2.0426397,149.55704
+5423,2.19004,97.232315
+5424,2.2701893,134.37415
+5425,1.8604223,110.24214
+5426,3.1952958,240.44704
+5427,4.011775,251.57515
+5428,2.6789908,193.81409
+5429,2.5315208,128.99878
+5430,2.5394216,105.74289
+5431,2.9823027,198.5925
+5432,1.7252156,86.56397
+5433,2.4043322,155.26956
+5434,2.0148442,117.89392
+5435,2.4580193,192.41414
+5436,1.5901058,78.12874
+5437,2.156058,142.8864
+5438,3.2160249,190.19516
+5439,1.5913517,83.839386
+5440,2.1609802,139.06941
+5441,2.3967257,155.22061
+5442,1.6519767,87.38447
+5443,2.1875203,97.66452
+5444,2.4159715,155.40123
+5445,2.1434574,114.85893
+5446,1.8082235,83.66697
+5447,2.6058414,200.12091
+5448,2.2012508,112.9722
+5449,2.5075126,183.08897
+5450,4.1454573,250.12369
+5451,1.366183,77.45114
+5452,2.544498,133.92136
+5453,2.218696,145.87088
+5454,1.3895658,87.36597
+5455,3.7946649,239.25378
+5456,1.4013549,77.81395
+5457,3.7137806,241.66832
+5458,3.0313888,204.92465
+5459,2.1917386,90.703476
+5460,2.6226075,175.15475
+5461,3.375865,204.11607
+5462,1.7324557,97.05556
+5463,2.1566105,120.53453
+5464,2.6318777,175.69028
+5465,2.8335683,152.54352
+5466,2.9776216,233.02188
+5467,2.2658153,130.41602
+5468,2.4126968,167.82512
+5469,2.4822583,122.47507
+5470,2.5114844,158.92615
+5471,2.6675804,160.62973
+5472,2.55271,167.68864
+5473,2.6016076,154.0078
+5474,2.6473937,194.79431
+5475,4.339507,243.85522
+5476,2.1832702,146.55414
+5477,2.241484,160.77295
+5478,2.1309228,143.1094
+5479,2.0457942,114.754486
+5480,2.9155035,216.98474
+5481,2.329272,130.34271
+5482,2.4160593,166.0492
+5483,3.5181239,221.03464
+5484,3.4610796,224.79126
+5485,2.2873516,166.08078
+5486,2.3425202,178.23726
+5487,2.4937344,138.79294
+5488,2.4410336,108.4631
+5489,1.8959202,93.61369
+5490,2.3071592,128.46574
+5491,2.4981775,124.362656
+5492,2.0970135,118.690994
+5493,2.7403228,189.4572
+5494,2.0777528,91.99335
+5495,3.3915825,237.52531
+5496,2.7257018,189.98138
+5497,2.735882,173.3223
+5498,2.2770524,113.35686
+5499,2.6111784,136.41513
+5500,2.571759,191.04161
+5501,1.8999244,91.605995
+5502,2.2987463,137.25708
+5503,2.448654,160.01233
+5504,1.8445129,118.09514
+5505,2.366218,198.37273
+5506,3.8949406,241.98059
+5507,2.9624007,213.2606
+5508,2.1219034,136.15652
+5509,2.113344,124.923294
+5510,2.106042,148.61978
+5511,2.1511524,121.92058
+5512,3.331245,237.48172
+5513,1.8057646,130.02374
+5514,2.17176,116.930824
+5515,2.741166,128.16568
+5516,3.3056083,234.20581
+5517,1.8325489,76.903305
+5518,2.4611802,132.74792
+5519,2.885241,196.4961
+5520,2.587132,132.89743
+5521,3.1327825,171.20221
+5522,2.2005825,130.18832
+5523,2.4280164,140.35889
+5524,2.1437027,97.125946
+5525,2.218584,115.10115
+5526,2.269665,117.92876
+5527,2.5812812,129.57693
+5528,1.780535,125.14416
+5529,2.2563798,135.2409
+5530,2.4682221,152.2203
+5531,3.2053218,210.13643
+5532,2.3739598,183.5572
+5533,2.844605,170.15787
+5534,2.046314,127.58867
+5535,1.7391429,102.613815
+5536,2.2295175,130.91245
+5537,2.8380897,174.86934
+5538,2.2652338,143.15999
+5539,1.4758737,89.47221
+5540,2.6958356,203.57173
+5541,2.9311218,170.42056
+5542,2.6749995,184.13187
+5543,3.4447923,234.39142
+5544,1.6383412,84.39783
+5545,2.6943421,157.80779
+5546,3.6395528,233.52594
+5547,1.4941132,96.90282
+5548,2.6695256,208.04044
+5549,3.2568302,229.36365
+5550,2.128508,109.03572
+5551,2.1264355,141.3927
+5552,3.3165193,204.93062
+5553,2.3769295,141.63351
+5554,3.1441145,219.47171
+5555,2.3396916,132.9386
+5556,1.0716269,78.18597
+5557,3.142097,228.04175
+5558,2.2904184,168.99838
+5559,3.4032626,226.98958
+5560,2.0000808,150.07397
+5561,2.3338008,163.18434
+5562,1.6306045,110.21231
+5563,2.781323,175.97699
+5564,3.1757288,225.4027
+5565,3.8055356,232.63463
+5566,2.450403,160.81522
+5567,3.0915987,181.82425
+5568,3.149013,192.24084
+5569,1.6421818,101.73689
+5570,2.6269934,195.04457
+5571,1.8608934,98.95261
+5572,1.7718793,118.42644
+5573,2.2738774,145.41144
+5574,1.6464088,84.31331
+5575,2.141171,125.42723
+5576,2.098518,154.23407
+5577,2.7311683,204.76491
+5578,2.6526604,159.88342
+5579,2.447178,116.07999
+5580,2.461944,176.00504
+5581,2.555472,180.21284
+5582,1.5979245,75.69234
+5583,1.5102128,83.18949
+5584,2.7295442,171.63203
+5585,2.7728162,185.99857
+5586,4.155881,250.1539
+5587,2.4248157,172.67358
+5588,1.735903,114.110565
+5589,2.283931,113.37813
+5590,2.2738068,151.57101
+5591,2.4020255,159.57037
+5592,3.2770574,236.85779
+5593,1.8421427,87.12501
+5594,2.3887298,121.54808
+5595,3.052126,222.50853
+5596,2.3205295,129.4966
+5597,1.7655743,80.78116
+5598,2.771607,191.87009
+5599,2.5829024,172.7091
+5600,2.0489135,123.00126
+5601,2.4580414,176.96268
+5602,4.5379777,252.36368
+5603,1.649093,92.367836
+5604,3.1262136,198.61516
+5605,2.0882618,107.5688
+5606,3.0468643,220.12686
+5607,3.518218,234.9901
+5608,2.940671,207.74655
+5609,1.6758356,88.329895
+5610,2.3288975,134.39247
+5611,2.5920167,167.23026
+5612,1.0866361,68.57783
+5613,1.9919504,130.91144
+5614,1.8021187,107.24252
+5615,2.915512,221.06526
+5616,3.0530841,221.38034
+5617,1.6926932,84.92603
+5618,2.4404478,124.18784
+5619,1.8148239,127.52621
+5620,2.790963,167.75848
+5621,2.8989255,187.56174
+5622,1.5494733,87.3672
+5623,2.394663,148.34059
+5624,1.9227061,118.22398
+5625,2.2459557,162.41716
+5626,2.0271926,121.70062
+5627,2.0335107,116.996704
+5628,2.316863,152.50046
+5629,1.6705854,83.37632
+5630,2.1881614,106.410736
+5631,2.7804291,191.80331
+5632,1.5690951,95.87588
+5633,2.8120115,167.12259
+5634,1.7805487,95.11427
+5635,3.7355034,238.51205
+5636,2.6178567,214.79268
+5637,2.6177106,133.63422
+5638,3.1604505,221.24126
+5639,2.235355,99.8465
+5640,2.635483,184.71802
+5641,2.2250562,107.409164
+5642,2.126446,101.65511
+5643,1.6634138,96.86496
+5644,3.3509526,205.46886
+5645,1.6808707,86.947235
+5646,1.8576113,117.3692
+5647,2.3611486,140.15251
+5648,1.3888772,73.42872
+5649,2.1456532,157.95595
+5650,2.0056982,124.47354
+5651,1.6527683,88.995186
+5652,3.0799835,202.24918
+5653,1.9124441,118.535995
+5654,2.42905,147.01349
+5655,1.7921116,113.980576
+5656,2.214372,177.09799
+5657,2.6466107,181.0607
+5658,2.5556803,155.74973
+5659,2.0614343,136.08734
+5660,1.6051222,83.30603
+5661,2.3195946,155.41562
+5662,2.2360232,126.86889
+5663,2.1335094,130.42615
+5664,1.8628304,137.98212
+5665,2.9025872,195.58539
+5666,1.8319333,90.28391
+5667,2.477538,147.72003
+5668,3.4431326,219.76611
+5669,2.4836357,160.74774
+5670,1.9169791,104.08986
+5671,1.8292464,117.61242
+5672,2.564885,112.202194
+5673,2.089811,98.83792
+5674,2.154515,130.8581
+5675,3.0309472,225.63171
+5676,1.9578463,129.58548
+5677,2.2019305,103.10201
+5678,2.8164492,152.32565
+5679,2.6814353,173.40384
+5680,2.8331444,151.73961
+5681,2.0361228,134.91281
+5682,2.2993503,116.56448
+5683,2.3821898,164.37137
+5684,1.9690793,89.63704
+5685,1.6730633,102.47766
+5686,2.4097533,185.1145
+5687,2.1330705,122.226685
+5688,2.351384,136.98477
+5689,1.5413244,82.640495
+5690,2.1317172,132.1717
+5691,2.1584103,142.64914
+5692,2.8505607,185.90472
+5693,2.513071,150.43652
+5694,2.1282837,130.62152
+5695,4.3737464,249.38596
+5696,1.8286154,109.493195
+5697,2.437509,135.4288
+5698,1.4408919,99.84807
+5699,2.789866,178.51299
+5700,3.7770023,246.2901
+5701,2.0884798,94.11958
+5702,1.9402187,85.695114
+5703,2.370988,164.48442
+5704,2.3771424,119.308914
+5705,4.2478704,250.65869
+5706,2.9455802,199.24094
+5707,1.985305,101.571724
+5708,2.0749295,141.83905
+5709,2.345561,171.58241
+5710,3.2771385,232.05438
+5711,1.861083,89.76323
+5712,2.0091722,134.77023
+5713,2.0380418,112.24736
+5714,2.455634,175.81561
+5715,3.3356967,232.62115
+5716,3.519525,237.51338
+5717,2.8682914,140.00888
+5718,4.0541115,250.40117
+5719,2.7090876,202.9126
+5720,2.0682917,121.83331
+5721,1.7306908,129.30867
+5722,3.6382446,239.96683
+5723,2.0718906,129.37952
+5724,3.0163498,221.39519
+5725,2.5013304,146.7216
+5726,2.2923212,123.87361
+5727,3.6832972,242.99696
+5728,1.8230008,116.00574
+5729,2.2056649,122.82551
+5730,1.9521911,105.31349
+5731,2.8488114,204.11136
+5732,2.3874855,142.31952
+5733,2.9495814,182.6924
+5734,1.7063596,119.37119
+5735,1.9485725,114.41166
+5736,2.08912,132.33438
+5737,2.6715531,180.67154
+5738,1.7490895,95.630394
+5739,2.7685363,175.9002
+5740,2.2567897,160.09457
+5741,2.759123,160.96002
+5742,2.5374587,164.99396
+5743,3.1721838,226.08499
+5744,2.8456416,202.91249
+5745,2.4544601,168.73553
+5746,2.7627523,187.74228
+5747,1.8331382,140.61685
+5748,2.0111122,96.48327
+5749,3.014024,168.46506
+5750,1.957693,135.61922
+5751,2.4969196,164.96114
+5752,2.5878637,151.66623
+5753,2.635584,168.32367
+5754,2.077958,124.545456
+5755,2.5671885,146.43292
+5756,2.3901331,113.47149
+5757,2.708281,187.62497
+5758,2.7866387,202.91953
+5759,2.4450269,139.74588
+5760,2.664114,208.45834
+5761,2.2369714,172.94864
+5762,3.2972035,230.3423
+5763,2.8612018,163.88095
+5764,3.3820112,233.21219
+5765,2.7260394,197.32274
+5766,1.7571273,85.114525
+5767,2.0955575,123.12892
+5768,2.6764836,214.70486
+5769,2.2459245,123.7401
+5770,1.8334482,110.77705
+5771,2.8680289,211.43605
+5772,1.8208328,135.37395
+5773,3.4402392,216.79071
+5774,2.3805568,115.39253
+5775,1.8947309,95.8203
+5776,1.6594788,100.17279
+5777,2.4160607,150.49426
+5778,3.1214876,238.89603
+5779,2.6705117,201.74182
+5780,4.017743,249.402
+5781,1.8057181,105.189575
+5782,2.5868895,144.06831
+5783,2.5835843,162.14255
+5784,3.5098424,235.00636
+5785,2.6679828,187.21957
+5786,2.5219073,193.4916
+5787,2.9163,223.85309
+5788,2.2688582,105.582855
+5789,3.6945071,240.7052
+5790,2.4045444,151.79735
+5791,1.3610511,85.02908
+5792,2.0179014,110.469604
+5793,2.193603,109.079346
+5794,1.856518,108.53061
+5795,1.4659041,85.2948
+5796,1.8753588,141.01257
+5797,2.0833073,165.2546
+5798,2.731327,173.71585
+5799,3.591062,217.24683
+5800,2.8024452,208.0482
+5801,1.2370409,79.83917
+5802,2.414886,126.970566
+5803,2.8583531,213.33171
+5804,3.4652324,230.78072
+5805,2.6333232,154.58575
+5806,2.4791012,185.89246
+5807,2.3160205,165.61966
+5808,2.4866035,103.15522
+5809,1.7349265,109.33334
+5810,2.5092762,155.94504
+5811,3.1774173,212.87947
+5812,3.1512473,235.55487
+5813,2.3036113,139.61853
+5814,2.1708148,128.63731
+5815,2.786251,202.70921
+5816,2.506789,170.40987
+5817,3.7181237,238.61021
+5818,2.946159,210.26752
+5819,3.2423754,204.49734
+5820,4.032859,249.21487
+5821,2.5921023,168.59497
+5822,3.5701802,245.32622
+5823,2.0935688,142.27704
+5824,1.8850279,129.23312
+5825,2.5805418,157.99689
+5826,3.555798,220.64839
+5827,2.1186252,117.528534
+5828,2.1000698,147.32135
+5829,4.465731,251.83257
+5830,2.156813,123.31739
+5831,2.0006006,122.75481
+5832,2.1495328,134.08807
+5833,1.3654459,80.429474
+5834,2.7982917,179.76793
+5835,2.4283931,191.91342
+5836,3.0503023,174.123
+5837,2.479097,166.58104
+5838,1.367194,72.67218
+5839,1.1890895,72.33487
+5840,2.4864442,143.52843
+5841,2.178454,152.02747
+5842,3.009672,190.42249
+5843,3.2524436,233.43228
+5844,3.461883,242.69162
+5845,2.5949388,181.65231
+5846,2.3387876,110.73585
+5847,2.227615,160.2972
+5848,3.4560714,222.34637
+5849,2.332992,103.84363
+5850,1.7335775,109.09612
+5851,1.8958901,110.06268
+5852,1.3521103,82.459366
+5853,3.3960552,230.61125
+5854,2.5351834,170.28752
+5855,2.752434,171.73988
+5856,3.8362985,247.83789
+5857,1.7920964,131.01389
+5858,1.885106,137.93573
+5859,4.11333,249.29898
+5860,1.9692833,106.05147
+5861,1.7511265,104.43553
+5862,1.8806666,97.89502
+5863,2.4220414,168.52104
+5864,2.309235,141.37332
+5865,2.4702446,186.8637
+5866,3.3634746,217.9547
+5867,3.4609654,188.07733
+5868,2.1743867,117.3943
+5869,2.9955869,212.85994
+5870,2.2790372,120.32317
+5871,2.3827286,172.97435
+5872,1.8126131,83.0213
+5873,1.6803339,91.360825
+5874,1.9680426,105.76819
+5875,1.8746771,92.41879
+5876,2.3795352,153.61453
+5877,3.437376,239.24628
+5878,3.1540709,171.1223
+5879,2.3891017,174.08105
+5880,1.101685,70.44453
+5881,2.1920495,145.13449
+5882,3.1355376,198.59946
+5883,2.0622048,117.760735
+5884,2.1491203,104.06218
+5885,2.7458453,178.76416
+5886,2.9931052,219.55362
+5887,2.6540196,181.25388
+5888,3.2852263,225.71701
+5889,2.2484126,97.51755
+5890,2.2275987,153.90106
+5891,2.4059765,148.2125
+5892,2.0028188,110.95789
+5893,3.346376,236.17601
+5894,4.953388,252.74414
+5895,2.3500226,138.77304
+5896,2.3118017,91.67979
+5897,3.1528049,186.65472
+5898,2.2302635,137.6441
+5899,2.4760592,149.25623
+5900,1.7151467,94.9261
+5901,2.0958905,89.32758
+5902,1.6862679,96.6873
+5903,2.5831246,177.16907
+5904,3.548244,240.16975
+5905,2.9306052,196.28589
+5906,1.8270353,97.1962
+5907,5.1573477,253.2879
+5908,2.1754959,118.809265
+5909,3.5206752,233.92131
+5910,1.456524,77.665375
+5911,2.5966353,177.25325
+5912,2.2216156,156.53842
+5913,2.0451913,131.77814
+5914,2.1783643,155.22151
+5915,3.765683,242.42445
+5916,2.7926893,203.2878
+5917,3.280573,186.77516
+5918,1.743736,106.03946
+5919,2.9143844,154.53711
+5920,2.1795843,146.97269
+5921,2.5752547,198.7555
+5922,2.9939709,207.63385
+5923,3.3483348,203.54326
+5924,2.877081,199.89937
+5925,2.349744,176.46153
+5926,2.3722742,160.53911
+5927,2.3136156,200.5094
+5928,3.0341387,213.7505
+5929,1.6694454,78.55446
+5930,2.0449781,110.46063
+5931,2.0885088,114.80609
+5932,2.9435058,199.36922
+5933,1.6289086,89.8427
+5934,1.8179564,87.725204
+5935,2.9211557,191.36816
+5936,1.8387554,74.248924
+5937,3.545266,227.87918
+5938,2.2720315,111.540794
+5939,2.4192178,128.10397
+5940,3.002538,209.8449
+5941,2.2407928,103.72803
+5942,1.3259823,74.192215
+5943,3.4940944,228.26106
+5944,3.801651,238.9773
+5945,2.1760316,112.27701
+5946,2.3018613,164.07175
+5947,2.0009944,97.42459
+5948,2.70606,190.69461
+5949,2.4550521,138.9851
+5950,3.5686936,227.91412
+5951,2.9238224,217.19455
+5952,3.5370576,231.24889
+5953,2.4633293,169.76758
+5954,2.1808372,103.80866
+5955,2.5759125,186.7396
+5956,2.6802647,172.889
+5957,3.045056,201.66693
+5958,1.5004607,83.77829
+5959,1.4338337,78.71294
+5960,2.3928905,138.28137
+5961,1.8600234,101.39731
+5962,2.551038,155.95961
+5963,2.818447,194.90773
+5964,3.358317,232.05397
+5965,3.1896758,173.90735
+5966,3.4042723,237.40105
+5967,3.1095786,178.44485
+5968,3.023205,208.67859
+5969,3.170695,212.02318
+5970,2.2589288,148.00691
+5971,3.0315003,238.33151
+5972,2.808449,169.02808
+5973,1.7968801,113.897385
+5974,3.0667343,231.02354
+5975,2.7607222,165.16963
+5976,2.5544899,151.39061
+5977,2.6350965,170.39969
+5978,3.1674695,236.29752
+5979,1.1379479,69.76777
+5980,2.1218808,102.41835
+5981,4.268712,248.09921
+5982,2.1300218,107.77666
+5983,1.4163893,77.46934
+5984,2.3230958,134.75294
+5985,1.7491444,97.859024
+5986,1.9996885,102.621666
+5987,1.9260918,126.55743
+5988,2.481974,168.15019
+5989,4.0742474,246.33318
+5990,1.7613323,105.72797
+5991,2.3263862,118.6158
+5992,1.8845346,95.93727
+5993,1.5964473,103.54776
+5994,2.4293072,121.32825
+5995,2.8868916,166.99522
+5996,2.4754744,148.65723
+5997,2.3980443,130.56622
+5998,2.3145747,114.09666
+5999,1.9211757,94.37823
+6000,2.2176087,100.2115
+6001,2.2446752,143.02928
+6002,2.352855,133.36888
+6003,2.1162841,132.33047
+6004,1.9741197,106.82655
+6005,2.2666335,169.08977
+6006,1.8819993,105.113396
+6007,3.9189281,230.09702
+6008,3.7303329,238.15851
+6009,3.47009,236.3689
+6010,2.5146701,152.97128
+6011,2.2529817,151.61847
+6012,3.2729926,229.19092
+6013,2.8950872,181.9276
+6014,1.8762343,111.050964
+6015,2.340631,126.976395
+6016,2.7554119,192.4007
+6017,1.2278279,73.61963
+6018,2.650972,203.95782
+6019,2.830239,228.2723
+6020,2.5870233,185.698
+6021,2.7846901,171.6302
+6022,3.092117,181.4603
+6023,1.621072,95.44762
+6024,2.3752239,129.26259
+6025,1.9137825,98.88504
+6026,1.8837695,91.54738
+6027,2.7721655,206.24696
+6028,2.1339736,122.35028
+6029,3.4297843,232.26273
+6030,2.0167742,107.75605
+6031,3.2176564,225.52058
+6032,2.322453,134.1163
+6033,2.074586,144.06161
+6034,3.8026147,243.23984
+6035,2.7854018,162.05304
+6036,3.151155,188.7886
+6037,2.7688165,202.00587
+6038,1.5446532,130.71196
+6039,3.0365024,206.55244
+6040,2.7368524,164.29385
+6041,3.8645692,244.39241
+6042,2.2013373,137.15152
+6043,2.8405557,219.95891
+6044,2.8266735,202.2445
+6045,1.5196363,91.10196
+6046,3.4513006,234.32974
+6047,2.054514,99.78912
+6048,2.1469865,123.2526
+6049,2.0743866,160.63583
+6050,1.5789299,90.825935
+6051,2.5158794,157.73354
+6052,1.8499273,120.22977
+6053,2.6406884,151.04088
+6054,2.979712,212.96571
+6055,2.6790414,168.90225
+6056,1.8390917,84.20068
+6057,3.6059701,248.53883
+6058,3.2438638,211.17848
+6059,1.9732895,95.55549
+6060,2.9120831,189.50552
+6061,2.1749806,145.15875
+6062,1.6523197,107.24808
+6063,2.467064,150.74445
+6064,2.7139933,184.12878
+6065,3.4385018,232.79526
+6066,1.5527146,92.72154
+6067,1.9758611,111.18652
+6068,3.506916,228.35013
+6069,3.1796725,209.79579
+6070,1.9164009,134.58255
+6071,2.3014247,119.05104
+6072,1.7992284,98.69716
+6073,2.3654916,106.06203
+6074,2.7289174,197.52522
+6075,2.8029196,183.86502
+6076,2.229916,126.49466
+6077,2.787078,201.2582
+6078,2.2929661,153.43033
+6079,3.690909,244.07033
+6080,1.7250686,92.71838
+6081,2.0322313,122.44023
+6082,3.1137528,208.807
+6083,2.7464652,207.83897
+6084,2.3577244,151.87973
+6085,2.1065884,104.51009
+6086,2.5931745,145.78108
+6087,2.144372,144.79156
+6088,2.8398747,211.2218
+6089,1.7664527,94.19854
+6090,2.869171,220.44707
+6091,2.0525453,133.76207
+6092,2.760445,176.8591
+6093,2.80132,192.02737
+6094,2.5523133,178.78922
+6095,2.0614734,137.52484
+6096,3.320574,235.64085
+6097,2.878921,225.9505
+6098,2.4003308,127.82717
+6099,2.4355044,148.87515
+6100,1.95207,141.45016
+6101,2.5548534,155.59634
+6102,3.1298175,220.83954
+6103,2.4459445,168.82999
+6104,2.19407,178.59253
+6105,2.4034855,127.25106
+6106,1.8884151,102.775955
+6107,1.7047945,94.12795
+6108,1.435433,79.6207
+6109,4.384925,251.11505
+6110,3.7783947,245.60802
+6111,3.248504,207.06229
+6112,1.5235598,92.44923
+6113,2.1187885,113.96887
+6114,2.6205523,199.43143
+6115,2.2265368,117.33374
+6116,2.797135,187.9697
+6117,2.5438442,149.04355
+6118,1.624905,77.71126
+6119,3.136031,204.48999
+6120,1.6763896,97.98509
+6121,3.6010473,218.13362
+6122,2.7186809,192.98174
+6123,3.230642,218.6623
+6124,2.6951623,198.91818
+6125,2.7452521,165.54053
+6126,2.5842488,170.62457
+6127,2.1499279,135.0895
+6128,2.0761905,112.37326
+6129,2.2272716,133.9012
+6130,2.0718346,160.32529
+6131,2.168972,122.026596
+6132,2.5397222,160.52835
+6133,2.8771534,194.71628
+6134,4.4814634,252.85353
+6135,1.8799664,101.04665
+6136,2.202095,174.71442
+6137,2.855106,183.33954
+6138,1.9380783,98.1232
+6139,1.5875204,89.03943
+6140,2.283143,157.00629
+6141,2.1675363,129.56317
+6142,2.1393428,112.98714
+6143,3.8931186,242.19112
+6144,3.2549036,207.57784
+6145,2.2033722,104.71716
+6146,2.0066931,141.90662
+6147,2.0582414,150.14175
+6148,2.3058438,99.788605
+6149,3.3008583,227.86636
+6150,2.6634588,195.13167
+6151,3.293445,227.05185
+6152,2.46864,162.63374
+6153,2.140326,130.56363
+6154,2.1464918,156.1787
+6155,2.2189355,119.13255
+6156,2.6919131,173.89911
+6157,2.6993442,180.85507
+6158,3.473832,231.78766
+6159,2.5640597,121.14582
+6160,1.8355933,85.53822
+6161,2.3605895,136.53436
+6162,1.9615848,114.07486
+6163,1.6818445,79.88043
+6164,3.300901,226.44958
+6165,2.2383335,163.61371
+6166,1.8315619,124.1709
+6167,2.5675173,185.56644
+6168,2.254457,127.861404
+6169,2.6693563,163.75136
+6170,1.48895,80.146515
+6171,4.2483735,250.66414
+6172,3.3768291,234.74973
+6173,3.2282043,212.4975
+6174,2.5424516,166.19861
+6175,2.6077142,169.99103
+6176,2.2167253,141.51427
+6177,1.7641935,113.3391
+6178,2.473776,156.13722
+6179,3.513275,223.04991
+6180,2.1751306,119.43646
+6181,2.0284023,100.4877
+6182,3.0678113,166.19447
+6183,2.3601801,139.92642
+6184,2.2247522,121.02499
+6185,2.6426435,178.0857
+6186,1.9064403,90.57507
+6187,1.8785591,97.223434
+6188,3.4238098,224.9962
+6189,2.3212943,114.20499
+6190,2.1287951,100.11107
+6191,2.625966,171.24178
+6192,1.3046058,82.426865
+6193,2.8096268,166.6367
+6194,3.7897122,239.67555
+6195,2.827174,208.5285
+6196,2.4791474,159.44629
+6197,1.9706733,128.98758
+6198,2.6505904,193.58083
+6199,1.3472307,78.65291
+6200,1.4726956,82.80271
+6201,2.1159472,113.800964
+6202,2.0460181,134.90974
+6203,2.6100783,194.5302
+6204,2.3254776,153.01747
+6205,2.743765,193.61383
+6206,2.4714723,175.13406
+6207,2.1960807,153.00421
+6208,2.8189094,191.77792
+6209,2.4445114,130.46823
+6210,2.4953105,161.08241
+6211,1.8053657,108.97155
+6212,2.5848088,165.89268
+6213,1.8531191,89.76584
+6214,2.7877467,187.1377
+6215,2.5445712,154.85545
+6216,2.408001,155.53233
+6217,3.2353594,189.84319
+6218,3.057344,207.27397
+6219,3.1674721,194.44064
+6220,2.572641,196.22003
+6221,2.891355,167.86879
+6222,2.4463186,172.75073
+6223,1.8527286,103.14603
+6224,3.8396003,238.95955
+6225,2.9535184,166.89694
+6226,3.5685172,238.59305
+6227,4.6045675,252.78511
+6228,1.799934,98.71097
+6229,2.9668553,221.65129
+6230,2.3498335,126.9281
+6231,3.2429168,226.52457
+6232,1.7455139,96.75057
+6233,2.140148,117.1826
+6234,2.2121797,112.50979
+6235,2.078444,144.88861
+6236,2.7143743,205.17032
+6237,1.7369697,92.76905
+6238,2.6122558,159.02344
+6239,3.2680998,217.035
+6240,2.7897758,144.49991
+6241,3.4935555,239.40486
+6242,1.7126772,117.08835
+6243,2.8894286,216.89583
+6244,2.4599268,143.61679
+6245,2.149275,131.75447
+6246,2.1121635,180.88547
+6247,2.3444788,133.79715
+6248,2.1074886,128.20712
+6249,2.5346735,164.80948
+6250,2.052412,95.70621
+6251,2.3049324,108.33356
+6252,2.6087654,175.98642
+6253,2.1084447,101.44979
+6254,2.1345778,144.72012
+6255,2.9834654,194.84653
+6256,1.9757806,109.14673
+6257,3.0312154,192.1083
+6258,2.472703,178.04945
+6259,1.6832429,113.282166
+6260,2.0398617,129.55745
+6261,2.0870206,127.537384
+6262,2.468333,150.90295
+6263,1.6568949,103.46395
+6264,3.0928953,224.84752
+6265,2.2313871,93.88914
+6266,2.0035357,160.5344
+6267,2.754663,194.57155
+6268,2.1041992,113.470695
+6269,3.4983573,233.6223
+6270,2.2040544,93.47693
+6271,3.0188818,209.35454
+6272,2.6222951,182.03497
+6273,3.6016958,240.86745
+6274,2.6941686,197.6363
+6275,2.1981392,113.23004
+6276,2.3162303,151.19046
+6277,2.819606,221.97705
+6278,3.6141994,239.95677
+6279,2.0848646,106.27782
+6280,4.15135,248.59944
+6281,2.2303262,149.46121
+6282,1.8594841,113.66882
+6283,2.7256026,184.02039
+6284,2.9770799,196.10384
+6285,1.1064484,76.811806
+6286,1.7114671,112.59038
+6287,4.41018,253.15726
+6288,2.7200372,143.10394
+6289,3.0580893,229.04623
+6290,3.0649881,166.93578
+6291,2.4741807,157.88367
+6292,2.848412,185.50397
+6293,3.0811856,214.66832
+6294,2.551296,143.45541
+6295,1.6244423,104.2742
+6296,1.6713153,94.32134
+6297,2.2504482,136.82864
+6298,3.7806938,227.76042
+6299,3.6045117,237.2281
+6300,1.9510278,135.09052
+6301,3.0268734,188.90604
+6302,3.015246,190.75505
+6303,3.068277,199.00096
+6304,2.7446847,166.0172
+6305,3.755586,249.50203
+6306,1.3837187,75.962746
+6307,3.1709569,222.56688
+6308,2.3231444,143.32652
+6309,2.919681,199.87825
+6310,1.4796791,100.127815
+6311,2.0561476,118.05135
+6312,4.1397114,251.33995
+6313,2.1187205,119.072784
+6314,2.722688,150.5687
+6315,2.6352115,170.10934
+6316,2.8632038,210.14772
+6317,2.9665933,204.09044
+6318,2.7298229,162.56018
+6319,2.5659256,165.69698
+6320,2.239111,140.82828
+6321,2.1124997,132.32484
+6322,1.8508861,103.50166
+6323,2.295437,184.8995
+6324,2.0027778,137.30582
+6325,1.6640251,116.8465
+6326,1.4422561,89.945885
+6327,2.6816819,143.07986
+6328,2.545144,108.46557
+6329,2.5979676,209.26779
+6330,2.488801,141.02728
+6331,2.3170207,115.38943
+6332,2.1079426,108.76996
+6333,3.0109518,210.94208
+6334,2.1857953,107.05316
+6335,1.4738514,76.80185
+6336,2.2667327,168.5863
+6337,2.7600303,205.14932
+6338,3.0636628,193.2459
+6339,2.6316733,140.16702
+6340,2.3992438,120.434746
+6341,2.8914847,211.90677
+6342,2.3927093,169.90079
+6343,2.5909564,220.70642
+6344,2.4324493,154.9537
+6345,2.8357768,210.80656
+6346,2.6050274,171.0588
+6347,1.968904,93.00531
+6348,1.8465558,92.64125
+6349,4.845706,252.73509
+6350,2.83112,171.25906
+6351,2.6176825,164.624
+6352,3.609413,222.64937
+6353,1.4162284,80.62253
+6354,3.2741785,226.74796
+6355,2.855029,183.25041
+6356,2.091964,132.49344
+6357,2.1972227,98.88362
+6358,1.805122,106.62341
+6359,2.5823655,151.86505
+6360,1.8012908,96.33359
+6361,2.006163,150.8638
+6362,1.533134,93.12023
+6363,2.7483816,170.83664
+6364,1.2792821,81.01399
+6365,3.2629662,229.62177
+6366,2.144199,129.9389
+6367,4.0904794,241.53815
+6368,2.241321,124.87842
+6369,1.6664951,91.742645
+6370,2.2086842,112.07085
+6371,2.847375,202.97386
+6372,1.7434314,98.0965
+6373,3.9943497,244.6326
+6374,1.9003403,109.44998
+6375,2.8120263,167.67987
+6376,2.6843607,176.32541
+6377,2.4670038,173.46143
+6378,2.6682973,189.54124
+6379,1.9100963,125.98303
+6380,2.5927508,200.68619
+6381,1.7167332,101.027725
+6382,2.2860994,108.58969
+6383,2.141978,147.25018
+6384,1.8408211,104.89624
+6385,2.5970716,147.70935
+6386,2.1640077,135.6291
+6387,2.797277,184.31024
+6388,1.8769313,94.464096
+6389,3.0904977,208.24965
+6390,3.8303676,246.15518
+6391,3.340006,221.79044
+6392,3.2217345,209.69434
+6393,2.1298735,156.49542
+6394,2.4101079,150.0723
+6395,4.1591854,245.52185
+6396,2.2177193,98.13031
+6397,1.7977874,102.94142
+6398,2.351708,146.416
+6399,1.8141296,150.47668
+6400,2.4712877,176.27155
+6401,1.4067533,99.066666
+6402,2.8209758,179.3147
+6403,1.5075616,81.7182
+6404,2.628552,173.45267
+6405,2.5104275,148.42926
+6406,1.9101789,119.82864
+6407,2.2662663,158.8417
+6408,1.9813436,107.99017
+6409,1.8493783,114.62718
+6410,2.570228,194.0765
+6411,2.5494123,187.6553
+6412,3.1191857,231.55705
+6413,1.8232625,110.83482
+6414,2.4137723,131.56384
+6415,2.0722656,122.47293
+6416,1.4336973,82.92448
+6417,3.4964855,233.75746
+6418,1.9259837,133.7493
+6419,2.1897993,130.87848
+6420,2.2588398,174.84975
+6421,1.9159527,111.74109
+6422,2.6205628,191.24979
+6423,2.3306632,147.15143
+6424,2.2384114,172.0553
+6425,3.7512798,244.70827
+6426,2.2742643,136.03418
+6427,4.073026,249.58542
+6428,2.4862838,140.7248
+6429,2.7782412,169.22488
+6430,1.9843299,95.58375
+6431,2.9347515,191.55243
+6432,2.221379,140.06406
+6433,3.016323,225.6624
+6434,4.29894,251.589
+6435,2.4047875,125.15918
+6436,3.7184608,245.2245
+6437,2.6797688,186.90335
+6438,2.765318,145.25067
+6439,3.1184022,215.14388
+6440,1.7070981,115.89688
+6441,2.7373908,176.66098
+6442,2.9275439,189.37172
+6443,2.0375526,123.21431
+6444,1.5691601,108.13248
+6445,1.5611387,88.98986
+6446,3.2877991,215.92708
+6447,1.7060983,85.853195
+6448,4.443095,249.08243
+6449,2.5363488,178.67322
+6450,2.9568381,210.86131
+6451,1.9411752,112.52074
+6452,2.4955623,140.87036
+6453,2.512469,129.21448
+6454,2.5547526,147.49231
+6455,1.1809053,77.792336
+6456,1.6293665,96.37659
+6457,2.9285007,193.7194
+6458,2.7108958,165.76031
+6459,2.4950888,127.43056
+6460,1.8478858,81.42981
+6461,3.3162954,224.44753
+6462,3.0733912,211.20517
+6463,2.835665,183.91116
+6464,1.9385209,85.78875
+6465,2.0483508,119.96987
+6466,2.4059176,165.7634
+6467,3.602185,230.92017
+6468,1.7890749,88.71999
+6469,2.4738562,168.16922
+6470,3.418066,195.08647
+6471,2.0544822,144.66068
+6472,2.4074154,119.42774
+6473,3.5308692,209.24501
+6474,3.661316,228.88657
+6475,2.6972384,188.55719
+6476,2.1995423,150.80988
+6477,2.9695475,222.94261
+6478,2.0380554,115.57831
+6479,2.915055,212.73784
+6480,2.6132665,146.91382
+6481,2.9775367,165.6654
+6482,2.7462125,192.28685
+6483,1.678796,106.02896
+6484,3.1654441,227.33173
+6485,3.1655457,211.03053
+6486,1.8325027,89.902596
+6487,4.083479,234.42719
+6488,2.9326186,184.46263
+6489,2.7742658,191.03876
+6490,2.9286895,176.39502
+6491,2.413264,133.6719
+6492,3.3388839,220.02005
+6493,1.8119812,100.6682
+6494,2.1628985,151.70303
+6495,2.3580146,179.6074
+6496,2.6316102,189.43521
+6497,2.5856564,128.01947
+6498,3.2272525,227.52486
+6499,2.7319708,184.60854
+6500,1.7851015,81.02037
+6501,2.8417645,175.40196
+6502,2.3277593,211.96054
+6503,1.8173815,87.234085
+6504,2.5979364,142.50787
+6505,1.9378608,103.79071
+6506,1.6650807,91.54623
+6507,1.5677584,84.13337
+6508,2.83462,189.5871
+6509,3.127832,174.21046
+6510,3.2434802,229.18484
+6511,2.9107828,184.73383
+6512,2.1589208,119.06669
+6513,3.0340858,204.77145
+6514,2.7220187,208.57555
+6515,2.1397192,133.65459
+6516,2.6088798,162.2876
+6517,2.100438,122.77167
+6518,1.881209,101.14308
+6519,3.4367542,234.5815
+6520,2.1390157,97.72638
+6521,2.3589458,138.23755
+6522,1.9877136,147.37706
+6523,2.1956651,108.755
+6524,1.4920638,94.95331
+6525,2.10508,115.7171
+6526,3.4868815,212.47304
+6527,1.8381016,128.82756
+6528,1.2791688,92.31476
+6529,1.9979893,106.18773
+6530,2.0748067,123.63568
+6531,3.524511,234.52045
+6532,2.4623754,145.50381
+6533,4.887143,252.85675
+6534,3.4325187,226.55457
+6535,2.4928913,182.06189
+6536,2.578447,140.77101
+6537,2.071117,98.26075
+6538,2.3901477,162.70825
+6539,2.6327205,203.26816
+6540,3.5796247,228.90674
+6541,3.0992165,223.89691
+6542,2.5801537,167.31802
+6543,2.940973,175.24696
+6544,1.9641701,97.46057
+6545,1.8187668,84.75952
+6546,2.4710038,144.80984
+6547,3.2871084,201.8938
+6548,2.680522,187.87143
+6549,3.5134158,238.53511
+6550,3.4718547,241.47876
+6551,3.1020784,196.39618
+6552,2.455509,174.00233
+6553,2.5659604,175.02655
+6554,3.3141046,203.85052
+6555,2.1725764,111.13607
+6556,2.6333737,134.23703
+6557,2.6130733,177.56195
+6558,2.7470968,179.17734
+6559,2.7740054,217.48994
+6560,2.0564356,103.29895
+6561,2.55086,170.61353
+6562,2.0461688,142.23392
+6563,2.7475266,166.57925
+6564,3.1709313,184.93527
+6565,2.5028503,136.85678
+6566,1.8764215,86.10741
+6567,2.2687116,110.56581
+6568,2.7389688,146.66788
+6569,2.652558,144.41487
+6570,1.8197536,104.894714
+6571,1.868562,115.2913
+6572,3.1578012,228.57613
+6573,2.9012086,208.4004
+6574,2.6502523,174.4013
+6575,1.5680895,115.76974
+6576,3.0240383,223.67892
+6577,2.051273,118.152794
+6578,2.5283885,172.0667
+6579,2.6824827,214.83257
+6580,1.4414976,78.328575
+6581,1.6191308,78.70223
+6582,3.6093993,245.05267
+6583,2.9669006,193.44284
+6584,3.31673,231.34918
+6585,2.4140825,136.95578
+6586,2.2820308,137.7927
+6587,3.2184691,196.46524
+6588,3.2069526,221.09459
+6589,1.932418,88.60475
+6590,2.495881,150.43924
+6591,2.194874,148.41869
+6592,1.8790452,102.02893
+6593,1.8991855,128.81166
+6594,2.3750901,153.46448
+6595,2.2343574,147.62292
+6596,1.7477975,89.013626
+6597,1.222647,73.14205
+6598,2.0685244,115.32887
+6599,2.8141806,214.09357
+6600,3.118452,225.80847
+6601,2.596059,125.39171
+6602,2.519035,173.79527
+6603,2.502671,183.51782
+6604,2.678606,163.26883
+6605,2.6009653,210.0901
+6606,2.3859043,126.159836
+6607,2.5016277,156.75446
+6608,3.0652325,170.66943
+6609,2.183634,146.629
+6610,2.1144738,102.48636
+6611,3.686006,243.04994
+6612,1.9547968,133.09036
+6613,2.314788,167.24673
+6614,2.0334983,118.471695
+6615,2.6455712,190.52423
+6616,1.6038673,91.39889
+6617,1.7756567,84.68643
+6618,2.615421,154.88013
+6619,2.5041907,179.43549
+6620,2.188082,127.10318
+6621,3.007001,221.03442
+6622,2.7253134,197.49426
+6623,1.3946955,105.6678
+6624,2.9739757,201.67052
+6625,1.9032352,82.9388
+6626,1.7432135,84.41948
+6627,2.1559377,94.09588
+6628,3.0262673,181.10735
+6629,2.0910134,151.12668
+6630,2.988952,165.10391
+6631,2.266676,134.30016
+6632,3.444266,239.43887
+6633,2.910839,209.64769
+6634,3.491473,238.81252
+6635,2.154142,120.876785
+6636,2.2893426,147.01645
+6637,3.786068,234.21736
+6638,2.7170486,156.89725
+6639,3.5548189,204.43474
+6640,2.2857323,174.11139
+6641,3.0284114,225.92772
+6642,2.2214034,102.85547
+6643,1.4674518,92.824875
+6644,3.6676266,232.788
+6645,2.438731,110.3736
+6646,2.4468374,160.8265
+6647,2.6446016,194.60796
+6648,2.6256196,179.6944
+6649,3.3078108,208.33133
+6650,2.3522086,101.238754
+6651,2.3941872,111.17505
+6652,1.2753628,89.805725
+6653,2.4622726,173.09375
+6654,2.6494937,166.29126
+6655,1.483171,78.177635
+6656,1.7236979,85.10305
+6657,2.6167111,214.7521
+6658,2.0410895,139.65839
+6659,2.1713214,151.80255
+6660,1.9980032,104.056114
+6661,2.2257113,178.90544
+6662,1.8430316,105.52998
+6663,1.8917694,118.277695
+6664,1.4768732,77.692
+6665,2.0681756,135.75606
+6666,2.0932002,138.44904
+6667,1.9537599,113.12262
+6668,2.2508209,188.4801
+6669,4.62247,252.66978
+6670,2.1759303,128.01472
+6671,2.1300263,136.97293
+6672,1.8524834,95.92729
+6673,3.1736217,195.76683
+6674,2.200253,119.329636
+6675,2.0325208,130.38657
+6676,2.527708,168.89609
+6677,3.768853,226.38011
+6678,2.143144,154.24435
+6679,2.0109465,107.10237
+6680,2.6617951,139.92932
+6681,2.281691,148.50905
+6682,4.3061037,251.17703
+6683,4.3872743,251.21762
+6684,1.4092383,79.8315
+6685,1.9422342,145.24344
+6686,1.7456629,114.94089
+6687,2.9695582,176.45349
+6688,4.0444365,233.36626
+6689,2.531872,171.76445
+6690,1.5121701,75.84735
+6691,2.7079387,189.44171
+6692,2.6138954,171.39273
+6693,2.3473334,169.34038
+6694,2.6274526,96.34118
+6695,2.0515053,125.861465
+6696,1.8752718,108.953964
+6697,2.3929527,196.07678
+6698,2.4847667,168.21655
+6699,2.8922725,170.50237
+6700,2.821432,139.66714
+6701,4.497184,251.37723
+6702,1.8630946,105.63663
+6703,1.8697776,92.29068
+6704,2.3519523,156.67169
+6705,2.2794127,120.38522
+6706,2.584915,192.24559
+6707,2.4466846,179.82147
+6708,2.249905,152.58766
+6709,1.7431349,82.21113
+6710,2.6331022,143.43846
+6711,2.3920257,139.24939
+6712,2.254383,135.28568
+6713,2.7905138,164.10947
+6714,2.4202619,201.54991
+6715,2.359217,151.92627
+6716,3.1714554,199.53156
+6717,2.6106434,171.3164
+6718,2.8133569,194.56544
+6719,2.822798,204.09756
+6720,2.771892,204.12386
+6721,2.6601865,158.83746
+6722,2.600667,190.06293
+6723,2.7978435,183.52982
+6724,1.9663237,129.29736
+6725,4.4837465,252.58647
+6726,2.3912158,150.35489
+6727,2.17458,117.73872
+6728,4.174363,243.91058
+6729,2.1928618,140.2799
+6730,2.303405,169.5975
+6731,2.650599,170.42372
+6732,2.1220345,141.13745
+6733,2.9577677,204.52278
+6734,2.6519613,216.73415
+6735,3.1324098,179.31216
+6736,2.6900628,180.26813
+6737,2.5030804,183.6937
+6738,2.367892,113.38307
+6739,1.5764217,85.943436
+6740,2.0330534,117.229614
+6741,2.4283843,115.16152
+6742,2.140615,145.34204
+6743,3.5909345,237.56721
+6744,1.6850765,120.63864
+6745,2.650442,191.98364
+6746,2.6971369,191.52277
+6747,3.2591722,227.93636
+6748,2.882281,168.55078
+6749,2.5754359,175.32587
+6750,2.8117423,148.39003
+6751,1.3646075,86.986176
+6752,3.5833526,239.09697
+6753,1.600076,93.02868
+6754,1.570906,113.09667
+6755,1.8917463,101.22127
+6756,2.8274455,186.70691
+6757,2.4516923,137.41306
+6758,2.4092603,145.30942
+6759,2.1747644,139.15704
+6760,2.1134286,122.8221
+6761,2.1764803,137.46321
+6762,1.8231665,126.49318
+6763,2.4756305,152.45044
+6764,2.6100335,164.60593
+6765,2.278973,129.77408
+6766,3.015183,225.25299
+6767,4.299424,249.27617
+6768,2.8730059,172.64062
+6769,2.5761943,177.74036
+6770,1.6951826,105.44229
+6771,3.0133939,204.70442
+6772,2.7174306,159.79884
+6773,3.203322,234.03792
+6774,2.1707284,137.02803
+6775,2.023953,131.50241
+6776,3.6952078,232.45184
+6777,2.3911853,141.03648
+6778,1.7355756,94.1571
+6779,2.6434665,196.92155
+6780,2.2075806,154.86348
+6781,2.4094837,173.889
+6782,1.9239571,129.1022
+6783,2.4355242,169.36841
+6784,2.7412388,167.18193
+6785,1.5851926,126.080536
+6786,1.9397165,113.046745
+6787,2.8071764,173.20886
+6788,2.9259324,190.81015
+6789,2.705674,169.97133
+6790,2.8870912,199.46953
+6791,1.7776818,100.19682
+6792,2.3495915,130.23514
+6793,1.5737512,90.77234
+6794,2.1282191,161.93793
+6795,2.0391695,116.058205
+6796,3.30977,219.22536
+6797,1.4788039,71.07186
+6798,2.930738,220.55345
+6799,1.9082699,98.21988
+6800,2.1968007,126.77365
+6801,2.8276744,193.65555
+6802,2.6579463,175.33646
+6803,2.1269662,102.18295
+6804,2.3552613,128.86023
+6805,2.1867967,106.46578
+6806,1.3853922,82.57028
+6807,2.423035,152.56833
+6808,3.0313287,166.22128
+6809,3.1653156,219.94922
+6810,2.6577487,166.57018
+6811,2.7869306,163.16147
+6812,2.8895242,152.32907
+6813,2.0589514,114.62402
+6814,3.478332,242.39224
+6815,2.7148182,193.60188
+6816,2.2777843,128.43005
+6817,3.7731342,245.5512
+6818,2.1486874,122.48349
+6819,2.3801544,163.77077
+6820,2.2411344,151.7385
+6821,2.5723023,199.17383
+6822,1.6970421,121.320435
+6823,1.7683222,105.99222
+6824,2.1362596,119.01619
+6825,2.7949157,216.8291
+6826,2.801785,200.97762
+6827,3.6876493,238.17279
+6828,2.2707047,160.34349
+6829,2.8405566,205.42863
+6830,2.7283494,185.13696
+6831,2.9350996,188.33446
+6832,2.4566011,153.53781
+6833,3.8634715,249.24667
+6834,2.2935672,170.66751
+6835,3.9431815,245.9462
+6836,2.3655202,160.78647
+6837,2.886474,195.37329
+6838,3.4304824,235.65822
+6839,2.6952155,156.05765
+6840,2.0181615,127.42699
+6841,2.3758626,141.32996
+6842,2.373719,108.16184
+6843,2.7211003,195.69148
+6844,1.9993209,128.98476
+6845,2.747718,208.71957
+6846,2.5605025,126.24866
+6847,2.2925634,133.19852
+6848,2.1794033,168.18033
+6849,2.212624,172.53651
+6850,3.3725324,229.54886
+6851,3.4517617,240.59592
+6852,2.4482586,122.26271
+6853,1.8800731,93.6064
+6854,1.7007972,98.528015
+6855,2.407348,143.54736
+6856,1.8442888,96.18065
+6857,2.4861338,149.17026
+6858,2.3597705,163.98895
+6859,3.011824,229.42569
+6860,3.2365205,233.439
+6861,1.8728018,109.19857
+6862,1.9610795,114.39702
+6863,1.7598375,99.16409
+6864,2.378336,135.86685
+6865,3.6847436,247.33644
+6866,2.1865442,140.65312
+6867,4.0941796,249.64536
+6868,3.3445737,202.30374
+6869,2.601494,132.9091
+6870,2.8417115,189.63095
+6871,1.730225,108.44643
+6872,3.3971038,239.69296
+6873,2.9205909,230.73264
+6874,2.1744823,141.23807
+6875,2.5602717,146.6888
+6876,2.0886734,107.80048
+6877,1.6842921,101.0777
+6878,3.6813393,233.6392
+6879,2.6253836,154.70403
+6880,2.5142894,187.73074
+6881,1.811364,95.46221
+6882,3.50623,242.83762
+6883,2.648126,130.64839
+6884,3.8951926,247.82556
+6885,2.2397535,165.58904
+6886,2.4023445,172.22015
+6887,2.5909119,186.96002
+6888,1.3907646,73.16567
+6889,3.1079798,217.2154
+6890,2.4472327,165.56271
+6891,3.4013886,237.94415
+6892,4.2079206,250.69344
+6893,2.162263,174.46164
+6894,2.7444813,178.91013
+6895,2.0141041,120.12076
+6896,3.7794204,246.15916
+6897,1.685175,97.237854
+6898,2.7023828,161.81406
+6899,1.9369977,119.888824
+6900,2.945498,189.18163
+6901,3.6451252,236.6557
+6902,1.267226,76.08719
+6903,1.9918219,87.80176
+6904,2.3549283,129.44073
+6905,1.8615866,104.80853
+6906,1.7056358,102.29457
+6907,2.983784,174.88647
+6908,2.1992466,107.00267
+6909,2.7496152,223.531
+6910,2.977195,183.93771
+6911,3.2957265,223.14958
+6912,1.7018663,87.30638
+6913,1.7333256,96.320335
+6914,1.4839407,78.26071
+6915,2.5530121,136.69211
+6916,1.4646412,76.42638
+6917,3.7811828,242.51645
+6918,2.9070988,201.62723
+6919,2.6293523,183.41649
+6920,2.6549745,198.22371
+6921,2.7659338,196.70477
+6922,1.9353095,138.64862
+6923,2.1191263,139.30928
+6924,2.9363275,221.57834
+6925,2.7484958,193.64095
+6926,2.4704785,173.11647
+6927,1.940743,121.61431
+6928,2.463564,163.99405
+6929,2.396513,127.74975
+6930,2.6508577,172.50833
+6931,4.0788345,249.13197
+6932,2.050621,132.83646
+6933,1.394806,81.45616
+6934,2.0999112,119.98783
+6935,4.462885,248.52802
+6936,2.5795484,206.8871
+6937,2.0415275,119.926956
+6938,2.4758747,139.43192
+6939,2.3220913,138.43225
+6940,1.4427437,95.77815
+6941,2.7971206,195.6587
+6942,2.813185,200.68501
+6943,2.483151,179.00519
+6944,2.7971358,160.70526
+6945,2.9791853,189.9639
+6946,2.7111626,123.640396
+6947,2.1039052,120.98049
+6948,1.2768928,74.93824
+6949,2.4555001,115.31407
+6950,3.1373062,214.80421
+6951,1.9152193,118.9545
+6952,2.4157157,142.93037
+6953,3.1355016,224.42172
+6954,2.8405676,187.06503
+6955,2.3097227,126.51883
+6956,1.4773322,88.42236
+6957,1.7817355,88.797295
+6958,2.990445,203.4143
+6959,2.412351,189.57715
+6960,2.064628,158.30496
+6961,2.591432,125.639145
+6962,2.8480477,188.08066
+6963,2.6548147,150.17435
+6964,2.632954,141.46417
+6965,1.6851981,79.35547
+6966,1.82286,133.5958
+6967,2.5466814,203.61511
+6968,2.4872503,196.4226
+6969,2.710911,164.61972
+6970,2.4525087,137.32712
+6971,1.9774382,101.87668
+6972,2.073281,154.78676
+6973,2.1825082,153.07289
+6974,2.9850183,214.45892
+6975,1.2098112,85.472206
+6976,2.0011895,127.00368
+6977,2.5282025,191.45811
+6978,2.156341,131.72585
+6979,2.000453,131.50308
+6980,1.8192276,108.7025
+6981,2.4629402,191.50383
+6982,2.5440972,189.35385
+6983,1.7197733,96.339005
+6984,4.1519446,250.26631
+6985,1.493555,83.73491
+6986,2.4880738,143.85426
+6987,2.6401744,193.66153
+6988,2.025156,106.37751
+6989,2.9033136,195.70134
+6990,1.6320016,101.79372
+6991,2.7636456,210.29092
+6992,2.5116096,182.59485
+6993,2.1894283,135.95604
+6994,3.0188043,180.7946
+6995,3.0227408,209.88351
+6996,1.9656886,132.17923
+6997,2.4168184,95.40466
+6998,2.3999906,149.64801
+6999,2.55817,157.54662
+7000,2.5101495,143.85846
+7001,1.8314867,99.20748
+7002,3.1023378,204.88611
+7003,2.9514863,180.04974
+7004,2.9943273,226.13821
+7005,2.5231278,150.74118
+7006,2.2279716,111.42947
+7007,3.0076706,201.01732
+7008,3.3676438,209.33665
+7009,2.7126458,197.33737
+7010,3.9997177,249.04346
+7011,2.1551318,138.94604
+7012,1.3761357,74.56874
+7013,3.3774736,230.86508
+7014,2.7427113,207.16522
+7015,2.7514966,150.34914
+7016,2.992986,206.26772
+7017,1.828211,106.53962
+7018,3.081678,235.12044
+7019,1.8569769,94.41618
+7020,2.0386088,131.5716
+7021,2.6927607,174.41301
+7022,2.0449064,123.32886
+7023,2.4431663,173.33047
+7024,2.2768443,129.2452
+7025,2.0564132,165.00763
+7026,2.3739877,121.013626
+7027,2.9291086,148.27042
+7028,2.9794884,205.65979
+7029,3.2653687,219.78418
+7030,2.324695,140.90475
+7031,2.3456178,127.73015
+7032,2.8089218,211.00838
+7033,1.3990929,82.30371
+7034,2.1760788,109.64787
+7035,1.8825641,104.73613
+7036,2.1441305,110.86342
+7037,2.1235006,133.48573
+7038,1.7417353,102.35439
+7039,2.230276,149.83784
+7040,2.6232343,134.9149
+7041,3.4651036,184.38153
+7042,2.35056,161.85373
+7043,2.0525084,120.6844
+7044,2.8841887,203.27023
+7045,2.0737283,130.4541
+7046,2.071815,146.21545
+7047,3.223902,224.5442
+7048,3.3690658,207.85916
+7049,2.0689125,158.45865
+7050,1.8182286,92.7368
+7051,3.160509,210.4241
+7052,2.172933,109.94289
+7053,2.8747044,192.2161
+7054,3.739409,232.88239
+7055,1.8209741,94.31179
+7056,3.0179293,204.28726
+7057,2.0010345,136.43604
+7058,2.3792605,189.36188
+7059,3.738706,235.3466
+7060,2.2465138,150.05765
+7061,3.6195138,244.53824
+7062,3.456561,218.93329
+7063,3.0604348,229.30406
+7064,2.430398,116.150345
+7065,3.0481164,207.17574
+7066,3.1513162,203.70937
+7067,1.7715065,106.2419
+7068,1.3945982,86.8725
+7069,2.5637429,151.19324
+7070,2.6701126,180.05884
+7071,2.2066097,116.95257
+7072,2.3490357,160.67474
+7073,2.3177922,157.73495
+7074,2.8429108,200.41614
+7075,1.4544256,76.54846
+7076,3.2190747,226.74768
+7077,2.4478118,144.5622
+7078,2.5865128,152.07565
+7079,2.4957275,112.001274
+7080,3.1702607,216.16484
+7081,2.327079,160.97556
+7082,3.6212978,234.11551
+7083,1.5091202,95.2734
+7084,2.76619,208.19531
+7085,2.2739892,177.0147
+7086,2.5266666,129.79996
+7087,2.1527376,127.465904
+7088,3.295291,230.26503
+7089,1.855259,107.54146
+7090,2.3528442,163.60233
+7091,2.8404298,190.29614
+7092,1.7080513,84.97712
+7093,2.127999,108.60637
+7094,2.949954,196.84428
+7095,2.1414528,125.53378
+7096,2.7475445,172.53589
+7097,2.1770546,144.14432
+7098,3.0447085,223.82895
+7099,2.3448887,156.58942
+7100,2.4039605,123.230194
+7101,3.0634222,215.77615
+7102,3.1550345,233.8198
+7103,2.5888264,162.21994
+7104,1.6464505,119.460785
+7105,1.5662514,85.54864
+7106,2.2754533,148.13496
+7107,1.913571,117.965515
+7108,2.580926,161.7262
+7109,1.7268124,124.90282
+7110,3.7043774,244.75513
+7111,2.6035576,146.85052
+7112,2.7350478,179.46313
+7113,1.8659236,96.66087
+7114,2.9234896,201.6669
+7115,2.2516823,133.89958
+7116,1.8698697,116.794876
+7117,3.2559872,225.4543
+7118,2.6073487,144.95505
+7119,2.2758284,130.26608
+7120,2.205134,197.58278
+7121,1.1107533,70.37203
+7122,2.982856,235.42781
+7123,3.4944496,237.66425
+7124,3.3143737,236.1391
+7125,3.27873,198.86674
+7126,2.6439154,171.01447
+7127,1.5963635,84.82205
+7128,2.9896865,192.63823
+7129,1.7503474,83.37633
+7130,2.3243492,143.38795
+7131,2.814162,200.66005
+7132,2.6939883,147.60143
+7133,2.6661162,175.12341
+7134,2.2748976,119.56566
+7135,3.6590288,244.06383
+7136,2.8884997,203.23834
+7137,3.4744344,229.57625
+7138,2.7854085,172.42807
+7139,2.01276,105.13253
+7140,1.9833138,114.15044
+7141,2.867851,168.60194
+7142,2.3528543,140.17853
+7143,1.8997607,87.38878
+7144,2.547594,166.96027
+7145,3.355113,236.72829
+7146,2.4976573,142.7818
+7147,2.9751697,216.1363
+7148,1.7326933,129.76764
+7149,1.7057613,92.388565
+7150,2.821401,207.03503
+7151,2.6994667,193.8172
+7152,2.9253693,222.94678
+7153,3.213306,194.71814
+7154,2.2960126,145.24713
+7155,3.5299845,238.80946
+7156,1.9967823,108.60486
+7157,3.0378232,184.60849
+7158,2.7862487,142.6971
+7159,2.1374283,123.94709
+7160,2.8151138,187.66931
+7161,1.8999518,92.47001
+7162,2.3325768,137.87189
+7163,3.0754852,220.18274
+7164,2.119171,129.57405
+7165,1.7793963,114.32968
+7166,1.5834492,79.102684
+7167,3.0876923,202.32027
+7168,3.1671386,217.2877
+7169,2.1169505,138.82724
+7170,3.0623593,228.97382
+7171,2.7027054,167.35587
+7172,2.1656184,111.32073
+7173,1.865955,91.42263
+7174,2.3383155,138.71387
+7175,1.701369,92.79785
+7176,2.768274,160.62076
+7177,3.249152,229.59091
+7178,2.6593783,159.47192
+7179,2.3632603,149.48688
+7180,2.9004397,179.68604
+7181,2.9509177,182.24817
+7182,2.7199762,182.69424
+7183,2.68386,169.522
+7184,1.8942226,99.42052
+7185,3.2768888,218.25514
+7186,2.471928,165.48563
+7187,2.3485336,119.922775
+7188,1.8995001,95.14875
+7189,3.0065827,167.2452
+7190,2.0989537,125.06645
+7191,2.3905053,177.50558
+7192,2.2437527,123.47693
+7193,2.0161178,109.903076
+7194,2.3962884,180.50821
+7195,2.8609974,186.45502
+7196,2.8988905,165.55054
+7197,1.9816,108.12752
+7198,2.4613435,179.35905
+7199,2.6474843,156.15797
+7200,2.60179,180.47647
+7201,2.1030605,124.63418
+7202,2.3508592,135.501
+7203,2.8020132,187.5163
+7204,2.538308,144.29964
+7205,2.0127885,98.72032
+7206,3.4544315,232.61604
+7207,2.944251,196.68433
+7208,2.8682427,204.62668
+7209,2.2858982,132.0035
+7210,2.3985,150.60855
+7211,2.9391134,179.09473
+7212,2.4372337,185.19267
+7213,2.805166,183.73236
+7214,1.7519712,96.80926
+7215,2.6587296,163.78973
+7216,2.042194,117.39751
+7217,3.5871668,240.52809
+7218,2.0235186,120.18473
+7219,2.2573838,155.53424
+7220,2.379355,134.50696
+7221,2.2880828,159.53587
+7222,1.3962615,101.68771
+7223,2.4956605,173.53699
+7224,3.293798,207.13606
+7225,2.7379785,172.17047
+7226,2.7769792,186.40494
+7227,3.658359,235.88101
+7228,2.789294,147.1023
+7229,2.738799,201.32678
+7230,1.8100765,96.75047
+7231,2.002727,119.973724
+7232,1.9089636,109.93931
+7233,1.7013965,99.47581
+7234,2.2561655,157.5246
+7235,3.1297688,204.41057
+7236,1.8650347,102.996704
+7237,2.5969658,180.67096
+7238,2.7220247,190.37589
+7239,2.9604037,203.26437
+7240,2.0196729,111.49077
+7241,3.3528578,212.61562
+7242,3.9587822,246.1589
+7243,1.5193462,105.6028
+7244,3.4512575,232.00671
+7245,1.8429475,107.951485
+7246,3.31396,224.22351
+7247,2.636325,163.92804
+7248,2.2552383,143.48485
+7249,1.3868911,83.30651
+7250,2.3291507,181.58846
+7251,2.4174867,133.19775
+7252,1.6839802,98.2186
+7253,1.8083766,131.94525
+7254,2.3546777,130.31064
+7255,2.136791,115.041
+7256,1.4180467,85.29859
+7257,3.1468632,167.49081
+7258,1.9737408,99.07771
+7259,2.293293,135.14813
+7260,3.3771346,236.17654
+7261,2.5999675,147.45807
+7262,3.0658293,187.48306
+7263,2.116793,118.625175
+7264,2.8587077,190.49081
+7265,1.8718045,100.71756
+7266,2.4274354,177.21371
+7267,2.5518937,126.02095
+7268,2.7498028,189.06198
+7269,2.2215686,176.38757
+7270,1.8824369,113.45544
+7271,2.1168792,136.35254
+7272,1.7578199,112.3806
+7273,2.0122962,139.68799
+7274,3.3590548,213.6718
+7275,2.118196,132.6272
+7276,1.8024061,90.367905
+7277,2.1807113,136.90552
+7278,2.7717946,202.89267
+7279,1.9845673,98.48855
+7280,2.1013336,109.15088
+7281,2.278443,127.32701
+7282,2.1333714,150.41171
+7283,4.2482386,249.08888
+7284,1.6887891,84.6319
+7285,1.9770454,143.3361
+7286,2.581351,168.45004
+7287,3.1510656,230.22081
+7288,3.750502,247.26848
+7289,3.3160472,240.01115
+7290,3.1880267,198.68228
+7291,1.9039838,93.93487
+7292,2.1059911,110.08037
+7293,2.400937,130.88583
+7294,2.3132834,123.587524
+7295,2.1276088,121.38856
+7296,2.3302283,167.23207
+7297,3.5440712,233.99008
+7298,2.2847507,135.55347
+7299,2.1690261,128.19635
+7300,2.867333,178.1152
+7301,3.4711454,232.34029
+7302,1.8195236,112.95646
+7303,2.231636,121.92366
+7304,1.5359846,85.60321
+7305,3.12229,212.0832
+7306,3.6012628,215.25496
+7307,2.9812503,183.69212
+7308,3.1778326,223.04181
+7309,3.4590583,231.60814
+7310,2.065453,123.429054
+7311,3.0281,232.70267
+7312,1.2415122,70.31819
+7313,1.6811211,81.52441
+7314,2.3600278,170.17711
+7315,2.7921052,198.32962
+7316,2.4378014,184.96939
+7317,2.3149858,135.90009
+7318,3.237582,201.1812
+7319,2.4510806,177.05573
+7320,1.7154081,120.153366
+7321,2.5824614,155.98096
+7322,3.4799507,239.57693
+7323,2.4927735,210.64891
+7324,1.9605927,102.13572
+7325,2.8284967,196.56798
+7326,2.9127269,194.55426
+7327,2.4279044,116.56079
+7328,2.7447622,193.58548
+7329,3.3243701,211.32259
+7330,2.1860723,152.37296
+7331,2.3459425,119.24329
+7332,1.940088,96.178955
+7333,2.6607714,200.7878
+7334,2.0983577,141.64432
+7335,2.613444,180.26462
+7336,2.4020813,139.22417
+7337,2.646112,184.73343
+7338,2.0063875,85.38972
+7339,2.853557,180.45438
+7340,2.9752183,219.8044
+7341,3.334721,221.09872
+7342,1.7590253,91.23539
+7343,1.173885,81.14179
+7344,2.6609695,152.3698
+7345,2.599173,197.1792
+7346,2.431524,191.48044
+7347,2.3696923,180.97226
+7348,2.4924905,191.73227
+7349,2.4711912,160.93678
+7350,2.4790425,149.07895
+7351,1.8179942,103.5172
+7352,3.0319848,191.04019
+7353,2.8949757,180.70683
+7354,1.6447957,114.71729
+7355,4.7205553,253.21198
+7356,2.2717218,152.68503
+7357,2.8070912,169.39935
+7358,3.2741034,227.95055
+7359,2.454804,142.43893
+7360,3.986465,246.16924
+7361,3.1471725,217.10413
+7362,2.1962423,125.45117
+7363,2.8604746,176.08148
+7364,3.4146287,239.4044
+7365,1.9387295,127.247986
+7366,1.295352,77.64315
+7367,1.9967871,105.39158
+7368,2.3748431,147.91257
+7369,2.249725,159.44354
+7370,1.763343,110.006546
+7371,2.0061486,107.97659
+7372,3.4603164,226.89355
+7373,1.8917292,98.49126
+7374,3.0576115,191.12761
+7375,2.5356355,174.2798
+7376,1.7918152,135.47571
+7377,2.2602572,149.33423
+7378,4.5748377,251.10703
+7379,2.9809985,181.79546
+7380,2.7104099,178.44208
+7381,2.6755548,213.4563
+7382,1.9799685,104.839935
+7383,1.4202461,78.78367
+7384,2.3230612,127.907074
+7385,3.6991224,244.34772
+7386,2.1792493,145.88887
+7387,1.6890463,99.07451
+7388,1.6141353,111.28407
+7389,2.643801,123.816284
+7390,2.8066087,184.7677
+7391,3.6239543,233.62827
+7392,1.8634762,111.236465
+7393,2.6743789,174.97678
+7394,2.823857,164.67264
+7395,1.954454,127.968445
+7396,2.8893802,173.42741
+7397,1.8780704,112.31421
+7398,1.9462192,92.917465
+7399,1.9014424,111.831825
+7400,1.5057192,82.27098
+7401,2.4272075,155.48212
+7402,2.3927286,101.55078
+7403,1.8774084,91.01448
+7404,2.2504737,169.90521
+7405,1.7628566,121.755684
+7406,2.446488,139.08008
+7407,2.5917668,161.97134
+7408,3.653402,245.75284
+7409,1.2788026,83.03962
+7410,2.848678,231.14102
+7411,2.8702726,209.64372
+7412,2.3800488,143.73979
+7413,2.6675425,173.74644
+7414,1.879824,90.04962
+7415,2.9267411,195.6964
+7416,1.9992328,99.23483
+7417,1.9793925,130.51505
+7418,2.3684726,148.51385
+7419,2.5142365,129.58723
+7420,2.6560798,203.95439
+7421,2.7180912,174.91888
+7422,2.3227937,126.68785
+7423,2.329515,143.97055
+7424,1.2752098,77.05381
+7425,2.5168576,134.32013
+7426,2.668313,206.9533
+7427,3.1777084,209.84438
+7428,2.664873,183.32278
+7429,1.793324,130.26775
+7430,2.0978494,135.5412
+7431,2.967037,196.66805
+7432,1.4729613,95.20791
+7433,2.3055358,140.89316
+7434,2.3596487,124.86041
+7435,1.9350116,110.97531
+7436,3.5141509,228.41179
+7437,3.4591181,228.08748
+7438,3.320826,211.75165
+7439,2.0819604,107.320984
+7440,2.2811527,163.25594
+7441,3.9624946,241.18123
+7442,3.435388,230.5775
+7443,2.94282,174.52176
+7444,3.371305,231.61389
+7445,2.2864728,150.1789
+7446,2.5693312,156.68121
+7447,3.1544378,220.55223
+7448,3.0514512,168.95639
+7449,3.1617494,196.90686
+7450,4.4509573,250.1106
+7451,3.4865506,241.21065
+7452,1.8442574,103.26805
+7453,1.8023964,104.76043
+7454,3.6921036,244.7609
+7455,3.2655082,228.2397
+7456,3.0716865,223.94772
+7457,2.312203,110.98181
+7458,2.6028047,202.73943
+7459,2.5370917,172.68799
+7460,2.6493497,136.52597
+7461,2.6543849,176.8582
+7462,2.7981806,198.86214
+7463,1.6544999,129.8205
+7464,3.4029684,232.86153
+7465,3.2482252,221.84943
+7466,2.684009,203.14964
+7467,2.8174887,174.31415
+7468,2.3216782,156.9184
+7469,1.5423189,96.12782
+7470,3.2233975,214.48882
+7471,3.1179674,208.8952
+7472,1.8337395,119.51425
+7473,2.0543003,154.36295
+7474,3.9183903,242.76567
+7475,2.704904,210.73245
+7476,2.5738835,160.51485
+7477,2.9149468,213.46864
+7478,2.664328,164.38266
+7479,1.6857713,81.10073
+7480,2.0906184,140.25836
+7481,2.048879,108.35531
+7482,2.2171273,142.961
+7483,1.5522954,73.02282
+7484,2.870849,125.138565
+7485,4.2914505,248.6526
+7486,2.441463,139.55305
+7487,2.4989676,126.01465
+7488,1.9778064,147.69199
+7489,2.7629905,187.80107
+7490,2.284458,116.01603
+7491,3.3457637,229.97473
+7492,3.0578592,199.98337
+7493,2.9628386,194.50945
+7494,4.396419,253.08669
+7495,2.0068734,114.326065
+7496,1.4870436,100.88762
+7497,1.8084352,85.47531
+7498,2.2349858,115.91078
+7499,2.2601628,117.28523
+7500,2.3368535,116.220505
+7501,2.1751122,162.54965
+7502,2.890204,188.31963
+7503,3.0862577,222.97592
+7504,2.726573,183.24663
+7505,2.796186,180.9054
+7506,2.999512,208.96106
+7507,1.8892558,92.80314
+7508,2.6448379,123.60353
+7509,2.4067016,116.09624
+7510,2.233381,115.69854
+7511,2.0949411,118.77586
+7512,3.6040797,238.76753
+7513,1.425568,79.83362
+7514,2.2205348,123.7236
+7515,1.8564806,114.27727
+7516,2.1408842,133.74548
+7517,2.8460288,166.16559
+7518,2.3369985,124.78824
+7519,2.0267098,120.378456
+7520,3.845039,234.14612
+7521,2.1644113,154.6568
+7522,3.214976,234.6854
+7523,2.6802564,204.7895
+7524,2.8218813,150.86707
+7525,1.4901775,86.42341
+7526,2.5672407,190.42886
+7527,1.3658371,90.84352
+7528,2.3920627,175.98395
+7529,2.1439009,143.37595
+7530,2.845135,209.46652
+7531,2.4757943,155.72264
+7532,1.5920559,89.55772
+7533,2.2901118,152.9245
+7534,2.0494401,143.67229
+7535,2.303738,150.55782
+7536,2.152477,113.574776
+7537,2.0102878,102.45839
+7538,2.9037244,165.37741
+7539,3.1129785,228.45088
+7540,2.0178819,106.1586
+7541,2.2470906,166.95676
+7542,1.7980258,95.2158
+7543,2.1786418,184.13866
+7544,2.0864122,149.15717
+7545,1.832021,108.8915
+7546,2.1447349,143.7269
+7547,2.4674933,155.32158
+7548,2.1749876,127.96524
+7549,1.7692275,85.45773
+7550,2.9821475,221.98306
+7551,1.7335747,94.33007
+7552,2.6823869,199.39851
+7553,1.9840028,110.92671
+7554,1.4877565,86.741486
+7555,1.9667045,113.1897
+7556,2.410585,172.13715
+7557,3.2486808,228.6099
+7558,2.9559746,177.15425
+7559,2.5867708,210.96954
+7560,1.8115073,88.80614
+7561,1.4422921,74.71495
+7562,2.5433986,188.37769
+7563,4.4507504,251.83261
+7564,2.1049187,114.45146
+7565,2.004557,128.88391
+7566,4.706336,253.61392
+7567,2.2223155,115.627716
+7568,1.5709304,121.43892
+7569,2.4727619,142.04803
+7570,3.0677645,200.05064
+7571,2.0876694,123.774826
+7572,2.5207922,144.35815
+7573,2.4397936,172.51228
+7574,3.2408874,224.75925
+7575,2.3907943,163.3918
+7576,2.8646932,164.80206
+7577,0.9212278,71.17405
+7578,2.053186,125.29809
+7579,1.6075575,108.034515
+7580,2.360942,98.76451
+7581,3.0056846,231.40651
+7582,1.9361646,118.35936
+7583,2.564837,184.41605
+7584,1.9309007,99.22592
+7585,1.9048463,119.10387
+7586,2.7600605,180.2466
+7587,2.6811914,191.26968
+7588,4.971234,251.61673
+7589,2.9068782,208.17546
+7590,2.6519647,192.80246
+7591,2.6410158,138.59927
+7592,1.9012234,130.30952
+7593,1.8143028,100.24414
+7594,1.9500011,89.390015
+7595,3.0738025,212.80663
+7596,2.7462618,185.15125
+7597,1.8757963,110.97033
+7598,1.5362386,76.21869
+7599,2.213121,118.59657
+7600,2.5538483,152.23763
+7601,1.9343255,101.10333
+7602,1.4733257,109.59855
+7603,5.278533,254.42476
+7604,1.8436921,94.79415
+7605,2.1695757,126.69362
+7606,2.5747828,183.31436
+7607,1.7405013,102.25108
+7608,1.6710876,82.24228
+7609,1.7296946,107.40098
+7610,3.665012,215.10446
+7611,2.650904,158.52435
+7612,2.9267392,180.56989
+7613,2.419373,148.0789
+7614,3.843906,246.0912
+7615,3.3172603,195.64037
+7616,2.99811,211.72287
+7617,2.371465,145.95773
+7618,3.4305606,228.91705
+7619,2.4022977,128.40791
+7620,2.31568,152.44588
+7621,1.6356845,76.26325
+7622,1.7015107,105.44827
+7623,2.7563806,216.81567
+7624,2.1289754,109.439
+7625,2.367413,152.30994
+7626,2.7179112,172.82388
+7627,2.4447014,143.18225
+7628,2.437742,167.03238
+7629,3.294274,217.49197
+7630,3.6632774,231.65988
+7631,1.784966,92.24763
+7632,3.4591835,244.73563
+7633,2.187842,119.00604
+7634,2.4174685,160.02362
+7635,2.2924855,145.2457
+7636,2.424748,165.28177
+7637,1.9343024,126.35431
+7638,2.1344664,140.88278
+7639,2.1935875,131.86145
+7640,1.6306099,103.772575
+7641,3.1896744,201.22084
+7642,1.9898528,114.46947
+7643,1.3688235,77.81431
+7644,2.4363942,141.75778
+7645,2.934495,189.86742
+7646,2.7852538,157.91364
+7647,2.528251,142.74658
+7648,2.5734363,153.56133
+7649,2.0348892,123.882706
+7650,2.8510053,209.2852
+7651,2.1112893,144.85489
+7652,3.3120918,233.21812
+7653,2.0396514,148.05222
+7654,2.3344672,124.4459
+7655,1.763242,96.722595
+7656,3.1920173,222.68364
+7657,1.9629748,87.44514
+7658,1.9186127,87.34102
+7659,2.8164396,177.50183
+7660,2.8262322,154.36145
+7661,3.8388488,240.61539
+7662,2.6284194,203.9264
+7663,3.3058934,228.17612
+7664,2.872163,198.17868
+7665,3.157106,211.81573
+7666,3.9877274,246.17513
+7667,2.3282304,162.19092
+7668,1.9920746,95.9142
+7669,2.2176642,113.40512
+7670,1.7980882,98.929245
+7671,2.0608644,136.3727
+7672,2.2051635,162.68549
+7673,2.3444304,176.16898
+7674,1.7950532,84.55197
+7675,1.4470428,80.4532
+7676,2.1572144,122.81132
+7677,2.373836,155.0604
+7678,2.2344108,117.384476
+7679,2.071116,105.3573
+7680,3.1715834,218.12004
+7681,3.0038056,218.60396
+7682,1.8438966,90.680466
+7683,3.1398315,223.31566
+7684,3.8969588,245.52986
+7685,3.218715,221.14166
+7686,1.9146756,101.01713
+7687,2.5834842,161.64426
+7688,3.1378856,195.111
+7689,2.085035,98.177086
+7690,2.186708,129.49036
+7691,2.6637928,178.26657
+7692,2.728608,210.10437
+7693,1.8253078,117.54352
+7694,2.9415393,195.06667
+7695,5.025693,254.36427
+7696,1.3241366,77.42906
+7697,3.0963166,224.17093
+7698,2.2669659,121.45601
+7699,1.7857416,127.58377
+7700,2.9460516,216.89804
+7701,3.1243277,219.22375
+7702,2.425444,167.30313
+7703,2.2199373,123.681625
+7704,3.0383704,229.02907
+7705,2.8792245,225.1691
+7706,2.20052,154.99521
+7707,2.2568831,138.22662
+7708,1.3744165,76.18653
+7709,2.3432817,141.53352
+7710,3.2441978,208.38934
+7711,3.6295245,230.30309
+7712,2.577115,177.20297
+7713,2.7005172,167.3919
+7714,2.3745668,153.33563
+7715,2.417743,177.73225
+7716,3.1308055,223.64166
+7717,1.6295981,89.40803
+7718,3.0458903,206.53572
+7719,2.4186008,127.65861
+7720,2.9010777,135.19836
+7721,2.8780072,179.7251
+7722,4.2494316,249.68997
+7723,1.6178567,79.83697
+7724,2.4502573,199.32545
+7725,2.575542,182.20978
+7726,3.1889362,230.08488
+7727,2.7400572,200.46313
+7728,2.545504,174.34224
+7729,1.9982873,119.16054
+7730,2.225461,146.78462
+7731,1.5381856,108.53853
+7732,3.0584295,211.01561
+7733,2.845553,157.98175
+7734,3.0780034,235.15172
+7735,2.2580733,113.90009
+7736,1.570479,92.36155
+7737,2.2167115,127.15616
+7738,2.4361994,125.77177
+7739,4.2555895,250.68488
+7740,3.5557587,244.4566
+7741,3.793302,239.93376
+7742,2.2950552,123.93521
+7743,3.5233355,233.3125
+7744,2.2209845,132.09721
+7745,1.6883163,105.64041
+7746,1.5440415,96.522415
+7747,2.311896,161.2363
+7748,2.4418464,167.38443
+7749,2.7862236,214.77727
+7750,1.6983216,104.63222
+7751,3.5904214,235.5882
+7752,1.9252001,136.53963
+7753,3.2449808,228.77383
+7754,2.8447993,194.54677
+7755,2.434524,113.53219
+7756,3.7062435,232.59036
+7757,2.4979548,123.82965
+7758,3.9334939,234.10469
+7759,2.8342412,191.15822
+7760,2.9507782,202.91963
+7761,2.936621,216.02779
+7762,2.4072268,141.32663
+7763,2.043279,120.30999
+7764,2.61361,193.88234
+7765,2.133554,131.7284
+7766,2.7230256,158.16342
+7767,1.6118401,102.07
+7768,1.3034819,78.252304
+7769,2.0138237,124.53732
+7770,2.858421,208.7984
+7771,1.5402834,82.047195
+7772,3.418958,221.15135
+7773,2.1558752,101.3277
+7774,4.134876,240.58528
+7775,1.8817998,131.15291
+7776,2.0765479,130.94241
+7777,2.0057468,128.0827
+7778,2.4128857,193.78871
+7779,4.2069616,247.49545
+7780,2.5876265,190.55624
+7781,2.430428,163.17134
+7782,3.2277493,243.09068
+7783,2.2811542,107.49243
+7784,2.34518,169.5897
+7785,2.8941183,167.33528
+7786,1.1854357,75.96774
+7787,3.3680077,218.82335
+7788,2.4232085,143.8139
+7789,2.273881,151.18091
+7790,2.60387,155.43317
+7791,2.2133882,114.004166
+7792,2.0593543,109.41481
+7793,1.9749949,149.15314
+7794,2.7886527,162.00618
+7795,2.6320498,174.16446
+7796,2.3860419,128.30472
+7797,2.9996254,206.5808
+7798,2.514282,157.2348
+7799,2.3836157,131.97223
+7800,2.5441093,170.57303
+7801,2.3281403,134.17177
+7802,1.8208336,101.762726
+7803,2.5341096,178.9198
+7804,1.9597384,149.18134
+7805,3.1151853,208.40324
+7806,2.4263175,146.37173
+7807,3.6837263,250.32195
+7808,2.9503767,182.78137
+7809,2.064181,121.32425
+7810,2.2610857,143.90916
+7811,1.681101,103.26465
+7812,2.215313,135.69421
+7813,2.2826524,131.70679
+7814,2.6499734,135.6625
+7815,2.4773257,152.75497
+7816,2.4984384,171.72429
+7817,3.7530885,229.8617
+7818,2.6262825,165.42792
+7819,3.1881843,197.39844
+7820,1.7203858,90.348755
+7821,1.3649728,84.4016
+7822,2.8440127,208.27298
+7823,2.3203273,156.48376
+7824,3.0385776,203.3868
+7825,3.2872133,188.88562
+7826,2.1817946,124.612015
+7827,3.4332738,228.5959
+7828,3.674812,228.37474
+7829,2.4997594,169.55374
+7830,2.1487086,109.799866
+7831,2.6348925,190.04407
+7832,1.6881826,89.914566
+7833,2.856624,159.87561
+7834,1.9100434,101.15782
+7835,3.416057,205.26321
+7836,2.3595967,168.36462
+7837,2.9936688,198.89645
+7838,3.455476,213.72932
+7839,2.203964,158.61151
+7840,1.8789208,103.91101
+7841,3.365346,244.25694
+7842,1.6619326,99.762535
+7843,2.3081968,173.07596
+7844,1.911988,121.69557
+7845,2.6742601,193.99345
+7846,3.275735,229.01036
+7847,2.675211,188.97092
+7848,2.2138696,124.07747
+7849,3.1757236,213.06458
+7850,2.6172295,217.47458
+7851,1.9773115,128.02971
+7852,3.1613586,218.9218
+7853,2.0980513,113.75934
+7854,2.5432572,190.88425
+7855,3.1699169,227.9221
+7856,3.3223906,201.8308
+7857,2.276278,137.56232
+7858,1.909039,96.80909
+7859,1.9153311,145.60678
+7860,2.7525744,163.22015
+7861,2.0597143,129.38885
+7862,1.7369783,105.41916
+7863,1.7212623,79.10441
+7864,2.9424481,191.56067
+7865,1.6420205,95.79762
+7866,3.0408802,220.77979
+7867,2.945486,205.95868
+7868,1.4589013,79.37255
+7869,2.2690222,136.20724
+7870,4.849918,252.12428
+7871,2.4638438,133.98361
+7872,1.4006848,80.2312
+7873,1.5117927,78.062386
+7874,2.231492,121.92634
+7875,2.7958093,164.68604
+7876,1.7159137,129.80917
+7877,2.6142716,194.27657
+7878,2.0935824,146.02748
+7879,3.7551773,238.93524
+7880,2.0879183,123.43331
+7881,3.6600888,225.02988
+7882,3.705524,241.23213
+7883,3.3948607,220.9642
+7884,2.3810878,154.58987
+7885,2.6839757,189.35033
+7886,3.060439,204.9579
+7887,2.0412068,102.06999
+7888,2.794285,164.0881
+7889,2.495079,192.65312
+7890,1.8993798,95.98681
+7891,0.90857357,73.27491
+7892,2.6580522,163.57153
+7893,2.192923,133.98553
+7894,2.4185133,172.61475
+7895,1.9971569,134.32925
+7896,2.0332375,113.742256
+7897,2.1003351,112.39076
+7898,1.2113556,72.964096
+7899,2.5582042,161.47858
+7900,2.422473,130.92377
+7901,1.9720027,92.90735
+7902,2.050092,180.09885
+7903,2.1100838,108.28618
+7904,2.128115,128.77078
+7905,2.6446383,185.2934
+7906,2.9916568,192.18556
+7907,2.2861123,126.15276
+7908,1.6275212,73.27411
+7909,2.7288618,156.09613
+7910,2.1660156,93.18209
+7911,2.1635535,121.68473
+7912,2.0717382,131.70786
+7913,2.1615524,138.71149
+7914,2.926078,152.79446
+7915,1.9109011,96.87527
+7916,2.5043976,155.09904
+7917,2.6416152,137.07748
+7918,2.5800061,153.95929
+7919,2.7587602,188.54501
+7920,2.3258781,182.69684
+7921,2.1940212,170.9614
+7922,2.5813603,180.41124
+7923,2.0878918,143.63031
+7924,2.0562851,128.0073
+7925,2.7616918,182.34409
+7926,2.0030394,98.46692
+7927,2.4815803,183.49966
+7928,2.8910418,225.48701
+7929,2.701333,199.53133
+7930,1.6498747,74.43892
+7931,2.876573,198.28296
+7932,1.5384933,80.83509
+7933,2.6858687,137.93668
+7934,2.701904,178.5264
+7935,2.3368363,123.397705
+7936,2.8592925,205.41252
+7937,2.5640476,125.05845
+7938,2.8364275,222.08029
+7939,1.8382621,155.07202
+7940,2.4868922,181.80162
+7941,2.394244,127.0856
+7942,2.1042635,96.30888
+7943,1.9109079,95.615486
+7944,2.6497822,154.73648
+7945,2.9702625,188.45212
+7946,2.7622473,156.30956
+7947,2.4354205,179.01453
+7948,2.5272298,106.465294
+7949,2.5529854,124.85579
+7950,3.791898,251.82632
+7951,2.616967,147.89099
+7952,2.9140804,180.74702
+7953,1.677679,89.8752
+7954,3.30098,232.60999
+7955,2.77357,212.57472
+7956,1.884835,119.59744
+7957,1.7541876,123.61088
+7958,1.92506,123.76782
+7959,2.7937987,198.55061
+7960,3.143387,209.00388
+7961,1.8467253,114.12417
+7962,3.2715452,231.36407
+7963,3.58955,238.13005
+7964,2.4019969,142.87993
+7965,2.157036,143.57953
+7966,2.9544952,216.17355
+7967,2.0924191,100.51532
+7968,1.8236775,101.971405
+7969,2.2303863,115.854004
+7970,3.527885,238.19197
+7971,1.8959478,89.634995
+7972,1.9584006,118.9351
+7973,2.5595782,138.85751
+7974,2.413896,134.31143
+7975,2.7126577,185.80154
+7976,2.1531937,120.984344
+7977,2.7086701,167.52837
+7978,3.1738505,188.4684
+7979,2.8505678,198.15244
+7980,1.8626392,115.950325
+7981,3.2850237,216.83662
+7982,1.6404543,98.429214
+7983,1.6308447,115.0417
+7984,2.2782214,153.1549
+7985,2.7117217,175.04381
+7986,3.261149,243.14091
+7987,4.432143,252.34796
+7988,2.03202,96.484726
+7989,3.155291,213.62215
+7990,2.9586911,189.40018
+7991,1.8382872,90.38625
+7992,1.7079091,92.97146
+7993,2.879899,139.97252
+7994,2.530524,132.20032
+7995,2.1966596,114.6021
+7996,2.8503637,196.3087
+7997,3.002294,233.80486
+7998,2.485973,166.90262
+7999,2.5625653,209.6244
+8000,3.3485513,230.5681
+8001,1.9011931,106.61659
+8002,2.1327717,127.92842
+8003,2.10601,111.81939
+8004,1.3915582,76.8568
+8005,3.8025525,236.83824
+8006,2.4013956,171.62503
+8007,1.6273427,130.18143
+8008,1.5563058,92.18976
+8009,2.5004046,188.09338
+8010,2.33186,140.70605
+8011,1.9749844,120.499954
+8012,2.0334535,113.04795
+8013,2.9979815,207.4489
+8014,1.9783144,155.82257
+8015,3.8247974,245.13374
+8016,2.3492992,171.28435
+8017,1.7400918,88.492386
+8018,2.3116853,134.76166
+8019,2.8805861,218.61621
+8020,3.1086383,222.16768
+8021,3.2017117,221.12415
+8022,2.8645968,214.17984
+8023,2.759398,186.09506
+8024,3.0752378,225.07106
+8025,1.9075062,92.71719
+8026,2.4862206,159.08636
+8027,2.8186164,164.84164
+8028,1.7548277,87.927315
+8029,1.9862105,137.74133
+8030,2.1092587,116.03555
+8031,2.138377,126.412994
+8032,3.3214622,231.46664
+8033,1.6569794,102.1944
+8034,3.717249,240.16156
+8035,4.001426,245.2088
+8036,2.481347,149.6521
+8037,2.9895031,218.31154
+8038,2.1595278,115.4854
+8039,2.643188,114.55757
+8040,2.6729097,195.85367
+8041,2.4766998,150.81459
+8042,2.4927695,161.35712
+8043,1.4468623,97.98012
+8044,2.7737908,201.79903
+8045,3.0590186,203.42468
+8046,1.9064891,130.0549
+8047,2.474546,179.51929
+8048,1.8841709,105.77489
+8049,2.6774476,207.13312
+8050,2.1464815,90.423965
+8051,2.1652179,109.55513
+8052,2.796577,194.13968
+8053,2.4837682,172.4086
+8054,2.5364015,157.1618
+8055,2.752765,214.10234
+8056,1.8069074,108.05658
+8057,2.2684033,128.58966
+8058,2.8568618,194.3602
+8059,3.202927,199.62599
+8060,2.1261134,118.805466
+8061,2.081767,115.49478
+8062,3.2562401,216.1444
+8063,2.9588785,189.8263
+8064,2.312254,151.73404
+8065,3.0957792,205.0931
+8066,1.9220438,117.696365
+8067,2.2294936,148.55942
+8068,2.1586118,184.58115
+8069,4.1394534,252.27776
+8070,2.1496844,118.50163
+8071,1.4796255,80.76608
+8072,2.6311738,219.48164
+8073,2.214274,155.92422
+8074,3.6122723,230.20035
+8075,4.688749,253.64845
+8076,3.066326,219.02193
+8077,2.800806,189.43861
+8078,2.3202822,155.45807
+8079,2.1916745,154.95047
+8080,1.6540827,94.15274
+8081,3.0962837,202.94437
+8082,1.9892563,106.51796
+8083,1.4697446,80.658195
+8084,2.262661,163.19891
+8085,2.7039618,206.93123
+8086,3.6323574,222.30286
+8087,2.0539556,138.62477
+8088,1.7312,86.29026
+8089,2.604115,123.32756
+8090,2.661518,192.4926
+8091,2.2517889,137.07893
+8092,2.4131174,168.6995
+8093,2.3533869,205.13565
+8094,2.5096054,128.14679
+8095,2.5633814,161.44278
+8096,2.4593773,195.66888
+8097,3.9270885,243.18523
+8098,2.6921592,188.54324
+8099,2.134077,140.59116
+8100,3.6736572,239.12778
+8101,2.3744433,144.55641
+8102,2.5696805,165.78323
+8103,3.3583803,226.91507
+8104,1.7934942,88.49797
+8105,2.1923537,118.419876
+8106,2.6675544,162.8688
+8107,1.9985579,133.44733
+8108,2.8950248,215.52303
+8109,2.0174496,101.63216
+8110,4.508707,251.73647
+8111,2.2054074,141.14816
+8112,2.5925193,151.79611
+8113,3.8941524,244.34618
+8114,2.5503001,195.11021
+8115,1.4212214,79.93244
+8116,3.9034123,241.62634
+8117,2.32788,114.04144
+8118,1.4614714,81.28914
+8119,2.081608,118.623726
+8120,2.21686,180.8441
+8121,3.3826022,234.85558
+8122,2.4544923,148.52252
+8123,2.6137383,194.27565
+8124,2.1606376,131.55026
+8125,2.2518919,187.58533
+8126,1.8774694,86.4008
+8127,2.5379148,154.96094
+8128,2.4561515,132.57645
+8129,1.7878468,119.099266
+8130,1.5339553,91.35636
+8131,2.9725544,184.80148
+8132,3.1600945,242.39337
+8133,3.04781,178.20058
+8134,2.2129395,135.92427
+8135,3.5498385,236.45685
+8136,2.3395607,170.99799
+8137,3.6382449,227.29668
+8138,2.2674086,96.974
+8139,2.5607114,203.7163
+8140,1.9657522,100.007095
+8141,1.9757572,100.22041
+8142,1.9774181,138.23682
+8143,2.401202,180.88734
+8144,4.386652,252.36879
+8145,2.075739,103.9635
+8146,2.0088453,158.50659
+8147,2.7837176,197.14288
+8148,2.1093438,119.0684
+8149,2.1754055,121.59449
+8150,2.170454,133.77887
+8151,2.188691,131.9723
+8152,2.4461331,166.27338
+8153,2.309155,180.31335
+8154,2.454571,178.13252
+8155,2.7371585,153.82068
+8156,2.0590477,110.581604
+8157,3.7448208,247.64934
+8158,2.6362154,163.92876
+8159,1.9126128,102.46225
+8160,2.6956987,179.70801
+8161,1.7775445,101.12015
+8162,1.7128309,84.6981
+8163,2.2055635,136.99469
+8164,2.4977098,173.75438
+8165,1.9901121,108.57625
+8166,2.7612653,145.25958
+8167,3.1283736,213.48596
+8168,1.7380726,102.44524
+8169,4.041682,244.46289
+8170,2.8702667,230.00323
+8171,1.5861742,89.04065
+8172,2.516104,182.9642
+8173,1.4799062,91.40373
+8174,3.166123,190.94202
+8175,3.2392013,224.39824
+8176,2.600757,171.81796
+8177,2.305419,117.33819
+8178,3.2333064,216.85876
+8179,3.434014,233.17805
+8180,2.7364306,184.74142
+8181,3.1567428,216.48143
+8182,1.9116117,92.09805
+8183,2.4111938,167.22095
+8184,2.3565946,171.42154
+8185,2.4838204,148.20294
+8186,2.3900561,168.2291
+8187,1.8394914,104.333725
+8188,1.8168988,144.37437
+8189,3.1623569,212.27931
+8190,3.1060944,202.41037
+8191,2.5126956,156.32053
+8192,1.7963856,109.261795
+8193,2.67186,156.89395
+8194,2.1032367,102.80972
+8195,2.3232145,126.73813
+8196,1.9167144,153.4176
+8197,2.162169,161.24736
+8198,2.1657865,107.01943
+8199,2.4404676,179.72618
+8200,2.2983453,141.56042
+8201,1.6604625,118.51675
+8202,2.0343807,110.514755
+8203,2.1270757,171.63806
+8204,1.8790026,112.89661
+8205,2.0097132,121.719574
+8206,1.5067927,92.369446
+8207,2.0442119,129.613
+8208,2.1788085,106.52094
+8209,1.6020797,84.34347
+8210,4.0212164,242.66998
+8211,3.1506402,224.62404
+8212,2.7207212,187.23904
+8213,3.17082,199.24193
+8214,2.2068326,112.80582
+8215,2.2562525,96.4081
+8216,2.266271,132.96645
+8217,3.367501,206.45578
+8218,2.010456,86.102974
+8219,2.8370585,202.99887
+8220,2.0989761,97.7845
+8221,3.114223,203.76352
+8222,2.2621787,148.13289
+8223,2.6469498,166.18341
+8224,1.9982852,127.85019
+8225,3.1707134,196.03099
+8226,2.4089572,123.640594
+8227,1.4668807,90.10008
+8228,3.6028047,220.82121
+8229,2.2974906,156.54282
+8230,2.5946546,158.80396
+8231,1.56385,68.49423
+8232,2.767713,214.76128
+8233,3.4745145,235.97446
+8234,2.377092,134.66003
+8235,1.9070474,131.3089
+8236,1.7115849,114.835464
+8237,1.958766,105.153336
+8238,2.0421882,105.8716
+8239,2.7980282,189.16214
+8240,1.5571859,84.13917
+8241,2.1008983,117.86335
+8242,1.9630154,128.24533
+8243,2.9156547,202.47668
+8244,2.782554,204.31198
+8245,3.9342742,244.54659
+8246,2.3555677,157.35765
+8247,2.0569162,156.85898
+8248,2.001991,186.92624
+8249,1.6303992,89.02695
+8250,1.3042216,72.572136
+8251,2.4386356,164.8216
+8252,2.2330108,107.73893
+8253,3.1818194,227.94066
+8254,2.2666335,123.86394
+8255,2.635412,147.2076
+8256,2.4565225,164.04019
+8257,2.5532584,161.08801
+8258,2.1223989,156.55203
+8259,3.2805285,235.71753
+8260,2.7846282,209.5398
+8261,2.6323025,173.78815
+8262,2.5477605,141.90485
+8263,1.894428,118.78353
+8264,2.2274542,192.14943
+8265,2.3734431,134.10153
+8266,2.4708292,160.76001
+8267,3.2288873,190.70935
+8268,2.6149364,216.88199
+8269,1.4632523,81.17446
+8270,1.9418443,99.596924
+8271,2.665373,185.6177
+8272,2.0591173,97.18263
+8273,2.0641134,140.37753
+8274,1.7797328,100.31662
+8275,2.2559633,128.56403
+8276,3.5621352,242.8192
+8277,1.7158355,85.06877
+8278,2.7503824,202.66348
+8279,4.0720277,248.73045
+8280,3.2929819,212.18742
+8281,2.1022522,111.767395
+8282,2.4184406,172.54233
+8283,3.1904678,201.99974
+8284,2.7410324,158.46051
+8285,1.8354385,128.95502
+8286,1.9335132,98.963135
+8287,2.5577395,177.92307
+8288,1.7923728,95.14192
+8289,2.366913,121.4522
+8290,2.2838137,149.41751
+8291,3.3032095,230.13065
+8292,2.2743704,129.78311
+8293,2.574963,144.14954
+8294,3.2608914,198.5324
+8295,2.9058528,188.91025
+8296,3.63061,227.65654
+8297,2.2587948,160.09975
+8298,2.1739376,115.72905
+8299,2.973448,208.76161
+8300,3.5348284,245.34624
+8301,1.4426872,91.58623
+8302,2.359345,128.21149
+8303,2.298853,124.03499
+8304,2.735333,204.45184
+8305,2.3646805,159.8887
+8306,3.4775069,245.63972
+8307,2.4442198,148.60759
+8308,2.6771183,164.24213
+8309,2.4560235,106.980774
+8310,5.009883,253.93507
+8311,2.4795318,156.50067
+8312,3.7440522,245.55716
+8313,1.9967494,95.49831
+8314,2.5718813,178.41151
+8315,2.631281,157.05183
+8316,3.4271574,229.94835
+8317,1.5504367,78.05801
+8318,2.825912,214.07607
+8319,2.4159184,154.0621
+8320,2.373882,139.48465
+8321,2.3945186,143.48221
+8322,2.161819,115.74455
+8323,2.2548697,100.855484
+8324,2.1957083,156.12032
+8325,3.2340386,214.25244
+8326,2.6336818,144.58716
+8327,1.2607447,72.81296
+8328,3.0664897,236.5968
+8329,3.6914825,245.51405
+8330,1.9397203,96.88631
+8331,3.1261678,233.60544
+8332,2.4850404,181.82968
+8333,2.6801574,180.18492
+8334,1.8010907,97.33276
+8335,3.8205314,238.12862
+8336,1.406707,83.09587
+8337,2.2397752,140.18605
+8338,2.7269928,215.56108
+8339,2.3227687,138.64296
+8340,3.2725153,224.97737
+8341,2.7007904,196.82251
+8342,2.4998395,123.23439
+8343,3.0209067,200.34306
+8344,2.7305098,187.97849
+8345,2.502987,175.84712
+8346,4.760064,250.81131
+8347,2.910739,178.60927
+8348,2.5173411,189.09702
+8349,4.004638,251.74106
+8350,2.6951404,150.60028
+8351,3.7617488,232.73027
+8352,2.2856004,178.28726
+8353,2.165577,110.767334
+8354,2.024384,94.29879
+8355,2.6743512,153.54163
+8356,2.111299,112.05398
+8357,2.1941068,152.19131
+8358,2.0269804,119.060715
+8359,2.3175912,123.12333
+8360,1.4030185,74.50586
+8361,2.6627138,132.64021
+8362,2.0486736,117.75115
+8363,1.6637204,94.015526
+8364,1.744484,77.49873
+8365,1.7247847,82.765045
+8366,1.9133849,105.34543
+8367,2.4807832,188.10266
+8368,3.1821783,204.39122
+8369,2.413053,118.5038
+8370,3.1674552,220.48131
+8371,2.1382258,145.69035
+8372,2.929277,187.0218
+8373,2.8345494,206.50114
+8374,2.399709,209.15343
+8375,3.0471542,213.00546
+8376,1.9536654,105.00276
+8377,2.2432227,148.72221
+8378,1.9905343,105.009766
+8379,1.6326356,105.812546
+8380,2.2269564,151.93124
+8381,2.4764035,174.05038
+8382,2.5353513,130.34952
+8383,2.648912,191.38225
+8384,1.98121,116.88266
+8385,2.4814844,147.24863
+8386,2.354007,170.09409
+8387,2.4994214,161.12535
+8388,2.3162682,163.17833
+8389,2.0835016,129.4198
+8390,2.9347038,208.44325
+8391,2.5006416,170.21964
+8392,2.4192128,187.74603
+8393,2.7638383,193.18399
+8394,3.0206501,233.88203
+8395,2.8991418,222.25363
+8396,2.8596988,172.99255
+8397,2.4084668,157.90414
+8398,2.5078669,140.97336
+8399,2.586099,155.03337
+8400,2.275458,109.52774
+8401,2.2573564,113.82147
+8402,2.8411574,143.08966
+8403,2.0209613,104.60843
+8404,1.6725495,81.283905
+8405,1.9178954,91.96636
+8406,3.334956,217.32103
+8407,2.7459145,159.30681
+8408,2.7429967,171.4817
+8409,2.7843585,188.46725
+8410,2.5717585,116.53699
+8411,2.2681146,121.19169
+8412,2.789914,162.42627
+8413,4.1966043,249.68384
+8414,2.7473474,206.06836
+8415,1.9461249,84.596436
+8416,4.1089373,249.07803
+8417,2.5655086,178.99713
+8418,2.31347,149.1004
+8419,2.5515668,209.26907
+8420,2.5102954,160.7858
+8421,2.8731313,173.51778
+8422,3.27074,217.37909
+8423,2.7763705,207.24341
+8424,1.8449299,110.20384
+8425,2.893127,148.01776
+8426,1.5772746,90.72677
+8427,2.639687,168.49951
+8428,3.087496,223.09369
+8429,2.4662151,136.36075
+8430,1.8301208,120.40375
+8431,2.011754,92.88687
+8432,2.1241934,127.50964
+8433,2.4940903,183.5549
+8434,2.68369,192.55182
+8435,3.577643,224.57935
+8436,2.5003037,142.5607
+8437,2.5349014,203.13074
+8438,2.701748,185.18677
+8439,2.6800723,159.08786
+8440,1.8442974,113.78901
+8441,1.9597963,109.43525
+8442,2.110702,102.668686
+8443,1.7122059,117.02347
+8444,1.492165,93.229126
+8445,2.3381152,121.85072
+8446,3.6932378,238.01456
+8447,2.8307383,190.09732
+8448,1.998928,74.20484
+8449,1.8851691,102.42633
+8450,2.4822054,148.49203
+8451,2.0269287,92.21864
+8452,3.0719519,178.6876
+8453,2.364637,144.15388
+8454,3.0387166,214.54573
+8455,3.1859283,193.27542
+8456,2.4088788,100.19734
+8457,3.0137925,211.79672
+8458,2.9356425,211.23557
+8459,3.3520026,223.99489
+8460,2.5385518,177.10252
+8461,3.2823155,233.00848
+8462,2.281076,158.58496
+8463,2.851461,212.74959
+8464,2.760665,170.54138
+8465,2.4152339,149.6602
+8466,2.6347759,185.9773
+8467,2.3545063,132.05942
+8468,1.8327026,108.517746
+8469,2.9401217,197.74399
+8470,2.9380257,206.37543
+8471,2.8402684,192.08392
+8472,2.2476733,163.71698
+8473,2.0691373,117.83173
+8474,1.7180979,94.74963
+8475,3.0719354,211.38445
+8476,2.7641368,164.32402
+8477,1.9682268,98.41079
+8478,2.0646539,142.3859
+8479,3.0371196,195.14021
+8480,2.0964491,123.64662
+8481,1.8952925,107.2014
+8482,2.2084277,117.38751
+8483,1.6981317,90.18444
+8484,2.7112732,181.61539
+8485,3.0755959,217.89427
+8486,3.436399,235.43631
+8487,2.221293,145.76978
+8488,2.6268597,162.4851
+8489,1.7482754,92.471115
+8490,2.9791138,212.00903
+8491,2.5657964,136.13828
+8492,1.9631175,99.42963
+8493,2.162309,147.9014
+8494,1.4444462,85.28861
+8495,1.5860665,84.21055
+8496,2.5276601,171.6273
+8497,3.7325177,244.10239
+8498,2.208881,123.57698
+8499,3.2654853,222.57849
+8500,2.4259038,170.71405
+8501,3.2726436,229.09842
+8502,2.454612,154.87671
+8503,1.5600249,105.457504
+8504,2.5374134,183.98026
+8505,2.8792496,174.15274
+8506,3.2346926,219.4174
+8507,2.2939987,133.19736
+8508,3.0320058,231.9142
+8509,3.4672651,244.35403
+8510,2.236819,114.531906
+8511,3.5801022,222.026
+8512,2.5295722,190.65001
+8513,2.5578427,172.29297
+8514,2.860387,151.18146
+8515,1.7490953,86.89125
+8516,1.8278677,90.762115
+8517,2.0774493,142.27301
+8518,3.623057,241.61868
+8519,2.93177,219.22887
+8520,1.9137444,85.12109
+8521,2.3329287,121.71352
+8522,2.5575323,167.46361
+8523,1.4101887,90.04454
+8524,1.690409,116.80508
+8525,2.7364504,175.73138
+8526,3.0210109,222.84903
+8527,3.060844,215.31909
+8528,2.4727306,132.81113
+8529,2.1691442,109.917465
+8530,2.3231516,116.01174
+8531,3.5013893,234.36073
+8532,1.9393003,128.74905
+8533,2.728389,175.73607
+8534,2.6919246,200.33107
+8535,1.9837513,134.65158
+8536,1.9963644,106.73157
+8537,1.9703872,93.04683
+8538,2.0380595,147.42566
+8539,2.6116176,174.43726
+8540,2.0430708,114.00148
+8541,2.7271562,173.92273
+8542,2.4912982,126.03196
+8543,2.3154945,151.18967
+8544,1.6963365,101.90811
+8545,3.3266048,202.86838
+8546,2.7004666,165.87125
+8547,2.9693365,188.23517
+8548,2.1839018,121.992355
+8549,3.2273574,203.18361
+8550,2.059796,140.7185
+8551,3.6817207,240.99211
+8552,1.6958083,124.810295
+8553,2.6569142,208.4925
+8554,2.256156,142.48889
+8555,2.6360826,130.8529
+8556,2.338018,118.94066
+8557,2.0772293,118.86633
+8558,3.7481065,243.74113
+8559,2.3170648,130.66309
+8560,2.9007509,223.30145
+8561,1.8380669,132.55304
+8562,2.7223268,202.5391
+8563,3.1068013,212.36534
+8564,1.3284034,103.8653
+8565,1.9522594,140.73401
+8566,3.7572503,237.71104
+8567,2.6561494,201.62167
+8568,2.9864306,166.78075
+8569,2.823119,221.6007
+8570,2.0340266,126.8775
+8571,2.581364,138.64055
+8572,3.2756047,180.33781
+8573,1.8749231,103.43503
+8574,1.8223615,83.63776
+8575,2.609423,190.81216
+8576,2.024005,100.65152
+8577,2.43477,191.58557
+8578,1.3907789,95.32789
+8579,2.6204274,142.99814
+8580,1.4190353,87.72286
+8581,2.6662338,165.90436
+8582,1.910132,105.695145
+8583,2.93471,188.69707
+8584,3.0636308,219.52345
+8585,2.2194514,93.74437
+8586,3.7357838,242.8163
+8587,2.562448,149.00647
+8588,3.3106236,198.42526
+8589,2.2515624,136.82968
+8590,3.3240814,223.2975
+8591,2.5838046,162.85373
+8592,1.018195,69.95596
+8593,2.2251363,106.14107
+8594,2.321985,129.32005
+8595,2.705424,204.19388
+8596,2.4035485,143.56812
+8597,2.4710288,173.86728
+8598,1.6886699,78.28283
+8599,2.1472635,101.82922
+8600,1.8160813,91.328995
+8601,3.4241543,208.78023
+8602,2.2586846,101.16
+8603,3.0742717,213.39578
+8604,2.634927,161.68433
+8605,2.215048,122.20273
+8606,2.6738987,196.2854
+8607,2.3127158,137.1784
+8608,1.6332201,104.1966
+8609,2.2618618,163.77325
+8610,2.5247614,130.39893
+8611,3.285798,228.18806
+8612,2.096654,118.516754
+8613,1.9399034,114.30118
+8614,2.0261238,114.806984
+8615,2.6774545,164.57495
+8616,2.2362227,134.86163
+8617,3.3507104,228.42502
+8618,1.5735385,105.01701
+8619,2.0920463,136.92659
+8620,2.8301983,209.12273
+8621,2.7639089,150.78291
+8622,1.2562767,76.46854
+8623,2.8077493,169.70398
+8624,2.2442985,134.44583
+8625,3.0913749,204.40527
+8626,2.4199793,152.90402
+8627,1.3991079,85.89748
+8628,1.3063388,72.85132
+8629,2.5152822,188.08032
+8630,2.6197813,151.18648
+8631,2.4210372,131.59961
+8632,2.1462555,122.43358
+8633,2.618683,168.24695
+8634,2.2940297,137.38779
+8635,1.79713,110.95865
+8636,3.4902291,238.1096
+8637,4.116935,248.58746
+8638,3.5201435,221.57915
+8639,2.4740186,145.75946
+8640,3.81246,244.2372
+8641,2.542412,159.46213
+8642,1.7623575,92.383064
+8643,2.7926354,170.55688
+8644,1.7498811,100.75752
+8645,1.2803988,81.83052
+8646,2.089317,126.99248
+8647,1.7497973,130.04611
+8648,2.706983,159.6329
+8649,2.6514416,169.68286
+8650,2.671292,129.34283
+8651,1.6277212,88.8384
+8652,1.9202845,90.113396
+8653,2.3141456,134.68875
+8654,3.573749,242.80565
+8655,2.64769,165.23544
+8656,2.5897877,204.24695
+8657,2.0036864,95.584045
+8658,1.8817992,125.32381
+8659,3.8661838,246.86497
+8660,2.3836412,158.47134
+8661,1.937758,115.71268
+8662,3.9528039,243.92267
+8663,3.0561194,227.0129
+8664,4.4872246,252.5137
+8665,2.0687883,125.66559
+8666,1.8795736,158.5585
+8667,2.3964176,157.9794
+8668,2.2714453,143.37314
+8669,2.5807679,167.81891
+8670,2.0198827,123.275604
+8671,2.492835,142.53632
+8672,2.3954318,165.36494
+8673,1.9510841,104.15482
+8674,1.733671,82.787575
+8675,3.2269642,217.85715
+8676,2.7841609,160.74368
+8677,2.5955377,169.35896
+8678,1.6108687,97.558174
+8679,2.292884,124.57891
+8680,2.393702,164.76845
+8681,2.9451184,232.28345
+8682,2.0452697,132.44627
+8683,2.9844494,209.05493
+8684,3.423363,220.87947
+8685,2.6308289,146.01445
+8686,1.9859961,161.44409
+8687,2.1460426,110.17099
+8688,2.4015937,94.343155
+8689,1.7687765,89.02933
+8690,3.79473,245.43398
+8691,2.3561502,166.50284
+8692,2.0311077,117.648254
+8693,2.3987079,160.98535
+8694,1.9793923,120.210464
+8695,2.6494915,191.1907
+8696,3.2208712,192.65488
+8697,2.174308,134.1885
+8698,2.7440906,196.35983
+8699,2.8906577,210.66235
+8700,1.6401527,87.04883
+8701,2.9001203,186.04855
+8702,2.8139672,204.66214
+8703,2.16185,155.68668
+8704,2.5924344,198.74713
+8705,3.3448706,221.11432
+8706,1.9457785,145.88129
+8707,3.1507702,221.57307
+8708,2.4217124,136.62943
+8709,2.8589535,171.16559
+8710,3.3107975,215.94435
+8711,2.4472184,187.77191
+8712,2.615959,171.80847
+8713,2.2552142,154.7507
+8714,3.767091,239.0923
+8715,2.7544262,194.42328
+8716,1.9548198,91.6099
+8717,2.760503,205.39285
+8718,2.013741,105.21666
+8719,3.1731584,214.38795
+8720,2.8361971,227.45262
+8721,2.162005,126.26737
+8722,3.4978569,213.55557
+8723,2.870932,182.61404
+8724,2.1813323,127.94903
+8725,2.7128057,206.91571
+8726,2.0995402,117.706726
+8727,1.6041627,85.7445
+8728,2.1710994,151.03445
+8729,3.2834918,204.1983
+8730,2.728579,186.40451
+8731,2.546697,156.78989
+8732,2.102779,138.94467
+8733,1.6483457,88.610565
+8734,1.9456115,98.67619
+8735,2.5298784,210.05768
+8736,2.247595,128.49155
+8737,3.2317247,241.37839
+8738,2.5430727,169.67517
+8739,3.183336,212.42542
+8740,2.580584,136.61229
+8741,2.6916656,153.48975
+8742,2.0492387,115.84519
+8743,2.272864,105.26735
+8744,1.9982224,115.703735
+8745,2.8433018,174.39726
+8746,2.3734987,161.18137
+8747,2.0490065,114.63463
+8748,2.8612022,157.95366
+8749,2.3561711,159.85089
+8750,2.281427,115.08104
+8751,1.7284777,100.46164
+8752,2.337199,187.55469
+8753,2.465339,173.62698
+8754,2.196889,145.89172
+8755,2.2992835,157.86058
+8756,2.968414,218.1807
+8757,1.615693,89.113045
+8758,3.5943654,226.07347
+8759,2.174182,130.54205
+8760,1.780344,98.36943
+8761,1.9698514,99.30966
+8762,2.0148485,136.41992
+8763,2.811006,192.12857
+8764,2.538694,159.91234
+8765,2.8227515,180.26614
+8766,2.8754609,179.73178
+8767,2.5432172,174.49045
+8768,3.0340447,204.5671
+8769,2.7033849,170.90817
+8770,2.381433,195.56569
+8771,3.3516982,222.8169
+8772,2.0280807,122.0966
+8773,2.3408017,116.20714
+8774,1.5504445,84.427414
+8775,2.176728,92.57032
+8776,3.7389302,231.38657
+8777,3.535605,231.03183
+8778,2.440601,126.4547
+8779,2.827306,214.43225
+8780,3.4252055,236.71469
+8781,1.9462831,128.11081
+8782,2.7055893,186.02156
+8783,2.4197917,121.14394
+8784,2.172525,122.12294
+8785,3.2943597,220.90897
+8786,2.6588748,149.7175
+8787,1.7241886,107.25603
+8788,2.8660667,182.3231
+8789,2.4380105,163.75865
+8790,2.7315533,188.95213
+8791,1.489929,86.739235
+8792,3.7743073,217.408
+8793,2.3853648,169.26291
+8794,3.2036512,167.86966
+8795,1.5778599,127.31284
+8796,2.4398234,164.49481
+8797,1.6822399,98.85112
+8798,2.3940673,129.5571
+8799,2.833375,190.16586
+8800,1.7208331,99.42158
+8801,2.8695707,196.5849
+8802,2.6792905,197.4193
+8803,2.104807,113.75241
+8804,2.915455,208.8083
+8805,2.1472116,147.33029
+8806,2.2756047,113.93465
+8807,2.115616,124.55357
+8808,3.7520576,238.68767
+8809,2.1799986,121.58862
+8810,2.096356,112.50595
+8811,2.6766162,175.0544
+8812,2.0149198,111.6208
+8813,1.6508934,109.22792
+8814,2.9039736,199.40402
+8815,2.3244872,149.64142
+8816,2.874612,172.08487
+8817,1.6436626,99.60984
+8818,2.2972941,102.408005
+8819,1.8565431,139.99954
+8820,3.3830357,218.33673
+8821,1.9216107,128.10457
+8822,2.5016294,147.28745
+8823,2.6040595,206.60689
+8824,2.935612,207.84703
+8825,2.8209994,189.30847
+8826,1.7185276,92.94647
+8827,2.9277368,215.42596
+8828,2.6903064,142.02158
+8829,1.9169751,138.11523
+8830,2.4501333,156.72827
+8831,3.4412503,224.40063
+8832,1.8346531,121.18175
+8833,1.9995137,101.68002
+8834,3.2324657,219.49277
+8835,2.2008898,155.872
+8836,2.021082,110.74632
+8837,2.757282,191.01685
+8838,1.7524798,102.39039
+8839,3.5039446,238.42726
+8840,2.3527708,147.46379
+8841,1.5348624,101.44287
+8842,2.558577,204.39456
+8843,2.1502879,134.94772
+8844,2.319962,130.07501
+8845,1.7415296,114.79402
+8846,2.0296385,123.275734
+8847,2.6544325,179.4574
+8848,2.4392827,158.77155
+8849,1.6161197,120.14249
+8850,1.7301004,86.350685
+8851,2.1556,127.62419
+8852,5.037242,254.09361
+8853,3.0909894,198.33205
+8854,2.282782,157.45892
+8855,2.4512448,195.84584
+8856,2.8096445,159.16954
+8857,1.6725352,84.79698
+8858,3.2669263,213.9206
+8859,2.8791735,209.90396
+8860,2.2801785,131.60721
+8861,2.3812442,141.31122
+8862,1.8099025,93.78608
+8863,2.3955293,120.98567
+8864,2.4944587,115.743454
+8865,2.408043,156.45056
+8866,2.2423432,133.24484
+8867,3.1937578,201.99123
+8868,2.5066392,174.20926
+8869,3.18006,211.97531
+8870,2.77235,178.19464
+8871,1.5411152,80.10264
+8872,3.270537,205.00255
+8873,2.8060486,202.68428
+8874,1.751046,95.839005
+8875,2.4193661,113.814514
+8876,1.6851147,88.32184
+8877,3.6684663,236.59253
+8878,2.8771834,203.33163
+8879,1.707285,100.93419
+8880,3.8185525,248.94447
+8881,3.1382875,213.4725
+8882,2.776525,168.83456
+8883,2.627341,155.85974
+8884,4.205222,251.31517
+8885,2.8554657,125.561905
+8886,2.7384048,179.6141
+8887,2.0634298,110.28552
+8888,2.1697721,97.602646
+8889,2.1784017,117.397095
+8890,2.4985044,125.94191
+8891,3.0852578,186.67082
+8892,2.3198798,140.12656
+8893,1.4942389,95.29168
+8894,2.554773,164.65692
+8895,1.3664963,80.76572
+8896,2.3655374,164.26872
+8897,1.9729488,96.52811
+8898,1.6606148,87.839485
+8899,3.3593028,235.02782
+8900,2.071933,140.35077
+8901,3.7063534,232.28967
+8902,2.886188,198.65071
+8903,1.7579576,85.628334
+8904,1.955686,98.83803
+8905,2.795282,211.47424
+8906,2.735005,193.75012
+8907,2.3304124,111.57028
+8908,1.5069209,80.567604
+8909,2.8018787,203.87592
+8910,2.4322457,161.08676
+8911,2.139699,128.79199
+8912,2.1585202,142.53464
+8913,2.5571375,205.63655
+8914,2.1014202,125.87967
+8915,2.2697818,125.85769
+8916,1.9836496,122.00548
+8917,1.7007413,96.385216
+8918,2.741774,198.94228
+8919,2.617259,173.73477
+8920,3.0403697,218.63063
+8921,3.048069,230.15678
+8922,2.0070791,123.45038
+8923,2.5864046,154.92827
+8924,2.0219438,93.03176
+8925,2.7051494,199.71507
+8926,3.3504512,211.75963
+8927,1.4996316,103.7265
+8928,2.0962634,140.2064
+8929,3.5886235,240.67735
+8930,4.1391115,252.96487
+8931,2.8005376,202.0485
+8932,4.4847713,252.29477
+8933,2.042486,137.06735
+8934,2.9794364,214.42017
+8935,2.3292272,167.55862
+8936,1.8614242,135.29602
+8937,3.677322,231.33955
+8938,3.3267183,216.91037
+8939,2.0712638,117.919914
+8940,2.8966231,176.73367
+8941,1.647083,97.08769
+8942,2.1929226,145.60129
+8943,3.8802955,246.55054
+8944,2.2934012,134.86243
+8945,3.593428,245.23448
+8946,1.7020134,94.965
+8947,3.5142832,241.50114
+8948,2.299378,149.38663
+8949,3.9857917,251.10873
+8950,1.7457163,89.11493
+8951,2.2679417,134.9682
+8952,1.3861878,100.05168
+8953,2.4054658,120.4784
+8954,1.8378252,108.22333
+8955,2.6053443,177.54092
+8956,3.4434783,239.58653
+8957,2.6145272,161.64221
+8958,2.025928,89.33576
+8959,2.6355834,187.71744
+8960,2.2620206,147.10605
+8961,1.8356806,147.97798
+8962,2.119679,134.22012
+8963,1.7426517,121.635605
+8964,2.791459,183.31955
+8965,2.3781817,122.03648
+8966,2.5223417,175.45403
+8967,2.635718,146.70615
+8968,2.1765833,130.36882
+8969,1.7924459,111.50946
+8970,2.6389604,183.80457
+8971,2.774438,225.33391
+8972,2.903959,182.23627
+8973,2.531359,173.29861
+8974,2.019392,129.76273
+8975,2.2471108,135.13165
+8976,3.5467238,233.1692
+8977,1.7014247,82.88899
+8978,2.0432653,134.96283
+8979,2.2651386,131.5063
+8980,1.6239779,91.70689
+8981,3.3226666,226.69682
+8982,1.5686314,90.159935
+8983,3.2583482,217.10368
+8984,2.3265176,145.20923
+8985,1.7396356,79.11335
+8986,2.9205945,210.33421
+8987,2.721164,215.89642
+8988,1.5258464,86.057846
+8989,2.2586124,164.16533
+8990,2.2509217,130.04123
+8991,2.8233511,197.93115
+8992,1.5944483,102.65248
+8993,2.1409578,132.71875
+8994,1.9207796,104.645996
+8995,2.9428809,164.88402
+8996,1.7614473,128.867
+8997,2.5813842,170.63562
+8998,2.2508118,101.238144
+8999,2.5830352,182.18546
+9000,2.0685935,84.05788
+9001,2.3919413,126.181274
+9002,3.2464218,231.00992
+9003,3.1109626,223.89587
+9004,3.4293017,243.4254
+9005,2.3929207,150.67032
+9006,2.1133993,105.33611
+9007,2.5319269,204.55565
+9008,1.8499382,91.5833
+9009,2.260377,172.27237
+9010,1.9409168,98.66693
+9011,2.4912524,148.44409
+9012,2.21187,97.92146
+9013,1.3892963,78.09508
+9014,2.946571,161.66708
+9015,1.9977,124.479294
+9016,3.2663789,237.95721
+9017,2.936259,184.8126
+9018,2.6209729,102.50003
+9019,2.3055863,122.68524
+9020,2.149261,97.26297
+9021,2.091307,111.26663
+9022,3.9226546,250.72125
+9023,2.7777295,176.82849
+9024,2.610097,146.23848
+9025,3.82485,247.81012
+9026,2.5645726,176.08276
+9027,3.2070243,207.14868
+9028,2.329053,112.98867
+9029,2.0238132,97.90123
+9030,1.6424278,93.11483
+9031,2.0975657,120.45091
+9032,3.001165,221.89616
+9033,1.5777556,102.06498
+9034,2.2300828,158.4519
+9035,2.1292927,107.3457
+9036,2.4102826,144.98138
+9037,2.7523255,182.82149
+9038,3.095492,223.59813
+9039,2.4005303,111.42539
+9040,1.9949701,122.65855
+9041,2.5609956,158.56966
+9042,3.084621,220.93372
+9043,2.287435,171.19543
+9044,2.8522377,178.90352
+9045,2.6968222,173.93306
+9046,1.8082552,116.502754
+9047,3.0861866,227.49141
+9048,2.9630084,226.03464
+9049,2.5760949,146.26376
+9050,1.9041212,111.34371
+9051,2.2294095,146.54785
+9052,4.093682,248.04945
+9053,2.0988898,111.94193
+9054,2.412866,129.02463
+9055,3.1548944,211.22424
+9056,2.6963704,204.80127
+9057,3.1045797,222.31488
+9058,3.3751512,211.17729
+9059,2.2264051,149.81876
+9060,1.8496245,108.003296
+9061,3.0407555,209.79051
+9062,2.6513877,185.42331
+9063,2.765237,160.5208
+9064,3.4260936,225.14386
+9065,3.0063953,190.31552
+9066,2.7242215,151.26736
+9067,3.539228,234.74583
+9068,2.2448459,117.12869
+9069,2.870914,166.88441
+9070,1.5685313,85.618256
+9071,3.6766162,247.93896
+9072,2.280883,165.87698
+9073,1.8527055,95.83302
+9074,4.020829,247.75523
+9075,2.3599067,128.42561
+9076,2.0170803,115.78971
+9077,1.7051585,98.87095
+9078,4.3163805,251.90498
+9079,2.7227867,182.00679
+9080,2.5049903,139.29567
+9081,3.1412568,232.0303
+9082,1.4911501,83.81857
+9083,3.4942307,229.83633
+9084,2.669324,204.26562
+9085,3.9696603,244.18091
+9086,1.9223483,104.335075
+9087,2.883818,175.98232
+9088,3.1019254,180.09738
+9089,3.687942,235.85515
+9090,2.0968966,132.72223
+9091,4.160224,251.7224
+9092,2.7891934,169.04716
+9093,2.6473136,192.54597
+9094,1.8410016,109.73364
+9095,2.2703197,126.906784
+9096,1.9793737,142.1442
+9097,3.2399259,217.3616
+9098,3.4896436,235.1716
+9099,2.4731183,170.6352
+9100,3.1385748,219.42766
+9101,2.6140103,154.44235
+9102,2.4256759,133.00034
+9103,2.7608862,195.68825
+9104,2.0097141,122.43054
+9105,2.1337063,121.916565
+9106,2.3585877,195.93307
+9107,2.7767112,200.77301
+9108,3.4639888,224.03452
+9109,3.442336,219.98529
+9110,3.799424,236.9494
+9111,2.2538903,143.66985
+9112,2.209333,138.88303
+9113,1.8457975,104.14727
+9114,3.5581307,241.09143
+9115,3.2319348,238.63335
+9116,2.6044838,205.00627
+9117,3.714389,224.16632
+9118,2.8367295,191.48778
+9119,2.3990066,114.765656
+9120,1.8644882,91.98699
+9121,2.4754617,183.24252
+9122,2.7689385,196.22931
+9123,3.4243355,221.88153
+9124,2.2362661,182.966
+9125,3.3467517,233.3231
+9126,1.9463341,114.21829
+9127,2.179819,114.965965
+9128,1.698093,125.46045
+9129,1.8895932,90.79147
+9130,2.029833,129.47302
+9131,2.9072337,220.7083
+9132,1.6768209,104.81524
+9133,1.2879945,82.08888
+9134,2.2071378,123.63168
+9135,1.7154701,104.33313
+9136,1.8984942,107.18332
+9137,2.762671,160.62636
+9138,1.9359086,124.6288
+9139,2.288456,135.55914
+9140,2.0766468,138.04202
+9141,2.2165945,171.17497
+9142,2.3511486,165.24164
+9143,3.7464523,248.70561
+9144,2.3372326,161.10117
+9145,2.1013484,109.50545
+9146,2.2864225,193.71953
+9147,2.6087546,148.85123
+9148,2.7251263,185.48892
+9149,3.2897224,208.48439
+9150,2.9306672,226.20659
+9151,1.9741988,93.96802
+9152,2.3579812,151.46432
+9153,1.7542925,101.93921
+9154,1.887047,123.58132
+9155,2.9061704,212.59277
+9156,2.7373059,180.27449
+9157,2.540043,159.71646
+9158,3.1239095,213.81032
+9159,2.5583549,185.78946
+9160,1.8392608,109.51782
+9161,2.5648887,207.04964
+9162,2.284009,145.21964
+9163,1.6921899,101.00832
+9164,1.826039,155.28812
+9165,1.916626,142.94658
+9166,2.0892167,95.670685
+9167,2.3830276,187.98929
+9168,3.2095473,234.47566
+9169,1.8046368,111.18849
+9170,1.5919344,93.17882
+9171,2.714452,174.90341
+9172,2.3322072,161.65016
+9173,2.362357,143.31712
+9174,2.8576941,217.30464
+9175,3.001385,211.79497
+9176,3.0578074,223.7307
+9177,3.3082156,215.34482
+9178,3.0672412,208.70563
+9179,2.3800173,135.92575
+9180,1.8994323,107.5216
+9181,2.5504904,167.59865
+9182,3.2333496,218.50499
+9183,2.1910415,165.91766
+9184,2.5869083,197.73863
+9185,2.379519,141.6929
+9186,3.61562,224.77193
+9187,2.6218982,163.97437
+9188,2.9634795,216.87408
+9189,2.5758846,135.53317
+9190,3.5385847,240.89783
+9191,2.5333343,136.4609
+9192,1.5953226,107.56329
+9193,2.3179955,147.474
+9194,2.0480592,90.73415
+9195,3.253656,192.76837
+9196,2.755834,183.04102
+9197,2.4474206,158.74753
+9198,3.0451515,206.20786
+9199,2.3976533,133.29114
+9200,2.1496363,155.95724
+9201,3.5578089,238.90182
+9202,2.4364092,166.46178
+9203,2.272795,153.99991
+9204,2.4121966,142.90286
+9205,1.7672387,104.19517
+9206,1.9307669,157.55511
+9207,2.6268432,173.85266
+9208,2.8064075,169.5727
+9209,1.7212275,89.79961
+9210,1.6562418,80.174446
+9211,1.7624682,98.10314
+9212,2.4854474,173.88141
+9213,2.4783847,177.48312
+9214,2.6508794,223.38121
+9215,2.2669544,95.57666
+9216,2.4870355,166.73157
+9217,1.7207488,99.6649
+9218,4.766797,253.04568
+9219,1.785445,118.18483
+9220,1.8768846,98.582504
+9221,2.24386,126.65492
+9222,2.3147147,133.58994
+9223,2.4153833,136.58473
+9224,2.6154416,142.74805
+9225,2.0882277,88.356186
+9226,1.62722,118.90786
+9227,2.300773,136.37407
+9228,1.6832042,77.07304
+9229,2.7629645,162.69753
+9230,1.5321567,95.120224
+9231,3.1837335,220.66873
+9232,2.8074017,193.67847
+9233,2.130941,158.37885
+9234,2.492352,177.65915
+9235,2.1329205,166.64679
+9236,2.4671159,141.2978
+9237,2.9182336,145.85677
+9238,1.7865944,92.57793
+9239,2.7523592,180.56313
+9240,2.8914616,215.80086
+9241,2.0535467,119.52533
+9242,2.4229677,184.45378
+9243,2.2108092,185.48833
+9244,2.8804383,153.3804
+9245,1.8703806,108.21721
+9246,2.3895836,149.63716
+9247,1.7129422,112.165596
+9248,3.0686245,224.45415
+9249,2.5862806,160.74406
+9250,1.6355727,89.60316
+9251,2.1364157,151.56268
+9252,1.5239718,90.21017
+9253,2.439412,146.74112
+9254,1.9765928,100.71609
+9255,3.0544577,207.16136
+9256,2.5796697,145.44653
+9257,3.1099944,194.04242
+9258,3.070189,230.77498
+9259,1.9865043,94.76658
+9260,2.3277855,129.35535
+9261,3.3866153,173.04727
+9262,2.3870158,118.48613
+9263,1.6042984,88.12457
+9264,2.2417052,157.83604
+9265,2.810331,179.16013
+9266,2.9676843,178.21387
+9267,1.7589605,91.685074
+9268,2.4846718,150.95628
+9269,2.4602883,127.31059
+9270,1.6375034,94.55405
+9271,2.019366,108.5325
+9272,3.0334792,207.32657
+9273,1.5737872,93.2121
+9274,3.9156775,239.50822
+9275,3.1884623,221.61894
+9276,3.7868626,247.59366
+9277,2.2770379,168.09988
+9278,2.485356,167.82335
+9279,2.375577,167.24002
+9280,4.8383965,252.8363
+9281,2.415439,174.30276
+9282,3.0524926,218.2481
+9283,3.2885737,216.66026
+9284,1.7506552,92.08928
+9285,2.3873389,122.15525
+9286,2.071106,143.71843
+9287,3.1161785,229.36203
+9288,3.924118,246.57657
+9289,2.3831563,160.56308
+9290,2.080415,130.92828
+9291,2.816299,202.14694
+9292,3.0926535,198.5018
+9293,2.2857985,119.17633
+9294,3.7359357,224.58292
+9295,2.413837,132.36046
+9296,2.4863663,158.84811
+9297,2.2490375,152.9474
+9298,4.354893,249.2387
+9299,2.7271354,176.26389
+9300,2.6768715,181.03644
+9301,3.3866198,237.98607
+9302,3.1406045,194.1493
+9303,3.1422353,219.40079
+9304,2.3827069,106.848434
+9305,4.0002384,248.45279
+9306,2.1460016,94.60131
+9307,2.355441,180.04053
+9308,2.6864502,180.32193
+9309,2.4030194,173.8342
+9310,2.6388876,146.26555
+9311,2.3229861,137.31157
+9312,2.676679,155.3556
+9313,2.912812,184.946
+9314,2.2404912,126.928894
+9315,2.1286473,125.29267
+9316,1.9490907,83.057556
+9317,2.1591594,126.914444
+9318,1.6410288,80.66495
+9319,3.9802601,236.71655
+9320,2.562403,181.72493
+9321,2.3900695,161.43863
+9322,2.578017,215.03864
+9323,3.2234774,184.86887
+9324,2.57327,163.90152
+9325,1.9217091,102.28159
+9326,1.42612,80.19871
+9327,2.9178872,184.96695
+9328,2.8908687,208.18791
+9329,1.6973963,100.55989
+9330,1.3668047,78.11864
+9331,1.9734987,92.75113
+9332,2.4667861,131.57352
+9333,2.1284258,136.18542
+9334,2.4518254,124.29071
+9335,2.2885044,137.33533
+9336,2.3001084,181.61455
+9337,2.7171147,169.64973
+9338,2.6953046,203.80414
+9339,2.7131257,181.52539
+9340,3.6459057,239.80139
+9341,2.9039245,177.21268
+9342,3.2251372,216.66722
+9343,2.6081967,170.26129
+9344,3.315565,223.45256
+9345,3.2499473,219.69252
+9346,1.4834433,83.28723
+9347,2.864244,167.88452
+9348,2.2666612,147.3342
+9349,3.9609761,251.68076
+9350,2.0562882,108.83719
+9351,3.0414498,201.88362
+9352,2.4556224,204.85226
+9353,2.1780381,120.29852
+9354,2.5399609,177.42285
+9355,1.6890886,104.81677
+9356,2.3684669,165.29308
+9357,2.4891605,129.32782
+9358,1.3575242,87.08018
+9359,2.7062836,197.71141
+9360,1.8004698,113.62427
+9361,2.0013537,129.73859
+9362,2.2762492,157.31061
+9363,2.7133164,170.28067
+9364,3.0896544,191.89243
+9365,1.7863538,113.74277
+9366,2.7930799,183.616
+9367,1.9155085,132.24919
+9368,2.9895818,170.12027
+9369,2.1888616,133.2586
+9370,1.7615846,83.549446
+9371,2.3889868,161.20187
+9372,2.4598517,159.83832
+9373,2.2310176,177.72446
+9374,2.5683,144.69446
+9375,2.5583062,145.52924
+9376,2.4630172,183.51227
+9377,2.953726,197.48602
+9378,2.6396081,187.55765
+9379,1.4602935,88.871506
+9380,2.3099284,156.0946
+9381,3.2400963,226.0092
+9382,2.3998873,130.8594
+9383,2.8456666,193.88606
+9384,3.2234154,229.8663
+9385,1.9007756,110.44742
+9386,2.7709925,146.44305
+9387,3.5830908,245.25342
+9388,2.8921754,181.74046
+9389,2.8708649,191.57823
+9390,2.3935044,152.91212
+9391,2.0940475,132.15808
+9392,1.294424,74.90036
+9393,3.2481177,210.86427
+9394,2.09899,108.505585
+9395,1.4692054,92.30796
+9396,2.5776534,176.98538
+9397,2.2812452,128.8541
+9398,2.6297305,152.03954
+9399,2.1522288,108.47693
+9400,3.5977936,232.16188
+9401,2.793087,167.22069
+9402,2.589671,180.41962
+9403,3.6824136,249.43245
+9404,2.3262362,111.12402
+9405,2.4595327,157.72675
+9406,4.112202,251.27841
+9407,2.814467,169.06396
+9408,1.9884802,87.74616
+9409,2.272881,188.92804
+9410,3.5092824,246.945
+9411,2.0235512,106.70543
+9412,2.684204,161.69528
+9413,2.2061362,131.07713
+9414,2.5264924,155.51076
+9415,3.343545,217.84712
+9416,2.1323707,128.73624
+9417,2.810758,182.26538
+9418,2.0808496,128.65198
+9419,3.1801112,198.15352
+9420,2.2439609,132.59766
+9421,2.4304895,182.3071
+9422,2.5224862,182.14793
+9423,3.0201583,183.0683
+9424,2.1895266,153.74957
+9425,1.5987866,99.1417
+9426,2.1954446,130.09514
+9427,3.0713615,186.46777
+9428,2.5530617,171.1964
+9429,3.1906142,221.06642
+9430,2.8604674,192.77274
+9431,2.9226346,183.31937
+9432,2.2275794,127.41518
+9433,4.3003573,248.7441
+9434,2.6383734,194.09421
+9435,1.9388007,120.74773
+9436,1.5506837,85.406456
+9437,2.5121977,185.00604
+9438,4.6628785,251.4746
+9439,1.8067255,101.02399
+9440,3.5377054,225.0689
+9441,2.2375891,144.23965
+9442,3.6462388,231.64442
+9443,2.2265172,156.28621
+9444,2.6303906,167.78378
+9445,3.49522,225.84
+9446,3.0926511,200.7733
+9447,2.3843215,160.72937
+9448,1.3838178,75.04766
+9449,2.8326364,155.51846
+9450,3.0453532,203.57443
+9451,2.710507,158.43344
+9452,3.080853,214.68935
+9453,3.0443747,222.11964
+9454,1.3338405,74.27132
+9455,2.5992043,148.81331
+9456,2.3228881,164.6933
+9457,2.8822246,190.52908
+9458,2.2700403,115.659744
+9459,3.0409472,182.50142
+9460,3.3373709,225.92986
+9461,2.9520776,194.98746
+9462,2.5372171,137.30582
+9463,2.9643319,178.09035
+9464,2.4130597,188.669
+9465,2.5822453,155.07846
+9466,2.6193187,199.13719
+9467,3.092261,207.78802
+9468,2.7129483,177.19241
+9469,2.0621722,112.27258
+9470,1.7922782,94.64273
+9471,2.9578962,193.46404
+9472,3.5525775,233.78088
+9473,2.0419283,115.75276
+9474,3.1831925,226.90703
+9475,2.200418,117.44447
+9476,3.9426663,252.22781
+9477,1.342862,92.91147
+9478,2.333688,196.32893
+9479,2.1622148,127.48874
+9480,2.7348046,207.1532
+9481,2.7061386,228.78574
+9482,2.8991241,192.0975
+9483,2.5141215,182.62187
+9484,3.4762175,235.23575
+9485,2.0542307,106.34776
+9486,2.528113,136.87
+9487,3.8230119,247.25691
+9488,2.3716233,156.44022
+9489,2.232571,119.596924
+9490,2.0286002,119.99968
+9491,1.993531,107.17203
+9492,3.0346477,180.56918
+9493,1.5924765,78.335434
+9494,1.9974712,124.332985
+9495,4.1832023,247.48329
+9496,2.2922158,174.39775
+9497,1.975052,92.90816
+9498,2.6374636,151.6784
+9499,2.2911754,122.57248
+9500,1.8166239,106.17346
+9501,2.4174206,184.08289
+9502,2.8179393,142.65036
+9503,2.5683436,156.09756
+9504,1.2425008,68.69116
+9505,2.268492,120.01848
+9506,2.4670546,149.64949
+9507,2.0957162,106.92258
+9508,2.9336207,203.50229
+9509,2.9887455,224.73076
+9510,2.1199517,114.785446
+9511,2.8760428,190.73271
+9512,2.7797813,173.20323
+9513,3.060562,199.80544
+9514,3.5622678,238.39441
+9515,2.6254325,167.90285
+9516,3.3481467,229.4772
+9517,2.8664298,204.80875
+9518,2.4524808,177.26599
+9519,2.6320632,202.13148
+9520,1.5479547,92.80911
+9521,2.2479815,187.03593
+9522,3.111738,220.46655
+9523,2.3605566,141.8617
+9524,2.9978912,203.85919
+9525,1.5696114,71.82999
+9526,2.1431527,128.42203
+9527,3.517059,232.5235
+9528,2.76551,187.80199
+9529,2.5576894,164.43
+9530,2.1369162,146.64047
+9531,2.8499641,186.32574
+9532,2.0032809,119.283615
+9533,2.615821,183.51045
+9534,2.4785469,181.71297
+9535,2.17615,121.7848
+9536,2.7833571,218.89348
+9537,3.862191,237.31123
+9538,2.4785602,159.8913
+9539,2.4258406,156.70181
+9540,2.8528762,171.89603
+9541,3.3214004,205.93674
+9542,2.4500518,184.14288
+9543,1.8966191,110.733665
+9544,4.056875,245.29214
+9545,2.6262836,175.88591
+9546,1.8591348,113.06716
+9547,3.3356807,239.80331
+9548,2.1202989,162.99768
+9549,2.266953,143.65793
+9550,1.7146057,90.32958
+9551,1.7113401,100.87195
+9552,2.9446177,185.6899
+9553,2.817219,189.45248
+9554,2.3989758,160.63376
+9555,1.7092766,95.70998
+9556,3.1214063,201.84323
+9557,2.5681672,203.9118
+9558,2.5053165,143.05865
+9559,2.061394,120.67107
+9560,2.857483,198.76482
+9561,2.1364293,144.3935
+9562,2.4636905,133.4078
+9563,2.9471831,191.48389
+9564,2.5023146,129.9747
+9565,3.0320792,204.63339
+9566,2.778699,198.94194
+9567,1.9401726,116.4143
+9568,1.5192622,80.327774
+9569,1.9599624,111.29697
+9570,2.52396,111.209915
+9571,2.8600667,163.48932
+9572,1.8213855,109.123764
+9573,2.5387034,172.23312
+9574,2.2558131,108.25812
+9575,1.8311689,133.05151
+9576,3.329046,220.44534
+9577,1.6714956,103.54979
+9578,2.9827924,217.92447
+9579,2.1717322,135.33905
+9580,2.4575658,150.83975
+9581,2.2685504,113.68808
+9582,2.9397721,157.03937
+9583,2.8675175,209.09106
+9584,1.9576752,97.31532
+9585,2.405918,117.40587
+9586,3.713955,233.8979
+9587,3.0227284,215.08856
+9588,2.4122107,133.96858
+9589,2.0134401,150.80171
+9590,2.415054,134.40501
+9591,3.7199173,243.47858
+9592,3.1119456,205.56268
+9593,3.6351647,233.5141
+9594,1.6857421,79.73361
+9595,4.415448,250.32353
+9596,1.9772294,112.61226
+9597,2.8340807,179.86188
+9598,2.0148692,129.54622
+9599,2.3221815,127.83121
+9600,2.050906,110.44194
+9601,2.059452,114.98157
+9602,2.4153118,126.15909
+9603,3.3011818,211.14975
+9604,2.187389,125.04729
+9605,2.6891792,148.07068
+9606,2.0978398,92.945854
+9607,3.7598336,246.18683
+9608,2.3474572,122.05143
+9609,1.9117032,114.99695
+9610,1.9873023,130.5841
+9611,2.7302015,191.86444
+9612,3.4393225,214.98326
+9613,2.5456054,163.63446
+9614,2.7579522,181.07404
+9615,2.3691516,121.381195
+9616,2.8403482,222.55157
+9617,1.5567544,89.94149
+9618,1.5153258,88.80495
+9619,2.6123354,188.09482
+9620,2.7096076,143.23268
+9621,1.757543,97.6972
+9622,1.9207788,103.07535
+9623,2.305263,118.364685
+9624,2.0654705,157.57898
+9625,2.0442324,137.12323
+9626,2.4007783,149.06274
+9627,2.2889366,108.69909
+9628,1.8562837,119.475784
+9629,2.4691176,171.79593
+9630,1.7352307,105.496506
+9631,2.9160852,213.68382
+9632,1.9404323,113.419
+9633,2.5001206,166.94067
+9634,2.565189,169.88089
+9635,1.9770067,82.48624
+9636,2.5808623,205.30936
+9637,3.3805027,235.18318
+9638,3.6465373,244.57251
+9639,2.0105276,95.07776
+9640,1.9845554,115.07036
+9641,1.8068988,103.64107
+9642,2.4886036,170.11548
+9643,1.7079093,104.64662
+9644,2.398725,170.51909
+9645,2.540545,145.46921
+9646,2.4345136,149.33347
+9647,1.7134768,88.10128
+9648,2.8361359,186.97018
+9649,1.7799323,140.3689
+9650,1.8253003,123.36445
+9651,2.096138,165.41248
+9652,2.418663,142.66968
+9653,2.3412423,124.07766
+9654,2.108644,111.251205
+9655,2.1533232,124.33471
+9656,2.4828944,191.49597
+9657,3.004107,178.88348
+9658,2.6704664,196.59637
+9659,2.5954952,143.92378
+9660,3.4523778,235.45114
+9661,2.5441132,187.08044
+9662,2.3900297,181.3537
+9663,1.5929983,93.907455
+9664,2.7671375,145.11536
+9665,3.352242,206.61247
+9666,3.1395965,229.19212
+9667,2.5097551,167.89961
+9668,2.67168,125.10362
+9669,2.5495322,136.34966
+9670,2.2520633,109.51137
+9671,3.0550847,215.43376
+9672,1.7105,94.58833
+9673,2.9022393,208.77965
+9674,3.2947755,214.21556
+9675,1.6426715,77.20205
+9676,3.7160516,245.627
+9677,1.8488348,102.64941
+9678,1.8764986,89.16145
+9679,3.617453,230.66125
+9680,2.2425969,135.45804
+9681,2.2271924,137.7471
+9682,2.7933574,179.69955
+9683,2.7337637,161.01115
+9684,1.6940254,97.21628
+9685,4.798669,252.2505
+9686,1.787227,94.32941
+9687,2.5496223,162.48135
+9688,2.3974388,171.86076
+9689,1.8908044,100.64404
+9690,2.7751634,149.93744
+9691,1.8844906,102.21252
+9692,2.3878355,182.51257
+9693,2.7091804,162.48938
+9694,3.218431,193.1916
+9695,1.8097811,105.2265
+9696,1.8921897,99.7997
+9697,2.3188329,146.61261
+9698,2.964976,191.33005
+9699,1.4904746,81.84088
+9700,2.9130378,222.80913
+9701,3.5126386,240.03986
+9702,3.274918,234.78464
+9703,1.7701125,102.53323
+9704,2.5712154,153.62325
+9705,2.7346292,226.03853
+9706,2.6796403,180.7404
+9707,2.7674265,168.03513
+9708,1.8224728,111.22811
+9709,2.3201103,169.59714
+9710,1.7604373,109.31916
+9711,1.9648031,114.18231
+9712,2.5788467,227.84535
+9713,1.7395205,85.07202
+9714,2.2193878,165.44426
+9715,1.5785027,102.969894
+9716,2.2843473,163.02194
+9717,2.1652672,141.63776
+9718,1.7026117,83.61752
+9719,2.5003755,167.95055
+9720,2.4292426,157.5587
+9721,2.356016,151.41138
+9722,2.525176,162.53558
+9723,2.200666,111.5334
+9724,1.782767,112.34248
+9725,1.9601468,109.78974
+9726,3.9765263,240.10107
+9727,1.5208682,88.10468
+9728,2.304109,124.227554
+9729,2.9146183,193.23633
+9730,1.782523,117.45218
+9731,2.817347,189.7266
+9732,2.9674861,209.24448
+9733,2.1964867,120.99638
+9734,1.7104733,134.01366
+9735,2.0389764,93.06765
+9736,2.2893906,116.06955
+9737,3.8075461,248.62068
+9738,1.6883792,102.52107
+9739,1.8159405,95.317154
+9740,2.9033372,172.48376
+9741,2.492886,139.56715
+9742,2.0924177,132.79497
+9743,1.9658518,125.79372
+9744,2.445118,171.52338
+9745,2.4923198,135.52768
+9746,2.3268042,119.15377
+9747,1.3874104,84.29731
+9748,2.6320596,169.2762
+9749,1.8551908,125.17445
+9750,3.6322312,242.56656
+9751,3.0134828,215.67111
+9752,1.5538431,90.78954
+9753,2.2888591,110.47651
+9754,1.773142,117.30997
+9755,1.4801133,125.70332
+9756,1.8604457,106.88618
+9757,1.618505,93.13255
+9758,2.1338887,108.95561
+9759,2.0698578,163.4296
+9760,2.7759202,195.57553
+9761,2.0423832,125.61063
+9762,3.8567562,244.58064
+9763,2.685689,202.04556
+9764,1.7419511,124.90076
+9765,2.6378365,164.6277
+9766,2.6317062,142.69315
+9767,1.7331936,103.36067
+9768,1.9720796,117.63968
+9769,1.6485635,82.864105
+9770,3.5581884,240.33655
+9771,3.6787612,237.71587
+9772,1.9965377,110.5417
+9773,2.1803753,142.73593
+9774,2.343173,113.04182
+9775,2.6111176,190.25565
+9776,2.2645824,169.14882
+9777,1.3067443,76.857635
+9778,2.7265306,189.38455
+9779,2.3593736,129.42728
+9780,2.8373034,157.57474
+9781,2.5996642,185.6468
+9782,3.1467247,211.41998
+9783,3.1352468,234.72565
+9784,2.7958536,200.70085
+9785,2.4131777,124.36603
+9786,2.2453341,114.582306
+9787,2.730418,147.0808
+9788,2.890909,176.02692
+9789,3.095605,236.73982
+9790,1.5106614,86.961525
+9791,2.6985369,143.88031
+9792,1.7837697,91.376976
+9793,2.247959,145.80084
+9794,2.0149457,112.12744
+9795,3.5332043,238.47752
+9796,3.1161873,225.47148
+9797,2.8516908,189.46037
+9798,3.1814494,232.36075
+9799,1.8331531,100.19597
+9800,3.5430753,234.51723
+9801,3.809983,234.12181
+9802,1.4839199,83.886246
+9803,2.8172462,192.18791
+9804,3.0472572,214.76096
+9805,2.4838736,200.22351
+9806,2.5716953,179.63928
+9807,3.1396286,217.17009
+9808,2.1560507,126.27742
+9809,1.5729249,99.013
+9810,1.540551,101.89359
+9811,2.656631,155.97766
+9812,2.785455,161.01357
+9813,1.9202336,90.52673
+9814,2.7737622,187.60275
+9815,1.9966364,142.12784
+9816,1.3144963,77.55286
+9817,2.5568597,169.98387
+9818,3.3997786,230.22534
+9819,1.9563884,117.45671
+9820,1.9941909,115.30882
+9821,1.6810405,92.31529
+9822,3.351604,224.69328
+9823,2.651911,195.07878
+9824,3.7685425,231.08122
+9825,2.1199663,127.8591
+9826,2.0086355,106.208595
+9827,2.4852483,165.00421
+9828,2.0302458,134.67557
+9829,1.7443267,84.58979
+9830,2.685441,164.60812
+9831,2.3022702,126.65097
+9832,1.3053325,85.9603
+9833,3.0637398,207.97533
+9834,2.707211,182.76013
+9835,2.2574868,203.07704
+9836,1.1760466,73.91678
+9837,1.7161707,89.39584
+9838,1.8684548,126.603195
+9839,2.5199578,193.88564
+9840,3.7983196,250.91281
+9841,3.0056427,186.11902
+9842,2.323687,164.08475
+9843,2.9089425,218.94531
+9844,1.7160337,96.8694
+9845,2.1893296,109.47215
+9846,1.8574855,108.05156
+9847,1.9770582,98.79867
+9848,1.8823187,122.16077
+9849,2.9958403,219.69421
+9850,2.6000974,147.78777
+9851,1.3072377,78.15724
+9852,2.250809,138.37292
+9853,3.011742,185.06366
+9854,3.4921176,224.4426
+9855,2.4456959,156.03583
+9856,2.560884,203.90042
+9857,1.9457794,84.85619
+9858,1.913186,119.32606
+9859,2.047828,138.8331
+9860,1.5632343,81.27344
+9861,4.123537,251.1296
+9862,2.732096,177.37799
+9863,1.910869,96.350845
+9864,1.8939371,104.34721
+9865,2.3796926,144.09752
+9866,2.4130483,159.97748
+9867,2.8820891,232.71754
+9868,3.4376864,225.299
+9869,1.9440857,106.71019
+9870,3.1250365,210.5005
+9871,2.920998,214.84299
+9872,3.27998,227.02193
+9873,2.1188245,166.88324
+9874,2.5659757,176.09491
+9875,2.9054523,202.49832
+9876,1.4480962,82.416214
+9877,3.2179358,196.51602
+9878,3.1988306,223.98828
+9879,2.7561858,160.4399
+9880,2.3255286,124.61283
+9881,2.12967,123.20752
+9882,2.1030898,100.43706
+9883,2.237196,134.7229
+9884,3.1683345,226.9151
+9885,2.9261022,208.85995
+9886,2.702474,176.17102
+9887,2.156101,149.97449
+9888,2.4581013,167.98279
+9889,4.100222,244.3168
+9890,2.4399228,144.71613
+9891,1.9471077,142.98041
+9892,2.2501554,104.28529
+9893,2.9902442,218.78787
+9894,3.6838744,248.71603
+9895,2.3483014,153.78592
+9896,2.4822154,198.4133
+9897,3.5021012,243.0214
+9898,2.5214374,127.88225
+9899,2.760094,200.35
+9900,2.4877267,165.41571
+9901,2.428087,150.76761
+9902,2.6836867,187.77231
+9903,3.5707629,219.11699
+9904,1.9292516,122.45257
+9905,2.9722097,206.7896
+9906,1.4783832,78.217224
+9907,1.5125698,112.87792
+9908,2.3083158,155.3458
+9909,2.5045388,184.31448
+9910,3.3950753,229.61432
+9911,3.2816782,220.49211
+9912,1.7524407,90.41136
+9913,1.7313657,78.041695
+9914,1.9512084,129.00244
+9915,3.4510424,226.6655
+9916,2.1377633,124.988754
+9917,3.5274208,218.17484
+9918,2.3137689,149.38034
+9919,1.3271005,73.05043
+9920,2.2544818,150.63058
+9921,3.3683417,229.49391
+9922,1.8504144,103.294
+9923,2.4583013,142.46014
+9924,2.8004723,222.42162
+9925,2.5795608,139.20619
+9926,2.1097875,107.33444
+9927,1.7961174,90.07196
+9928,2.4098303,125.17475
+9929,1.6927149,122.304504
+9930,1.3268094,77.04863
+9931,1.6377523,88.46494
+9932,2.9827063,161.86885
+9933,2.7644448,174.2995
+9934,1.6653868,96.165436
+9935,1.7432604,108.79616
+9936,2.046463,142.50552
+9937,3.561954,246.1548
+9938,2.5617018,156.67282
+9939,3.0917838,230.50923
+9940,2.2871368,140.29875
+9941,3.6109157,235.19057
+9942,1.6906232,96.617935
+9943,2.7842922,186.09763
+9944,3.043639,206.23285
+9945,3.2105827,234.5632
+9946,2.8953822,171.78804
+9947,2.714919,143.51944
+9948,2.2146182,164.62003
+9949,2.0050278,105.91739
+9950,2.1700468,126.4272
+9951,2.183174,126.025246
+9952,1.1539967,77.63214
+9953,3.002003,187.98474
+9954,2.3261092,183.59476
+9955,2.2781792,151.19193
+9956,2.0554354,113.7018
+9957,2.518804,154.68863
+9958,2.4341016,133.75697
+9959,1.9571393,115.38597
+9960,2.8908796,177.66698
+9961,2.7003636,178.44936
+9962,2.4383857,163.07106
+9963,1.5407288,90.92381
+9964,2.529922,159.58762
+9965,2.5660036,144.23306
+9966,2.1528783,191.66199
+9967,2.6071277,149.58899
+9968,2.3012195,140.94061
+9969,3.0313275,175.47906
+9970,3.5684676,235.201
+9971,1.9763688,117.14014
+9972,2.7519827,143.55682
+9973,1.7146491,78.924774
+9974,2.8158596,146.02304
+9975,1.6485947,104.03119
+9976,2.6833315,166.47357
+9977,2.628936,151.89578
+9978,2.6328955,136.22342
+9979,2.4699528,129.09169
+9980,1.3800788,82.9642
+9981,1.6381365,106.603485
+9982,3.1373181,206.42216
+9983,2.4085698,130.55328
+9984,3.211033,211.54295
+9985,3.7537181,237.0594
+9986,2.6706133,157.20071
+9987,3.1488235,205.06801
+9988,2.8578506,223.30336
+9989,2.6481168,136.78711
+9990,2.6291409,156.56693
+9991,3.4337797,220.81163
+9992,1.426997,96.060295
+9993,1.6941047,107.15755
+9994,3.814156,244.08058
+9995,2.234477,142.52368
+9996,2.3884993,135.34244
+9997,3.371591,205.85284
+9998,3.5534806,233.04236
+9999,2.5519078,130.03291
diff --git a/data/ukbb_subset/test.csv b/data/ukbb_subset/test.csv
new file mode 100644
index 0000000000000000000000000000000000000000..1598cbe2522c520eec69a2a50ab8026b0004baa6
--- /dev/null
+++ b/data/ukbb_subset/test.csv
@@ -0,0 +1,251 @@
+index,eid,sex,age,brain_volume,ventricle_volume,mri_seq
+13255.0,3444227.0,0.0,64.0,1089130.0,32499.9,0.0
+10046.0,3225602.0,0.0,58.0,1169270.0,20194.5,0.0
+9330.0,1523213.0,0.0,60.0,1168890.0,26026.8,1.0
+9466.0,5628751.0,0.0,67.0,975229.0,23644.7,0.0
+11553.0,2078091.0,0.0,62.0,1204410.0,31612.5,0.0
+7726.0,2736992.0,0.0,63.0,1075190.0,19002.3,1.0
+6782.0,1147424.0,0.0,61.0,1257190.0,39016.2,0.0
+14398.0,4815937.0,0.0,72.0,963012.0,35591.7,1.0
+13570.0,5544144.0,0.0,53.0,1239490.0,33004.30000000001,0.0
+3503.0,2833097.0,0.0,52.0,1157240.0,14638.9,1.0
+8014.0,3159829.0,0.0,73.0,1063990.0,40036.1,0.0
+293.0,5202381.0,0.0,53.0,932847.0,30101.8,1.0
+8015.0,5194964.0,0.0,67.0,1047180.0,26437.2,1.0
+10946.0,1406085.0,0.0,51.0,1036030.0,22839.1,0.0
+5447.0,3813524.0,0.0,56.0,1291750.0,21283.9,1.0
+9501.0,4464199.0,0.0,58.0,1039560.0,18165.9,0.0
+461.0,3815607.0,0.0,56.0,1190070.0,42706.2,1.0
+11268.0,3076089.0,0.0,50.0,1095810.0,26504.0,0.0
+7130.0,5901109.0,0.0,67.0,977994.0,27450.0,0.0
+4620.0,1143615.0,0.0,71.0,1002980.0,25568.6,0.0
+4620.0,1143615.0,0.0,71.0,1002980.0,25568.6,1.0
+8344.0,3164775.0,0.0,52.0,1274300.0,32557.8,0.0
+10518.0,5711945.0,0.0,51.0,1138770.0,28578.5,1.0
+4484.0,2373943.0,0.0,57.0,1045700.0,25994.9,0.0
+6384.0,5272090.0,0.0,58.0,1065880.0,30520.1,1.0
+9430.0,3015999.0,0.0,63.0,1159370.0,22994.3,0.0
+14419.0,3526877.0,0.0,70.0,1005490.0,42726.80000000001,0.0
+4775.0,3580550.0,0.0,54.0,1108340.0,23994.8,1.0
+5996.0,4068499.0,0.0,64.0,1129440.0,24509.5,0.0
+7008.0,1092170.0,0.0,59.0,1172270.0,38399.9,0.0
+8256.0,1646843.0,0.0,61.0,1183920.0,49178.9,1.0
+4275.0,5576168.0,0.0,57.0,1145780.0,9507.76,0.0
+3739.0,4858245.0,0.0,56.0,1001250.0,16039.0,1.0
+11645.0,3897090.0,0.0,68.0,1133110.0,47017.1,1.0
+1202.0,1322934.0,0.0,69.0,1008410.0,19764.4,0.0
+9339.0,5836825.0,0.0,54.0,1077620.0,34550.4,1.0
+781.0,5191671.0,0.0,65.0,1221310.0,17177.9,0.0
+1377.0,1206058.0,0.0,57.0,1357010.0,19466.2,0.0
+11995.0,1383769.0,0.0,58.0,1092340.0,16554.0,1.0
+9203.0,1104540.0,0.0,65.0,1096250.0,33241.7,0.0
+9203.0,1104540.0,0.0,65.0,1096250.0,33241.7,1.0
+3828.0,2303777.0,0.0,50.0,1171840.0,22273.3,1.0
+9609.0,2101841.0,0.0,65.0,1186260.0,49774.2,0.0
+6398.0,2823056.0,0.0,73.0,1220930.0,47591.5,1.0
+4256.0,3651087.0,0.0,54.0,1128960.0,24543.9,0.0
+2371.0,4427161.0,0.0,70.0,1219990.0,76702.9,1.0
+11227.0,2078918.0,0.0,70.0,1237940.0,38836.6,1.0
+8412.0,1513685.0,0.0,56.0,1063680.0,13594.2,1.0
+6466.0,2420014.0,0.0,54.0,1160500.0,20429.5,0.0
+10526.0,2958972.0,0.0,73.0,1042850.0,56263.0,0.0
+11091.0,4617564.0,0.0,67.0,1014980.0,26718.9,0.0
+14331.0,1426774.0,0.0,63.0,1024540.0,18286.8,0.0
+12524.0,1860065.0,0.0,52.0,1094090.0,20513.0,0.0
+3350.0,1738473.0,0.0,63.0,1062530.0,22948.7,1.0
+14098.0,3672396.0,0.0,59.0,1112210.0,26884.3,0.0
+883.0,2774533.0,0.0,57.0,1173040.0,18890.0,0.0
+3508.0,5693883.0,0.0,54.0,1102280.0,19031.3,0.0
+2490.0,3178524.0,0.0,70.0,1061920.0,35946.5,0.0
+2581.0,3881330.0,0.0,49.0,1141630.0,15939.3,0.0
+11565.0,2143997.0,0.0,62.0,1137590.0,19041.8,1.0
+5295.0,3325879.0,0.0,64.0,1188370.0,21812.2,1.0
+9464.0,3849715.0,0.0,73.0,1141710.0,63496.3,0.0
+5873.0,4305915.0,0.0,73.0,1053870.0,47471.3,1.0
+2154.0,5023690.0,0.0,62.0,1056150.0,26231.3,0.0
+7723.0,1938755.0,0.0,60.0,1132210.0,27561.4,1.0
+10691.0,4870941.0,0.0,52.0,1166480.0,14002.8,0.0
+10691.0,4870941.0,0.0,52.0,1166480.0,14002.8,1.0
+4067.0,4363670.0,0.0,70.0,977390.0,48217.6,0.0
+4067.0,4363670.0,0.0,70.0,977390.0,48217.6,1.0
+10219.0,4314118.0,0.0,57.0,1176650.0,34057.7,1.0
+1399.0,3458621.0,0.0,57.0,1153300.0,24278.8,0.0
+6018.0,1295935.0,0.0,62.0,1053400.0,24328.2,0.0
+1262.0,2171414.0,0.0,66.0,1011310.0,29394.1,0.0
+5610.0,3089077.0,0.0,61.0,1109690.0,17606.7,1.0
+9057.0,4569804.0,0.0,67.0,1030490.0,26715.9,0.0
+6526.0,3797176.0,0.0,61.0,1018960.0,47146.0,0.0
+2848.0,5753677.0,0.0,70.0,1038190.0,26464.5,1.0
+11698.0,5607591.0,0.0,55.0,1121460.0,24078.8,0.0
+2890.0,5006359.0,0.0,68.0,1101260.0,31337.0,0.0
+10786.0,5135278.0,0.0,62.0,1119170.0,25841.2,1.0
+10082.0,4225833.0,0.0,70.0,1068240.0,30508.6,0.0
+5174.0,3276853.0,0.0,56.0,1025930.0,21943.1,0.0
+6355.0,2803766.0,0.0,68.0,1114560.0,32971.6,1.0
+7502.0,1304529.0,0.0,52.0,1096360.0,23908.5,1.0
+2622.0,1889036.0,0.0,62.0,1105240.0,20861.1,0.0
+7462.0,4025459.0,0.0,57.0,1088450.0,14489.6,1.0
+1518.0,1647678.0,0.0,50.0,1056410.0,39155.30000000001,0.0
+5056.0,2357688.0,0.0,64.0,982140.0,22416.2,1.0
+4970.0,4712491.0,0.0,67.0,1036000.0,27117.5,0.0
+4970.0,4712491.0,0.0,67.0,1036000.0,27117.5,1.0
+5389.0,2320854.0,0.0,73.0,1098400.0,41417.0,1.0
+12812.0,2810487.0,0.0,52.0,1097710.0,26413.3,0.0
+13756.0,1921762.0,0.0,67.0,1276830.0,43532.1,1.0
+10111.0,1723643.0,0.0,61.0,1010730.0,40116.6,1.0
+12272.0,3130060.0,0.0,70.0,1138530.0,19291.2,1.0
+12337.0,3789898.0,0.0,68.0,1079500.0,42969.80000000001,1.0
+12649.0,4974349.0,0.0,64.0,983005.0,17561.6,0.0
+8233.0,1365767.0,0.0,65.0,970182.0,22295.2,1.0
+10504.0,1248201.0,0.0,68.0,1286480.0,55346.1,1.0
+3882.0,4899521.0,0.0,62.0,1062430.0,16112.9,0.0
+12653.0,4447198.0,0.0,65.0,1113010.0,38330.7,1.0
+3928.0,4585002.0,0.0,72.0,1053020.0,35887.1,1.0
+10121.0,1137595.0,0.0,62.0,1088650.0,28361.4,1.0
+11523.0,2078260.0,0.0,68.0,1178720.0,32786.80000000001,0.0
+7354.0,4943364.0,0.0,71.0,1101940.0,34042.0,1.0
+10969.0,5106715.0,0.0,65.0,1123400.0,30499.2,0.0
+37.0,4537691.0,0.0,70.0,1128500.0,45476.6,1.0
+5145.0,3577748.0,0.0,55.0,1074420.0,18685.7,1.0
+12916.0,4187645.0,0.0,50.0,1175790.0,20664.1,1.0
+10418.0,1879289.0,0.0,68.0,1122830.0,26145.2,0.0
+12480.0,5226260.0,0.0,67.0,1227210.0,47329.1,1.0
+8554.0,3986717.0,0.0,50.0,1197810.0,16858.3,0.0
+6521.0,5200512.0,0.0,63.0,1289820.0,32765.4,1.0
+4252.0,5867775.0,0.0,65.0,1199990.0,15613.0,0.0
+7617.0,3456714.0,0.0,60.0,1153490.0,26489.1,0.0
+2271.0,2115625.0,0.0,65.0,963007.0,18291.5,1.0
+4772.0,4307513.0,0.0,61.0,1022730.0,23794.0,0.0
+8508.0,4323860.0,0.0,65.0,1142020.0,37603.1,1.0
+5477.0,4571076.0,0.0,72.0,1070060.0,30427.7,0.0
+7906.0,1479193.0,0.0,54.0,1228410.0,17909.9,0.0
+14110.0,2089169.0,0.0,64.0,1034080.0,36378.80000000001,0.0
+5027.0,4513134.0,0.0,65.0,1175340.0,57955.8,1.0
+3993.0,5953279.0,0.0,63.0,1093720.0,26027.9,1.0
+11430.0,3818977.0,0.0,59.0,1098000.0,19754.0,0.0
+8517.0,3241946.0,0.0,66.0,1029470.0,36909.6,1.0
+10832.0,4098700.0,0.0,54.0,1056630.0,22286.3,1.0
+11270.0,4066375.0,0.0,58.0,1099580.0,22011.2,1.0
+4213.0,4456155.0,0.0,56.0,1311980.0,21226.8,1.0
+14055.0,1062031.0,0.0,47.0,1232480.0,17157.8,1.0
+5811.0,1382023.0,0.0,61.0,1204040.0,22855.8,0.0
+5811.0,1382023.0,0.0,61.0,1204040.0,22855.8,1.0
+11944.0,5842847.0,0.0,58.0,1036730.0,32500.8,1.0
+5907.0,3291351.0,0.0,64.0,1209260.0,23081.7,1.0
+4535.0,2854927.0,0.0,59.0,1143880.0,23384.5,0.0
+8741.0,3381867.0,0.0,59.0,1084490.0,19780.9,0.0
+4510.0,3667235.0,0.0,69.0,1001920.0,57133.9,0.0
+6836.0,4139179.0,0.0,62.0,1019530.0,21109.5,1.0
+7409.0,2230752.0,0.0,65.0,911796.0,25741.5,1.0
+3202.0,5284624.0,0.0,51.0,1474930.0,13765.4,0.0
+6000.0,1252025.0,1.0,72.0,1182290.0,63783.4,0.0
+4359.0,2096520.0,1.0,60.0,1179710.0,55936.4,1.0
+10074.0,3332501.0,1.0,70.0,1118180.0,52298.3,1.0
+11997.0,5725542.0,1.0,72.0,1227510.0,37929.2,0.0
+2218.0,1240253.0,1.0,68.0,1375590.0,77302.3,0.0
+138.0,4699538.0,1.0,63.0,1092280.0,30889.6,0.0
+6381.0,3018814.0,1.0,70.0,1160090.0,52111.5,1.0
+1448.0,4643734.0,1.0,61.0,1420550.0,62498.1,0.0
+9915.0,2223957.0,1.0,65.0,1309040.0,29417.6,1.0
+12534.0,3075036.0,1.0,67.0,1226440.0,40170.1,1.0
+5903.0,5103953.0,1.0,67.0,1451790.0,73490.3,0.0
+2531.0,1121316.0,1.0,55.0,1161320.0,27499.9,1.0
+5814.0,5345532.0,1.0,71.0,1110870.0,41917.2,0.0
+6428.0,4101771.0,1.0,51.0,1220790.0,26201.6,1.0
+5045.0,4586183.0,1.0,64.0,1315630.0,14765.3,1.0
+1533.0,5739968.0,1.0,63.0,1181640.0,22097.1,0.0
+8486.0,1271931.0,1.0,66.0,1183320.0,25067.6,1.0
+2920.0,5548023.0,1.0,56.0,1224330.0,45352.5,0.0
+2800.0,4537543.0,1.0,49.0,1032960.0,14767.5,0.0
+987.0,3072756.0,1.0,64.0,1216450.0,31114.8,0.0
+6069.0,4705641.0,1.0,53.0,1368270.0,15385.7,1.0
+13015.0,1903811.0,1.0,60.0,1304680.0,44119.9,1.0
+12304.0,3265078.0,1.0,64.0,1232920.0,40854.6,0.0
+11967.0,3921204.0,1.0,65.0,1069710.0,48754.0,0.0
+2801.0,4598612.0,1.0,55.0,1162310.0,36874.30000000001,0.0
+436.0,5239391.0,1.0,71.0,1170010.0,27114.2,1.0
+8823.0,1839166.0,1.0,66.0,1277070.0,48177.3,1.0
+14293.0,3447905.0,1.0,61.0,1229240.0,34335.80000000001,0.0
+14315.0,4740914.0,1.0,57.0,1222430.0,29210.4,1.0
+6790.0,4400559.0,1.0,54.0,946592.0,22559.5,1.0
+2781.0,2333937.0,1.0,56.0,1320760.0,56365.7,1.0
+1227.0,2212278.0,1.0,48.0,1233870.0,43924.30000000001,0.0
+4581.0,3253319.0,1.0,62.0,1166220.0,26184.3,0.0
+4417.0,4378766.0,1.0,73.0,1203130.0,31852.7,0.0
+8702.0,2473189.0,1.0,61.0,1223790.0,28657.7,0.0
+12647.0,1339118.0,1.0,66.0,1303460.0,32381.3,0.0
+3003.0,4461429.0,1.0,64.0,1088780.0,28006.5,1.0
+9432.0,3019081.0,1.0,70.0,1006010.0,34291.80000000001,0.0
+11669.0,3304219.0,1.0,68.0,1259140.0,62994.7,0.0
+10118.0,2646334.0,1.0,65.0,1330260.0,42561.1,0.0
+13942.0,2936613.0,1.0,65.0,1162280.0,41039.80000000001,1.0
+12099.0,1210279.0,1.0,65.0,1237520.0,31426.7,1.0
+5070.0,5125860.0,1.0,66.0,1175020.0,81981.4,0.0
+6542.0,2131210.0,1.0,55.0,1231050.0,20361.0,0.0
+10564.0,4587619.0,1.0,68.0,1359120.0,40835.5,0.0
+4488.0,4055346.0,1.0,70.0,1180740.0,58770.1,1.0
+5200.0,1941914.0,1.0,62.0,1436160.0,58911.5,1.0
+4328.0,4109122.0,1.0,61.0,1276540.0,36636.80000000001,0.0
+13458.0,5209234.0,1.0,69.0,1319930.0,28143.6,0.0
+7749.0,4865855.0,1.0,54.0,1269790.0,21727.1,0.0
+2404.0,2732341.0,1.0,63.0,1246950.0,45313.2,0.0
+12035.0,3432789.0,1.0,62.0,1308880.0,66687.7,0.0
+7849.0,1124348.0,1.0,70.0,1129150.0,33154.9,1.0
+11536.0,3678179.0,1.0,54.0,1249170.0,30638.8,1.0
+8593.0,1746670.0,1.0,51.0,1189950.0,14588.1,0.0
+6848.0,2189848.0,1.0,61.0,1220230.0,25365.8,0.0
+14180.0,5179924.0,1.0,63.0,1237630.0,23665.2,1.0
+1863.0,5333759.0,1.0,62.0,1046360.0,59425.8,0.0
+13525.0,4599248.0,1.0,55.0,1189190.0,24375.6,1.0
+2511.0,4218724.0,1.0,61.0,1072700.0,20700.0,1.0
+9299.0,4973043.0,1.0,67.0,1369040.0,53871.5,0.0
+13403.0,3108269.0,1.0,56.0,1305520.0,30453.1,1.0
+13708.0,5057629.0,1.0,69.0,1158400.0,41936.6,0.0
+1470.0,3246283.0,1.0,69.0,1160600.0,54244.2,1.0
+5891.0,4679220.0,1.0,65.0,1454380.0,47130.2,1.0
+389.0,3779100.0,1.0,63.0,1153080.0,34764.4,1.0
+6361.0,2709551.0,1.0,70.0,1184640.0,51273.1,1.0
+3989.0,1306166.0,1.0,69.0,1214200.0,42274.4,1.0
+13742.0,4403530.0,1.0,67.0,1317360.0,27520.1,1.0
+3839.0,1077279.0,1.0,53.0,1118550.0,39087.7,0.0
+10524.0,4859976.0,1.0,71.0,1273450.0,32368.7,1.0
+2723.0,3014868.0,1.0,65.0,1117270.0,49709.8,1.0
+2088.0,4224706.0,1.0,59.0,1377500.0,26731.5,1.0
+14382.0,3457256.0,1.0,71.0,1186260.0,96852.2,0.0
+9124.0,4302075.0,1.0,71.0,1271210.0,50427.1,0.0
+12951.0,3799411.0,1.0,62.0,1167510.0,42355.80000000001,1.0
+109.0,2479251.0,1.0,58.0,1301170.0,27688.0,1.0
+11158.0,2805505.0,1.0,49.0,1280710.0,24822.0,0.0
+10296.0,2152305.0,1.0,68.0,1381080.0,66418.60000000002,0.0
+4395.0,5165230.0,1.0,56.0,1365700.0,15677.5,1.0
+8446.0,2073085.0,1.0,50.0,1169470.0,25715.0,1.0
+7924.0,1533611.0,1.0,57.0,1308480.0,40737.6,1.0
+11900.0,4166950.0,1.0,65.0,1219890.0,57511.7,1.0
+6325.0,5166702.0,1.0,67.0,1161970.0,64711.1,0.0
+9125.0,5034765.0,1.0,60.0,1310340.0,47888.8,0.0
+1787.0,4227962.0,1.0,61.0,1405120.0,66657.5,1.0
+10520.0,4614233.0,1.0,50.0,1129840.0,18843.2,0.0
+8297.0,1917674.0,1.0,58.0,1235680.0,26196.5,1.0
+13829.0,4375216.0,1.0,62.0,1343290.0,32312.7,0.0
+5190.0,1885884.0,1.0,64.0,1298760.0,44099.4,0.0
+1771.0,3442779.0,1.0,59.0,1249840.0,29483.7,0.0
+856.0,1900121.0,1.0,51.0,1267010.0,35581.80000000001,0.0
+4986.0,1625149.0,1.0,51.0,1437900.0,32099.0,0.0
+297.0,4605375.0,1.0,48.0,1238740.0,18582.8,0.0
+11318.0,4393912.0,1.0,60.0,1051680.0,24256.4,1.0
+6305.0,2402279.0,1.0,63.0,1188490.0,26822.4,1.0
+9252.0,5962209.0,1.0,71.0,1269860.0,63840.6,0.0
+9587.0,2289891.0,1.0,57.0,1136950.0,20029.6,1.0
+4367.0,1000596.0,1.0,63.0,1331850.0,46279.8,0.0
+2384.0,1526934.0,1.0,72.0,1135710.0,43195.9,1.0
+6816.0,1858494.0,1.0,52.0,1319610.0,20727.2,0.0
+12941.0,1590897.0,1.0,58.0,1239590.0,19547.3,0.0
+12941.0,1590897.0,1.0,58.0,1239590.0,19547.3,1.0
+1105.0,3818451.0,1.0,71.0,1024030.0,33474.80000000001,1.0
+5170.0,5786702.0,1.0,65.0,1335530.0,26325.5,1.0
+13397.0,1592945.0,1.0,68.0,929896.0,32630.5,0.0
+9238.0,1474610.0,1.0,59.0,1387860.0,49392.3,0.0
+13075.0,4239565.0,1.0,56.0,1308290.0,29344.3,0.0
+13326.0,5236658.0,1.0,68.0,1166570.0,54863.8,1.0
+6061.0,5639121.0,1.0,70.0,1218890.0,58259.1,0.0
+13564.0,1191203.0,1.0,67.0,1066260.0,35735.4,1.0
diff --git a/data/ukbb_subset/thumbs_192x192/1000596_T1_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1000596_T1_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..0836c1e614ecaae563c5cfa1e8d6b97e0282225a
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1000596_T1_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1062031_T2_FLAIR_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1062031_T2_FLAIR_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..fa445e3f45f67279c60e005faa0a99e336866a62
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1062031_T2_FLAIR_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1077279_T1_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1077279_T1_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..b2ee204b9afed06a864d26afe43d66bc377629fb
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1077279_T1_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1092170_T1_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1092170_T1_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..d9c72fcbca8c24fb97d0a31d82b33d26a1c88ff4
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1092170_T1_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1104540_T1_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1104540_T1_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..4b89f9e174b7e238fdf953679ba6cb44b564c009
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1104540_T1_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1104540_T2_FLAIR_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1104540_T2_FLAIR_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..123ae1db4cebc85192d389953d09bb22d397d61f
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1104540_T2_FLAIR_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1121316_T2_FLAIR_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1121316_T2_FLAIR_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..7699f2333f7f3501ea344ee7454f58f56fb05cfc
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1121316_T2_FLAIR_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1124348_T2_FLAIR_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1124348_T2_FLAIR_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..6483ceb694828bceaa06a29482e76ef4851b068c
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1124348_T2_FLAIR_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1137595_T2_FLAIR_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1137595_T2_FLAIR_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..273501a95f6a37baec183cd3ddb11e31d5559ba2
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1137595_T2_FLAIR_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1143615_T1_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1143615_T1_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..511308e65cc208759ca34f6d7e18355f53d4465f
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1143615_T1_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1143615_T2_FLAIR_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1143615_T2_FLAIR_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..a54468d367fca0ab6a5d97f66bbb4931c29bb04b
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1143615_T2_FLAIR_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1147424_T1_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1147424_T1_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..6e8c90ee1e99a1aaaf5faca608741aa065f6b693
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1147424_T1_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1191203_T2_FLAIR_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1191203_T2_FLAIR_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..fe5777c6f04a9a5f9dc1cebcd8dda4befaa9a96c
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1191203_T2_FLAIR_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1206058_T1_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1206058_T1_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..4b7abbfaf92fa042af705f1b835a272c1b5619da
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1206058_T1_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1210279_T2_FLAIR_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1210279_T2_FLAIR_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..b7cc60c3a87c234845d908356165f6d6c9e60f1d
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1210279_T2_FLAIR_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1240253_T1_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1240253_T1_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..8ac10a7896ada8d4e6e166221fc189fc127c3e85
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1240253_T1_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1248201_T2_FLAIR_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1248201_T2_FLAIR_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..7e37f0df44dd6e57b8e771f256a2628395f12efe
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1248201_T2_FLAIR_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1252025_T1_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1252025_T1_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..f9e5d14931addfdc3c9ca0e9d192c2b9439839c2
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1252025_T1_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1271931_T2_FLAIR_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1271931_T2_FLAIR_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..9c4f08f2045a7af3a8ad7b37f26991debc8e6a5c
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1271931_T2_FLAIR_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1295935_T1_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1295935_T1_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..3a840ca1e63c47af49adaa63af7f7d3bc5f7c51e
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1295935_T1_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1304529_T2_FLAIR_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1304529_T2_FLAIR_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..5c99e0ec726c94d5fb99f79bed9d9a3d6a35fac2
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1304529_T2_FLAIR_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1306166_T2_FLAIR_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1306166_T2_FLAIR_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..f1b7cb366aa673804799ecfdf4f9d57f3b176b84
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1306166_T2_FLAIR_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1322934_T1_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1322934_T1_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..59a668cf80f34cea999a969676a8576fb6859385
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1322934_T1_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1339118_T1_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1339118_T1_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..7c9edc78f5314c6f397f752665374ac85f565713
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1339118_T1_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1365767_T2_FLAIR_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1365767_T2_FLAIR_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..d5446493524ed9468c651e5ef3ab77cf353e238d
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1365767_T2_FLAIR_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1382023_T1_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1382023_T1_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..11dceaee9011c6ec47eebc80827feed767d08872
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1382023_T1_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1382023_T2_FLAIR_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1382023_T2_FLAIR_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..dad939c970561865d0c6ef77964aedcabcf23e1d
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1382023_T2_FLAIR_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1383769_T2_FLAIR_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1383769_T2_FLAIR_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..0c05a91f740ba864243e021915989487fa151174
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1383769_T2_FLAIR_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1406085_T1_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1406085_T1_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..36087144253f8365970713e6e9c7b97970f8bb5b
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1406085_T1_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1426774_T1_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1426774_T1_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..9ce18524fe48b59a4f027e9e2b499cb1c423e6c3
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1426774_T1_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1474610_T1_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1474610_T1_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..936304601a56e2e7ac05fc8cb1a4bdb44bd901e7
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1474610_T1_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1479193_T1_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1479193_T1_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..5e2404dee2170d72e03da22c2f91ebf261339ba0
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1479193_T1_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1513685_T2_FLAIR_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1513685_T2_FLAIR_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..4052437e633174bcd96f532bd4efa0758f739ba6
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1513685_T2_FLAIR_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1523213_T2_FLAIR_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1523213_T2_FLAIR_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..142e2a7074f07818b69a89277eb3567c2a1d83c5
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1523213_T2_FLAIR_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1526934_T2_FLAIR_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1526934_T2_FLAIR_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..fadde09d85d45a73d82578e5e0cdc98dc6ac24fb
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1526934_T2_FLAIR_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1533611_T2_FLAIR_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1533611_T2_FLAIR_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..48aa13ba0b4e164322c3eb9fc67d90d11ef2c615
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1533611_T2_FLAIR_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1590897_T1_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1590897_T1_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..79e12853a49838cc632af91bd0311295aa90d462
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1590897_T1_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1590897_T2_FLAIR_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1590897_T2_FLAIR_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..fa5f89fd6ff02497a0ac08f58bd2a7fd3879260d
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1590897_T2_FLAIR_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1592945_T1_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1592945_T1_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..d1d7bade8122a36deb1711e1cd17f4459378a990
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1592945_T1_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1625149_T1_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1625149_T1_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..6819fb9699e34dc5c29ba51bf08dd4e3589a307d
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1625149_T1_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1646843_T2_FLAIR_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1646843_T2_FLAIR_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..8d38fb6ccb01ebd8d63a9c1bba88f4214623ecc0
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1646843_T2_FLAIR_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1647678_T1_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1647678_T1_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..1db2d79f7661519af584f58aedeba6de5f31e2c3
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1647678_T1_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1723643_T2_FLAIR_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1723643_T2_FLAIR_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..2ade531ee59c3da9e976c92726902ba011a1aaff
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1723643_T2_FLAIR_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1738473_T2_FLAIR_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1738473_T2_FLAIR_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..4ca5d671a1df2312372b927fe7089ce9437c6d10
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1738473_T2_FLAIR_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1746670_T1_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1746670_T1_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..a216e7e53b2c64d8c54d9a54cb2b7f9e99beba06
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1746670_T1_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1839166_T2_FLAIR_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1839166_T2_FLAIR_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..d5d0b021bff531069e2567c3792ad38e1296bb0c
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1839166_T2_FLAIR_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1858494_T1_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1858494_T1_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..c5a5c6cbf1fae3dfe0f4485b89e818e6f9f2c4c5
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1858494_T1_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1860065_T1_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1860065_T1_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..e385fd80fbeb0aaf33ff2e458ceb28f61216cbb4
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1860065_T1_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1879289_T1_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1879289_T1_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..8fefbe53cf0b617c3bb4ffb00bfdbdec70c11593
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1879289_T1_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1885884_T1_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1885884_T1_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..312f288b74ace9d05eeb700e4f61d8c7c3accdaf
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1885884_T1_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1889036_T1_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1889036_T1_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..f14b62e0ac1616a7cac13d3109973f44f3365a62
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1889036_T1_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1900121_T1_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1900121_T1_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..ce02b13dba3927d793cb7287571598283169e0ae
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1900121_T1_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1903811_T2_FLAIR_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1903811_T2_FLAIR_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..db0490d8b1c8d8e4a00aa13248e68ad3c26d35e6
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1903811_T2_FLAIR_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1917674_T2_FLAIR_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1917674_T2_FLAIR_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..10c0fb675dacd78136e17a161d4dadea0cdcf10a
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1917674_T2_FLAIR_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1921762_T2_FLAIR_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1921762_T2_FLAIR_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..df6b3dffa9a37c502b3b175d5100965a2113dd53
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1921762_T2_FLAIR_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1938755_T2_FLAIR_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1938755_T2_FLAIR_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..db4338a6ae2707ff809c97d3b265cc4353827592
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1938755_T2_FLAIR_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/1941914_T2_FLAIR_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/1941914_T2_FLAIR_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..b95e02ef3a3ffefd91daeb9c2fc0ffcb46fcc068
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/1941914_T2_FLAIR_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/2073085_T2_FLAIR_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/2073085_T2_FLAIR_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..0df4dcf461d4e76d7517fe24237455f6de93cca4
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/2073085_T2_FLAIR_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/2078091_T1_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/2078091_T1_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..118e052a13fd002b043f0cbce7f10b7bd971ee7b
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/2078091_T1_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/2078260_T1_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/2078260_T1_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..ac95e0b7393a6be5bcf3c471e443a681c7a701c5
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/2078260_T1_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/2078918_T2_FLAIR_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/2078918_T2_FLAIR_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..e6ec2aab5352ac8b8e55f933406148f4ab266337
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/2078918_T2_FLAIR_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/2089169_T1_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/2089169_T1_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..511be7d2de4d089adda2b2919797f547a9ffdb0f
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/2089169_T1_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/2096520_T2_FLAIR_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/2096520_T2_FLAIR_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..663689f838ebfee1c9222e33084e73027f48be70
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/2096520_T2_FLAIR_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/2101841_T1_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/2101841_T1_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..a3205654ab644274ec2784000e997c18bf3ac4c5
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/2101841_T1_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/2115625_T2_FLAIR_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/2115625_T2_FLAIR_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..4a19ce0444758bd4916129f2c6de70d9242a2d03
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/2115625_T2_FLAIR_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/2131210_T1_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/2131210_T1_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..114ab2f5f967dbe218947b759b4bd843e89f40fc
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/2131210_T1_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/2143997_T2_FLAIR_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/2143997_T2_FLAIR_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..e4f84e446b00943d6625dd207816b5b2570ae8e3
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/2143997_T2_FLAIR_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/2152305_T1_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/2152305_T1_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..aa1e2fa1bbcc65200539de95a31220604a97196e
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/2152305_T1_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/2171414_T1_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/2171414_T1_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..d2b3aad3a029e03ad63f2997bc6313e9696d4ee4
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/2171414_T1_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/2189848_T1_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/2189848_T1_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..b53aff1be25b4fbf32e71f9e1b4bfd390aeb3c88
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/2189848_T1_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/2212278_T1_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/2212278_T1_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..08bcea2ac7dda234f1773beb41727666bb9d7c1d
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/2212278_T1_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/2223957_T2_FLAIR_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/2223957_T2_FLAIR_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..e6f711f1c616c09a16924c459f1fcae722e057c0
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/2223957_T2_FLAIR_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/2230752_T2_FLAIR_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/2230752_T2_FLAIR_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..cd5b600da4210833dc7dc8cd4daa1b01e371612a
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/2230752_T2_FLAIR_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/2289891_T2_FLAIR_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/2289891_T2_FLAIR_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..415a6dba531867a03be7826a9fc6b6378d41884f
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/2289891_T2_FLAIR_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/2303777_T2_FLAIR_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/2303777_T2_FLAIR_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..9f36e4264fb08910fc5d83fc9a960dcccd89aa0e
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/2303777_T2_FLAIR_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/2320854_T2_FLAIR_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/2320854_T2_FLAIR_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..7e5b00c389fe62c90eba27807542603b098600a8
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/2320854_T2_FLAIR_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/2333937_T2_FLAIR_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/2333937_T2_FLAIR_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..31028dbfe2c6ad79f8abbc6c7f7bbe2470852815
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/2333937_T2_FLAIR_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/2357688_T2_FLAIR_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/2357688_T2_FLAIR_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..0c83b63a7a4fdb8f9430649da17d9a226b02d99a
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/2357688_T2_FLAIR_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/2373943_T1_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/2373943_T1_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..9add69e1317e4c86e0c093f898802252a1fe3bfa
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/2373943_T1_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/2402279_T2_FLAIR_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/2402279_T2_FLAIR_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..b2a6091d6b25024660473a7fd778cd514eebd6e4
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/2402279_T2_FLAIR_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/2420014_T1_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/2420014_T1_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..63b25eb6a9366fa15971e5a437c494bba39a8ceb
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/2420014_T1_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/2473189_T1_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/2473189_T1_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..96ba79a2d854fdf5ca7a18071c34eb071f070726
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/2473189_T1_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/2479251_T2_FLAIR_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/2479251_T2_FLAIR_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..fa2c1ae7914815c0297d139d4804bc3541102d24
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/2479251_T2_FLAIR_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/2646334_T1_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/2646334_T1_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..b59eedeef756473651dee5031baa51a47bbc4930
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/2646334_T1_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/2709551_T2_FLAIR_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/2709551_T2_FLAIR_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..218c007888a90bcd8fd76d7c99b02d0b16fb68ee
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/2709551_T2_FLAIR_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/2732341_T1_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/2732341_T1_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..581de8aaf4195c9e33d20589bd059066c8fcb1c2
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/2732341_T1_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/2736992_T2_FLAIR_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/2736992_T2_FLAIR_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..254b2a6d61563c82ef047fedda1e898308c97f40
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/2736992_T2_FLAIR_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/2774533_T1_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/2774533_T1_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..1a5b779aa6bfed784626fbf90feffbd416fe9ac2
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/2774533_T1_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/2803766_T2_FLAIR_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/2803766_T2_FLAIR_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..fe4c1a592ed3073210360490c217263167387cd3
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/2803766_T2_FLAIR_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/2805505_T1_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/2805505_T1_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..796d5b7cb0ac7db93b403e7b52d96f1c2374d491
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/2805505_T1_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/2810487_T1_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/2810487_T1_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..af9d5d76598a291fafa923a963a7e89299f4db1c
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/2810487_T1_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/2823056_T2_FLAIR_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/2823056_T2_FLAIR_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..ed34888b155d5bc136803986637f8723db7c15bc
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/2823056_T2_FLAIR_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/2833097_T2_FLAIR_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/2833097_T2_FLAIR_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..02ac27dc3e92dec5b1600bfbfd9d0d15552608cb
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/2833097_T2_FLAIR_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/2854927_T1_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/2854927_T1_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..02e51f81853d162b7385a5b2e9dc21a02c28742f
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/2854927_T1_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/2936613_T2_FLAIR_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/2936613_T2_FLAIR_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..cf9a7d606a079e96c9e43ed01062ee44bd745108
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/2936613_T2_FLAIR_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/2958972_T1_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/2958972_T1_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..6c76bfa374787b88ba506279d3a16b76348ca7a0
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/2958972_T1_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/3014868_T2_FLAIR_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/3014868_T2_FLAIR_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..bfb05511104f6f28532d1d1b4a283d4b953acf91
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/3014868_T2_FLAIR_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/3015999_T1_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/3015999_T1_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..0bc433359b9b717a282461d1b2713e8f9d782688
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/3015999_T1_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/3018814_T2_FLAIR_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/3018814_T2_FLAIR_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..e9458b6be928a68a6e1058ab19ef59fa799fb8ac
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/3018814_T2_FLAIR_unbiased_brain_rigid_to_mni.png differ
diff --git a/data/ukbb_subset/thumbs_192x192/3019081_T1_unbiased_brain_rigid_to_mni.png b/data/ukbb_subset/thumbs_192x192/3019081_T1_unbiased_brain_rigid_to_mni.png
new file mode 100644
index 0000000000000000000000000000000000000000..213de45cc97c45483a0ff1c61df90c21948e4d74
Binary files /dev/null and b/data/ukbb_subset/thumbs_192x192/3019081_T1_unbiased_brain_rigid_to_mni.png differ
diff --git a/datasets.py b/datasets.py
new file mode 100644
index 0000000000000000000000000000000000000000..216f1c0bbf288b8684c8f164ed6e51229aa136f7
--- /dev/null
+++ b/datasets.py
@@ -0,0 +1,413 @@
+import os
+import gzip
+import struct
+import numpy as np
+import pandas as pd
+import torch
+import torchvision.transforms as TF
+import torch.nn.functional as F
+from tqdm import tqdm
+from torch.utils.data import Dataset
+from typing import Tuple
+from PIL import Image
+from skimage.io import imread
+
+
+def log_standardize(x):
+ log_x = torch.log(x.clamp(min=1e-12))
+ return (log_x - log_x.mean()) / log_x.std().clamp(min=1e-12) # mean=0, std=1
+
+
+def normalize(x, x_min=None, x_max=None, zero_one=False):
+ if x_min is None:
+ x_min = x.min()
+ if x_max is None:
+ x_max = x.max()
+ print(f"max: {x_max}, min: {x_min}")
+ x = (x - x_min) / (x_max - x_min) # [0,1]
+ return x if zero_one else 2 * x - 1 # else [-1,1]
+
+
+class UKBBDataset(Dataset):
+ def __init__(
+ self, root, csv_file, transform=None, columns=None, norm=None, concat_pa=True
+ ):
+ super().__init__()
+ self.root = root
+ self.transform = transform
+ self.concat_pa = concat_pa # return concatenated parents
+
+ print(f"\nLoading csv data: {csv_file}")
+ self.df = pd.read_csv(csv_file)
+ self.columns = columns
+ if self.columns is None:
+ # ['eid', 'sex', 'age', 'brain_volume', 'ventricle_volume', 'mri_seq']
+ self.columns = list(self.df.columns) # return all
+ self.columns.pop(0) # remove redundant 'index' column
+ print(f"columns: {self.columns}")
+ self.samples = {i: torch.as_tensor(self.df[i]).float() for i in self.columns}
+
+ for k in ["age", "brain_volume", "ventricle_volume"]:
+ print(f"{k} normalization: {norm}")
+ if k in self.columns:
+ if norm == "[-1,1]":
+ self.samples[k] = normalize(self.samples[k])
+ elif norm == "[0,1]":
+ self.samples[k] = normalize(self.samples[k], zero_one=True)
+ elif norm == "log_standard":
+ self.samples[k] = log_standardize(self.samples[k])
+ elif norm == None:
+ pass
+ else:
+ NotImplementedError(f"{norm} not implemented.")
+ print(f"#samples: {len(self.df)}")
+ self.return_x = True if "eid" in self.columns else False
+
+ def __len__(self):
+ return len(self.df)
+
+ def __getitem__(self, idx):
+ sample = {k: v[idx] for k, v in self.samples.items()}
+
+ if self.return_x:
+ mri_seq = "T1" if sample["mri_seq"] == 0.0 else "T2_FLAIR"
+ # Load scan
+ filename = (
+ f'{int(sample["eid"])}_' + mri_seq + "_unbiased_brain_rigid_to_mni.png"
+ )
+ x = Image.open(os.path.join(self.root, "thumbs_192x192", filename))
+
+ if self.transform is not None:
+ sample["x"] = self.transform(x)
+ sample.pop("eid", None)
+
+ if self.concat_pa:
+ sample["pa"] = torch.cat(
+ [torch.tensor([sample[k]]) for k in self.columns if k != "eid"], dim=0
+ )
+
+ return sample
+
+
+def get_attr_max_min(attr):
+ # some ukbb dataset (max, min) stats
+ if attr == "age":
+ return 73, 44
+ elif attr == "brain_volume":
+ return 1629520, 841919
+ elif attr == "ventricle_volume":
+ return 157075, 7613.27001953125
+ else:
+ NotImplementedError
+
+
+def ukbb(args):
+ csv_dir = args.data_dir
+ augmentation = {
+ "train": TF.Compose(
+ [
+ TF.Resize((args.input_res, args.input_res), antialias=None),
+ TF.RandomCrop(
+ size=(args.input_res, args.input_res),
+ padding=[2 * args.pad, args.pad],
+ ),
+ TF.RandomHorizontalFlip(p=args.hflip),
+ TF.PILToTensor(),
+ ]
+ ),
+ "eval": TF.Compose(
+ [
+ TF.Resize((args.input_res, args.input_res), antialias=None),
+ TF.PILToTensor(),
+ ]
+ ),
+ }
+
+ datasets = {}
+ # for split in ['train', 'valid', 'test']:
+ for split in ["test"]:
+ datasets[split] = UKBBDataset(
+ root=args.data_dir,
+ csv_file=os.path.join(csv_dir, split + ".csv"),
+ transform=augmentation[("eval" if split != "train" else split)],
+ columns=(None if not args.parents_x else ["eid"] + args.parents_x),
+ norm=(None if not hasattr(args, "context_norm") else args.context_norm),
+ concat_pa=False,
+ )
+
+ return datasets
+
+
+def _load_uint8(f):
+ idx_dtype, ndim = struct.unpack("BBBB", f.read(4))[2:]
+ shape = struct.unpack(">" + "I" * ndim, f.read(4 * ndim))
+ buffer_length = int(np.prod(shape))
+ data = np.frombuffer(f.read(buffer_length), dtype=np.uint8).reshape(shape)
+ return data
+
+
+def load_idx(path: str) -> np.ndarray:
+ """Reads an array in IDX format from disk.
+ Parameters
+ ----------
+ path : str
+ Path of the input file. Will uncompress with `gzip` if path ends in '.gz'.
+ Returns
+ -------
+ np.ndarray
+ Output array of dtype ``uint8``.
+ References
+ ----------
+ http://yann.lecun.com/exdb/mnist/
+ """
+ open_fcn = gzip.open if path.endswith(".gz") else open
+ with open_fcn(path, "rb") as f:
+ return _load_uint8(f)
+
+
+def _get_paths(root_dir, train):
+ prefix = "train" if train else "t10k"
+ images_filename = prefix + "-images-idx3-ubyte.gz"
+ labels_filename = prefix + "-labels-idx1-ubyte.gz"
+ metrics_filename = prefix + "-morpho.csv"
+ images_path = os.path.join(root_dir, images_filename)
+ labels_path = os.path.join(root_dir, labels_filename)
+ metrics_path = os.path.join(root_dir, metrics_filename)
+ return images_path, labels_path, metrics_path
+
+
+def load_morphomnist_like(
+ root_dir, train: bool = True, columns=None
+) -> Tuple[np.ndarray, np.ndarray, pd.DataFrame]:
+ """
+ Args:
+ root_dir: path to data directory
+ train: whether to load the training subset (``True``, ``'train-*'`` files) or the test
+ subset (``False``, ``'t10k-*'`` files)
+ columns: list of morphometrics to load; by default (``None``) loads the image index and
+ all available metrics: area, length, thickness, slant, width, and height
+ Returns:
+ images, labels, metrics
+ """
+ images_path, labels_path, metrics_path = _get_paths(root_dir, train)
+ images = load_idx(images_path)
+ labels = load_idx(labels_path)
+
+ if columns is not None and "index" not in columns:
+ usecols = ["index"] + list(columns)
+ else:
+ usecols = columns
+ metrics = pd.read_csv(metrics_path, usecols=usecols, index_col="index")
+ return images, labels, metrics
+
+
+class MorphoMNIST(Dataset):
+ def __init__(
+ self,
+ root_dir,
+ train=True,
+ transform=None,
+ columns=None,
+ norm=None,
+ concat_pa=True,
+ ):
+ self.train = train
+ self.transform = transform
+ self.columns = columns
+ self.concat_pa = concat_pa
+ self.norm = norm
+
+ cols_not_digit = [c for c in self.columns if c != "digit"]
+ images, labels, metrics_df = load_morphomnist_like(
+ root_dir, train, cols_not_digit
+ )
+ self.images = torch.from_numpy(np.array(images)).unsqueeze(1)
+ self.labels = F.one_hot(
+ torch.from_numpy(np.array(labels)).long(), num_classes=10
+ )
+
+ if self.columns is None:
+ self.columns = metrics_df.columns
+ self.samples = {k: torch.tensor(metrics_df[k]) for k in cols_not_digit}
+
+ self.min_max = {
+ "thickness": [0.87598526, 6.255515],
+ "intensity": [66.601204, 254.90317],
+ }
+
+ for k, v in self.samples.items(): # optional preprocessing
+ print(f"{k} normalization: {norm}")
+ if norm == "[-1,1]":
+ self.samples[k] = normalize(
+ v, x_min=self.min_max[k][0], x_max=self.min_max[k][1]
+ )
+ elif norm == "[0,1]":
+ self.samples[k] = normalize(
+ v, x_min=self.min_max[k][0], x_max=self.min_max[k][1], zero_one=True
+ )
+ elif norm == None:
+ pass
+ else:
+ NotImplementedError(f"{norm} not implemented.")
+ print(f"#samples: {len(metrics_df)}\n")
+
+ self.samples.update({"digit": self.labels})
+
+ def __len__(self):
+ return len(self.images)
+
+ def __getitem__(self, idx):
+ sample = {}
+ sample["x"] = self.images[idx]
+
+ if self.transform is not None:
+ sample["x"] = self.transform(sample["x"])
+
+ if self.concat_pa:
+ sample["pa"] = torch.cat(
+ [
+ v[idx] if k == "digit" else torch.tensor([v[idx]])
+ for k, v in self.samples.items()
+ ],
+ dim=0,
+ )
+ else:
+ sample.update({k: v[idx] for k, v in self.samples.items()})
+ return sample
+
+
+def morphomnist(args):
+ # Load data
+ augmentation = {
+ "train": TF.Compose(
+ [
+ TF.RandomCrop((args.input_res, args.input_res), padding=args.pad),
+ ]
+ ),
+ "eval": TF.Compose(
+ [
+ TF.Pad(padding=2), # (32, 32)
+ ]
+ ),
+ }
+
+ datasets = {}
+ # for split in ['train', 'valid', 'test']:
+ for split in ["test"]:
+ datasets[split] = MorphoMNIST(
+ root_dir=args.data_dir,
+ train=(split == "train"), # test set is valid set
+ transform=augmentation[("eval" if split != "train" else split)],
+ columns=args.parents_x,
+ norm=args.context_norm,
+ concat_pa=False,
+ )
+ return datasets
+
+
+def preproc_mimic(batch):
+ for k, v in batch.items():
+ if k == "x":
+ batch["x"] = (batch["x"].float() - 127.5) / 127.5 # [-1,1]
+ elif k in ["age"]:
+ batch[k] = batch[k].float().unsqueeze(-1)
+ batch[k] = batch[k] / 100.0
+ batch[k] = batch[k] * 2 - 1 # [-1,1]
+ elif k in ["race"]:
+ batch[k] = F.one_hot(batch[k], num_classes=3).squeeze().float()
+ elif k in ["finding"]:
+ batch[k] = batch[k].unsqueeze(-1).float()
+ else:
+ batch[k] = batch[k].float().unsqueeze(-1)
+ return batch
+
+
+class MIMICDataset(Dataset):
+ def __init__(
+ self,
+ root,
+ csv_file,
+ transform=None,
+ columns=None,
+ concat_pa=True,
+ only_pleural_eff=True,
+ ):
+ self.data = pd.read_csv(csv_file)
+ self.transform = transform
+ self.disease_labels = [
+ "No Finding",
+ "Other",
+ "Pleural Effusion",
+ # "Lung Opacity",
+ ]
+ self.samples = {
+ "age": [],
+ "sex": [],
+ "finding": [],
+ "x": [],
+ "race": [],
+ # "lung_opacity": [],
+ # "pleural_effusion": [],
+ }
+
+ for idx, _ in enumerate(tqdm(range(len(self.data)), desc="Loading MIMIC Data")):
+ if only_pleural_eff and self.data.loc[idx, "disease"] == "Other":
+ continue
+ img_path = os.path.join(root, self.data.loc[idx, "path_preproc"])
+
+ # lung_opacity = self.data.loc[idx, "Lung Opacity"]
+ # self.samples["lung_opacity"].append(lung_opacity)
+
+ # pleural_effusion = self.data.loc[idx, "Pleural Effusion"]
+ # self.samples["pleural_effusion"].append(pleural_effusion)
+
+ disease = self.data.loc[idx, "disease"]
+ finding = 0 if disease == "No Finding" else 1
+
+ self.samples["x"].append(img_path)
+ self.samples["finding"].append(finding)
+ self.samples["age"].append(self.data.loc[idx, "age"])
+ self.samples["race"].append(self.data.loc[idx, "race_label"])
+ self.samples["sex"].append(self.data.loc[idx, "sex_label"])
+
+ self.columns = columns
+ if self.columns is None:
+ # ['age', 'race', 'sex']
+ self.columns = list(self.data.columns) # return all
+ self.columns.pop(0) # remove redundant 'index' column
+ self.concat_pa = concat_pa
+
+ def __len__(self):
+ return len(self.samples["x"])
+
+ def __getitem__(self, idx):
+ sample = {k: v[idx] for k, v in self.samples.items()}
+ sample["x"] = imread(sample["x"]).astype(np.float32)[None, ...]
+
+ for k, v in sample.items():
+ sample[k] = torch.tensor(v)
+
+ if self.transform:
+ sample["x"] = self.transform(sample["x"])
+
+ sample = preproc_mimic(sample)
+ if self.concat_pa:
+ sample["pa"] = torch.cat([sample[k] for k in self.columns], dim=0)
+ return sample
+
+
+def mimic(args):
+ args.csv_dir = args.data_dir
+ datasets = {}
+ datasets["test"] = MIMICDataset(
+ root=args.data_dir,
+ csv_file=os.path.join(args.csv_dir, "mimic.sample.test.csv"),
+ columns=args.parents_x,
+ transform=TF.Compose(
+ [
+ TF.Resize((args.input_res, args.input_res), antialias=None),
+ ]
+ ),
+ concat_pa=False,
+ )
+ return datasets
diff --git a/hammer.png b/hammer.png
new file mode 100644
index 0000000000000000000000000000000000000000..aab09f6628275c15f71eecc1ecebe8fa079f5886
Binary files /dev/null and b/hammer.png differ
diff --git a/packages.txt b/packages.txt
new file mode 100644
index 0000000000000000000000000000000000000000..3c8d9819db262c32217436cc4a1b3c1ea74c805a
--- /dev/null
+++ b/packages.txt
@@ -0,0 +1,4 @@
+dvipng
+texlive-latex-extra
+texlive-fonts-recommended
+cm-super
\ No newline at end of file
diff --git a/pgm/__pycache__/flow_pgm.cpython-311.pyc b/pgm/__pycache__/flow_pgm.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..96e88075cb2f7dd7f8cd7ac71cb474c768d9dced
Binary files /dev/null and b/pgm/__pycache__/flow_pgm.cpython-311.pyc differ
diff --git a/pgm/__pycache__/layers.cpython-311.pyc b/pgm/__pycache__/layers.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..6c0393021a86c7a67368130806d5e393ee8d3aae
Binary files /dev/null and b/pgm/__pycache__/layers.cpython-311.pyc differ
diff --git a/pgm/flow_pgm.py b/pgm/flow_pgm.py
new file mode 100644
index 0000000000000000000000000000000000000000..14ba585d70080f2d4f46abbe2fdfe46ddcea3f51
--- /dev/null
+++ b/pgm/flow_pgm.py
@@ -0,0 +1,613 @@
+from typing import Dict
+
+import numpy as np
+import torch
+from torch import nn, Tensor
+import torch.nn.functional as F
+
+import pyro
+import pyro.distributions as dist
+import pyro.distributions.transforms as T
+
+from pyro.nn import DenseNN
+from pyro.infer.reparam.transform import TransformReparam
+from pyro.distributions.conditional import ConditionalTransformedDistribution
+
+from .layers import (
+ ConditionalTransformedDistributionGumbelMax,
+ ConditionalGumbelMax,
+ ConditionalAffineTransform,
+ MLP,
+ CNN,
+)
+
+
+class Hparams:
+ def update(self, dict):
+ for k, v in dict.items():
+ setattr(self, k, v)
+
+
+class BasePGM(nn.Module):
+ def __init__(self):
+ super().__init__()
+
+ def scm(self, *args, **kwargs):
+ def config(msg):
+ if isinstance(msg["fn"], dist.TransformedDistribution):
+ return TransformReparam()
+ else:
+ return None
+
+ return pyro.poutine.reparam(self.model, config=config)(*args, **kwargs)
+
+ def sample_scm(self, n_samples: int = 1):
+ with pyro.plate("obs", n_samples):
+ samples = self.scm()
+ return samples
+
+ def sample(self, n_samples: int = 1):
+ with pyro.plate("obs", n_samples):
+ samples = self.model() # NOTE: not ideal as model is defined in child class
+ return samples
+
+ def infer_exogeneous(self, obs: Dict[str, Tensor]) -> Dict[str, Tensor]:
+ batch_size = list(obs.values())[0].shape[0]
+ # assuming that we use transformed distributions for everything:
+ cond_model = pyro.condition(self.sample, data=obs)
+ cond_trace = pyro.poutine.trace(cond_model).get_trace(batch_size)
+
+ output = {}
+ for name, node in cond_trace.nodes.items():
+ if "z" in name or "fn" not in node.keys():
+ continue
+ fn = node["fn"]
+ if isinstance(fn, dist.Independent):
+ fn = fn.base_dist
+ if isinstance(fn, dist.TransformedDistribution):
+ # compute exogenous base dist (created with TransformReparam) at all sites
+ output[name + "_base"] = T.ComposeTransform(fn.transforms).inv(
+ node["value"]
+ )
+ return output
+
+ def counterfactual(
+ self,
+ obs: Dict[str, Tensor],
+ intervention: Dict[str, Tensor],
+ num_particles: int = 1,
+ detach: bool = True,
+ ) -> Dict[str, Tensor]:
+ # NOTE: not ideal as "variables" is defined in child class
+ dag_variables = self.variables.keys()
+ assert set(obs.keys()) == set(dag_variables)
+ avg_cfs = {k: torch.zeros_like(obs[k]) for k in obs.keys()}
+ batch_size = list(obs.values())[0].shape[0]
+
+ for _ in range(num_particles):
+ # Abduction
+ exo_noise = self.infer_exogeneous(obs)
+ exo_noise = {k: v.detach() if detach else v for k, v in exo_noise.items()}
+ # condition on root node variables (no exogeneous noise available)
+ for k in dag_variables:
+ if k not in intervention.keys():
+ if k not in [i.split("_base")[0] for i in exo_noise.keys()]:
+ exo_noise[k] = obs[k]
+ # Abducted SCM
+ abducted_scm = pyro.poutine.condition(self.sample_scm, data=exo_noise)
+ # Action
+ counterfactual_scm = pyro.poutine.do(abducted_scm, data=intervention)
+ # Prediction
+ counterfactuals = counterfactual_scm(batch_size)
+
+ if hasattr(self, "discrete_variables"): # hack for MIMIC
+ # Check if we should change "finding", i.e. if its parents and/or
+ # itself are not intervened on, then we use its observed value.
+ # This is used due to stochastic abduction of discrete variables
+ if (
+ "age" not in intervention.keys()
+ and "finding" not in intervention.keys()
+ ):
+ counterfactuals["finding"] = obs["finding"]
+
+ for k, v in counterfactuals.items():
+ avg_cfs[k] += v / num_particles
+ return avg_cfs
+
+
+class FlowPGM(BasePGM):
+ def __init__(self, args: Hparams):
+ super().__init__()
+ self.variables = {
+ "sex": "binary",
+ "mri_seq": "binary",
+ "age": "continuous",
+ "brain_volume": "continuous",
+ "ventricle_volume": "continuous",
+ }
+ # priors: s, m, a, b and v
+ self.s_logit = nn.Parameter(torch.zeros(1))
+ self.m_logit = nn.Parameter(torch.zeros(1))
+ for k in ["a", "b", "v"]:
+ self.register_buffer(f"{k}_base_loc", torch.zeros(1))
+ self.register_buffer(f"{k}_base_scale", torch.ones(1))
+
+ # constraint, assumes data is [-1,1] normalized
+ # normalize_transform = T.ComposeTransform([
+ # T.AffineTransform(loc=0, scale=2), T.SigmoidTransform(), T.AffineTransform(loc=-1, scale=2)])
+ # normalize_transform = T.ComposeTransform([T.TanhTransform(cache_size=1)])
+ # normalize_transform = T.ComposeTransform([T.AffineTransform(loc=0, scale=1)])
+
+ # age flow
+ self.age_module = T.ComposeTransformModule(
+ [T.Spline(1, count_bins=4, order="linear")]
+ )
+ self.age_flow = T.ComposeTransform([self.age_module])
+ # self.age_module, normalize_transform])
+
+ # brain volume (conditional) flow: (sex, age) -> brain_vol
+ bvol_net = DenseNN(2, args.widths, [1, 1], nonlinearity=nn.LeakyReLU(0.1))
+ self.bvol_flow = ConditionalAffineTransform(context_nn=bvol_net, event_dim=0)
+ # self.bvol_flow = [self.bvol_flow, normalize_transform]
+
+ # ventricle volume (conditional) flow: (brain_vol, age) -> ventricle_vol
+ vvol_net = DenseNN(2, args.widths, [1, 1], nonlinearity=nn.LeakyReLU(0.1))
+ self.vvol_flow = ConditionalAffineTransform(context_nn=vvol_net, event_dim=0)
+ # self.vvol_flow = [self.vvol_transf, normalize_transform]
+
+ # if args.setup != 'sup_pgm':
+ # anticausal predictors
+ input_shape = (args.input_channels, args.input_res, args.input_res)
+ # q(s | x, b) = Bernoulli(f(x,b))
+ self.encoder_s = CNN(input_shape, num_outputs=1, context_dim=1)
+ # q(m | x) = Bernoulli(f(x))
+ self.encoder_m = CNN(input_shape, num_outputs=1)
+ # q(a | b, v) = Normal(mu(b, v), sigma(b, v))
+ self.encoder_a = MLP(num_inputs=2, num_outputs=2)
+ # q(b | x, v) = Normal(mu(x, v), sigma(x, v))
+ self.encoder_b = CNN(input_shape, num_outputs=2, context_dim=1)
+ # q(v | x) = Normal(mu(x), sigma(x))
+ self.encoder_v = CNN(input_shape, num_outputs=2)
+ self.f = (
+ lambda x: args.std_fixed * torch.ones_like(x)
+ if args.std_fixed > 0
+ else F.softplus(x)
+ )
+
+ def model(self) -> Dict[str, Tensor]:
+ # p(s), sex dist
+ ps = dist.Bernoulli(logits=self.s_logit).to_event(1)
+ sex = pyro.sample("sex", ps)
+
+ # p(m), mri_seq dist
+ pm = dist.Bernoulli(logits=self.m_logit).to_event(1)
+ mri_seq = pyro.sample("mri_seq", pm)
+
+ # p(a), age flow
+ pa_base = dist.Normal(self.a_base_loc, self.a_base_scale).to_event(1)
+ pa = dist.TransformedDistribution(pa_base, self.age_flow)
+ age = pyro.sample("age", pa)
+
+ # p(b | s, a), brain volume flow
+ pb_sa_base = dist.Normal(self.b_base_loc, self.b_base_scale).to_event(1)
+ pb_sa = ConditionalTransformedDistribution(
+ pb_sa_base, [self.bvol_flow]
+ ).condition(torch.cat([sex, age], dim=1))
+ bvol = pyro.sample("brain_volume", pb_sa)
+ # _ = self.bvol_transf # register with pyro
+
+ # p(v | b, a), ventricle volume flow
+ pv_ba_base = dist.Normal(self.v_base_loc, self.v_base_scale).to_event(1)
+ pv_ba = ConditionalTransformedDistribution(
+ pv_ba_base, [self.vvol_flow]
+ ).condition(torch.cat([bvol, age], dim=1))
+ vvol = pyro.sample("ventricle_volume", pv_ba)
+ # _ = self.vvol_transf # register with pyro
+
+ return {
+ "sex": sex,
+ "mri_seq": mri_seq,
+ "age": age,
+ "brain_volume": bvol,
+ "ventricle_volume": vvol,
+ }
+
+ def guide(self, **obs) -> None:
+ # guide for (optional) semi-supervised learning
+ pyro.module("FlowPGM", self)
+ with pyro.plate("observations", obs["x"].shape[0]):
+ # q(m | x)
+ if obs["mri_seq"] is None:
+ m_prob = torch.sigmoid(self.encoder_m(obs["x"]))
+ m = pyro.sample("mri_seq", dist.Bernoulli(probs=m_prob).to_event(1))
+
+ # q(v | x)
+ if obs["ventricle_volume"] is None:
+ v_loc, v_logscale = self.encoder_v(obs["x"]).chunk(2, dim=-1)
+ qv_x = dist.Normal(v_loc, self.f(v_logscale)).to_event(1)
+ obs["ventricle_volume"] = pyro.sample("ventricle_volume", qv_x)
+
+ # q(b | x, v)
+ if obs["brain_volume"] is None:
+ b_loc, b_logscale = self.encoder_b(
+ obs["x"], y=obs["ventricle_volume"]
+ ).chunk(2, dim=-1)
+ qb_xv = dist.Normal(b_loc, self.f(b_logscale)).to_event(1)
+ obs["brain_volume"] = pyro.sample("brain_volume", qb_xv)
+
+ # q(s | x, b)
+ if obs["sex"] is None:
+ s_prob = torch.sigmoid(
+ self.encoder_s(obs["x"], y=obs["brain_volume"])
+ ) # .squeeze()
+ pyro.sample("sex", dist.Bernoulli(probs=s_prob).to_event(1))
+
+ # q(a | b, v)
+ if obs["age"] is None:
+ ctx = torch.cat([obs["brain_volume"], obs["ventricle_volume"]], dim=-1)
+ a_loc, a_logscale = self.encoder_a(ctx).chunk(2, dim=-1)
+ pyro.sample("age", dist.Normal(a_loc, self.f(a_logscale)).to_event(1))
+
+ def model_anticausal(self, **obs) -> None:
+ # assumes all variables are observed
+ pyro.module("FlowPGM", self)
+ with pyro.plate("observations", obs["x"].shape[0]):
+ # q(v | x)
+ v_loc, v_logscale = self.encoder_v(obs["x"]).chunk(2, dim=-1)
+ qv_x = dist.Normal(v_loc, self.f(v_logscale)).to_event(1)
+ pyro.sample("ventricle_volume_aux", qv_x, obs=obs["ventricle_volume"])
+
+ # q(b | x, v)
+ b_loc, b_logscale = self.encoder_b(
+ obs["x"], y=obs["ventricle_volume"]
+ ).chunk(2, dim=-1)
+ qb_xv = dist.Normal(b_loc, self.f(b_logscale)).to_event(1)
+ pyro.sample("brain_volume_aux", qb_xv, obs=obs["brain_volume"])
+
+ # q(a | b, v)
+ ctx = torch.cat([obs["brain_volume"], obs["ventricle_volume"]], dim=-1)
+ a_loc, a_logscale = self.encoder_a(ctx).chunk(2, dim=-1)
+ pyro.sample(
+ "age_aux",
+ dist.Normal(a_loc, self.f(a_logscale)).to_event(1),
+ obs=obs["age"],
+ )
+
+ # q(s | x, b)
+ s_prob = torch.sigmoid(self.encoder_s(obs["x"], y=obs["brain_volume"]))
+ qs_xb = dist.Bernoulli(probs=s_prob).to_event(1)
+ pyro.sample("sex_aux", qs_xb, obs=obs["sex"])
+
+ # q(m | x)
+ m_prob = torch.sigmoid(self.encoder_m(obs["x"]))
+ qm_x = dist.Bernoulli(probs=m_prob).to_event(1)
+ pyro.sample("mri_seq_aux", qm_x, obs=obs["mri_seq"])
+
+ def predict(self, **obs) -> Dict[str, Tensor]:
+ # q(v | x)
+ v_loc, v_logscale = self.encoder_v(obs["x"]).chunk(2, dim=-1)
+ # v_loc = torch.tanh(v_loc)
+ # q(b | x, v)
+ b_loc, b_logscale = self.encoder_b(obs["x"], y=obs["ventricle_volume"]).chunk(
+ 2, dim=-1
+ )
+ # b_loc = torch.tanh(b_loc)
+ # q(a | b, v)
+ ctx = torch.cat([obs["brain_volume"], obs["ventricle_volume"]], dim=-1)
+ a_loc, a_logscale = self.encoder_a(ctx).chunk(2, dim=-1)
+ # a_loc = torch.tanh(b_loc)
+ # q(s | x, b)
+ s_prob = torch.sigmoid(self.encoder_s(obs["x"], y=obs["brain_volume"]))
+ # q(m | x)
+ m_prob = torch.sigmoid(self.encoder_m(obs["x"]))
+
+ return {
+ "sex": s_prob,
+ "mri_seq": m_prob,
+ "age": a_loc,
+ "brain_volume": b_loc,
+ "ventricle_volume": v_loc,
+ }
+
+ def svi_model(self, **obs) -> None:
+ with pyro.plate("observations", obs["x"].shape[0]):
+ pyro.condition(self.model, data=obs)()
+
+ def guide_pass(self, **obs) -> None:
+ pass
+
+
+class MorphoMNISTPGM(BasePGM):
+ def __init__(self, args):
+ super().__init__()
+ self.variables = {
+ "thickness": "continuous",
+ "intensity": "continuous",
+ "digit": "categorical",
+ }
+ # priors
+ self.digit_logits = nn.Parameter(torch.zeros(1, 10)) # uniform prior
+ for k in ["t", "i"]: # thickness, intensity, standard Gaussian
+ self.register_buffer(f"{k}_base_loc", torch.zeros(1))
+ self.register_buffer(f"{k}_base_scale", torch.ones(1))
+
+ # constraint, assumes data is [-1,1] normalized
+ normalize_transform = T.ComposeTransform(
+ [T.SigmoidTransform(), T.AffineTransform(loc=-1, scale=2)]
+ )
+
+ # thickness flow
+ self.thickness_module = T.ComposeTransformModule(
+ [T.Spline(1, count_bins=4, order="linear")]
+ )
+ self.thickness_flow = T.ComposeTransform(
+ [self.thickness_module, normalize_transform]
+ )
+
+ # intensity (conditional) flow: thickness -> intensity
+ intensity_net = DenseNN(1, args.widths, [1, 1], nonlinearity=nn.GELU())
+ self.context_nn = ConditionalAffineTransform(
+ context_nn=intensity_net, event_dim=0
+ )
+ self.intensity_flow = [self.context_nn, normalize_transform]
+
+ if args.setup != "sup_pgm":
+ # anticausal predictors
+ input_shape = (args.input_channels, args.input_res, args.input_res)
+ # q(t | x, i) = Normal(mu(x, i), sigma(x, i)), 2 outputs: loc & scale
+ self.encoder_t = CNN(input_shape, num_outputs=2, context_dim=1, width=8)
+ # q(i | x) = Normal(mu(x), sigma(x))
+ self.encoder_i = CNN(input_shape, num_outputs=2, width=8)
+ # q(y | x) = Categorical(pi(x))
+ self.encoder_y = CNN(input_shape, num_outputs=10, width=8)
+ self.f = (
+ lambda x: args.std_fixed * torch.ones_like(x)
+ if args.std_fixed > 0
+ else F.softplus(x)
+ )
+
+ def model(self) -> Dict[str, Tensor]:
+ pyro.module("MorphoMNISTPGM", self)
+ # p(y), digit label prior dist
+ py = dist.OneHotCategorical(
+ probs=F.softmax(self.digit_logits, dim=-1)
+ ) # .to_event(1)
+ # with pyro.poutine.scale(scale=0.05):
+ digit = pyro.sample("digit", py)
+
+ # p(t), thickness flow
+ pt_base = dist.Normal(self.t_base_loc, self.t_base_scale).to_event(1)
+ pt = dist.TransformedDistribution(pt_base, self.thickness_flow)
+ thickness = pyro.sample("thickness", pt)
+
+ # p(i | t), intensity conditional flow
+ pi_t_base = dist.Normal(self.i_base_loc, self.i_base_scale).to_event(1)
+ pi_t = ConditionalTransformedDistribution(
+ pi_t_base, self.intensity_flow
+ ).condition(thickness)
+ intensity = pyro.sample("intensity", pi_t)
+ _ = self.context_nn
+
+ return {"thickness": thickness, "intensity": intensity, "digit": digit}
+
+ def guide(self, **obs) -> None:
+ # guide for (optional) semi-supervised learning
+ with pyro.plate("observations", obs["x"].shape[0]):
+ # q(i | x)
+ if obs["intensity"] is None:
+ i_loc, i_logscale = self.encoder_i(obs["x"]).chunk(2, dim=-1)
+ qi_t = dist.Normal(torch.tanh(i_loc), self.f(i_logscale)).to_event(1)
+ obs["intensity"] = pyro.sample("intensity", qi_t)
+
+ # q(t | x, i)
+ if obs["thickness"] is None:
+ t_loc, t_logscale = self.encoder_t(obs["x"], y=obs["intensity"]).chunk(
+ 2, dim=-1
+ )
+ qt_x = dist.Normal(torch.tanh(t_loc), self.f(t_logscale)).to_event(1)
+ obs["thickness"] = pyro.sample("thickness", qt_x)
+
+ # q(y | x)
+ if obs["digit"] is None:
+ y_prob = F.softmax(self.encoder_y(obs["x"]), dim=-1)
+ qy_x = dist.OneHotCategorical(probs=y_prob) # .to_event(1)
+ pyro.sample("digit", qy_x)
+
+ def model_anticausal(self, **obs) -> None:
+ # assumes all variables are observed & continuous ones are in [-1,1]
+ pyro.module("MorphoMNISTPGM", self)
+ with pyro.plate("observations", obs["x"].shape[0]):
+ # q(t | x, i)
+ t_loc, t_logscale = self.encoder_t(obs["x"], y=obs["intensity"]).chunk(
+ 2, dim=-1
+ )
+ qt_x = dist.Normal(torch.tanh(t_loc), self.f(t_logscale)).to_event(1)
+ pyro.sample("thickness_aux", qt_x, obs=obs["thickness"])
+
+ # q(i | x)
+ i_loc, i_logscale = self.encoder_i(obs["x"]).chunk(2, dim=-1)
+ qi_t = dist.Normal(torch.tanh(i_loc), self.f(i_logscale)).to_event(1)
+ pyro.sample("intensity_aux", qi_t, obs=obs["intensity"])
+
+ # q(y | x)
+ y_prob = F.softmax(self.encoder_y(obs["x"]), dim=-1)
+ qy_x = dist.OneHotCategorical(probs=y_prob) # .to_event(1)
+ pyro.sample("digit_aux", qy_x, obs=obs["digit"])
+
+ def predict(self, **obs) -> Dict[str, Tensor]:
+ # q(t | x, i)
+ t_loc, t_logscale = self.encoder_t(obs["x"], y=obs["intensity"]).chunk(
+ 2, dim=-1
+ )
+ t_loc = torch.tanh(t_loc)
+ # q(i | x)
+ i_loc, i_logscale = self.encoder_i(obs["x"]).chunk(2, dim=-1)
+ i_loc = torch.tanh(i_loc)
+ # q(y | x)
+ y_prob = F.softmax(self.encoder_y(obs["x"]), dim=-1)
+ return {"thickness": t_loc, "intensity": i_loc, "digit": y_prob}
+
+ def svi_model(self, **obs) -> None:
+ with pyro.plate("observations", obs["x"].shape[0]):
+ pyro.condition(self.model, data=obs)()
+
+ def guide_pass(self, **obs) -> None:
+ pass
+
+
+class ChestPGM(BasePGM):
+ def __init__(self, args: Hparams):
+ super().__init__()
+ self.variables = {
+ "race": "categorical",
+ "sex": "binary",
+ "finding": "binary",
+ "age": "continuous",
+ }
+ # Discrete variables that are not root nodes
+ self.discrete_variables = {"finding": "binary"}
+ # define base distributions
+ for k in ["a"]: # , "f"]:
+ self.register_buffer(f"{k}_base_loc", torch.zeros(1))
+ self.register_buffer(f"{k}_base_scale", torch.ones(1))
+ # age spline flow
+ self.age_flow_components = T.ComposeTransformModule([T.Spline(1)])
+ # self.age_constraints = T.ComposeTransform([
+ # T.AffineTransform(loc=4.09541458484, scale=0.32548387126),
+ # T.ExpTransform()])
+ self.age_flow = T.ComposeTransform(
+ [
+ self.age_flow_components,
+ # self.age_constraints,
+ ]
+ )
+ # Finding (conditional) via MLP, a -> f
+ finding_net = DenseNN(1, [8, 16], param_dims=[2], nonlinearity=nn.Sigmoid())
+ self.finding_transform_GumbelMax = ConditionalGumbelMax(
+ context_nn=finding_net, event_dim=0
+ )
+ # log space for sex and race
+ self.sex_logit = nn.Parameter(np.log(1 / 2) * torch.ones(1))
+ self.race_logits = nn.Parameter(np.log(1 / 3) * torch.ones(1, 3))
+
+ input_shape = (args.input_channels, args.input_res, args.input_res)
+
+ if args.enc_net == "cnn":
+ # q(s | x) ~ Bernoulli(f(x))
+ self.encoder_s = CNN(input_shape, num_outputs=1)
+ # q(r | x) ~ OneHotCategorical(logits=f(x))
+ self.encoder_r = CNN(input_shape, num_outputs=3)
+ # q(f | x) ~ Bernoulli(f(x))
+ self.encoder_f = CNN(input_shape, num_outputs=1)
+ # q(a | x, f) ~ Normal(mu(x), sigma(x))
+ self.encoder_a = CNN(input_shape, num_outputs=1, context_dim=1)
+
+ def model(self) -> Dict[str, Tensor]:
+ pyro.module("ChestPGM", self)
+ # p(s), sex dist
+ ps = dist.Bernoulli(logits=self.sex_logit).to_event(1)
+ sex = pyro.sample("sex", ps)
+
+ # p(a), age flow
+ pa_base = dist.Normal(self.a_base_loc, self.a_base_scale).to_event(1)
+ pa = dist.TransformedDistribution(pa_base, self.age_flow)
+ age = pyro.sample("age", pa)
+ # age_ = self.age_constraints.inv(age)
+ _ = self.age_flow_components # register with pyro
+
+ # p(r), race dist
+ pr = dist.OneHotCategorical(logits=self.race_logits) # .to_event(1)
+ race = pyro.sample("race", pr)
+
+ # p(f | a), finding as OneHotCategorical conditioned on age
+ # finding_dist_base = dist.Gumbel(self.f_base_loc, self.f_base_scale).to_event(1)
+ finding_dist_base = dist.Gumbel(torch.zeros(1), torch.ones(1)).to_event(1)
+
+ finding_dist = ConditionalTransformedDistributionGumbelMax(
+ finding_dist_base, [self.finding_transform_GumbelMax]
+ ).condition(age)
+ finding = pyro.sample("finding", finding_dist)
+
+ return {
+ "sex": sex,
+ "race": race,
+ "age": age,
+ "finding": finding,
+ }
+
+ def guide(self, **obs) -> None:
+ with pyro.plate("observations", obs["x"].shape[0]):
+ # q(s | x)
+ if obs["sex"] is None:
+ s_prob = torch.sigmoid(self.encoder_s(obs["x"]))
+ pyro.sample("sex", dist.Bernoulli(probs=s_prob).to_event(1))
+ # q(r | x)
+ if obs["race"] is None:
+ r_probs = F.softmax(self.encoder_r(obs["x"]), dim=-1)
+ qr_x = dist.OneHotCategorical(probs=r_probs) # .to_event(1)
+ pyro.sample("race", qr_x)
+ # q(f | x)
+ if obs["finding"] is None:
+ f_prob = torch.sigmoid(self.encoder_f(obs["x"]))
+ qf_x = dist.Bernoulli(probs=f_prob).to_event(1)
+ obs["finding"] = pyro.sample("finding", qf_x)
+ # q(a | x, f)
+ if obs["age"] is None:
+ a_loc, a_logscale = self.encoder_a(obs["x"], y=obs["finding"]).chunk(
+ 2, dim=-1
+ )
+ qa_xf = dist.Normal(a_loc, self.f(a_logscale)).to_event(1)
+ pyro.sample("age_aux", qa_xf)
+
+ def model_anticausal(self, **obs) -> None:
+ # assumes all variables are observed, train classfiers
+ pyro.module("ChestPGM", self)
+ with pyro.plate("observations", obs["x"].shape[0]):
+ # q(s | x)
+ s_prob = torch.sigmoid(self.encoder_s(obs["x"]))
+ qs_x = dist.Bernoulli(probs=s_prob).to_event(1)
+ # with pyro.poutine.scale(scale=0.8):
+ pyro.sample("sex_aux", qs_x, obs=obs["sex"])
+
+ # q(r | x)
+ r_probs = F.softmax(self.encoder_r(obs["x"]), dim=-1)
+ qr_x = dist.OneHotCategorical(probs=r_probs) # .to_event(1)
+ # with pyro.poutine.scale(scale=0.5):
+ pyro.sample("race_aux", qr_x, obs=obs["race"])
+
+ # q(f | x)
+ f_prob = torch.sigmoid(self.encoder_f(obs["x"]))
+ qf_x = dist.Bernoulli(probs=f_prob).to_event(1)
+ pyro.sample("finding_aux", qf_x, obs=obs["finding"])
+
+ # q(a | x, f)
+ a_loc, a_logscale = self.encoder_a(obs["x"], y=obs["finding"]).chunk(
+ 2, dim=-1
+ )
+ qa_xf = dist.Normal(a_loc, self.f(a_logscale)).to_event(1)
+ # with pyro.poutine.scale(scale=2):
+ pyro.sample("age_aux", qa_xf, obs=obs["age"])
+
+ def predict(self, **obs) -> Dict[str, Tensor]:
+ # q(s | x)
+ s_prob = torch.sigmoid(self.encoder_s(obs["x"]))
+ # q(r | x)
+ r_probs = F.softmax(self.encoder_r(obs["x"]), dim=-1)
+ # q(f | x)
+ f_prob = torch.sigmoid(self.encoder_f(obs["x"]))
+ # q(a | x, f)
+ a_loc, _ = self.encoder_a(obs["x"], y=obs["finding"]).chunk(2, dim=-1)
+
+ return {
+ "sex": s_prob,
+ "race": r_probs,
+ "finding": f_prob,
+ "age": a_loc,
+ }
+
+ def svi_model(self, **obs) -> None:
+ with pyro.plate("observations", obs["x"].shape[0]):
+ pyro.condition(self.model, data=obs)()
+
+ def guide_pass(self, **obs) -> None:
+ pass
diff --git a/pgm/layers.py b/pgm/layers.py
new file mode 100644
index 0000000000000000000000000000000000000000..86df63db746b39ce9faa1ab09017100282dfe253
--- /dev/null
+++ b/pgm/layers.py
@@ -0,0 +1,260 @@
+import pyro
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+
+from typing import Dict
+from pyro.distributions.conditional import (
+ ConditionalTransformModule,
+ ConditionalTransformedDistribution,
+ TransformedDistribution,
+)
+from pyro.distributions.torch_distribution import TorchDistributionMixin
+
+from torch.distributions import constraints
+from torch.distributions.utils import _sum_rightmost
+from torch.distributions.transforms import Transform
+
+
+class ConditionalAffineTransform(ConditionalTransformModule):
+ def __init__(self, context_nn, event_dim=0, **kwargs):
+ super().__init__(**kwargs)
+ self.event_dim = event_dim
+ self.context_nn = context_nn
+
+ def condition(self, context):
+ loc, log_scale = self.context_nn(context)
+ return torch.distributions.transforms.AffineTransform(
+ loc, log_scale.exp(), event_dim=self.event_dim
+ )
+
+
+class MLP(nn.Module):
+ def __init__(self, num_inputs=1, width=32, num_outputs=1):
+ super().__init__()
+ activation = nn.LeakyReLU()
+ self.mlp = nn.Sequential(
+ nn.Linear(num_inputs, width, bias=False),
+ nn.BatchNorm1d(width),
+ activation,
+ nn.Linear(width, width, bias=False),
+ nn.BatchNorm1d(width),
+ activation,
+ nn.Linear(width, num_outputs),
+ )
+
+ def forward(self, x):
+ return self.mlp(x)
+
+
+class CNN(nn.Module):
+ def __init__(self, in_shape=(1, 192, 192), width=16, num_outputs=1, context_dim=0):
+ super().__init__()
+ in_channels = in_shape[0]
+ res = in_shape[1]
+ s = 2 if res > 64 else 1
+ activation = nn.LeakyReLU()
+ self.cnn = nn.Sequential(
+ nn.Conv2d(in_channels, width, 7, s, 3, bias=False),
+ nn.BatchNorm2d(width),
+ activation,
+ (nn.MaxPool2d(2, 2) if res > 32 else nn.Identity()),
+ nn.Conv2d(width, 2 * width, 3, 2, 1, bias=False),
+ nn.BatchNorm2d(2 * width),
+ activation,
+ nn.Conv2d(2 * width, 2 * width, 3, 1, 1, bias=False),
+ nn.BatchNorm2d(2 * width),
+ activation,
+ nn.Conv2d(2 * width, 4 * width, 3, 2, 1, bias=False),
+ nn.BatchNorm2d(4 * width),
+ activation,
+ nn.Conv2d(4 * width, 4 * width, 3, 1, 1, bias=False),
+ nn.BatchNorm2d(4 * width),
+ activation,
+ nn.Conv2d(4 * width, 8 * width, 3, 2, 1, bias=False),
+ nn.BatchNorm2d(8 * width),
+ activation,
+ )
+ self.fc = nn.Sequential(
+ nn.Linear(8 * width + context_dim, 8 * width, bias=False),
+ nn.BatchNorm1d(8 * width),
+ activation,
+ nn.Linear(8 * width, num_outputs),
+ )
+
+ def forward(self, x, y=None):
+ x = self.cnn(x)
+ x = x.mean(dim=(-2, -1)) # avg pool
+ if y is not None:
+ x = torch.cat([x, y], dim=-1)
+ return self.fc(x)
+
+
+class ArgMaxGumbelMax(Transform):
+ r"""ArgMax as Transform, but inv conditioned on logits"""
+
+ def __init__(self, logits, event_dim=0, cache_size=0):
+ super(ArgMaxGumbelMax, self).__init__(cache_size=cache_size)
+ self.logits = logits
+ self._event_dim = event_dim
+ self._categorical = pyro.distributions.torch.Categorical(
+ logits=self.logits
+ ).to_event(0)
+
+ @property
+ def event_dim(self):
+ return self._event_dim
+
+ def __call__(self, gumbels):
+ """
+ Computes the forward transform
+ """
+ assert self.logits != None, "Logits not defined."
+
+ if self._cache_size == 0:
+ return self._call(gumbels)
+
+ y = self._call(gumbels)
+ return y
+
+ def _call(self, gumbels):
+ """
+ Abstract method to compute forward transformation.
+ """
+ assert self.logits != None, "Logits not defined."
+ y = gumbels + self.logits
+ # print(f'y: {y}')
+ # print(f'logits: {self.logits}')
+ return y.argmax(-1, keepdim=True)
+
+ @property
+ def domain(self):
+ """ "
+ Domain of input(gumbel variables), Real
+ """
+ if self.event_dim == 0:
+ return constraints.real
+ return constraints.independent(constraints.real, self.event_dim)
+
+ @property
+ def codomain(self):
+ """ "
+ Domain of output(categorical variables), should be natural numbers, but set to Real for now
+ """
+ if self.event_dim == 0:
+ return constraints.real
+ return constraints.independent(constraints.real, self.event_dim)
+
+ def inv(self, k):
+ """Infer the gumbels noises given k and logits."""
+ assert self.logits != None, "Logits not defined."
+
+ uniforms = torch.rand(
+ self.logits.shape, dtype=self.logits.dtype, device=self.logits.device
+ )
+ gumbels = -((-(uniforms.log())).log())
+ # print(f'gumbels: {gumbels.size()}, {gumbels.dtype}')
+ # (batch_size, num_classes) mask to select kth class
+ # print(f'k : {k.size()}')
+ mask = F.one_hot(
+ k.squeeze(-1).to(torch.int64), num_classes=self.logits.shape[-1]
+ )
+ # print(f'mask: {mask.size()}, {mask.dtype}')
+ # (batch_size, 1) select topgumbel for truncation of other classes
+ topgumbel = (mask * gumbels).sum(dim=-1, keepdim=True) - (
+ mask * self.logits
+ ).sum(dim=-1, keepdim=True)
+ mask = 1 - mask # invert mask to select other != k classes
+ g = gumbels + self.logits
+ # (batch_size, num_classes)
+ epsilons = -torch.log(mask * torch.exp(-g) + torch.exp(-topgumbel)) - (
+ mask * self.logits
+ )
+ return epsilons
+
+ def log_abs_det_jacobian(self, x, y):
+ """We use the log_abs_det_jacobian to account for the categorical prob
+ x: Gumbels; y: argmax(x+logits)
+ P(y) = softmax
+ """
+ # print(f"logits: {torch.log(F.softmax(self.logits, dim=-1)).size()}")
+ # print(f'y: {y.size()} ')
+ # print(f"log_abs_det_jacobian: {self._categorical.log_prob(y.squeeze(-1)).unsqueeze(-1).size()}")
+ return -self._categorical.log_prob(y.squeeze(-1)).unsqueeze(-1)
+
+
+class ConditionalGumbelMax(ConditionalTransformModule):
+ r"""Given gumbels+logits, output the OneHot Categorical"""
+
+ def __init__(self, context_nn, event_dim=0, **kwargs):
+ # The logits_nn which predict the logits given ages:
+ super().__init__(**kwargs)
+ self.context_nn = context_nn
+ self.event_dim = event_dim
+
+ def condition(self, context):
+ """Given context (age), output the Categorical results"""
+ logits = self.context_nn(
+ context
+ ) # The logits for calculating argmax(Gumbel + logits)
+ return ArgMaxGumbelMax(logits)
+
+ def _logits(self, context):
+ """Return logits given context"""
+ return self.context_nn(context)
+
+ @property
+ def domain(self):
+ """ "
+ Domain of input(gumbel variables), Real
+ """
+ if self.event_dim == 0:
+ return constraints.real
+ return constraints.independent(constraints.real, self.event_dim)
+
+ @property
+ def codomain(self):
+ """ "
+ Domain of output(categorical variables), should be natural numbers, but set to Real for now
+ """
+ if self.event_dim == 0:
+ return constraints.real
+ return constraints.independent(constraints.real, self.event_dim)
+
+
+class TransformedDistributionGumbelMax(TransformedDistribution, TorchDistributionMixin):
+ r"""Define a TransformedDistribution class for Gumbel max"""
+ arg_constraints: Dict[str, constraints.Constraint] = {}
+
+ def log_prob(self, value):
+ """
+ We do not use the log_prob() of the base Gumbel distribution, because the likelihood for
+ each class for Gumbel Max sampling is determined by the logits.
+ """
+ # print("This happens")
+ if self._validate_args:
+ self._validate_sample(value)
+ event_dim = len(self.event_shape)
+ log_prob = 0.0
+ y = value
+ for transform in reversed(self.transforms):
+ x = transform.inv(y)
+ event_dim += transform.domain.event_dim - transform.codomain.event_dim
+ log_prob = log_prob - _sum_rightmost(
+ transform.log_abs_det_jacobian(x, y),
+ event_dim - transform.domain.event_dim,
+ )
+ y = x
+ # print(f"log_prob: {log_prob.size()}")
+ return log_prob
+
+
+class ConditionalTransformedDistributionGumbelMax(ConditionalTransformedDistribution):
+ def condition(self, context):
+ base_dist = self.base_dist.condition(context)
+ transforms = [t.condition(context) for t in self.transforms]
+ # return TransformedDistribution(base_dist, transforms)
+ return TransformedDistributionGumbelMax(base_dist, transforms)
+
+ def clear_cache(self):
+ pass
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000000000000000000000000000000000000..54a7c152434c36252381181eb5760009d522d7cd
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,10 @@
+gradio==3.27.0
+matplotlib==3.7.1
+networkx==2.8.4
+numpy==1.24.3
+pandas==1.5.3
+Pillow==9.3.0
+pyro_ppl==1.8.4
+scikit_image==0.20.0
+tqdm==4.65.0
+torchvision
diff --git a/vae.py b/vae.py
new file mode 100644
index 0000000000000000000000000000000000000000..d8c4ed2836b3ee3c4305217a68b14dea92e92d0f
--- /dev/null
+++ b/vae.py
@@ -0,0 +1,517 @@
+import numpy as np
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+import torch.distributions as dist
+
+EPS = -9 # minimum logscale
+
+
+@torch.jit.script
+def gaussian_kl(q_loc, q_logscale, p_loc, p_logscale):
+ return (
+ -0.5
+ + p_logscale
+ - q_logscale
+ + 0.5
+ * (q_logscale.exp().pow(2) + (q_loc - p_loc).pow(2))
+ / p_logscale.exp().pow(2)
+ )
+
+
+@torch.jit.script
+def sample_gaussian(loc, logscale):
+ return loc + logscale.exp() * torch.randn_like(loc)
+
+
+class Block(nn.Module):
+ def __init__(
+ self,
+ in_width,
+ bottleneck,
+ out_width,
+ kernel_size=3,
+ residual=True,
+ down_rate=None,
+ version=None,
+ ):
+ super().__init__()
+ self.d = down_rate
+ self.residual = residual
+ padding = 0 if kernel_size == 1 else 1
+
+ if version == "light": # for ukbb
+ activation = nn.ReLU()
+ self.conv = nn.Sequential(
+ activation,
+ nn.Conv2d(in_width, bottleneck, kernel_size, 1, padding),
+ activation,
+ nn.Conv2d(bottleneck, out_width, kernel_size, 1, padding),
+ )
+ else: # for morphomnist
+ activation = nn.GELU()
+ self.conv = nn.Sequential(
+ activation,
+ nn.Conv2d(in_width, bottleneck, 1, 1),
+ activation,
+ nn.Conv2d(bottleneck, bottleneck, kernel_size, 1, padding),
+ activation,
+ nn.Conv2d(bottleneck, bottleneck, kernel_size, 1, padding),
+ activation,
+ nn.Conv2d(bottleneck, out_width, 1, 1),
+ )
+
+ if self.residual and (self.d or in_width > out_width):
+ self.width_proj = nn.Conv2d(in_width, out_width, 1, 1)
+
+ def forward(self, x):
+ out = self.conv(x)
+ if self.residual:
+ if x.shape[1] != out.shape[1]:
+ x = self.width_proj(x)
+ out = x + out
+ if self.d:
+ if isinstance(self.d, float):
+ out = F.adaptive_avg_pool2d(out, int(out.shape[-1] / self.d))
+ else:
+ out = F.avg_pool2d(out, kernel_size=self.d, stride=self.d)
+ return out
+
+
+class Encoder(nn.Module):
+ def __init__(self, args):
+ super().__init__()
+ # parse architecture
+ stages = []
+ for i, stage in enumerate(args.enc_arch.split(",")):
+ start = stage.index("b") + 1
+ end = stage.index("d") if "d" in stage else None
+ n_blocks = int(stage[start:end])
+
+ if i == 0: # define network stem
+ if n_blocks == 0 and "d" not in stage:
+ print("Using stride=2 conv encoder stem.")
+ self.stem = nn.Conv2d(
+ args.input_channels,
+ args.widths[1],
+ kernel_size=7,
+ stride=2,
+ padding=3,
+ )
+ continue
+ else:
+ self.stem = nn.Conv2d(
+ args.input_channels,
+ args.widths[0],
+ kernel_size=7,
+ stride=1,
+ padding=3,
+ )
+
+ stages += [(args.widths[i], None) for _ in range(n_blocks)]
+ if "d" in stage: # downsampling block
+ stages += [(args.widths[i + 1], int(stage[stage.index("d") + 1]))]
+ blocks = []
+ for i, (width, d) in enumerate(stages):
+ prev_width = stages[max(0, i - 1)][0]
+ bottleneck = int(prev_width / args.bottleneck)
+ blocks.append(
+ Block(prev_width, bottleneck, width, down_rate=d, version=args.vr)
+ )
+ # scale weights of last conv layer in each block
+ for b in blocks:
+ b.conv[-1].weight.data *= np.sqrt(1 / len(blocks))
+ self.blocks = nn.ModuleList(blocks)
+
+ def forward(self, x):
+ x = self.stem(x)
+ acts = {}
+ for block in self.blocks:
+ x = block(x)
+ res = x.shape[2]
+ if res % 2 and res > 1: # pad if odd resolution
+ x = F.pad(x, [0, 1, 0, 1])
+ acts[x.size(-1)] = x
+ return acts
+
+
+class DecoderBlock(nn.Module):
+ def __init__(self, args, in_width, out_width, resolution):
+ super().__init__()
+ bottleneck = int(in_width / args.bottleneck)
+ self.res = resolution
+ self.stochastic = self.res <= args.z_max_res
+ self.z_dim = args.z_dim
+ self.cond_prior = args.cond_prior
+ k = 3 if self.res > 2 else 1
+
+ if self.cond_prior: # conditional prior
+ p_in_width = in_width + args.context_dim
+ else: # exogenous prior
+ p_in_width = in_width
+ # self.z_feat_proj = nn.Conv2d(self.z_dim + in_width, out_width, 1)
+ self.z_feat_proj = nn.Conv2d(self.z_dim + in_width, out_width, 1)
+
+ self.prior = Block(
+ p_in_width,
+ bottleneck,
+ 2 * self.z_dim + in_width,
+ kernel_size=k,
+ residual=False,
+ version=args.vr,
+ )
+ if self.stochastic:
+ self.posterior = Block(
+ 2 * in_width + args.context_dim,
+ bottleneck,
+ 2 * self.z_dim,
+ kernel_size=k,
+ residual=False,
+ version=args.vr,
+ )
+ self.z_proj = nn.Conv2d(self.z_dim + args.context_dim, in_width, 1)
+ self.conv = Block(
+ in_width, bottleneck, out_width, kernel_size=k, version=args.vr
+ )
+
+ def forward_prior(self, z, pa=None, t=None):
+ if self.cond_prior:
+ z = torch.cat([z, pa], dim=1)
+ z = self.prior(z)
+ p_loc = z[:, : self.z_dim, ...]
+ p_logscale = z[:, self.z_dim : 2 * self.z_dim, ...]
+ p_features = z[:, 2 * self.z_dim :, ...]
+ if t is not None:
+ p_logscale = p_logscale + torch.tensor(t).to(z.device).log()
+ return p_loc, p_logscale, p_features
+
+ def forward_posterior(self, z, pa, x, t=None):
+ h = torch.cat([z, pa, x], dim=1)
+ q_loc, q_logscale = self.posterior(h).chunk(2, dim=1)
+ if t is not None:
+ q_logscale = q_logscale + torch.tensor(t).to(z.device).log()
+ return q_loc, q_logscale
+
+
+class Decoder(nn.Module):
+ def __init__(self, args):
+ super().__init__()
+ # parse architecture
+ stages = []
+ for i, stage in enumerate(args.dec_arch.split(",")):
+ res = int(stage.split("b")[0])
+ n_blocks = int(stage[stage.index("b") + 1 :])
+ stages += [(res, args.widths[::-1][i]) for _ in range(n_blocks)]
+ self.blocks = []
+ for i, (res, width) in enumerate(stages):
+ next_width = stages[min(len(stages) - 1, i + 1)][1]
+ self.blocks.append(DecoderBlock(args, width, next_width, res))
+ self._scale_weights()
+ self.blocks = nn.ModuleList(self.blocks)
+ # bias params
+ self.all_res = list(np.unique([stages[i][0] for i in range(len(stages))]))
+ bias = []
+ for i, res in enumerate(self.all_res):
+ if res <= args.bias_max_res:
+ bias.append(
+ nn.Parameter(torch.zeros(1, args.widths[::-1][i], res, res))
+ )
+ self.bias = nn.ParameterList(bias)
+ self.cond_prior = args.cond_prior
+ self.is_drop_cond = True if "mnist" in args.hps else False # hacky
+
+ def _scale_weights(self):
+ scale = np.sqrt(1 / len(self.blocks))
+ for b in self.blocks:
+ b.z_proj.weight.data *= scale
+ b.conv.conv[-1].weight.data *= scale
+ b.prior.conv[-1].weight.data *= 0.0
+
+ def forward(self, parents, x=None, t=None, abduct=False, latents=[]):
+ # learnt params for each resolution r
+ bias = {r.shape[2]: r for r in self.bias}
+ h = bias[1].repeat(parents.shape[0], 1, 1, 1) # h_init
+ z = h # for exogenous prior
+ # for conditioning dropout, stochastic path (p1), deterministic path (p2)
+ p1, p2 = self.drop_cond() if (self.training and self.cond_prior) else (1, 1)
+
+ stats = []
+ for i, block in enumerate(self.blocks):
+ res = block.res # current block resolution, e.g. 64x64
+ pa = parents[..., :res, :res].clone() # select parents @ res
+
+ if (
+ self.is_drop_cond
+ ): # for morphomnist w/ conditioning dropout. Hacky, clean up later
+ pa_drop1 = pa.clone()
+ pa_drop1[:, 2:, ...] = pa_drop1[:, 2:, ...] * p1
+ pa_drop2 = pa.clone()
+ pa_drop2[:, 2:, ...] = pa_drop2[:, 2:, ...] * p2
+ else: # for ukbb
+ pa_drop1 = pa_drop2 = pa
+
+ if h.size(-1) < res: # upsample previous layer output
+ b = bias[res] if res in bias.keys() else 0 # broadcasting
+ h = b + F.interpolate(h, scale_factor=res / h.shape[-1])
+
+ if block.cond_prior: # conditional prior: p(z_i | z_ 0: # if std_init=0, random init weights for diag cov
+ nn.init.zeros_(self.x_logscale.weight)
+ nn.init.constant_(self.x_logscale.bias, np.log(args.std_init))
+
+ covariance = args.x_like.split("_")[0]
+ if covariance == "fixed":
+ self.x_logscale.weight.requires_grad = False
+ self.x_logscale.bias.requires_grad = False
+ elif covariance == "shared":
+ self.x_logscale.weight.requires_grad = False
+ self.x_logscale.bias.requires_grad = True
+ elif covariance == "diag":
+ self.x_logscale.weight.requires_grad = True
+ self.x_logscale.bias.requires_grad = True
+ else:
+ NotImplementedError(f"{args.x_like} not implemented.")
+
+ def forward(self, h, x=None, t=None):
+ loc, logscale = self.x_loc(h), self.x_logscale(h).clamp(min=EPS)
+
+ # for RGB inputs
+ # if hasattr(self, 'channel_coeffs'):
+ # coeff = torch.tanh(self.channel_coeffs(h))
+ # if x is None: # inference
+ # # loc = loc + logscale.exp() * torch.randn_like(loc) # random sampling
+ # f = lambda x: torch.clamp(x, min=-1, max=1)
+ # loc_red = f(loc[:,0,...])
+ # loc_green = f(loc[:,1,...] + coeff[:,0,...] * loc_red)
+ # loc_blue = f(loc[:,2,...] + coeff[:,1,...] * loc_red + coeff[:,2,...] * loc_green)
+ # else: # training
+ # loc_red = loc[:,0,...]
+ # loc_green = loc[:,1,...] + coeff[:,0,...] * x[:,0,...]
+ # loc_blue = loc[:,2,...] + coeff[:,1,...] * x[:,0,...] + coeff[:,2,...] * x[:,1,...]
+
+ # loc = torch.cat([loc_red.unsqueeze(1),
+ # loc_green.unsqueeze(1), loc_blue.unsqueeze(1)], dim=1)
+
+ if t is not None:
+ logscale = logscale + torch.tensor(t).to(h.device).log()
+ return loc, logscale
+
+ def approx_cdf(self, x):
+ return 0.5 * (
+ 1.0 + torch.tanh(np.sqrt(2.0 / np.pi) * (x + 0.044715 * torch.pow(x, 3)))
+ )
+
+ def nll(self, h, x):
+ loc, logscale = self.forward(h, x)
+ centered_x = x - loc
+ inv_stdv = torch.exp(-logscale)
+ plus_in = inv_stdv * (centered_x + 1.0 / 255.0)
+ cdf_plus = self.approx_cdf(plus_in)
+ min_in = inv_stdv * (centered_x - 1.0 / 255.0)
+ cdf_min = self.approx_cdf(min_in)
+ log_cdf_plus = torch.log(cdf_plus.clamp(min=1e-12))
+ log_one_minus_cdf_min = torch.log((1.0 - cdf_min).clamp(min=1e-12))
+ cdf_delta = cdf_plus - cdf_min
+ log_probs = torch.where(
+ x < -0.999,
+ log_cdf_plus,
+ torch.where(
+ x > 0.999, log_one_minus_cdf_min, torch.log(cdf_delta.clamp(min=1e-12))
+ ),
+ )
+ return -1.0 * log_probs.mean(dim=(1, 2, 3))
+
+ def sample(self, h, return_loc=True, t=None):
+ if return_loc:
+ x, logscale = self.forward(h)
+ else:
+ loc, logscale = self.forward(h, t)
+ x = loc + torch.exp(logscale) * torch.randn_like(loc)
+ x = torch.clamp(x, min=-1.0, max=1.0)
+ return x, logscale.exp()
+
+
+class HVAE(nn.Module):
+ def __init__(self, args):
+ super().__init__()
+ args.vr = "light" if "ukbb" in args.hps else None # hacky
+ self.encoder = Encoder(args)
+ self.decoder = Decoder(args)
+ if args.x_like.split("_")[1] == "dgauss":
+ self.likelihood = DGaussNet(args)
+ else:
+ NotImplementedError(f"{args.x_like} not implemented.")
+ self.cond_prior = args.cond_prior
+ self.free_bits = args.kl_free_bits
+
+ def forward(self, x, parents, beta=1):
+ acts = self.encoder(x)
+ h, stats = self.decoder(parents=parents, x=acts)
+ nll_pp = self.likelihood.nll(h, x)
+ if self.free_bits > 0:
+ free_bits = torch.tensor(self.free_bits).type_as(nll_pp)
+ kl_pp = 0.0
+ for stat in stats:
+ kl_pp += torch.maximum(
+ free_bits, stat["kl"].sum(dim=(2, 3)).mean(dim=0)
+ ).sum()
+ else:
+ kl_pp = torch.zeros_like(nll_pp)
+ for i, stat in enumerate(stats):
+ kl_pp += stat["kl"].sum(dim=(1, 2, 3))
+ kl_pp = kl_pp / np.prod(x.shape[1:]) # per pixel
+ elbo = nll_pp.mean() + beta * kl_pp.mean() # negative elbo (free energy)
+ return dict(elbo=elbo, nll=nll_pp.mean(), kl=kl_pp.mean())
+
+ def sample(self, parents, return_loc=True, t=None):
+ h, _ = self.decoder(parents=parents, t=t)
+ return self.likelihood.sample(h, return_loc, t=t)
+
+ def abduct(self, x, parents, cf_parents=None, alpha=0.5, t=None):
+ acts = self.encoder(x)
+ _, q_stats = self.decoder(
+ x=acts, parents=parents, abduct=True, t=t
+ ) # q(z|x,pa)
+ q_stats = [s["z"] for s in q_stats]
+
+ if self.cond_prior and cf_parents is not None:
+ _, p_stats = self.decoder(parents=cf_parents, abduct=True, t=t) # p(z|pa*)
+ p_stats = [s["z"] for s in p_stats]
+
+ cf_zs = []
+ t = torch.tensor(t).to(x.device) # z* sampling temperature
+
+ for i in range(len(q_stats)):
+ # from z_i ~ q(z_i | z_{