Posts: 503
Threads: 72
Joined: Nov 2023
Gender: Male
Ethnicity: Arab
(10-14-2024, 03:22 PM)Light Wrote: AT2 qpf4ratio is garbage
I know but some people only have at2
Posts: 761
Threads: 4
Joined: Sep 2023
10-14-2024, 05:27 PM
(This post was last modified: 10-14-2024, 05:38 PM by Kale.)
So ChatGPT and I just pushed each other to our limits...
I got it to turn the qpadm output...
Show Content
Spoiler
$weights
# A tibble: 2 x 5
target left weight se z
<chr> <chr> <dbl> <dbl> <dbl>
1 MA1.SG Sunghir.SG 0.772143 0.0556550 13.8737
2 MA1.SG Jomon.SG 0.227857 0.0556550 4.09410
$f4
# A tibble: 10 x 9
pop1 pop2 pop3 pop4 est se z p n
<chr> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
1 MA1.SG Sunghir.SG Congo_Mbuti.DG ZlatyKun.SG -0.000887207 0.000566748 -1.56544 1.17481e- 1 793084
2 MA1.SG Sunghir.SG Congo_Mbuti.DG Ust_Ishim.DG -0.000960180 0.000554089 -1.73290 8.31134e- 2 803769
3 MA1.SG Sunghir.SG Congo_Mbuti.DG BachoKiro_IUP -0.00106054 0.000441989 -2.39948 1.64184e- 2 775424
4 MA1.SG Sunghir.SG Congo_Mbuti.DG Andaman_100BP.SG -0.00206921 0.000533038 -3.88193 1.03631e- 4 796930
5 MA1.SG Sunghir.SG Congo_Mbuti.DG China_UP -0.00181189 0.000499062 -3.63058 2.82786e- 4 734010
6 MA1.SG Jomon.SG Congo_Mbuti.DG ZlatyKun.SG 0.0000730784 0.000627430 0.116473 9.07278e- 1 793069
7 MA1.SG Jomon.SG Congo_Mbuti.DG Ust_Ishim.DG -0.000250854 0.000625532 -0.401026 6.88401e- 1 803747
8 MA1.SG Jomon.SG Congo_Mbuti.DG BachoKiro_IUP 0.00134027 0.000488669 2.74270 6.09363e- 3 775406
9 MA1.SG Jomon.SG Congo_Mbuti.DG Andaman_100BP.SG 0.00520748 0.000582792 8.93541 4.05680e-19 796912
10 MA1.SG Jomon.SG Congo_Mbuti.DG China_UP 0.00528230 0.000540499 9.77300 1.47038e-22 733994
Into this...
# A tibble: 5 x 3
target fitted Fitted_z
<chr> <chr> <dbl>
1 MA1.SG MA1.SG fitted Congo_Mbuti.DG ZlatyKun.SG -1.18220
2 MA1.SG MA1.SG fitted Congo_Mbuti.DG Ust_Ishim.DG -1.42942
3 MA1.SG MA1.SG fitted Congo_Mbuti.DG BachoKiro_IUP -1.22780
4 MA1.SG MA1.SG fitted Congo_Mbuti.DG Andaman_100BP.SG -0.961409
5 MA1.SG MA1.SG fitted Congo_Mbuti.DG China_UP -0.576480
By just multiplying the actual f4 statistics in $f4 by the weights.
That would be sufficient, however here is the code I have to put in R to do that...
Show Content
Spoiler
weights <- tibble::tribble(
~target, ~left, ~weight, ~se, ~z,
'MA1.SG', 'Sunghir.SG', 0.772143, 0.0556550, 13.8737,
'MA1.SG', 'Jomon.SG', 0.227857, 0.0556550, 4.09410
)
f4 <- tibble::tribble(
~pop1, ~pop2, ~pop3, ~pop4, ~est, ~se, ~z, ~p, ~n,
'MA1.SG', 'Sunghir.SG', 'Congo_Mbuti.DG', 'ZlatyKun.SG', -0.000887207, 0.000566748, -1.56544, 1.17481e-1, 793084,
'MA1.SG', 'Sunghir.SG', 'Congo_Mbuti.DG', 'Ust_Ishim.DG', -0.000960180, 0.000554089, -1.73290, 8.31134e-2, 803769,
'MA1.SG', 'Sunghir.SG', 'Congo_Mbuti.DG', 'BachoKiro_IUP', -0.00106054, 0.000441989, -2.39948, 1.64184e-2, 775424,
'MA1.SG', 'Sunghir.SG', 'Congo_Mbuti.DG', 'Andaman_100BP.SG', -0.00206921, 0.000533038, -3.88193, 1.03631e-4, 796930,
'MA1.SG', 'Sunghir.SG', 'Congo_Mbuti.DG', 'China_UP', -0.00181189, 0.000499062, -3.63058, 2.82786e-4, 734010,
'MA1.SG', 'Jomon.SG', 'Congo_Mbuti.DG', 'ZlatyKun.SG', 0.0000730784, 0.000627430, 0.116473, 9.07278e-1, 793069,
'MA1.SG', 'Jomon.SG', 'Congo_Mbuti.DG', 'Ust_Ishim.DG', -0.000250854, 0.000625532, -0.401026, 6.88401e-1, 803747,
'MA1.SG', 'Jomon.SG', 'Congo_Mbuti.DG', 'BachoKiro_IUP', 0.00134027, 0.000488669, 2.74270, 6.09363e-3, 775406,
'MA1.SG', 'Jomon.SG', 'Congo_Mbuti.DG', 'Andaman_100BP.SG', 0.00520748, 0.000582792, 8.93541, 4.05680e-19, 796912,
'MA1.SG', 'Jomon.SG', 'Congo_Mbuti.DG', 'China_UP', 0.00528230, 0.000540499, 9.77300, 1.47038e-22, 733994
)
# Function to calculate fitted z-values
calculate_fitted_z <- function(weights, f4) {
# Initialize results tibble
results <- tibble(target = character(), fitted = character(), Fitted_z = numeric())
for (i in seq(1, 5)) {
left_weight <- weights$weight[1]
right_weight <- weights$weight[2]
left_z <- f4$z[i]
right_z <- f4$z[i + 5]
fitted_z <- (left_z * left_weight) + (right_z * right_weight)
results <- results %>%
add_row(
target = weights$target[1],
fitted = paste(weights$target[1], "fitted", f4$pop3[i], f4$pop4[i], sep = " "),
Fitted_z = fitted_z
)
}
return(results)
}
# Run the calculation
fitted_results <- calculate_fitted_z(weights, f4)
# Display results
print(fitted_results)
And it absolutely cannot wrap it's circuits around being told not to include the bolded (because it's going to change with every model) and instead reference it from qpadm's output.
If ChatGPT is correct, weights appears to be both a variable and a tibble? And it doesn't know how to resolve that.
Posts: 241
Threads: 6
Joined: Oct 2023
Works for me, call the function on the qpadm result, no need to make those weights and f4 variables: calculate_fitted_z(res$weights, res$f4)
library(dplyr) if it can't find tibble
Congrats ChatGPT (if it's actually what you were looking for)
Posts: 761
Threads: 4
Joined: Sep 2023
Hmm? I mean it works in that specific instance. But if I wanted to run a different model I'd have to change the bolded parts in the second spoiler manually?
Unless you figured out something I didn't?
Posts: 241
Threads: 6
Joined: Oct 2023
The bolded parts are the qpadm output.
You just do
res = qpadm(...)
calculate_fitted_z(res$weights, res$f4)
Posts: 503
Threads: 72
Joined: Nov 2023
Gender: Male
Ethnicity: Arab
(10-14-2024, 07:08 PM)Kale Wrote: Hmm? I mean it works in that specific instance. But if I wanted to run a different model I'd have to change the bolded parts in the second spoiler manually?
Unless you figured out something I didn't?
Just out of curiosity why don’t you run admixtools1 I’ve seen some atrocious differences in the two
Posts: 761
Threads: 4
Joined: Sep 2023
10-15-2024, 02:31 AM
(This post was last modified: 10-15-2024, 03:37 AM by Kale.)
(10-14-2024, 07:35 PM)kolompar Wrote: The bolded parts are the qpadm output.
You just do
res = qpadm(...)
calculate_fitted_z(res$weights, res$f4)
No the first spoiler is the qpadm output. The bolded parts in the 2nd spoiler are how chatGPT wanted to reformat the qpadm output.
The hurdle is what commands can convert the qpadm output into the bolded parts, so that the rest of chatGPT gobbledegook can do it's thing.
EDIT: Noticed that after upgrading to Admixtools 2.07, that something broke in qpgraph, involving a function/variable named 'names'?
That happens either updating all dependencies or just the necessary ones.
Posts: 241
Threads: 6
Joined: Oct 2023
You don't need to convert, that's the same thing, just a way to create a tibble. You just call the function on the qpadm output as I said.
For names you need to update your R.
Posts: 761
Threads: 4
Joined: Sep 2023
So what exactly are the commands you are running where it is working for you?
Posts: 146
Threads: 3
Joined: Oct 2023
(10-15-2024, 04:51 PM)Kale Wrote: So what exactly are the commands you are running where it is working for you?
Note that I modified the above function to add parameters the number of left and right populations for it to work with any numbers as the original worked only for 2 left and 6 right
-Step1: Once you open R, paste the following that's in between the pounds(#) only once:
#######
library(dplyr)
calculate_fitted_z <- function(weights, f4, nleft, nright) {
# Initialize results tibble
results <- tibble(target = character(), fitted = character(), Fitted_z = numeric())
for (i in seq(1, nright - 1)) {
tot_fitted_z = 0
for (j in seq(1, nleft)) {
result_weight <- weights$weight[j]
result_z <- f4$z[i + (j - 1) * (nright - 1)]
fitted_z <- result_z * result_weight
tot_fitted_z <- tot_fitted_z + fitted_z
}
results <- results %>%
add_row(
target = weights$target[1],
fitted = paste(weights$target[1], "fitted", f4$pop3[i], f4$pop4[i], sep = " "),
Fitted_z = tot_fitted_z
)
}
return(results)
}
#######
-Step2: run qpadm
qpadm_result = qpadm(data, left, right, target, allsnps=TRUE)
-step3: get your fitted z! (I put 3 left pop in my example and 9 right pops, BUT CHANGE IT AS NEEDED)
calculate_fitted_z(qpadm_result$weights, qpadm_result$f4, 3, 9)
Posts: 761
Threads: 4
Joined: Sep 2023
Sweeeeetttt!
Posts: 241
Threads: 6
Joined: Oct 2023
Yes, I noticed now what's the problem and decided to also try ChatGPT to fix it. You can get the needed numbers from nrow(weights) and nrow(f4)/nrow(weights), and that way you wouldn't need to pass those as parameters.
This was my result but I had to correct it several times, try if it also works.
Code: calculate_fitted_z <- function(weights, f4) {
# Initialize results tibble
results <- tibble(target = character(), fitted = character(), Fitted_z = numeric())
n_weights <- nrow(weights)
n_f4 <- nrow(f4)
# Ensure f4 has n * k rows (where k is the number of groups)
if (n_f4 %% n_weights != 0) {
stop("The number of f4 rows must be a multiple of the number of weights.")
}
# Calculate the number of groups (k)
k <- n_f4 / n_weights
for (j in seq(1, k)) { # Loop over each group
# Initialize fitted_z for the current group
fitted_z <- 0
for (i in seq(1, n_weights)) { # Loop over each weight
z_index <- i + (j - 1) * n_weights # Adjust index for each weight and group
weight <- weights$weight[i]
z <- f4$z[z_index]
fitted_z <- fitted_z + (z * weight)
}
results <- results %>%
add_row(
target = weights$target[1], # Assuming all share the same target for the group
fitted = paste(weights$target[1], "fitted", f4$pop3[j], f4$pop4[j], sep = " "),
Fitted_z = fitted_z
)
}
return(results)
}
Posts: 761
Threads: 4
Joined: Sep 2023
10-16-2024, 03:17 PM
(This post was last modified: 10-16-2024, 03:45 PM by Kale.)
I think this might be a bug with admixtools2, but maybe someone else understands the technicalities better than me...
Here's a qpadm model...
right = c('Congo_Mbuti.DG', 'ZlatyKun.SG', 'Ust_Ishim.DG', 'BachoKiro_IUP', 'China_UP', 'Andaman_100BP.SG', 'RUS_Primorsky_DevilsCave_N.SG', 'Kostenki14', 'Sunghir.SG', 'Muierii1', 'Gravettian_KremsVestonice', 'GoyetQ116_1', 'Gravettian_France_Fournol', 'BachoKiro_BK1653', 'Yana_UP.SG', 'MA1.SG', 'Peru_RioUncallane_1800BP.SG', 'Kotias_UP.SG', 'Anatolia_Epipaleolithic', 'CHG.SG', 'Iran_Wezmeh_N.SG')
allsnps=TRUE
RUS_Vologda_Minino_HG
Italy_AreneCandide_HG 0.324782 0.0281531 11.5363
AG3 0.478162 0.0206777 23.1246
RUS_Yakutia_KolymaRiver_Meso.SG 0.0261529 0.0135680 1.92754
Anatolia_Boncuklu_N 0.170903 0.0235679 7.25152
Tail: 0.20
And now because it's fun, residuals!
Show Content
Spoiler
1 RUS_Vologda_Minino_HG RUS_Vologda_Minino_HG fitted Congo_Mbuti.DG ZlatyKun.SG -0.892755
2 RUS_Vologda_Minino_HG RUS_Vologda_Minino_HG fitted Congo_Mbuti.DG Ust_Ishim.DG 0.113432
3 RUS_Vologda_Minino_HG RUS_Vologda_Minino_HG fitted Congo_Mbuti.DG BachoKiro_IUP -0.118080
4 RUS_Vologda_Minino_HG RUS_Vologda_Minino_HG fitted Congo_Mbuti.DG China_UP -1.14658
5 RUS_Vologda_Minino_HG RUS_Vologda_Minino_HG fitted Congo_Mbuti.DG Andaman_100BP.SG -1.28636
6 RUS_Vologda_Minino_HG RUS_Vologda_Minino_HG fitted Congo_Mbuti.DG RUS_Primorsky_DevilsCave_N.SG -1.17061
7 RUS_Vologda_Minino_HG RUS_Vologda_Minino_HG fitted Congo_Mbuti.DG Kostenki14 -1.35244
8 RUS_Vologda_Minino_HG RUS_Vologda_Minino_HG fitted Congo_Mbuti.DG Sunghir.SG -0.879313
9 RUS_Vologda_Minino_HG RUS_Vologda_Minino_HG fitted Congo_Mbuti.DG Muierii1 -0.672348
10 RUS_Vologda_Minino_HG RUS_Vologda_Minino_HG fitted Congo_Mbuti.DG Gravettian_KremsVestonice -0.669164
11 RUS_Vologda_Minino_HG RUS_Vologda_Minino_HG fitted Congo_Mbuti.DG GoyetQ116_1 -1.24854
12 RUS_Vologda_Minino_HG RUS_Vologda_Minino_HG fitted Congo_Mbuti.DG Gravettian_France_Fournol -0.148874
13 RUS_Vologda_Minino_HG RUS_Vologda_Minino_HG fitted Congo_Mbuti.DG BachoKiro_BK1653 0.168853
14 RUS_Vologda_Minino_HG RUS_Vologda_Minino_HG fitted Congo_Mbuti.DG Yana_UP.SG -1.05410
15 RUS_Vologda_Minino_HG RUS_Vologda_Minino_HG fitted Congo_Mbuti.DG MA1.SG -2.52939
16 RUS_Vologda_Minino_HG RUS_Vologda_Minino_HG fitted Congo_Mbuti.DG Peru_RioUncallane_1800BP.SG -2.04457
17 RUS_Vologda_Minino_HG RUS_Vologda_Minino_HG fitted Congo_Mbuti.DG Kotias_UP.SG -0.0330296
18 RUS_Vologda_Minino_HG RUS_Vologda_Minino_HG fitted Congo_Mbuti.DG Anatolia_Epipaleolithic 0.290903
19 RUS_Vologda_Minino_HG RUS_Vologda_Minino_HG fitted Congo_Mbuti.DG CHG.SG -1.68810
20 RUS_Vologda_Minino_HG RUS_Vologda_Minino_HG fitted Congo_Mbuti.DG Iran_Wezmeh_N.SG 0.747225
From observation, AG3 has a bit of damage/artifacts which make it universally less related to everybody, and as can be seen from the residuals, that gives EHG pretty much a universal slight underfit to the right pops.
So what happens if I throw in Mota as an additional source (expecting it to come back as a small negative percentage) to 'counteract' the damage?
RUS_Vologda_Minino_HG
Italy_AreneCandide_HG 0.322127 0.0283130 11.3773
AG3 0.477256 0.0205856 23.1840
RUS_Yakutia_KolymaRiver_Meso.SG 0.0298457 0.0139813 2.13468
Anatolia_Boncuklu_N 0.180140 0.0247575 7.27620
Ethiopia_Mota_4500BP.SG -0.00936885 0.00600763 -1.55949
It takes -0.9%, kind of what I thought, and the residuals as a whole have greatly improved.
Show Content
Spoiler
1 RUS_Vologda_Minino_HG RUS_Vologda_Minino_HG fitted Congo_Mbuti.DG ZlatyKun.SG -0.456963
2 RUS_Vologda_Minino_HG RUS_Vologda_Minino_HG fitted Congo_Mbuti.DG Ust_Ishim.DG 0.581169
3 RUS_Vologda_Minino_HG RUS_Vologda_Minino_HG fitted Congo_Mbuti.DG BachoKiro_IUP 0.419306
4 RUS_Vologda_Minino_HG RUS_Vologda_Minino_HG fitted Congo_Mbuti.DG China_UP -0.607950
5 RUS_Vologda_Minino_HG RUS_Vologda_Minino_HG fitted Congo_Mbuti.DG Andaman_100BP.SG -0.801151
6 RUS_Vologda_Minino_HG RUS_Vologda_Minino_HG fitted Congo_Mbuti.DG RUS_Primorsky_DevilsCave_N.SG -0.519964
7 RUS_Vologda_Minino_HG RUS_Vologda_Minino_HG fitted Congo_Mbuti.DG Kostenki14 -0.867894
8 RUS_Vologda_Minino_HG RUS_Vologda_Minino_HG fitted Congo_Mbuti.DG Sunghir.SG -0.320853
9 RUS_Vologda_Minino_HG RUS_Vologda_Minino_HG fitted Congo_Mbuti.DG Muierii1 -0.154573
10 RUS_Vologda_Minino_HG RUS_Vologda_Minino_HG fitted Congo_Mbuti.DG Gravettian_KremsVestonice -0.0989740
11 RUS_Vologda_Minino_HG RUS_Vologda_Minino_HG fitted Congo_Mbuti.DG GoyetQ116_1 -0.800676
12 RUS_Vologda_Minino_HG RUS_Vologda_Minino_HG fitted Congo_Mbuti.DG Gravettian_France_Fournol 0.306085
13 RUS_Vologda_Minino_HG RUS_Vologda_Minino_HG fitted Congo_Mbuti.DG BachoKiro_BK1653 0.663136
14 RUS_Vologda_Minino_HG RUS_Vologda_Minino_HG fitted Congo_Mbuti.DG Yana_UP.SG -0.509841
15 RUS_Vologda_Minino_HG RUS_Vologda_Minino_HG fitted Congo_Mbuti.DG MA1.SG -2.09734
16 RUS_Vologda_Minino_HG RUS_Vologda_Minino_HG fitted Congo_Mbuti.DG Peru_RioUncallane_1800BP.SG -1.47154
17 RUS_Vologda_Minino_HG RUS_Vologda_Minino_HG fitted Congo_Mbuti.DG Kotias_UP.SG 0.507713
18 RUS_Vologda_Minino_HG RUS_Vologda_Minino_HG fitted Congo_Mbuti.DG Anatolia_Epipaleolithic 1.01917
19 RUS_Vologda_Minino_HG RUS_Vologda_Minino_HG fitted Congo_Mbuti.DG CHG.SG -1.05012
20 RUS_Vologda_Minino_HG RUS_Vologda_Minino_HG fitted Congo_Mbuti.DG Iran_Wezmeh_N.SG 1.31895
But the tail prob is now... 3e-10!?
It seems to be a problem specifically relating to African/deep populations. No negative coefficients here, residuals are great, tail prob is garbage.
Morocco_SKH001_MN.SG
Israel_Pekiin_CA 0.561492 0.0504498 11.1297
Ethiopia_Mota_4500BP.SG 0.0576846 0.00868432 6.64239
Morocco_OUB002_Epipaleolithic.SG 0.0510571 0.0203990 2.50292
Morocco_KTG005_EN.SG 0.329766 0.0656861 5.02034
Tail: 6e-7
right = c('Congo_Mbuti.DG', 'Kenya_Naivasha_PastoralN', 'Levant_N', 'Anatolia_Barcin_N.SG', 'Anatolia_Boncuklu_N.SG', 'Iran_TepeAbdulHosein_N.SG', 'Iran_Wezmeh_N.SG', 'CHG.SG', 'Taforalt', 'Italy_GrottaContinenza_HG.SG', 'Sweden_StoraForvar_HG.SG', 'RUS_Arkhangelsk_HG.SG', 'Botai.SG', 'Andaman_100BP.SG', 'RUS_Primorsky_DevilsCave_N.SG', 'Peru_RioUncallane_1800BP.SG')
allsnps=TRUE
Residuals...
Show Content
Spoiler
1 Morocco_SKH001_MN.SG Morocco_SKH001_MN.SG fitted Congo_Mbuti.DG Kenya_Naivasha_PastoralN 0.0345636
2 Morocco_SKH001_MN.SG Morocco_SKH001_MN.SG fitted Congo_Mbuti.DG Levant_N 1.68901
3 Morocco_SKH001_MN.SG Morocco_SKH001_MN.SG fitted Congo_Mbuti.DG Anatolia_Barcin_N.SG 0.383352
4 Morocco_SKH001_MN.SG Morocco_SKH001_MN.SG fitted Congo_Mbuti.DG Anatolia_Boncuklu_N.SG 1.68505
5 Morocco_SKH001_MN.SG Morocco_SKH001_MN.SG fitted Congo_Mbuti.DG Iran_TepeAbdulHosein_N.SG 1.25853
6 Morocco_SKH001_MN.SG Morocco_SKH001_MN.SG fitted Congo_Mbuti.DG Iran_Wezmeh_N.SG 1.34165
7 Morocco_SKH001_MN.SG Morocco_SKH001_MN.SG fitted Congo_Mbuti.DG CHG.SG 1.10741
8 Morocco_SKH001_MN.SG Morocco_SKH001_MN.SG fitted Congo_Mbuti.DG Taforalt -1.17927
9 Morocco_SKH001_MN.SG Morocco_SKH001_MN.SG fitted Congo_Mbuti.DG Italy_GrottaContinenza_HG.SG 0.361059
10 Morocco_SKH001_MN.SG Morocco_SKH001_MN.SG fitted Congo_Mbuti.DG Sweden_StoraForvar_HG.SG -0.414488
11 Morocco_SKH001_MN.SG Morocco_SKH001_MN.SG fitted Congo_Mbuti.DG RUS_Arkhangelsk_HG.SG 0.194894
12 Morocco_SKH001_MN.SG Morocco_SKH001_MN.SG fitted Congo_Mbuti.DG Botai.SG 0.00455099
13 Morocco_SKH001_MN.SG Morocco_SKH001_MN.SG fitted Congo_Mbuti.DG Andaman_100BP.SG 1.12874
14 Morocco_SKH001_MN.SG Morocco_SKH001_MN.SG fitted Congo_Mbuti.DG RUS_Primorsky_DevilsCave_N.SG -0.691050
15 Morocco_SKH001_MN.SG Morocco_SKH001_MN.SG fitted Congo_Mbuti.DG Peru_RioUncallane_1800BP.SG -0.493771
Ran again with SouthAfrica_2000BP.SG, Neanderthal_Altai.DG, and Chimp.REF as the first right pops, same deal.
Posts: 503
Threads: 72
Joined: Nov 2023
Gender: Male
Ethnicity: Arab
(07-25-2024, 06:44 PM)masta Wrote: admixtools 2 is trash and gives false results i advice any user to use the original admixtools
I wouldn’t suggest it for Neolithic modelling but anything else it seems fine and matches up from what I can see.
The only differences I had was running Neolithic models on both they were wildly different, when I ran iron model or a modern model it was similar
Personally I don’t do Neolithic modelling so it doesn’t effect me
Posts: 863
Threads: 48
Joined: Aug 2023
Gender: Male
Ethnicity: Colonial American
Nationality: American
Y-DNA (P): R1b-U152 >R-FTA96415
Y-DNA (M): I2-P37 > I-BY77146
mtDNA (M): J1b1a1a
mtDNA (P): H66a
v2.0.8 released two days ago
|