diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index d31e644..c4f6b46 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -23,7 +23,7 @@ jobs: fail-fast: false matrix: version: - - '1.2' + - '1' os: - ubuntu-latest - macOS-latest @@ -40,7 +40,7 @@ jobs: - uses: julia-actions/julia-buildpkg@v1 - uses: julia-actions/julia-runtest@v1 - uses: julia-actions/julia-processcoverage@v1 - - uses: codecov/codecov-action@v4 + - uses: codecov/codecov-action@v5 with: files: lcov.info token: ${{ secrets.CODECOV_TOKEN }} @@ -54,6 +54,8 @@ jobs: statuses: write steps: - uses: actions/checkout@v4 + - uses: r-lib/actions/setup-r@v2 + - run: echo "LD_LIBRARY_PATH=$(R RHOME)/lib:$LD_LIBRARY_PATH" >> $GITHUB_ENV - uses: julia-actions/setup-julia@v2 with: version: '1' @@ -74,5 +76,5 @@ jobs: run: | using Documenter: DocMeta, doctest using PhyloTraits - DocMeta.setdocmeta!(PhyloTraits, :DocTestSetup, :(using PhyloTraits); recursive=true) + DocMeta.setdocmeta!(PhyloTraits, :DocTestSetup, :(using PhyloTraits; using PhyloNetworks); recursive=true) doctest(PhyloTraits) diff --git a/CITATION.bib b/CITATION.bib index 5926b38..7b74b1c 100644 --- a/CITATION.bib +++ b/CITATION.bib @@ -30,11 +30,13 @@ @article{2020Karimi_baobab_discretetraitevolution doi = {10.1093/sysbio/syz073}, } % paper on continuous traits with intraspecific variation -@article{2022Teo_intraspeciesvariation, +@article{2023Teo_intraspeciesvariation, author = {Teo, Benjamin and Rose, Jeffrey P. and Bastide, Paul and An{\'e}, C{\'e}cile}, title = {Accounting for intraspecific variation in continuous trait evolution on a reticulate phylogeny}, - journal = {bioRxiv}, - year = {2022}, - doi = {10.1101/2022.05.12.490814}, - publisher = {Cold Spring Harbor Laboratory}, + journal = {Bulletin of the Society of Systematic Biologists}, + year = {2023}, + volume = {2}, + number = {3}, + pages = {1-29}, + doi = {10.18061/bssb.v2i3.8977}, } diff --git a/Project.toml b/Project.toml index a8b7f7b..ec45a75 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,43 @@ name = "PhyloTraits" uuid = "bce24f4f-6725-4ba4-a77f-2b043c8e33c5" authors = ["Cecile Ane ", "Paul Bastide ", "and contributors"] -version = "0.1.0-DEV" +version = "1.0.0" + +[deps] +BioSequences = "7e6ae17a-c86d-528c-b3b9-7f778a29fe59" +BioSymbols = "3c28c6f8-a34d-59c4-9654-267d177fcfa9" +DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" +Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f" +FASTX = "c2308a5c-f048-11e8-3e8a-31650f418d12" +GLM = "38e38edf-8417-5370-95a0-9cbb8c7f171a" +LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +NLopt = "76087f3c-5699-56af-9a33-bf431cd00edd" +PhyloNetworks = "33ad39ac-ed31-50eb-9b15-43d0656eaa72" +Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7" +Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" +StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" +Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" +StatsAPI = "82ae8749-77ed-4fe6-ae5f-f523153014b0" +StatsBase = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" +StatsFuns = "4c63d2b9-4356-54db-8cca-17b64c39e42c" +StatsModels = "3eaba693-59b7-5ba5-a881-562e759f1c8d" [compat] +BioSequences = "2, 3" +BioSymbols = "4, 5" +DataFrames = "1.3" +Distributions = "0.15, 0.16, 0.17, 0.18, 0.19, 0.20, 0.21, 0.22, 0.23, 0.24, 0.25" +FASTX = "1.1, 2" +GLM = "1.1" +LinearAlgebra = "1" +NLopt = "0.5.1, 0.6, 1" +PhyloNetworks = "1" +Printf = "1" +Random = "1" +StaticArrays = "0.8.3, 0.9, 0.10, 0.11, 0.12, 1" +Statistics = "1" +StatsAPI = "1.5" +StatsBase = "0.26, 0.27, 0.28, 0.29, 0.30, 0.31, 0.32, 0.33, 0.34" +StatsFuns = "0.7, 0.8, 0.9, 1" +StatsModels = "0.6, 0.7" julia = "1.2" diff --git a/README.md b/README.md index 9f3be4d..4ad7eb5 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# PhyloTraits +# PhyloTraits: trait evolution along phylogenies [![Stable](https://img.shields.io/badge/docs-stable-blue.svg)](https://JuliaPhylo.github.io/PhyloTraits.jl/stable/) [![Dev](https://img.shields.io/badge/docs-dev-blue.svg)](https://JuliaPhylo.github.io/PhyloTraits.jl/dev/) @@ -13,11 +13,39 @@ a phylogeny, including phylogenetic networks. It depends on utilities from [PhyloNetworks](https://github.com/JuliaPhylo/PhyloNetworks.jl). +## Citing + +See [`CITATION.bib`](CITATION.bib) for the relevant reference(s). +Below is a short list. + +For continuous traits, analyses based on the Brownian motion process, +with or without transgressive evolution after reticulations: + +- Bastide, Solís-Lemus, Kriebel, Sparks, Ané (2018). + Phylogenetic Comparative Methods for Phylogenetic Networks with Reticulations. + Systematic Biology, 67(5):800–820. + [doi:10.1093/sysbio/syy033](https://doi.org/10.1093/sysbio/syy033). + SI on [dryad](http://dx.doi.org/10.5061/dryad.nt2g6) + including a tutorial for trait evolution + and a tutorial for network calibration. + +Continuous traits, accounting for within-species variation: + +- Benjamin Teo, Jeffrey P. Rose, Paul Bastide & Cécile Ané (2023). + Accounting for intraspecific variation in continuous trait evolution + on a reticulate phylogeny. + Bulletin of the Society of Systematic Biologists, 2(3):1-29. + doi: [10.18061/bssb.v2i3.8977](https://doi.org/10.18061/bssb.v2i3.8977) + +For a discrete trait (influence of gene flow on the trait, +ancestral state reconstruction, rates): + +- Karimi, Grover, Gallagher, Wendel, Ané & Baum (2020). Reticulate evolution + helps explain apparent homoplasy in floral biology and pollination in baobabs + (*Adansonia*; Bombacoideae; Malvaceae). + Systematic Biology, + 69(3):462-478. doi: [10.1093/sysbio/syz073](https://academic.oup.com/sysbio/advance-article/doi/10.1093/sysbio/syz073/5613901?guestAccessKey=a32e7dd3-27fd-4a13-b171-7ff5d6da0e01). > [!NOTE] > Much of this package was formerly part of PhyloNetworks v0.16.4 (and prior). > PhyloNetworks v0.17 will be stripped of functions for trait evolution. - -## Citing - -See [`CITATION.bib`](CITATION.bib) for the relevant reference(s). diff --git a/docs/Project.toml b/docs/Project.toml index 40f31ba..442be2f 100644 --- a/docs/Project.toml +++ b/docs/Project.toml @@ -1,3 +1,16 @@ [deps] +BioSequences = "7e6ae17a-c86d-528c-b3b9-7f778a29fe59" +BioSymbols = "3c28c6f8-a34d-59c4-9654-267d177fcfa9" +CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" +DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" Documenter = "e30172f5-a6a5-5a46-863b-614d45cd2de4" +DocumenterInterLinks = "d12716ef-a0f6-4df4-a9f1-a5a34e75c656" +GLM = "38e38edf-8417-5370-95a0-9cbb8c7f171a" +PhyloNetworks = "33ad39ac-ed31-50eb-9b15-43d0656eaa72" +PhyloPlots = "c0d5b6db-e3fc-52bc-a87d-1d050989ed3b" PhyloTraits = "bce24f4f-6725-4ba4-a77f-2b043c8e33c5" +RCall = "6f49c342-dc21-5d91-9882-a32aef131414" +StableRNGs = "860ef19b-820b-49d6-a774-d7a799459cd3" +StatsAPI = "82ae8749-77ed-4fe6-ae5f-f523153014b0" +StatsBase = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" +StatsModels = "3eaba693-59b7-5ba5-a881-562e759f1c8d" diff --git a/docs/make.jl b/docs/make.jl index 632f393..8e0ef80 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -1,23 +1,50 @@ using PhyloTraits using Documenter -DocMeta.setdocmeta!(PhyloTraits, :DocTestSetup, :(using PhyloTraits); recursive=true) +# Interlink with PhyloNetworks +using DocumenterInterLinks +links = InterLinks( + "PhyloNetworks" => "https://juliaphylo.github.io/PhyloNetworks.jl/stable/objects.inv" +) + +# NOTE: default loading of PhyloNetworks in all docstring examples +DocMeta.setdocmeta!( + PhyloTraits, + :DocTestSetup, + :(using PhyloNetworks; using PhyloTraits); + recursive=true) makedocs(; modules=[PhyloTraits], authors="Cecile Ane , Paul Bastide , and contributors", sitename="PhyloTraits.jl", format=Documenter.HTML(; + prettyurls = get(ENV, "CI", nothing) == "true", # easier local build + size_threshold = 600 * 2^10, + size_threshold_warn = 500 * 2^10, # 600 KiB canonical="https://JuliaPhylo.github.io/PhyloTraits.jl", edit_link="main", assets=String[], ), pages=[ "Home" => "index.md", + "Manual" => [ + "Continuous trait analysis" => "man/phyloregression.md", + "Continuous trait simulation" => "man/simulate_continuous.md", + "Discrete trait analysis" => "man/fitDiscrete.md", + "DNA evolutionary models" => "man/fitdiscreteDNA.md", + "Discrete trait simulation" => "man/simulate_discrete.md", + ], + "Library" => [ + "public" => "lib/public.md", + "internals" => "lib/internal.md", + ] ], + plugins=[links], ) deploydocs(; repo="github.com/JuliaPhylo/PhyloTraits.jl", devbranch="main", + push_preview = true, ) diff --git a/docs/readme.md b/docs/readme.md new file mode 100644 index 0000000..bcb8dee --- /dev/null +++ b/docs/readme.md @@ -0,0 +1,150 @@ +# notes to maintain documentation + +- built with [Documenter](https://documenter.juliadocs.org/stable/). +- deployed [here](https://juliaphylo.github.io/PhyloTraits.jl/) + using GitHub and files committed to the `gh-pages` branch: + go to `dev/`, or manually type the url to preview the docs from a pull request: + [https://juliaphylo.github.io/PhyloTraits.jl/previews/PR#/] with `#` replaced + by the pull request number. + +## quick start: create a local version of the website + +generally: to see deprecation warnings, add the option `--depwarn=yes`. +go into the `docs/` folder, load the project environment, then run `make.jl`: + +```shell +cd docs +julia --project -e 'using Pkg; Pkg.instantiate(); Pkg.develop(PackageSpec(path=dirname(pwd())))' +julia --project --color=yes make.jl +``` + +or interactively in `docs/`, if needing to have finer control of loaded dependencies: + +```shell +pkg> activate . +pkg> status # just to check +pkg> status --manifest +pkg> instantiate # after deleting Manifest.toml +# do what you need to do to update dependencies / dev packages +julia> include("make.jl") +``` + +or, after project & manifest setup, from the main repo instead of `docs/`: +```shell +julia --project=docs/ --color=yes docs/make.jl +``` + +it will: +- test the `jldoctest` blocks of examples in the docstrings +- create or update a `build/` directory with html files. + +To see the result, just open `docs/build/index.html` in a browser and follow the links. + +## how it works: overview + +- The `docs` job (named "Documentation") of `.github/workflows/CI.yml` + * installs R, installs Julia + * runs Julia commands that asks to start the doc project, which will trigger + the installation of dependencies listed in `docs/Project.toml`, + * then run `doctest(PhyloTraits)`, which will call `./docs/make.jl`. +- the julia script `docs/make.jl` includes these steps: + 1. run `makedocs()` to create the documentation website. + also runs all `jldoctest` blocks in the source files, to check that + the output in the blocks matches the actual output. + This steps also translate the "Documenter md" documentation files + into html files. + 2. run `deploydocs(...)` also from Documenter: + to push the files on github, gh-pages branch. + +for now, docstrings are automatically used to build an entry for +- each internal thing that has a docstring (e.g. not exported in `src/PhyloTraits.jl`) +- each public thing. + +## The "Documenter md" format + +The documentation pages are all written in this format. It is a regular md, but +with extra blocks of codes (as `@example` and `@setup`) that contain Julia +commands. These lines will be executed during the `makedoc()` process. See the +`Documenter` [doc](https://juliadocs.github.io/Documenter.jl/stable/man/syntax/) +for more details on the syntax. For instance, @example blocks with the same "name" +are run in the same session. Otherwise, an @example blocks with no name +is run in its own anonymous Module. + +## documentation figures & plots + +Some of these blocks may contain plots, which are going to be drawn during the +process, requiring the use of `PhyloPlots` along with `RCall`. Hence, +before the doc is built, `.github/workflows/ci.yml` installs `R` on the server, +sets up the julia environment with dependencies like `PhyloPlots` before +starting the build in itself. + +### directory to save figures + +We chose to group all the output plots in the directory `assets/figures`. +Hence, the typical setup in a documentation page containing plots is: + + ```@setup name + using PhyloPlots, RCall + mkpath("../assets/figures") + figname(x) = joinpath("..", "assets", "figures", x) # hide + ``` + +The `mkpath` command is there to ensure that the target directory does indeed +exist. In theory, it only needs to be called once (by the first documentation +page being built). However, as this order might be subject to change over time, +it could be safer to include it on every such page. + +### figure format + +After trial and error and discussions, we chose to use only the *SVG* format +for plots. This format should ensure that when a plot is drawn again, +identical, in a new build, then Git will recognize that it has not changed, and +hence not save a new version of it. This should ensure that the repository does +not grow unreasonably at each build of the doc, i.e. after each push to +master. The typical commands to save and display a plot should hence be: + + ```@example name + R"svg"(figname("my_useful_name.svg"), width=4, height=4) # hide + plot(net); + R"dev.off()" # hide + nothing # hide + ``` + ![my_useful_name](../assets/figures/my_useful_name.svg) + +**Warning**: this is not like an interactive session. If the same file name +is re-used by some other documentation page for some other plot, only the +final version of the plot will be committed by git, with possible unintended +consequences. Make sure to use different file names for plots that are supposed +to look different (across the whole site). + +## references + +big difference: + + [blabla](@ref) + [`blabla`](@ref) + +The first version will look for a *section* header "blabla", to link to that section. +The secon version will look for a *function* named "blabla", +to link to the documentation for that function. + +### external references + +References to functions from external packages are handled with +[`DocumenterInterLinks.jl`](https://juliadocs.org/DocumenterInterLinks.jl/stable/). +To set up external references, `make.jl` needs to be modified to include +the package for referencing. For example, to make references to functions in +`PhyloNetworks`, `make.jl` has these additional lines of code: + +```julia +# Interlink with PhyloNetworks +using DocumenterInterLinks +links = InterLinks( + "PhyloNetworks" => "https://juliaphylo.github.io/PhyloNetworks.jl/stable/objects.inv" +) +``` + +The `links` object is then used in the `plugins` argument of `makedocs()` ran +at the end of `make.jl`. +Now `@ref` can be used to reference things in `PhyloNetworks`! +We can also use `@extref` to specify that a reference is an external one. diff --git a/docs/src/index.md b/docs/src/index.md index 67f532c..4937914 100644 --- a/docs/src/index.md +++ b/docs/src/index.md @@ -4,11 +4,58 @@ CurrentModule = PhyloTraits # PhyloTraits -Documentation for [PhyloTraits](https://github.com/JuliaPhylo/PhyloTraits.jl). +[PhyloTraits](https://github.com/JuliaPhylo/PhyloTraits.jl) +is a [Julia](http://julialang.org) package with core utilities for +phylogenetic networks. +See the [PhyloNetworks](https://github.com/JuliaPhylo/PhyloNetworks.jl) +package, which PhyloTraits depends on, for background on phylogenetic networks +and for how to get help. -```@index +--- + +## References + +See them in [bibtex format](https://github.com/juliaphylo/PhyloTraits.jl/blob/master/CITATION.bib). + +Quick links for methods about trait evolution on networks: +- Teo, Rose, Bastide & Ané (2023). + Accounting for intraspecific variation in continuous trait evolution + on a reticulate phylogeny. + Bulletin of the Society of Systematic Biologists, 2(3):1-29. + doi: [10.18061/bssb.v2i3.8977](https://doi.org/10.18061/bssb.v2i3.8977) +- Karimi, Grover, Gallagher, Wendel, Ané & Baum (2020). Reticulate evolution + helps explain apparent homoplasy in floral biology and pollination in baobabs + (*Adansonia*; Bombacoideae; Malvaceae). + Systematic Biology, 69(3):462-478. + [doi:10.1093/sysbio/syz073](https://academic.oup.com/sysbio/advance-article/doi/10.1093/sysbio/syz073/5613901?guestAccessKey=a32e7dd3-27fd-4a13-b171-7ff5d6da0e01). +- Bastide, Solís-Lemus, Kriebel, Sparks, Ané (2018). + Phylogenetic Comparative Methods for Phylogenetic Networks with Reticulations. + Systematic Biology, 67(5):800–820. + [doi:10.1093/sysbio/syy033](https://doi.org/10.1093/sysbio/syy033). + +## Manual + +For a tutorial, see this manual. + +```@contents +Pages = [ + "man/phyloregression.md", + "man/simulate_continuous.md", + "man/fitDiscrete.md", + "man/fitdiscreteDNA.md", + "man/simulate_discrete.md", +] +Depth = 3 ``` -```@autodocs -Modules = [PhyloTraits] +## Library + +For help on individual functions, see this library. + +```@contents +Pages = [ + "lib/public.md", + "lib/internal.md", +] +Depth = 3 ``` diff --git a/docs/src/lib/internal.md b/docs/src/lib/internal.md new file mode 100644 index 0000000..bdf3fec --- /dev/null +++ b/docs/src/lib/internal.md @@ -0,0 +1,21 @@ +# internal documentation + +Documentation for `PhyloTraits`'s internal functions. +These functions are not exported and their access (API) should not be +considered stable. But they can still be used, like this for example: +`PhyloTraits.foo()` for a function named `foo()`. + + +## functions & types + +```@autodocs +Modules = [PhyloTraits] +Public = false +Order = [:type,:function] +``` + +## index + +```@index +Pages = ["internal.md"] +``` diff --git a/docs/src/lib/public.md b/docs/src/lib/public.md new file mode 100644 index 0000000..311844f --- /dev/null +++ b/docs/src/lib/public.md @@ -0,0 +1,18 @@ +# public documentation + +Documentation for `PhyloTraits`'s public (exported) functions. +Most functions are internal (not exported). + +## functions & types + +```@autodocs +Modules = [PhyloTraits] +Private = false +Order = [:function,:type] +``` + +## index + +```@index +Pages = ["public.md"] +``` diff --git a/docs/src/man/fitDiscrete.md b/docs/src/man/fitDiscrete.md new file mode 100644 index 0000000..e53fa94 --- /dev/null +++ b/docs/src/man/fitDiscrete.md @@ -0,0 +1,197 @@ +```@setup fitdiscrete_trait +using PhyloNetworks +using PhyloTraits +using DataFrames +mkpath("../assets/figures") +figname(x) = joinpath("..", "assets", "figures", x) +``` + +# Discrete trait evolution + +With a phylogenetic network structure inferred, we can now estimate how quickly traits +have evolved over time using a likelihood model. These traits should be discrete +characteristics of a species such as feather color, diet type, +or DNA in aligned genetic sequences. + +As with continuous trait evolution, we assume a fixed network, correctly rooted, +with branch lengths proportional to calendar time. We start with a network, then +add data about the tips of this network. + +## Reading trait data + +The simplest way is to use a vector of species names with a data frame of traits: + +```@example fitdiscrete_trait +# read in network +net = readnewick("(O:4,(A:3,((B:0.4)#H1:1.6::0.92,((#H1:0::0.08,C:0.4):0.6,(D:.2,E:.2):0.8):1):1):1);"); +# read in trait data +species = ["C","A","D","B","O","E"]; +dat = DataFrame(trait=["hi","lo","lo","hi","lo","lo"]) +nothing # hide +``` + +If the species names and trait data are in the same data frame, +read in your data frame then subset the data like this: +```@example fitdiscrete_trait +dat = DataFrame( + species=["C","A","D","B","O","E"], + trait=["hi","lo","lo","hi","lo","lo"] +); +species = dat.species # or: dat[!, :species] +select!(dat, Not(:species)) # select all columns except for :species; modifies dat in place +nothing # hide +``` + +Let's plot the network and map the data onto it: + +```@example fitdiscrete_trait +using RCall, PhyloPlots +R"svg"(figname("fitdiscrete_trait_net_1.svg"), width=4, height=3); # hide +R"par"(mar=[0,0,0,0]); # to reduce margins +res = plot(net, tipoffset=0.3); # the results "res" provides point coordinates, to use for data annotation +o = [findfirst(isequal(tax), species) for tax in tiplabels(net)] # 5,2,4,1,3,6: order to match taxa from "species" to tip labels +isequal(species[o], tiplabels(net)) # true :) +traitcolor = map(x -> (x=="lo" ? "grey" : "red"), dat.trait[o]) +leaves = res[13][!,:lea] +R"points"(x=res[13][leaves,:x] .+0.1, y=res[13][leaves,:y], pch=16, col=traitcolor, cex=1.5); # adds grey & red points +R"legend"(x=1, y=7, legend=["hi","lo"], pch=16, col=["red","grey"], + title="my trait", bty="n",var"title.adj"=0); +# next: add to gene flow edge the proportion γ of genes affected +hi = findfirst([!e.ismajor for e in net.edge]) # 6 : "h"ybrid "i"ndex: index of gene flow edge (minor hybrid) in net: horizontal segment +R"text"(res[14][hi,:x]-0.3, res[14][hi,:y]-0.1, res[14][hi,:gam], col="deepskyblue", cex=0.75); # add the γ value +R"dev.off"(); # hide +nothing # hide +``` + +![net_1](../assets/figures/fitdiscrete_trait_net_1.svg) + +## Substitution models + +After reading in your data, we need to choose a model to describe how +evolutionary changes (or substitutions, in the case of DNA) happened over time. +Available Markov substitution models are described below. + +For general trait types, use one of these three models: +- `:BTSM` Binary Trait Substitution Model (2 states, rates unconstrained) +- `:ERSM` Equal Rates Substitution Model + (`k` states, all transitions possible with equal rates) +- `:TBTSM` Two Binary Trait Substitution Model (though not fully implemented yet) + + +To infer evolutionary rates, run [`fitdiscrete`](@ref) on the network and data. +It will calculate the maximum likelihood score +of one or more discrete trait characters at the tips +on a fixed network. + +- Along each edge, evolutionary changes are modeled with a + continous time Markov model. +- At a hybrid node, the trait is assumed to be inherited from one or the other + of its parents (immediately before the reticulation event), + with probabilities equal to the inheritance γ of each parent edge, + which is given by the network. +- At the root of the network, a uniform distribution among the possible + states is assumed a priori. +- The model ignores incomplete lineage sorting (e.g. hemiplasy). + +## parameter estimation & model fit + +The example below if for a binary trait, first using a model assuming +equal rates (from `lo` to `hi` and from `hi` to `lo`); +then using a model allowing for distinct rates. +The option `optimizeQ=false` causes transition rates +to stay at their starting values, without being optimized. + +```@repl fitdiscrete_trait +s1 = fitdiscrete(net, :ERSM, species, dat; optimizeQ=false) +s2 = fitdiscrete(net, :BTSM, species, dat; optimizeQ=false) +``` +The default rates, which act as starting value if rates were to be optimized, +are chosen equal to the inverse of the total edge lengths +in the network (or 1/number_of_taxa if all branch lengths are missing). + +By default `optimizeQ = true`, such that [`fitdiscrete`](@ref) +estimates the parameters of the rate matrix Q. + +```@repl fitdiscrete_trait +s3 = fitdiscrete(net, :ERSM, species, dat) +s4 = fitdiscrete(net, :BTSM, species, dat) +``` + +To compare the two models, we can use the Akaike criterion. +```@repl fitdiscrete_trait +using StatsBase +aic(s3) +aic(s4) +``` +Here, the equal-rate model is slightly favored (lower AIC), +so we will use `s3` below. + +## ancestral state prediction + +This is traditionally called "ancestral state reconstruction", +but we do not actually reconstruct anything. +We make predictions for (past of present-day) values, +hopefully with some measure to quantify our uncertainty. + +```@repl fitdiscrete_trait +# show(ancestralreconstruction(s3), allrows=true) +ancestralreconstruction(s3) +``` +Rows 1-6 correspond to the tips, with known values. +We see much prediction uncertainty at most of the internal nodes. +To see where these internal nodes (7-13/H1) are, we need to look +at the network stored within the fitted model. +This network might differ somewhat from the input network in case +taxa with missing data where pruned, and with edges possibly renumbered. + +```@example fitdiscrete_trait +R"svg"(figname("fitdiscrete_trait_net_2.svg"), width=4, height=3); # hide +R"par"(mar=[0,0,0,0]); # hide +plot(s3.net, shownodenumber=true, shownodelabel=true, tipoffset=0.2); +R"dev.off"(); # hide +nothing # hide +``` + +![net_2](../assets/figures/fitdiscrete_trait_net_2.svg) + +Looking back at the posterior probabilities of states "hi" and "lo" +at each node from the ancestral 'prediction' table above, +we see that there is more uncertainty near the root, and +less uncertainty near the tips. +The most recent common ancestor of D and E (node 11), +in particular, is predicted to be "lo" with fairly high certainty. + +## impact of gene flow on the trait + +An interesting question is whether there is evidence that B obtained +it's "hi" state via gene flow. The prior probability for this is γ: +the supposedly known proportion of genes inherited via gene flow, +which is part of the network (along with branch lengths). +Here, this prior probability of trait inheritance via gene flow is: + +```@repl fitdiscrete_trait +net.edge[6].gamma # the minor hybrid edge was edge 6, from above +``` + +We can compare this to the posterior probability, and get a Bayes factor +to compare the two hypotheses: gene flow vs. vertical inheritance. + +```@repl fitdiscrete_trait +exp(s3.priorltw[1]) # prior: for vertical inheritance. "ltw" = log tree weight +exp(s3.priorltw[2]) # prior: for gene flow inheritance, same as γ above +postltw = PhyloTraits.posterior_logtreeweight(s3) +exp(postltw[2]) # posterior: for gene flow inheritance +function geneflowBF(fit) + postltw = PhyloTraits.posterior_logtreeweight(fit) + exp(postltw[2] - postltw[1] + fit.priorltw[1] - fit.priorltw[2]) +end +geneflowBF(s3) +``` + +We get a Bayes factor greater than 1, so there is more evidence that +the "hi" value of B was inherited via gene flow, than via vertical +inheritance. But the Bayes factor is just barely above 1, so the +evidence is very equivocal. +This may not be surprising given that +gene flow occurred between fairly closely related species, +and that the data set is very small. diff --git a/docs/src/man/fitdiscreteDNA.md b/docs/src/man/fitdiscreteDNA.md new file mode 100644 index 0000000..62a46e2 --- /dev/null +++ b/docs/src/man/fitdiscreteDNA.md @@ -0,0 +1,82 @@ +```@setup concatdna +using PhyloNetworks +using PhyloTraits +``` + +# fitting DNA substitution parameters on a network + +The methods below model each DNA site as a trait, assuming that +sites are unlinked, that is, they evolve independently of each other. +In other words, this is a "concatenation" approach where +sites from the same locus do not share information about their +evolutionary path. This is appropriate if recombination is assumed +to have occurred within genes. + +## reading in an alignment + +Like for trait evolution, [`fitdiscrete`](@ref) can be used. It can be +given data in a variety of ways. For DNA, this is one way, using +[`PhyloNetworks.readfastatodna`](@extref): + +```@example concatdna +# read in network +dna_net = readnewick("((((((((((((((Ae_caudata_Tr275:1.0,Ae_caudata_Tr276:1.0):1.0,Ae_caudata_Tr139:1.0):1.0)#H1:1.0::0.6,((((((Ae_longissima_Tr241:1.0,Ae_longissima_Tr242:1.0):1.0,Ae_longissima_Tr355:1.0):1.0,(Ae_sharonensis_Tr265:1.0,Ae_sharonensis_Tr264:1.0):1.0):1.0,((Ae_bicornis_Tr408:1.0,Ae_bicornis_Tr407:1.0):1.0,Ae_bicornis_Tr406:1.0):1.0):1.0,((Ae_searsii_Tr164:1.0,Ae_searsii_Tr165:1.0):1.0,Ae_searsii_Tr161:1.0):1.0):1.0)#H2:1.0::0.6):1.0,(((Ae_umbellulata_Tr266:1.0,Ae_umbellulata_Tr257:1.0):1.0,Ae_umbellulata_Tr268:1.0):1.0,#H1:1.0::0.4):1.0):1.0,((Ae_comosa_Tr271:1.0,Ae_comosa_Tr272:1.0):1.0,(((Ae_uniaristata_Tr403:1.0,Ae_uniaristata_Tr357:1.0):1.0,Ae_uniaristata_Tr402:1.0):1.0,Ae_uniaristata_Tr404:1.0):1.0):1.0):1.0,(((Ae_tauschii_Tr352:1.0,Ae_tauschii_Tr351:1.0):1.0,(Ae_tauschii_Tr180:1.0,Ae_tauschii_Tr125:1.0):1.0):1.0,(#H2:1.0::0.4,((((Ae_mutica_Tr237:1.0,Ae_mutica_Tr329:1.0):1.0,Ae_mutica_Tr244:1.0):1.0,Ae_mutica_Tr332:1.0):1.0)#H4:1.0::0.6):1.0):1.0):1.0,(((T_boeoticum_TS8:1.0,(T_boeoticum_TS10:1.0,T_boeoticum_TS3:1.0):1.0):1.0,T_boeoticum_TS4:1.0):1.0,((T_urartu_Tr315:1.0,T_urartu_Tr232:1.0):1.0,(T_urartu_Tr317:1.0,T_urartu_Tr309:1.0):1.0):1.0):1.0):1.0,(((((Ae_speltoides_Tr320:1.0,Ae_speltoides_Tr323:1.0):1.0,Ae_speltoides_Tr223:1.0):1.0,Ae_speltoides_Tr251:1.0):1.0):1.0,#H4:1.0::0.4):1.0):1.0):1.0,Ta_caputMedusae_TB2:1.0):1.0,S_vavilovii_Tr279:1.0):1.0,Er_bonaepartis_TB1:1.0):1.0,H_vulgare_HVens23:1.0);"); +# read in alignment in FASTA format +fastafile = joinpath(dirname(pathof(PhyloTraits)), "..","examples","Ae_bicornis_Tr406_Contig10132.aln"); +dna_dat, dna_weights = readfastatodna(fastafile, true); +nothing # hide +``` +```@repl concatdna +dna_dat +dna_weights +``` + +Here, `dna_dat` is a single data frame containing both species names +and trait data (site patterns). The alignment was summarized by listing +each observed site pattern only once in `dna_dat`. +`dna_weights` is a vector of weights, containing +the number of times that each site pattern was observed. + +## substitution models for DNA + +DNA-specific substitution models have 4 states: the 4 nucleotides from +[BioSymbols](https://github.com/BioJulia/BioSymbols.jl) +(listed [here](https://biojulia.dev/BioSymbols.jl/stable/nucleicacids/)). +Each model has a relative and an absolute version. +- `:JC69` Jukes & Cantor 1969 model: one single rate for all transitions. + The relative version has values -1 along the diagonal of the rate matrix + (1 expected transition / unit of time). The absolute version has an extra + parameter to scale the rate matrix. +- `:HKY85` Hasegawa, Kishino & Yano 1985: treats transitions differently + from transversions. The relative is scaled to predict an average of + 1 transition / unit of time. + +We may allow for rate variation across sites using the `:RV` option. + +## likelihood of a fixed network + +In the examples below, none of the rate parameters are optimized, +so we get to see the default starting values. + +```@repl concatdna +d1 = fitdiscrete(dna_net, :JC69, dna_dat, dna_weights, :Gamma; optimizeQ=false, optimizeRVAS=false) +d2 = fitdiscrete(dna_net, :HKY85, dna_dat, dna_weights, :Gamma; optimizeQ=false, optimizeRVAS=false) +``` +When allowing for rate variation across sites with gamma-distributed rates, +the default shape parameter α is 1. + +In the more interesting examples below, +we optimize the evolutionary rates and the way rates vary across sites +(which is the default). +```@repl concatdna +d3 = fitdiscrete(dna_net, :JC69, dna_dat, dna_weights, :Gamma; ftolAbs=0.1, xtolAbs=0.01) +``` +Lenient tolerance parameters `ftolAbs` etc. have been chosen here to +make this example faster. +Note that the fitted object contains a separate version of the input network, +where any taxon without data has been pruned, and where branch numbers +may have been modified. + +```@repl concatdna +d3.net +``` diff --git a/docs/src/man/phyloregression.md b/docs/src/man/phyloregression.md new file mode 100644 index 0000000..1c810f8 --- /dev/null +++ b/docs/src/man/phyloregression.md @@ -0,0 +1,492 @@ +```@setup tree_trait +using PhyloNetworks +using PhyloTraits +mkpath("../assets/figures") +``` + +# Continuous trait analysis + +After inferring a phylogeny, we can take +these phylogenetic relationships into account when studying the distribution of +quantitative traits measured for extant species. +This is the goal of phylogenetic comparative methods (PCM). +With PhyloTraits, we can do so for a phylogeny that is either a tree, +or a network with reticulations. +More details can be found on the developments below in Bastide et al. 2018 [^B18] + +We assume a fixed network (which may be a tree), correctly rooted, with branch +lengths proportional to calendar time. +Below, we use a network that is time-consistent (all paths from the root to any +given node have the same length) and ultrametric (all the tips are contemporary). + +```@example tree_trait +truenet = readnewick("((((D:0.4,C:0.4):4.8,((A:0.8,B:0.8):2.2)#H1:2.2::0.7):4.0,(#H1:0::0.3,E:3.0):6.2):2.0,O:11.2);"); +``` +We can plot the network thanks to package +[PhyloPlots](https://github.com/juliaphylo/PhyloPlots.jl), which uses +[`RCall`](https://juliainterop.github.io/RCall.jl/stable/gettingstarted/). +The `name` function is only instrumental here, to ensure that the figure is +saved in the correct directory when the documentation is built. +We only show the commands to actually save the plot in this first example for +the interested reader, but we will hide those in the rest of the chapter, for +the sake of clarity. +```@example tree_trait +using PhyloPlots, RCall +name(x) = joinpath("..", "assets", "figures", x) +R"svg"(name("truenet.svg"), width=8, height=4) +R"par"(mar=[0,0,0,0]) +plot(truenet, useedgelength=true, showgamma=true); +R"dev.off()" +nothing # hide +``` +![truenet](../assets/figures/truenet.svg) + +## Model and variance matrix + +Assuming that the network is known and that the continuous traits evolve under a +Brownian Motion (BM) over time, it is possible to compute the expected variance +covariance matrix between tip measurements. This can be done using function +[`PhyloNetworks.vcv`](@extref), whose syntax is inspired from the well known +corresponding [`ape`](https://CRAN.R-project.org/package=ape) function. +```@repl tree_trait +C = vcv(truenet) +``` +The matrix is returned as a `DataFrame`, with columns named by the +tips of the network to allow for easy identification. +Each row also corresponds to a tip in the network, and rows are +ordered in the same way as columns. + +The computation of this matrix is based on the more general function +[` PhyloNetworks.sharedpathmatrix`](@extref). +It is at the core of all the Phylogenetic Comparative Methods described below. + +## Phylogenetic regression + +Assume that we measured three continuous traits in the data frame below. +We want to study the impact of traits 1 and 2 on trait 3. +To do that, we can perform a phylogenetic regression. + +To make sure that data are mapped to the correct tip in the phylogeny, +even though the tips might be ordered differently in the data frame compared +to the phylogeny, our data needs to have a column with the names of the tips in +the network. +If this column is labeled `tipnames`, fitting the data will not require an +extra option. +```@example tree_trait +using DataFrames +dat = DataFrame( + trait1 = [ 2.668, 3.696, 4.541, 4.846, 2.268, -0.331], + trait2 = [-3.008, -4.146, -2.338, 0.655, -3.339, -4.566], + trait3 = [15.424, 17.333, 18.115, 18.81, 13.337, 10.012], + tipnames = ["D", "C", "A", "B", "E", "O"] +) +nothing # hide +``` + +Phylogenetic regression / ANOVA is based on the +[GLM](https://github.com/JuliaStats/GLM.jl) package, with the network as an +extra argument, using function [`phylolm`](@ref). + +```@example tree_trait +using StatsModels # for statistical model formulas +fitTrait3 = phylolm(@formula(trait3 ~ trait1 + trait2), dat, truenet) +``` +The REML criterion is used by default, for estimating the variance +parameter(s). ML could be used instead with option `reml=false`. +From this, we can see that the intercept, the coefficient for trait 1 +and the variance of the noise are correctly estimated +(given that there are only 6 taxa). +In addition, the Student T test for the coefficient +associated with trait 2 has a high p-value, which means that this coefficient +is not significantly different from 0. This is consistent with the +way we simulated trait 3. + +The function returns an object of type [`PhyloNetworkLinearModel`](@ref)`<:GLM.LinPredModel`. +It is a subtype of the GLM type `LinPredModel`, which means that all base +functions from Julia [StatsBase](https://github.com/JuliaStats/StatsBase.jl) can +be applied to it. See the documentation for this type for a list of all +functions that can be used. Some functions allow the user to retrieve directly +the estimated parameters of the BM, and are specific to this object. +```@repl tree_trait +sigma2_phylo(fitTrait3) # estimated variance of the BM +mu_phylo(fitTrait3) # estimated root value of the BM +``` + +## Ancestral state reconstruction + +### From known parameters + +If we assume that we know the exact model of evolution that generated the traits, +we can do ancestral trait reconstruction. Here, we simulated trait 1 ourselves +(see next section), so we can use the true process with the true parameters. +In other words, we can reconstruct the state at the internal nodes, +given the values at the tips, the known value at the root (2) +and the known BM variance (0.5). +```@example tree_trait +ancTrait1 = ancestralreconstruction(truenet, dat.trait1, ParamsBM(2, 0.5)) +nothing # hide +``` +Function [`ancestralreconstruction`](@ref) creates an object with type +[`ReconstructedStates`](@ref). Several extractors can be applied to it: +```@repl tree_trait +using StatsAPI, StatsBase # for predict and stderror() +predict(ancTrait1) # predictions +stderror(ancTrait1) # associated standard errors +predict(ancTrait1, interval=:prediction, level=0.90) # prediction interval (at level 90%) +``` +We can plot the ancestral states or prediction intervals on the tree, using the +`nodelabel` argument of the `plot` function. +```@example tree_trait +R"svg"(name("ancestral_expe.svg"), width=8, height=4) # hide +R"par"(mar=[0,0,0,0]) # hide +plot(truenet, nodelabel=predict(ancTrait1, text=true), tipoffset=0.1); +R"dev.off()" # hide +nothing # hide +``` +![ancestral_expe](../assets/figures/ancestral_expe.svg) + +```@example tree_trait +ancInt = predict(ancTrait1, interval=:prediction, text=true) # format the prediction intervals for the plot +R"svg"(name("ancestral_predint.svg"), width=8, height=4) # hide +R"par"(mar=[0,0,0,0]) # hide +plot(truenet, nodelabel=ancInt[!,[:nodenumber,:interval]], tipoffset=0.1); +R"dev.off()" # hide +nothing # hide +``` +![ancestral_predint](../assets/figures/ancestral_predint.svg) + +The `predict` function has an optional argument to state +the `level` of the prediction interval. If not given, the default value is +0.95. + +It is also possible to plot both the reconstructed state and the predicted value +on the same plot, using the optional keyword argument `combine`. +As shown below, we could also use the `RCall` method from the +[`plot`](https://juliaphylo.github.io/PhyloPlots.jl/stable/lib/public/) function. +```@example tree_trait +ancInt = predict(ancTrait1, interval=:prediction, text=true, combine=true) +plot(truenet, nodelabel = ancInt[!,[:nodenumber,:interval]], tipoffset=0.1); +nothing # hide +``` +These plots tend to be quite busy, even for small networks. + +As we know the true ancestral states here, we can compare them to our +estimation. In this example, we see that the 95% prediction (ancestral state +reconstruction) intervals contain the true simulated value, at all ancestral nodes. + +```@repl tree_trait +pred = predict(ancTrait1, interval=:prediction); +DataFrame( + lower = pred[1:7, :lower], # lower bound of 95% prediction interval + trueValue = [3.312,4.438,3.922,3.342,2.564,1.315,2.0], # from sim1[:internalnodes] in next section + upper = pred[1:7, :upper] # upper bound + ) +``` + +### From estimated parameters + +In real applications though, we do not have access to the true parameters of the +process that generated the data. We can estimate them using the previous function. +To fit a regular BM, we just need to do a regression of trait 1 against a simple +intercept: +```@example tree_trait +fitTrait1 = phylolm(@formula(trait1 ~ 1), dat, truenet) +nothing # hide +``` + +We can then apply the [`ancestralreconstruction`](@ref) function directly +to the fitted object: +```@example tree_trait +ancTrait1Approx = ancestralreconstruction(fitTrait1) +nothing # hide +``` +The prediction intervals ignore the fact that we estimated the process +parameters, so they are less accurate and the function throws a warning. +The output is an object of the same [`ReconstructedStates`](@ref) type as earlier, +and the same extractors can be applied to it: +```@example tree_trait +R"svg"(name("ancestral1.svg"), width=8, height=4) # hide +R"par"(mar=[0,0,0,0]) # hide +plot(truenet, nodelabel = predict(ancTrait1Approx, text = true)); +R"dev.off()" # hide +nothing # hide +``` +![ancestral1](../assets/figures/ancestral1.svg) + +For convenience, the two steps described above (fitting against the +intercept, and then do ancestral state reconstruction) can be done all at once +with a single call of the function [`ancestralreconstruction`](@ref) on a +DataFrame with the trait to reconstruct, and the tip labels: +```@example tree_trait +datTrait1 = DataFrame(trait1 = dat[:,:trait1], tipnames = dat[:,:tipnames]) +ancTrait1Approx = ancestralreconstruction(datTrait1, truenet) +nothing # hide +``` +```@example tree_trait +ancInt = predict(ancTrait1Approx, interval=:prediction, level=0.9, text=true, combine=true) +R"svg"(name("ancestral2.svg"), width=8, height=4) # hide +R"par"(mar=[0,0,0,0]) # hide +plot(truenet, nodelabel = ancInt[!,[:nodenumber,:interval]]); +R"dev.off()" # hide +nothing # hide +``` +![ancestral2](../assets/figures/ancestral2.svg) + +This produces the exact same results. Here, we chose a `level` of 90% for the +plotted prediction intervals. + +### Data imputation + +Note that there is no theoretical difference between an internal node, for which +we could not measure the value of the trait, and a missing value at a tip of the +network. Consequently, the previous [`ancestralreconstruction`](@ref) +function can be used to do data imputation. To see this, let's add some missing +values in trait 1. +```@example tree_trait +allowmissing!(datTrait1, :trait1) +datTrait1[2, :trait1] = missing; # second row: for taxon C +ancTrait1Approx = ancestralreconstruction(datTrait1, truenet) +nothing # hide +``` +```@example tree_trait +ancInt = predict(ancTrait1Approx, interval=:prediction, text=true, combine=true) +R"svg"(name("ancestral3.svg"), width=8, height=4) # hide +R"par"(mar=[0,0,0,0]) # hide +plot(truenet, nodelabel = ancInt[!,[:nodenumber,:interval]]); +R"dev.off()" # hide +nothing # hide +``` +![ancestral3](../assets/figures/ancestral3.svg) + +A prediction interval is shown for the missing values. + +### With known predictors + +At this point, it might be tempting to apply this function to trait 3 as a +linear combination of trait 1 and a phylogenetic noise, to get a better +ancestral state reconstruction via using its correlation with trait 1. +However, this cannot be done directly: +```julia +ancTrait3 = ancestralreconstruction(fitTrait3) # throws an error +``` +This is because the model to fit the trait (a regression with one +predictor and an intercept) used a predictor for which we don't know the +ancestral states. The regression model accounted for that. + +The only option we have is to provide the function with the predictor's +ancestral states, if they are known. They are actually known in this +toy example because we generated the data ourselves (see next section), +so we can reconstruct our trait doing the following: +```@example tree_trait +ancTrait3 = ancestralreconstruction(fitTrait3, # model with estimated coefs etc. + hcat(ones(7,1), + [ 3.312, 4.438, 3.922, 3.342, 2.564, 1.315, 2.0], # from sim1[:internalnodes] + [-3.62, -0.746, -2.217, -3.612, -2.052, -2.871, -2.0]) # from sim2[:internalnodes] +) +nothing # hide +``` +```@example tree_trait +ancInt = predict(ancTrait3, interval=:prediction, text=true, combine=true) +R"svg"(name("ancestral4.svg"), width=8, height=4) # hide +R"par"(mar=[0,0,0,0]) # hide +plot(truenet, nodelabel = ancInt[!,[:nodenumber,:interval]]); +R"dev.off()" # hide +nothing # hide +``` +![ancestral4](../assets/figures/ancestral4.svg) + +where we provided the ancestral predictors as a matrix, containing the +intercept, and the known predictor at internal nodes. We must be very careful +with this function, as no check is done for the order of the predictors, or +the order of their values that must be the same as the internal nodes of the +phylogeny. As ancestral predictors are often unknown, the use of this +functionality is discouraged. + +## Phylogenetic ANOVA + +The [`phylolm`](@ref) function is based on the `lm` function +from [GLM](https://github.com/JuliaStats/GLM.jl). This means that it +inherits from most of its features, and in particular, it can handle formulas +with factors (discrete predictors) and interactions. +For example, in lizards, we might want to do a regression of toe length on +body length and the region where each species is found, where this region is coded +into 4 categories (say). We might also want to include an interaction effect +between body length and region. +(This model is just meant to show the possibilities of the function). + +To illustrate the use of categorical predictors of particular interest in a +network with reticulations, let's assume that some transgressive evolution took +place after the hybridization event, so that species "A" and "B" have a larger +mean compared to the others +(see [^B18] for transgressive evolution after a reticulation event). +```@example tree_trait +δ = 5.0; # value of heterosis +underHyb = [n == "A" || n == "B" for n in dat[:,"tipnames"]] # tips under hybrid +underHyb +for i in 1:nrow(dat) + underHyb[i] && (dat[i,:trait3] += δ) # add delta to tips A and B +end +nothing # hide +``` +```@repl tree_trait +select(dat, [:trait3, :tipnames]) # trait3 changed: +5 added to A and B by previous loop +``` +The categorical variable `underHyb` separates tips "A" and "B" from the others. +We need to consider it as a factor, not a numerical variable. +One way is to make it a vector of strings, as done below. +An alternative way would be to add and use the `CategoricalArrays` package, +then transform the column `underHyb` to be `categorical` (shown in commments). +```@example tree_trait +dat.underHyb = string.(underHyb); # adds a new column +# using CategoricalArrays +# transform!(dat, :underHyb => categorical, renamecols=false) +nothing # hide +``` +```@repl tree_trait +dat +``` +Now we can include this reticulation variable in the regression. +```@example tree_trait +fitTrait = phylolm(@formula(trait3 ~ trait1 + underHyb), dat, truenet) +``` +In this case, the categorical variable indicating which tips are descendants +of the reticulation event is indeed relevant, and the transgressive evolution effect +is recovered. + +This is a very simple example of how to include transgressive evolution, +but some general +functions to test for it, on networks with more than one hybrid, are also +available. + +## Pagel's Lambda + +One classical question about trait evolution is the amount of +"phylogenetic signal" in a trait or in the residuals of a linear relationship, +that is, the importance of the tree +structure to explain variation in the observed traits (or in the residuals). +One way of measuring that is to use +Pagel's lambda transformation of the branch lengths [^P99]. +This model assumes a +BM on a tree where the internal branches are multiplied by a factor λ, +while the external branches are modified so that the total height of the tree is +constant. Hence, λ varies between 0 (the tree has no influence on +the data) and 1 (the tree is unchanged). +Using the same branch length transformations, this model can +be straightforwardly extended to phylogenetic networks. + +This transformation assumes a time-consistent and ultrametric phylogeny, +in which all paths from the root to any tip has the same length: the "height" +of the phylogeny referred to above. + +We can illustrate this with the predictor trait we used earlier. We use the +same function as before, only indicating the model we want to use: +```@example tree_trait +fitPagel = phylolm(@formula(trait1 ~ 1), dat, truenet, model="lambda") +``` +As this trait 1 was indeed generated according to a plain BM on the phylogeny +(see next section), +the estimated λ should be close to 1. It can be extracted with function +`lambda_estim`: +```@repl tree_trait +lambda_estim(fitPagel) +``` + +For models in which the covariance is estimated, like Pagel's lambda, +model comparisons should use a likelihood ratio test with the function `lrtest`, +because the f-test (see below) is not applicable. + +If the models being compared have different predictors, then models +should be fit with maximum likelihood instead of the default REML criterion +in order to do a likelihood ratio test: use option `reml=false` for this. + +## Test of transgressive evolution + +In the ANOVA section above, we showed how to include transgressive evolution +in a simple case, and we did so manually. +In general, transgressive evolution can be seen as a particular example +of a *shifted BM* on the phylogenetic network, in which the trait evolves +as a BM on the network, but *shifts* at a reticulation. The value of the shift +may be the same across all reticulations, or may differ between reticulations. + +For identifiability reasons, each transgressive shift is applied to the +edge below a reticulation. In our network above, there is a single reticulation +and the edge below it is edge 6: + +```@example tree_trait +R"svg"(name("truenet_with_numbers.svg"), width=8, height=4) # hide +R"par"(mar=[0,0,0,0]) # hide +plot(truenet, useedgelength=true, showedgenumber=true); +R"dev.off()" # hide +nothing # hide +``` +![truenet_with_numbers](../assets/figures/truenet_with_numbers.svg) + +Let's assume we measured a trait that we hypothesized underwent a shift at +some or all ancestral reticulations. To test this hypothesis, we can use the +custom columns of the [`PhyloNetworks.descendencematrix`](@extref), that can be +directly defined thanks to function [`descendencedataframe`](@ref). +```@repl tree_trait +df_shift = descendencedataframe(truenet) # regressors matching Hybrid Shifts +``` +This creates a dataframe, with one column for each hybrid node +in the network, named according to the number of the edge after the +hybrid. In column `shift_6`, a row has a 0 if the corresponding species +is *not* a descendant of the reticulation, otherwise has the proportion of +its genome that was inherited from this reticulation. Here, A and B's ancestry +if fully inherited from edge 6, below the one reticulation in the network. + +We can use the columns in this dataframe as regressors (predictors) in the +`phylolm` function. Their coefficients will measure the shift after each +reticulation. +In the example below, the species names are listed in a different order than in `df_shift`, and contained in a column called "species", to show how this is +handled to merge and then fit the data. + +```@repl tree_trait +dat = DataFrame( # trait data + trait = [3.510, 2.195, 1.869, 4.839, 5.027, -0.679], + species = ["O", "D", "C", "A", "B", "E"]); +dat = innerjoin(dat, df_shift, on = [:species => :tipnames]) # trait + shift predictors +fit_sh = phylolm(@formula(trait ~ shift_6), dat, truenet, tipnames=:species) # fit +``` +Here, because there is only one hybrid in the network, we can directly +see whether the ancestral transgressive evolution is significant or not thanks to the +Student T-test on the coefficient associated with `shift_6`. In more +complex cases, it is possible to do a Fisher F-test, thanks to the `GLM` +function `ftest`. +```@example tree_trait +fit_null = phylolm(@formula(trait ~ 1), dat, truenet, tipnames=:species) # null (no shift) +ftest(fit_null, fit_sh) # nested models +``` +Here, this test is equivalent to the Fisher F test, and gives the same p-value. + +!!! note "Warnings from GLM" + A warning may appear, saying + "Starting from GLM.jl 1.8, null model is defined as having no predictor at all when a model without an intercept is passed." + - Why? `ftest` is inherited from the GLM package, which does not know that + the intercept term is not a column of ones after transformation to remove + the phylogenetic correlation. This is why `ftest` sends a warning for + each model, when multiple models are compared. + - These specific warnings can be ignored: + * F values and p-values are correct + * R² values are also correct: they are obtained with the + `r2` function for phylogenetic linear models. + A future version of the package will attempt to remove these warnings + specifically. + +Note that models need to be ordered by complexity, when given to `ftest`: +either from most complex to most simple, or from most simple to most complex. +In the output table, models are listed in the order in which they were given. +If the most complex model is given first, as done above, the table +lists the most complex H₁ (with shifts) first, and the null model H₀ +is listed as the second model. + +--- + +### References + +[^B18]: Bastide, Solís-Lemus, Kriebel, Sparks, Ané (2018): + Phylogenetic Comparative Methods for Phylogenetic Networks with Reticulations. + Systematic Biology 67(5):800–820. doi:10.1093/sysbio/syy033 + +[^P99]: Pagel M (1999). Inferring the historical patterns of biological + evolution. Nature. 401: 877–884. doi:10.1038/44766 diff --git a/docs/src/man/simulate_continuous.md b/docs/src/man/simulate_continuous.md new file mode 100644 index 0000000..d84aaae --- /dev/null +++ b/docs/src/man/simulate_continuous.md @@ -0,0 +1,153 @@ +```@setup sim_BM +using PhyloNetworks +using PhyloTraits +using PhyloPlots, RCall +mkpath("../assets/figures") +figname(x) = joinpath("..", "assets", "figures", x) +truenet = readnewick("((((D:0.4,C:0.4):4.8,((A:0.8,B:0.8):2.2)#H1:2.2::0.7):4.0,(#H1:0::0.3,E:3.0):6.2):2.0,O:11.2);"); +``` + +# Continuous trait simulation + +We show here how PhyloPlots can be used to simulate data under a Brownian motion +(BM) process. We use the same network as in the previous section. +The data used in the previous section was actually obtained using this +simulation (followed by some rounding). + +## Brownian motion + +We simulate three traits on the network: two independent traits that serve +as predictors, and one "dependent" trait that is affected by the first 2. +We start +by choosing the parameters of the BM (ancestral mean and variance), by creating +objects of class [`ParamsBM`](@ref)`<:ParamsProcess`. + +```@example sim_BM +params_trait1 = ParamsBM( 2, 0.5) # BM with mean 2 and variance 0.5 +params_trait2 = ParamsBM(-2, 1) # BM with mean -2 and variance 1.0 +nothing # hide +``` + +We then simulate the traits to serve as predictors according to these parameters, using +function [`rand`](@ref). +For reproducibility, we use a stable random number generator (RNG), +but the default random generator is better (and more efficient). +To use the default RNG, simply remove `rng` in the code below. + +```@example sim_BM +using StableRNGs; rng = StableRNG(18480224); # stable RNG for reproducibility +sim1 = rand(rng, truenet, params_trait1) # simulate a BM on truenet +sim2 = rand(rng, truenet, params_trait2) +nothing # hide +``` + +This creates objects of class [`TraitSimulation`](@ref), from which we can +extract the data at the tips, thanks to the method +[`getindex(::TraitSimulation, ::Symbol)`](@ref). + +```@repl sim_BM +trait1 = sim1[:tips] # trait 1 at the tips (data) +trait2 = sim2[:tips] +``` + +This extractor creates an `Array` with one column, and as many lines as the +number of tips there are in the phylogeny. It is sorted in the same order as +the tips of the phylogeny used to simulate it. +If needed, we could also extract the simulated values at the internal nodes +in the network: + +```@example sim_BM +sim1[:internalnodes] +``` +These values (rounded to 3 digits) are those used in section +[Ancestral state reconstruction](@ref), +when we compared the ancestral state reconstruction (or "predictions") of +trait 1 (stored in `ancTrait1`) to the true simulated value. + +Finally, we generate the last trait correlated with trait 1 +(but not trait 2), with phylogenetic noise. +```@example sim_BM +noise = rand(StableRNG(18700904), truenet, ParamsBM(0, 0.1)) # phylogenetic residuals +trait3 = 10 .+ 2 * trait1 .+ noise[:tips] # trait to study. independent of trait2 +nothing # hide +``` + +For a simulation study, we would assume that we measured the three traits above, +and then we would like to apply analysis methods to these data, e.g. to +see how they infer the impact of traits 1 and 2 on trait 3. +To do that, we may need to create a data frame containing all 3 traits, +as shown below: + +```@repl sim_BM +using DataFrames +dat = DataFrame(trait1 = trait1, trait2 = trait2, trait3 = trait3, + tipnames = tiplabels(sim1)) +``` + +These data were rounded to 3 digits and used in the previous section on +[Phylogenetic regression](@ref). + +## shifted Brownian motion + +In a shifted BM, the trait evolves as a BM on the network most of +the time, but undergo sudden *shifts* on some of the branches. +The positions and values of the shifts can be stored in a [`ShiftNet`](@ref) +object. The position of the shifts can be given using vector of edges. +To see this, let's first plot the network with its associated edges and node +numbers. +```@example sim_BM +R"svg"(figname("truenet_with_numbers.svg"), width=8, height=4) # hide +R"par"(mar=[0,0,0,0]) # hide +plot(truenet, useedgelength=true, showedgenumber=true); +R"dev.off()" # hide +nothing # hide +``` +![truenet_with_numbers](../assets/figures/truenet_with_numbers.svg) + +For identifiability reasons, shifts are only allowed on tree (not hybrid) edges. +Here, a shift on either hybrid edge 9 or 7 would have the same +effect as a shift on edge 6: by shifting traits of species A and B. + +Let's say that we want to add a shift with value 5.0 on the branch directly +following the hybridization event, in order to model transgressive evolution. +We can see on the +plot above that this branch is number 6, so we define the following object: + +```@repl sim_BM +edge_afterhyb = truenet.edge[6] # the 6th edge has number 6 +shift = ShiftNet(truenet.edge[6], 5.0, truenet) +``` +Note that the edge numbers and values of a `ShiftNet` object can be retrieved +thanks to functions [`getshiftedgenumber`](@ref) and [`getshiftvalue`](@ref). +The constructor can take a single edge and associated value, like here, +or two vectors of edges and matching values. + +Because we often need to put shifts only on edges right after hybrids, +there is a special function [`shiftathybrids`](@ref) to do that, so that +we do not have to find out their edges number. Here, the `shift` object +could hence have been defined as: +```@example sim_BM +shift = shiftathybrids(5.0, truenet) +``` + +The parameters for the simulation are then defined as above, just adding +our `ShiftNet` object as a parameter. +Again, we use a custom stable random number generator to make our example +reproducible, but we recommend *against* this random number generator forf +simulation studies (just remove the argument `rng`). + +```@example sim_BM +params_sh = ParamsBM(2, 0.5, shift) # BM with mean 2, variance 0.5, and shifts. +nothing # hide +``` + +The traits are simulated using the same function [`rand`](@ref), and +extracted at the tips as before. +```@example sim_BM +rng = StableRNG(18700904) +sim_sh = rand(rng, truenet, params_sh) # simulate a shifted BM on truenet +trait_sh = sim_sh[:tips] # trait at the tips (data) +``` +```@example sim_BM +tiplabels(sim_sh) +``` diff --git a/docs/src/man/simulate_discrete.md b/docs/src/man/simulate_discrete.md new file mode 100644 index 0000000..9749656 --- /dev/null +++ b/docs/src/man/simulate_discrete.md @@ -0,0 +1,97 @@ +```@setup sim_discrete +using PhyloNetworks +using PhyloTraits +using DataFrames +mkpath("../assets/figures") +figname(x) = joinpath("..", "assets", "figures", x) +``` + +# Discrete trait simulation + +[`rand`](@ref) can simulate discrete traits along a known network. + +## binary trait example + +For example, we can define a binary trait model with states +"carnivory" (state 1) and "non-carnivory" (state 2), then ask for +a trait to be simulated along our network. We can ask for +3 independent simulations, giving us 3 traits then, arranged in 3 rows. + +```@repl sim_discrete +m1 = BinaryTraitSubstitutionModel(1.0,2.0, ["carnivory", "non-carnivory"]) +``` + +We also need a phylogeny. We re-use the network from the section on +[Discrete trait evolution](@ref). +We then simulate traits with a stable random number generator (RNG) for +reproducibility, but recommend using the default RNG by simply removing +the argument `rng` below. + +```@repl sim_discrete +net = readnewick("(O:4,(A:3,((B:0.4)#H1:1.6::0.92,((#H1:0::0.08,C:0.4):0.6,(D:.2,E:.2):0.8):1):1):1);"); +using StableRNGs; rng = StableRNG(123); # for reproducibility of this example +traitmatrix, nodecolumn = rand(rng, m1, net; ntraits=3); +traitmatrix +``` + +In this trait matrix, each column corresponds to a node, +each row is a trait, and each entry gives the state of that trait for that node, +as an index. To get the state labels: + +```@repl sim_discrete +labs = getlabels(m1) +labs[traitmatrix] +``` + +The `nodecolumn` vector says which node corresponds to which column +in the trait matrix, and we can compare to the node numbers in the network. +For example, the first column corresponds to node `-2`, which is the root. +(The root is always in the first column: that's where the simulation starts.) + +```@repl sim_discrete +nodecolumn +getroot(net) +``` + +As another example, we can extract the data for species "A". +We first get the column number for "A" (column 12), +then get A's data in that column. + +```@repl sim_discrete +findfirst(isequal("A"), nodecolumn) # 12 +nodecolumn[12] +traitmatrix[:,12] # data for species A, as category indices +labs[traitmatrix[:,12]] # same data, as category names +``` + +## example of DNA simulation + +Below we simulate 4 sites of a DNA alignment, independent from an HKY model +with transition/transversion ratio κ=0.5 and stationary base frequencies of +0.2 for A and T and 0.3 for C and G: + +and +```@repl sim_discrete +m2 = HKY85([.5], [0.20, 0.30, 0.30, 0.20]) +rng = StableRNG(36154); # again, for reproducibility +traitmatrix, nodecolumn = rand(rng, m2, net; ntraits=4); +traitmatrix +labs = getlabels(m2) +``` + +To get the data at the tips only, and in a specific order, we can do this. +```@repl sim_discrete +taxa = tiplabels(net) +taxoncol = indexin(taxa, nodecolumn) # column indices to get taxa in order +labs[traitmatrix[:,taxoncol]] # trait at the tips only, ordered as in 'taxa' +``` + +This type of DNA data is from the package +[BioSymbols](https://biojulia.dev/BioSymbols.jl/stable/), +for interoperability with packages from [BioJulia](https://biojulia.dev). + +```@repl sim_discrete +using BioSequences +d = Dict(taxa[i] => LongDNA{4}(labs[traitmatrix[:,taxoncol[i]]]) + for i in eachindex(taxa)) +``` diff --git a/examples/Ae_bicornis_8sites.aln b/examples/Ae_bicornis_8sites.aln new file mode 100644 index 0000000..702dbd6 --- /dev/null +++ b/examples/Ae_bicornis_8sites.aln @@ -0,0 +1,44 @@ +>Ae_uniaristata_Tr357 +GCGCCGAC +>Ae_mutica_Tr237 +GCAGCGAC +>Ae_tauschii_Tr352 +GCAGCGAT +>Ae_searsii_Tr165 +GTAGCGAC +>Ae_sharonensis_Tr265 +GTAGCGAT +>Ae_bicornis_Tr407 +GTAGCGGC +>Ae_longissima_Tr241 +GTAGCGAC +>Ae_bicornis_Tr406 +GTAGCGGC +>Ae_caudata_Tr275 +GCGCCGAT +>H_vulgare_HVens23 +GTGCCAGT +>Ae_tauschii_Tr125 +GCAGCGGT +>Ae_uniaristata_Tr403 +GCGCCGAC +>Ae_uniaristata_Tr402 +GC------ +>Ae_comosa_Tr272 +GCGCCGAT +>Ae_longissima_Tr242 +GTAGCGAC +>Ae_comosa_Tr271 +GCGCCGAT +>Ae_searsii_Tr164 +GTAGCGAC +>Ae_speltoides_Tr251 +GTGCCAGT +>Ae_bicornis_Tr408 +GTAGCGGC +>Ae_tauschii_Tr351 +GCAGCGAT +>Ae_longissima_Tr355 +GTAGCGAC +>Ae_caudata_Tr139 +GCGCCGAT diff --git a/examples/Ae_bicornis_Tr406_Contig10132.aln b/examples/Ae_bicornis_Tr406_Contig10132.aln new file mode 100644 index 0000000..018e2ae --- /dev/null +++ b/examples/Ae_bicornis_Tr406_Contig10132.aln @@ -0,0 +1,44 @@ +>Ae_uniaristata_Tr357 +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ATGTATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTATTATGAGTACTGCAAAAATCTTGAGCTCGCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGCAACTATGGAAGAGTACATCAGAGAAGCACCCGGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCATGAAGATGAAGCTCCACAGGAAACCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCTGAAGAAGAGCCACCATATACCACTCTCTCAGAAGAAGATGAAGCCCCGCCATTGCGGCCAACC---ACTGGGGATCTACTAAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTTGAACAAAGCAACGCGCATGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATACACCGGCCCCTCTAGACTTGTTTGCCATTGACAAAGCTGGGTGGGAATTGGCACTGGTCGCTGCCCAGAGTAACCACACAAGCCAACCAGCTGTCAGCCAAGTGCAGCCCGGAGGGTTCGACAAGCTGCTGCTGGACAGCCTATACGAAGACGACGCGAGGGGGCAGCAAATCGCCAATGTGACCTACACCGGCGGCGTCACGGTGAACCCATTTGACCCAAATGACCCGTTCGCCATGTCCAACAGCTTCGCGCCGCCATCAAACGTGCAGTTCGCCATGATGGGG------CAGCAGCAGCAATACTACCAGGCACAGCAGCATGGCTACTTCCAGGTGCAGCAGCAGCAGCAACATCAAATG---GCGGCGATGCCGCCG---CAGACATACCAGCAGCAGCAGGCTCAGTACGCCGTGAATGCCGGATTATCCAACCCGTTCGGAGATCCGTTCAGTGCTCTCGTCACGACGGCGAATCCGCCAAAGCAAAACAATCAG------ +>Ae_mutica_Tr237 +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------TTGCAGAAACTACTACTCCGGCTTATTTCTTGCCAGCCTGAAGGTACAGCCTGCACAAATCACCTTGTACAATATGCATTAGCCCTTGTTATAAAGGAGAGCTTCAAAATATACTGTTCGATAAATGACGGCATCATCAATCTTGTCGATATGTATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTATTATGACTACTGCAAAAATCTTGAGCTCGCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGCAACTATGGAAGAGTACATCAGAGAAGCACCCAGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCATGAAGATGAAGCTCCACAGGAAACCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCTGAAGAAGAGCCACCATATACCACTCTCTCAGAAGAAGATGAACCCCCACCATTGCGGCCAACC---AATGGGGATCTATTAAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTTGAACAAAGCAACGCACTTGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATGCCTCGGCCCCTCTAGACTTGTTTGCCATTGACAAAGCTGGGTGGGAATTGGCACTGGTCACTGCCCAGAGTAACCACACAGGCCAACCAGCTGTCAGCCAAGTGCAAGCCGGAGGGTTCGACAAGCTGCTGCTGGATAGCCTATACGAAGACGATGCGAGGAGGCAGCAAATCGCCAATGTGACCTACACCGGCGGCGTCACGGTGAACCCATTTGACCCCAATGACCCGTTCGCCATGTCCAACAGCTTCGCGCCGCCATCAAACGTGCAGTTCGCCATGATGGGGCAGCAGCAGCAGCAGCAGTACTACCAGGCACAGCAGCATGGCTACTTCCAGATG------CAGCAACAACATCAAATG---GCGGCGATGCCG--------------------------------------------------------------------------------------------------------------------------------- +>Ae_tauschii_Tr352 +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------CTTATTTCTTGCCAGCCTGAAGGTACAGCCTGCACAAATCACCTTATACAATATGCATTAGCCCTTGTTCTGAAGGAGAGCTTCAAAATATACTGTTCGATAAATGACGGCATCATCAATCTTGTTGATATGTATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTATTATGACTACTGCAAAAATCTTGAGCTCGCCAAGACATTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGCAACTATGGAAGAGTACATCAGAGAAGCACCCAGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCACGAAGATGAAGCTCCACAGGAAACCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCTGAAGAAGAGCCACCATATACCACTCTCTCGGAAGAAGATGAACCCCCACCATTGCGGCCAACC---ACTGGGGATCTACTAAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTTGAACAAAGCAACGCACTTGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATGCCTCGGCCCCTCTAGACTTGTTTGCCATTGACAAAGCTGGGTGGGAATTGGCACTGGTCACTGCCCAGAGTAACCACGCAAGCCAACCAGCTGTCAGCCAAGTGCAAGCCGGAGGGTTCGACAAGCTGCTGCTAGACAGCCTATACGAAGACGACGCGAGGAGGCAGCAAATTGCCAGTGTGACCTACACCGGCGGCGTCACGGTGAACCCATTTGACCCCAATGACCCGTTCGCCATGTCCAACAGCTTCGCGCCGCCATCAAACGTGCAGTTCGCCATGATGGGC---CAGCAGCAGCAGCAGTACTACCAGGCACAGCAGCATGGCTACTTCCAGATGCAGCAGCAACAACAACATCAAATG---CTGGCGATGCCGTCA---CAGACATACCAGCAGCAGCAGGCTCAGTACGCCGTGAATGCCGGATTATCCAACCCGTTCGGCGATCCGTTCAGTGCTCTCGTCACGACGGCGAATCCGCCAAAGCAAAACAATCAG------ +>Ae_searsii_Tr165 +TTCAGGGATGACTCAAGCCCATTAGCATGGGATTCCTCTGCTTGGGTTCGCCTGTATGCGTTCTACCTACATGAACGCGTCGAATGCTTTAGGGTTCTGAAATACGACGTCGAAGCCGATCGTCTGGTGAAATTACCCCAGGCCTCTGGCAAGGCACACAGTAGAACAAGAACCCTTCCATGTGAAGATCTTTTAGATCAGTTGCCTGCATTGCAGAAGCTACTCTTCCGGCTTATTTCTTGCCAGCCTGAAGGTACAGCCTGCACAAATCACCTTATACAATATGCATTAGCCCTTGTTTTGAAGGAGAGCTTCAAAATATACTGTTCGATAAATGACGGCATCATCAATCTTGTTGATATGTATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTATTATGACTACTGCAAAAATCTTGAGCTTGCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGTAACTATGGAAGAGTACATCAGAGAAGCACCCAGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCATGAAGATGAAGCTCCACAGGAAACCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCTGAAGAAGAGCCACCATATACCACTCTCTCAGAAGAAGATGAACCCCCACCATTGCGGCCAACC---AATGGGGATCTATTAAACTTGGATGAAGAATTGCGCCCCATGATTGCAAACCTTGAACAAAGCAACGCACTTGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATGCCTCGGCCCCTCTAGACTTGTTTGCCATTGACAAAGCTGGGTGGGAATTGGCACTGGTCACTGCCCAGAGTAACCACACAGGCCAACCAGCTGTCAGCCAAGTGCAAGCCGGAGGGTTCGACAAGCTGCTGCTAGACAGCCTATACGAAGACGACGCGAGGAGGCAGCAAATCGCCAGTGTGACCTACACCGGCGGCGTCACGGTGAACCCCTTTGACCCCAATGACCCGTTCGCCATGTCCAGCAGCTTCGCGCCGCCATCAAACGTGCAGTTCGCCATGATGGGG---CAGCAGCAGCAGCAGTACTACCAGGCACAGCAGCATGGCTACTTCCAGATG---CAGCAGCAACAACATCAAATG---GCGGCGATGCCGCCA---CAGACATACCAGCAGCAGCAGGCTCAGTACGCCGTGAATGCCGGATTATCCAACCCGTTCGGCGATCCGTTCAGTGCTCTCGTCACGACGGCGAATCCGCCAAAGCAAAACAATCAGATT--- +>Ae_sharonensis_Tr265 +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------CAGCCTGAAGGTACAGCCTGCACAAATCACCTTATACAATATGCATTAGCCCTTGTTTTGAAGGAGAGCTTCAAAATATACTGTTCGATAAATGACGGCATCATCAATCTTGTTGATATGTATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTTTTATGACTACTGCAAAAATCTTGAGCTCGCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGTAACTATGGAAGAGTACATCAGAGAAGCACCCAGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCATGAAGATGAAGCTCCACAGGAAACCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCCGAAGAAGAGCCACAATATACCACTCTCTCAGAAGAAGATGAACCCCCACCATTGCGGCCAACCAACAATGGGGATCTATTAAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTTGAACAAAGCAACGCACATGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATGCCTCGGCCCCTCTAGACTTGTTTGCCATTGACAAAGCTGGATGGGAATTGGCACTGGTCACTGCCCAGAGTAACCACACAAGCCAACCAGCTGCCAGCCAAGTGCAAGCCGGAGGGTTCGACAAGCTGCTGCTAGACAGCCTATACGAAGACGACGCGAGGAGGCAGCAAATCGCCAGTGTGACCTACACCGGCGGCGTCACGGTGAACCCATTTGACCCCAATGACCCGTTCGCCATGTCCAGCAGCTTCTCGCCGCCATCAAACGTGCAGTTCGCCATGATGGGGCAGCAGCAGCAGCAGCAGTACTACCAGGCACAGCAGCATGGCTACTTCCAGATGCAGCAGCAACAACAACATCAAATG---GTGGCGATGCCGCCA---CAGATATACCAGCAGCAGCAGGCTCAGTACGCCGTGAATGCCGGATTATCCAACCCGTTCGGCGATCCGTTCAGCGCCCTCGTCACGACGGCGAATCCGCCAAAGCAAAACAATCAG------ +>Ae_bicornis_Tr407 +TTCAGGGATGACTCAAGCCCATTAGCATGGGATTCCTCTGCTTGGGTTCGCCTGTATGCGTTCTACCTACATGAACGCGTCGAATGCTTTAGGGTTCTGAAATATGACGTAGAAGCCGATCGTCTGGTGAAATTACCCCAGGCCTCTGGCAAGGCACACAGTAGAACAAGAACCCTTCCATGTGAAGATCTTTTAGATCAGTTGCCTGCATTGCAGAAGCTACTACTCCGGCTTATTTCTTGCCAGCCTGAAGGTACAGCCTGCACAAATCACCTTATACAATATGCATTAGCCCTTGTTTTGAAGGAGAGCTTCAAAATATACTGTTCGATAAATGACGGCATCATCAATCTTGTTGATATGTATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTTTTATGACTACTGCAAAAATCTTGAGCTCGCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGTAACTATGGAAGAGTACATCAGAGAAGCACCCAGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCATGAAGATGAAGCTCCACAGGAAACCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCCGAAGAAGAGCCACAATATACCACTCTCTCAGAAGAAGATGAACCCCCACCATTGCGGCCAACCAACAATGGGGATCTATTAAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTTGAACAAAGCAACGCACATGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATGCCTCGGCCCCTCTAGACTTGTTTGCCATTGACAAAGCTGGGTGGGAATTGGCACTGGTCACTGCCCAGAGTAACCACACAAGCCAACCAGCTGTCAGCCAATTGCAAGCCGGAGGGTTCGACAAGCTGCTGCTAGACAGCCTATACGAAGACGACGCGAGGAGGCAGCAAATCGCCAGTGTGACCTACACCGGCGGCGTCACGGTGAACCCATTTGACCCCAATGACCCATTCGCCATGTCCAGCAGCTTCGCGCCGCCATCGAACGTGCAGTTCGCCATGATGGGG---CAGCAGCAGCAGCAGTACTACCAGGCACAGCAGCATGGCTACTTCCAGATGCAGCAGCAACAACAACATCAAATGGCGGCGGCGATGCCGCCA---CAGACATACCAGCAGCAGCAGGCTCAGTACGCCGTGAATGCCGGATTATCCAACCCGTTCGGGGATCCGTTCAGCGCCCTCGTCCCCATGGCGAATCCGCCAAAGCAAAACAATCAGATT--- +>Ae_longissima_Tr241 +TTCAGGGATGACTCAAGCCCATTAGCATGGGATTCCTCTGCTTGGGTTCGCCTGTATGCGTTCTACCTACATGAACGCGTCGAATGCTTTAGGGTTCTGAAATACGACGTCGAAGCCGATCGTCTGGTGAAATTACCCCAGGCCTCTGGCAAGGCACACAGTAGAACAAGAACCCTTCCATGTGAAGATCTTTTAGATCAGTTGCCTGCATTGCAGAAGCTACTACTCCGGCTTATTTCTTGCCAGCCTGAAGGTACAGCCTGCACAAATCACCTTATACAATATGCATTAGCCCTTGTTTTGAAGGAGAGCTTCAAAATATACTGTTCGATAAATGACGGCATCATCAATCTTGTTGATATGTATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTTTTATGACTACTGCAAAAATCTTGAGCTCGCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGTAACTATGGAAGAGTACATCAGAGAAGCACCCAGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCATGAAGATGAAGCTCCACAGGAAACCGAGAAACCGGTTCAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCCGAAGAAGAGCCACAATATACCACTCTCTCAGAAGAAGATGAACCCCCACCATTGCGGCCAACCAACAATGGGGATCTATTAAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTTGAACAAAGCAACGCACATGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATGCCTCGGCCCCTCTAGACTTGTTTGCCATTGACAAAGCTGGGTGGGAATTGGCACTGGTCACTGCCCAGAGTAACCACACAGGCCAACCAGCTGTCAGCCAAGTGCAAGCCGGAGGGTTCGACAAGCTGCTGCTAGACAGCCTATACGAAGACGACGCGAGGAGGCAGCAAATCGCCAGTGTGACCTACACCGGCGGCGTCACGGTGAACCCATTTGACCCCAATGACCCGTTCGCCATGTCCAGCAGCTTCTCGCCGCCATCAAACGTGCAGTTCGCCATGATGGGGCAGCAGCAGCAGCAGCAGTACTACCAGGCACAGCAGCATGGCTACTTCCAGATGCAGCAGCAACAACAACATCAAATG---GCGGCGATGCCGCCA---CAGACATACCAGCAGCAGCAGGCTCAGTACGCCGTGAATGCCGGATTATCCAACCCGTTCGGCGATCCGTTCAGTGCTCTCGTCACGACGGCAAATCCGCCAAAGCAAAACAATCAG------ +>Ae_bicornis_Tr406 +TTCAGGGATGACTCAAGCCCATTAGCATGGGATTCCTCTGCTTGGGTTCGCCTGTATGCGTTCTACCTACATGAACGCGTCGAATGCTTTAGGGTTCTGAAATATGACGTAGAAGCCGATCGTCTGGTGAAATTACCCCAGGCTTCTGGCAAGGCACACAGTAGAACAAGAACCCTTCCATGTGAAGATCTTTTAGATCAGTTGCCTGCATTGCAGAAGCTACTACTCCGGCTTATTTCTTGCCAGCCTGAAGGTACAGCCTGCACAAATCACCTTATACAATATGCATTAGCCCTTGTTTTGAAGGAGAGCTTCAAAATATACTGTTCGATAAATGACGGCATCATCAATCTTGTTGATATGTATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTTTTATGACTACTGCAAAAATCTTGAGCTCGCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGTAACTATGGAAGAGTACATCAGAGAAGCACCCAGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCATGAAGATGAAGCTCCACAGGAAACCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCCGAAGAAGAGCCACAATATACCACTCTCTCAGAAGAAGATGAACCCCCACCATTGCGGCCAACCAACAATGGGGATCTATTAAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTTGAACAAAGCAACGCACATGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATGCCTCGGCCCCTCTAGACTTGTTTGCCATTGACAAAGCTGGGTGGGAATTGGCACTGGTCACTGCCCAGAGTAACCACACAAGCCAACCAGCTGTCAGCCAATTGCAAGCCGGAGGGTTCGACAAGCTGCTGCTAGACAGCCTATACGAAGACGACGCGAGGAGGCAGCAAATCGCCAGTGTGACCTACACCGGCGGCGTCACGGTGAACCCATTTGACCCCAATGACCCATTCGCCATGTCCAGCAGCTTCGCGCCGCCATCGAATGTGCAGTTCGCCATGATGGGG---CAGCAGCAGCAGCAGTACTACCAGGCACAGCAGCATGGCTACTTCCAGATGCAGCAGCAACAACAACATCAAATGGCGGCGGCGATGCCGCCA---CAGACATACCAGCAGCAGCAGGCTCAGTACGCCGTGAATGCCGGATTATCCAACCCGTTCGGGGATCCGTTCAGCGCCCTCGTCCCCATGGCGAATCCGCCAAAGCAAAACAATCAG------ +>Ae_caudata_Tr275 +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------AAAAATCTTGAGCTCGCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGCAACCATGGAAGAGTACATCAGAGAAGCACCCAGTGTCAGCATCACGAGAAAGAGTGTGAGTTTACCTAGTGACCACGAAGATGAAGCTCCACAGCAAACCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCTGAAGAAGAGCCACCATATACCACTCTCTCAGAAGAAGATGAAGCCCCACCATTGCGGCCAACC---ACTGGGGATCTACTAAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTTGAACAAAGCAACGCACATGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATACATCGGCCCCTCTAGACTTGTTTGCTATTGACAAAGCTGGGTGGGAATTGGCACTGGTCGCTGCCCAGAGTAACCACACAAGCCAACCAGCTGTCAGCCAAGTGCAGCCCGGAGGGTTCGACAAGCTGCTGCTAGACAGCCTATACGAAGACGACACGAGGAGGCAGCAAATCGGCAATGTGACCTACACTGGCAGCGTCACGGTGAACCCATTTGACCCCAACGACCCGTTCGCCATGTCCAACAGCTTCGCGCCGCCATCAAACGTGCAGTTGGCCATGATGGGG---CAGCAGCAGCAGCAGTACTACCAGGCACAGCAGCATGGCTACTTCCAG---CAGCAACAACAACAACATCAAATG---GTGGCGATGCCGCCA---CAGACATACCAGCAGCAGCAGGCTCAGTACGCCGTGAATGCCGGATTATCCAACCCGTTCGGCGATCCGTTCAGTGCTCTCGTCACGACAGCGAATCCGCCAAAGCAAAACAATCAGATT--- +>H_vulgare_HVens23 +------------------------------------------------------------------------------------------------------------------------------ATGAAATTACCGCAGGCTTCTGGCAAGGCACACAGTAGAACAAGAACCCTTCCGTGCGCAGATCTTTTAGATCAGTTGCCTGCATTGCAGAAACTACTACTCCGGCTTATTTCTTGCCAGCCTGAAAGTGCAGCCTGCACAAATCACCTTGTACAATATGCATTAGCCCTTGTTTTGAAGGAGAGCTTCAAAATATACTGTTCGATAAATGACGGCATCATCAATCTTGTTGATATGTATTTTGATATGGCAAAAACCGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGACAGCAGGCAGAAAAGCTTTCTGCATATTATGACTACTGCAAACATCTTGAGCTCGCCAGGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGTAACTATGGAGGAGTACATCAGAGAAGCACCCCGTGTCAGCATCACGAGAAAGAGTGCGAGTTCACCTAGTGACCACGAAGATGAAGCTCCACTGGAAGCCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAACCTGCACCTGAAGAAGAGCCACAATATATCGCTCTCTCAGAAGAAGATGAACCCCCACCATTGCCGCCAACC---ACTGGGGATCTATTAAACTTGGATGAGGAATTGCACCCCATGATTGCAGATCTCGAACAAAGCAACGCACTTGCTCTTGCTATCGTGGAACCAGGGAGTGAGAACAATGCCTCGGCCCCTCTAGACTTGTTTGCCATGGACAAAGCTGGGTGGGAAATGGCACTGGTCACTGCACCAAGTAACCACACAAGCCAACCAGCTGTCAGCCAATTGCAGCCCGGAGGGTTCGACAAGCTGCTGCTAGACAGCCTATACGAAGATGAGGCAAGGAGGCAGCAAATCGCCAGCGTGACCTACACCGGTGGCGTCACAGTGAACCCATTTGACCCCAACGACCCGTTCGCCATGTCCAACAGCTTCGCACCGCCATCGAATGTGCAGTTCGCCATGATGGGG------CAGCAGCAGCAGTACTACCAGGCACCGCAGCATGACTACTTCCAGATG---CAGCAGCAACAACATCAAATG---ATGTCGATGCCGCCACCCCAAACATACCAGCAGCAGCAGGCTCAGTATGCCGTGAACGCTGGATTATCCAACCCGTTCGGAGATCCGTTCAGCGCCCTTGTCACGATGGCGAATCCGCCAAAGCAAAACAAT------NNN +>Ae_tauschii_Tr125 +TTCAGGGATGACTCGAGCCCATTAGCATGGGATTCCTCTGCTTGGGTTCGCCTGTATGCATTCTACCTACATGAACGCGCCGAATGCTTTAGGGTTCTAAAATACGACGTCGAAGCCGATCGTCTGGTGAAATTACCCCAGGCTTCTGGCAAGGCACACAGTAGAACAAGAACCCTTCCATGTGAAGATCTTTTAGATCAGTTGCCTGCATTGCAGAAGCTACTACTCCGGCTTATTTCTTGCCAGCCTGAAGGTACAGCCTGCACAAATCACCTTATACAATATGCATTAGCCCTTGTTCTGAAGGAGAGCTTCAAAATATACTGTTCGATAAATGACGGCATCATCAATCTTGTTGATATGTATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTATTATGACTACTGCAAAAATCTTGAGCTCGCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGCAACCATGGAAGAGTACATCAGAGAAGCACCCAGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCACGAAGATGAAGCTCCACAGGAAACCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCTGAAGAAGAGCCACCATATACCACACTCTCGGAAGAAGATGAACCCCCACCATTGCGGCCAACC---ACTGGGGATCTACTAAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTTGAACAAAGCAACGCACTTGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATGCCTCGGCCCCTCTAGACTTGTTTGCCATTGACAAAGCTGGGTGGGAATTGGCACTGGTCACTGCCCAGAGTAACCACACAAGCCAACCAGCTGTCAGCCAAGTGCAAGCCGGAGGGTTCGACAAGCTGCTGCTAGACAGCCTATACGAAGACGACGCGAGGAGGCAGCAAATTGCCAGTGTGACCTACACCGGCGGCGTCACGGTGAACCCATTTGACCCCAATGACCCGTTCGCCATGTCCAACAGCTTCGCGCCGCCATCGAACGTGCAGTTCGCCATGATGGGC---CAGCAGCAGCAGCAGTACTACCAGGCACAGCAGCATGGCTACTTCCAGATGCAGCAGCAACAACAACATCAAATG---CTGGCGATGCCGCCA---CAGACATACCAGCAGCAGCAGGCTCAGTACGCCGTGAATGCCGGATTATCCAACCCGTTCGGCGATCCATTCAGTGCTCTCGTCACGACGGCGAATCCGCCAAAGCAAAACAATCAG------ +>Ae_uniaristata_Tr403 +TTCAGGGATGACTCGAGCCCGTTAGCATGGGATTCCTCTGCTTGGGTTCGCTTGTATGCATTCTACCTACATGAACGTGTCGAATGCTTTAGGGTTCTAAAATACGACGTCGAAGCCGATCGTCTGGTGAAATTACCCCAGGCCTCTGGCAAGGCACACAGTAGAACAAGAACCCTTCCATGTGAAGATCTTTTAGATCAGTTGCCTGCATTGCAGAAACTACTACTCCGGCTTATTTCTTGCCAGCCTGAAGGTACAGCCTGCACAAATCACCTTATACAATATGCATTAGCCCTTGTTATTAAGGAGAGCTTCAAAATATACTGTTCGATAAATGACGGCATCATCAATCTTGTTGATATGTATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTATTATGAGTACTGCAAAAATCTTGAGCTCGCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGCAACTATGGAAGAGTACATCAGAGAAGCACCCGGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCATGAAGATGAAGCTCCACAGGAAACCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCTGAAGAAGAGCCACCATATACCACTCTCTCAGAAGAAGATGAAGCCCCGCCATTGCGGCCAACC---ACTGGGGATCTACTAAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTTGAACAAAGCAACGCGCATGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATACACCGGCCCCTCTAGACTTGTTTGCCATTGACAAAGCTGGGTGGGAATTGGCACTGGTCGCTGCCCAGAGTAACCACACAAGCCAACCAGCTGTCAGCCAAGTGCAGCCCGGAGGGTTCGACAAGCTGCTGCTGGACAGCCTATACGAAGACGACGCGAGGGGGCAGCAAATCGCCAATGTGACCTACACCGGCGGCGTCACGGTGAACCCATTTGACCCAAATGACCCGTTCGCCATGTCCAACAGCTTCGCGCCGCCATCAAACGTGCAGTTCGCCATGATGGGG------CAGCAGCAGCAATACTACCAGGCACAGCAGCATGGCTACTTCCAGGTGCAGCAGCAGCAGCAACATCAAATG---GCGGCGATGCCGCCG---CAGACATACCAGCAGCAGCAGGCTCAGTACGCCGTGAATGCCGGATTATCCAACCCGTTCGGAGATCCGTTCAGTGCTCTCGTCACGACGGCGAATCCGCCAAAGCAAAACAATCAGATT--- +>Ae_uniaristata_Tr402 +TTCAGGGATGACTCGAGCCCGTTAGCATGGGATTCCTCTGCTTGGGTTCGCTTGTATGCATTCTACCTACATGAACGTGTCGAATGCTTTAGGGTTCTAAAATACGACGTCGAAGCCGATCGTCTGGTGAAATTACCCCAGGCCTCTGGCAAGGCACACAGTAGAACAAGAACCCTTCCATGTGAAGATCTTTTAGATCAGTTGCCTGCATTGCAGAAACTACTACTCCGGCTTATTTCTTGCCAGCCTGAAGGTACAGCCTGCACAAATCACCTTATACAATATGCATTAGCCCTTGTTATTAAGGAGAGCTTCAAAATATACTGTTCGATAAATGACGGCATCATCAATCTTGTTGATATGTATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTATTATGAGTACTGCAAAAATCTTGAGCTCGCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGCAACTATGGAAGAGTACATCAGAGAAGCACCCGGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCATGAAGATGAAGCTCCACAGGAAACCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCTGAAGAAGAGCCACCATATACCACTCTCTCAGAAGAAGATGAAGCCCCGCCATTGCGGCCAACC---ACTGGGGATCTACTAAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTTGAACAAAGCAACGCGCATGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATACACCGGCCCCTCTAGACTTGTTTGCCATTGACAAA------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ +>Ae_comosa_Tr272 +TTCAGGGATGACTCGAGCCCATTAGCATGGGATTCCTCTGCTTGGGTTCGCCTGTATGCATTCTACCTACATGAACGCGTCGAGTGCTTTAGGGTTCTAAAATACGACGTCGAAGCCGATCGTCTGGTGAAATTACCCCAGGCTTCTGGCAAGGCACACAGTAGAACAAGAACCCTTCCATGTGAAGAACTTTTAGATCAGTTGCCTGCATTGCAGAAACTACTACTCCGGCTTATTTCTTGCCAGCCTGAAGGTACAGCCTGCACAAATCACCTTATACAATATGCATTAGCCCTTGTTATTAAGGAGAGCTTCAAAATATACTGTTCGATAAATGACGGCATCATCAATCTTGTTGATATGTATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTATTATGACTACTGCAAAAATCTTGAGCTCGCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGCAACTATGGAAGAGTACATCAGAGAAGCACCCGGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCACGAAGATGAAGCTCCACAGCAAACCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCTGAAGAAGAGCCACCATATACCACTCTCTCAGAAGAAGATGAACCCCCACCATTGCCGCCAACT---TCTGGGGATCTATTAAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTCGAACAGAGCAACGCACATGCTCTTGCCATTGTGGAACCAGGGAGTGAGAACAATACATCGGCCCCTCTAGACTTGTTTGCCATTGACAAAGCTGGGTGGGAATTGGCACTGGTCACTGCCCAGAGTAACCACACAAACCAACCAGCTGTCAGCCAAGTGCAGCCCGGAGGGTTCGACAAGCTGCTGCTGGACAGCCTATACGAAGACGACACGAGGAGGCAGCAAATCGCCAGTGTGACCTACCCCGGCGGCGTCACGGTGAACCCATTTGACCCCAATGACCCGTTCGCCATGTCCAACAGCTTCGCGCCGCCATCAGACGTGCAGTTCGCCATGATGGGG---CAGCAGCAGCAGCAGTACTACCAGGCACAGCAGCATGGCTACTTCCAGATGCAGCAGCAGCAACAACATCAAATG---GTGGCGATGCCGCCA---CAGACATACCAGCAGCAGCAGGCTCAGTACGCCGTGAATGCCGGATTATCCAACCCCTTCGGCGATCCGTTCAGTGCTCTCGTCACGACGGCGAATCCGCCAAAGCAAAACAATCAG------ +>Ae_longissima_Tr242 +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------GCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGTAACTATGGAAGAGTACATCAGAGAAGCACCCAGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCATGAAGATGAAGCTCCACAGGAAACCGAGAAACCGGTTCAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCCGAAGAAGAGCCACAATATACCACTCTCTCAGAAGAAGATGAACCCCCACCATTGCGGCCAACCAACAATGGGGATCTATTAAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTTGAACAAAGCAACGCACATGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATGCCTCGGCCCCTCTAGACTTGTTTGCCATTGACAAAGCTGGGTGGGAATTGGCACTGGTCACTGCCCAGAGTAACCACACAGGCCAACCAGCTGTCAGCCAAGTGCAAGCCGGAGGGTTCGACAAGCTGCTGCTAGACAGCCTATACGAAGACGACGCGAGGAGGCAGCAAATCGCCAGTGTGACCTACACCGGCGGCGTCACGGTGAACCCATTTGACCCCAATGACCCGTTCGCCATGTCCAGCAGCTTCTCGCCGCCATCAAACGTGCAGTTCGCCATGATGGGGCAGCAGCAGCAGCAGCAGTACTACCAGGCACAGCAGCATGGCTACTTCCAGATGCAGCAGCAACAACAACATCAAATG---GCGGCGATGCCGCCA---CAGACATACCAGCAGCAGCAGGCTCAGTACGCCGTGAATGCCGGATTATCCAACCCGTTCGGCGATCCGTTCAGTGCTCTCGTCACGACGGCAAATCCGCCAAAGCAAAACAATCAGATT--- +>Ae_comosa_Tr271 +---------------------------------------------------------------------------CGCGTCGAGTGCTTTAGGGTTCTAAAATACGACGTCGAAGCCGATCGTCTGGTGAAATTACCCCAGGCTTCTGGCAAGGCACACAGTAGAACAAGAACCCTTCCATGTGAAGAACTTTTAGATCAGTTGCCTGCATTGCAGAAACTACTACTCCGGCTTATTTCTTGCCAGCCTGAAGGTACAGCCTGCACAAATCACCTTATACAATATGCATTAGCCCTTGTTATTAAGGAGAGCTTCAAAATATACTGTTCGATAAATGACGGCATCATCAATCTTGTTGATATGTATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTATTATGACTACTGCAAAAATCTTGAGCTCGCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGCAACTATGGAAGAGTACATCAGAGAAGCACCCGGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCACGAAGATGAAGCTCCACAGCAAACCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCTGAAGAAGAGCCACCATATACCACTCTCTCAGAAGAAGATGAACCCCCACCATTGCCGCCAACT---TCTGGGGATCTATTAAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTCGAACAGAGCAACGCACATGCTCTTGCCATTGTGGAACCAGGGAGTGAGAACAATACATCGGCCCCTCTAGACTTGTTTGCCATTGACAAAGCTGGGTGGGAATTGGCACTGGTCACTGCCCAGAGTAACCACACAAACCAACCAGCTGTCAGCCAAGTGCAGCCCGGAGGGTTCGACAAGCTGCTGCTGGACAGCCTATACGAAGACGACACGAGGAGGCAGCAAATCGCCAGTGTGACCTACCCCGGCGGCGTCACGGTGAACCCATTTGACCCCAATGACCCGTTCGCCATGTCCAACAGCTTCGCGCCGCCATCAGACGTGCAGTTCGCCATGATGGGG---CAGCAGCAGCAGCAGTACTACCAGGCACAGCAGCATGGCTACTTCCAGATGCAGCAGCAGCAACAACATCAAATG---GTGGCGATGCCGCCA---CAGACATACCAGCAGCAGCAGGCTCAGTACGCCGTGAATGCCGGATTATCCAACCCCTTCGGCGATCCGTTCAGTGCTCTCGTCACGACGGCGAATCCGCCAAAGCAAAACAATCAGATT--- +>Ae_searsii_Tr164 +TTCAGGGATGACTCAAGCCCATTAGCATGGGATTCCTCTGCTTGGGTTCGCCTGTATGCGTTCTACCTACATGAACGCGTCGAATGCTTTAGGGTTCTGAAATACGACGTCGAAGCCGATCGTCTGGTGAAATTACCCCAGGCCTCTGGCAAGGCACACAGTAGAACAAGAACCCTTCCATGTGAAGATCTTTTAGATCAGTTGCCTGCATTGCAGAAGCTACTCTTCCGGCTTATTTCTTGCCAGCCTGAAGGTACAGCCTGCACAAATCACCTTATACAATATGCATTAGCCCTTGTTTTGAAGGAGAGCTTCAAAATATACTGTTCGATAAATGACGGCATCATCAATCTTGTTGATATGTATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTATTATGACTACTGCAAAAATCTTGAGCTTGCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGTAACTATGGAAGAGTACATCAGAGAAGCACCCAGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCATGAAGATGAAGCTCCACAGGAAACCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCTGAAGAAGAGCCACCATATACCACTCTCTCAGAAGAAGATGAACCCCCACCATTGCGGCCAACC---AATGGGGATCTATTAAACTTGGATGAAGAATTGCGCCCCATGATTGCAAACCTTGAACAAAGCAACGCACTTGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATGCCTCGGCCCCTCTAGACTTGTTTGCCATTGACAAAGCTGGGTGGGAATTGGCACTGGTCACTGCCCAGAGTAACCACACAGGCCAACCAGCTGTCAGCCAAGTGCAAGCCGGAGGGTTCGACAAGCTGCTGCTAGACAGCCTATACGAAGACGACGCGAGGAGGCAGCAAATCGCCAGTGTGACCTACACCGGCGGCGTCACGGTGAACCCCTTTGACCCCAATGACCCGTTCGCCATGTCCAGCAGCTTCGCGCCGCCATCAAACGTGCAGTTCGCCATGATGGGG---CAGCAGCAGCAGCAGTACTACCAGGCACAGCAGCATGGCTACTTCCAGATG---CAGCAGCAACAACATCAAATG---GCGGCGATGCCGCCA---CAGACATACCAGCAGCAGCAGGCTCAGTACGCCGTGAATGCCGGATTATCCAACCCGTTCGGCGATCCGTTCAGTGCTCTCGTCACGACGGCGAATCCGCCAAAGCAAAACAATCAG------ +>Ae_speltoides_Tr251 +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ATGTATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTTTTATGACTACTGCAAAAATCTTGAGCTCGCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGTAACTATGGAAGAGTACATCAGAGAAGCACCCAGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCATGAAGATGAAGCTCCACAGGAAACCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCTGAAGAAGAGCCACCATATACCACTCTCTCAGAAGAAGATGAACCCCCACCGTTGCGGCCAACCAACAATGGGGATCTATTAAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTTGAACAAAGCAACGCACTTGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATACATCGGCCCCTCTAGACTTGTTTGCGATTGACAAAGCTGGGTGGGAATTGGCACTGGTCACTGCCCAGAGTAACCAGACAAGCCAACAAGCTGTCAGCCAAGTGCAGCCCGGAGGGTTCGACAAGCTGCTGCTGGACAGCCTATACGAAGACGACACAAGGAGGCAGCAAATCGCCAGTGTGACCTACCCCGGCGGCGTCACGGTGAACCCATTTGACCCCAATGACCCGTTCGCCATGTCCAACAGCTTCCCGCCGCCATCGAACGTGCAGTTCGCCATGATGGGG------CAGCAGCAGCAGTACTACCAGGCACAGCAGCATGGCTACTTCCAGGTGCAGCAGCAGCAACAACATCAAATG---GTGGCGATGCCGCCA---CAGACATACCAGCAGCAGCAGGCTCAGTACGCTGTGAATGCCGGATTATCCAACCCGTTCGGCGATCCGTTCAGTGCTCTCGTCACGACGGCGAATCCGCCAAAGCAAAACAAT--------- +>Ae_bicornis_Tr408 +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------TATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTTTTATGACTACTGCAAAAATCTTGAGCTCGCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGTAACTATGGAAGAGTACATCAGAGAAGCACCCAGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCATGAAGATGAAGCTCCACAGGAAACCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCCGAAGAAGAGCCACAATATACCACTCTCTCAGAAGAAGATGAACCCCCACCATTGCGGCCAACCAACAATGGGGATCTATTAAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTTGAACAAAGCAACGCACATGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATGCCTCGGCCCCTCTAGACTTGTTTGCCATTGACAAAGCTGGGTGGGAATTGGCACTGGTCACTGCCCAGAGTAACCACACAAGCCAACCAGCTGTCAGCCAATTGCAAGCCGGAGGGTTCGACAAGCTGCTGCTAGACAGCCTATACGAAGACGACGCGAGGAGGCAGCAAATCGCCAGTGTGACCTACACCGGCGGCGTCACGGTGAACCCATTTGACCCCAATGACCCATTCGCCATGTCCAGCAGCTTCGCGCCGCCATCGAACGTGCAGTTCGCCATGATGGGG---CAGCAGCAGCAGCAGTACTACCAGGCACAGCAGCATGGCTACTTCCAGATGCAGCAGCAACAACAACATCAAATGGCGGCGGCGATGCCGCCA---CAGACATACCAGCAGCAGCAGGCTCAGTACGCCGTGAATGCCGGATTATCCAACCCGTTCGGGGATCCGTTCAGCGCCCTCGTCCCCATGGCGAATCCGCCAAAGCAAAACAATCAG------ +>Ae_tauschii_Tr351 +TTCAGGGATGACTCGAGCCCATTAGCATGGGATTCCTCTGCTTGGGTTCGCCTGTATGCATTCTACCTACATGAACGCGTCGAATGCTTTAGGGTTCTAAAATACGACGTCGAAGCCGATCGTCTGGTGAAATTACCCCAGGCTTCTGGCAAGGCACACAGTAGAACAAGAACCCTTCCATGTGAAGATCTTTTAGATCAGTTGCCTGCATTGCAGAAGCTACTACTCCGGCTTATTTCTTGCCAGCCTGAAGGTACAGCCTGCACAAATCACCTTATACAATATGCATTAGCCCTTGTTCTGAAGGAGAGCTTCAAAATATACTGTTCGATAAATGACGGCATCATCAATCTTGTTGATATGTATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTATTATGACTACTGCAAAAATCTTGAGCTCGCCAAGACATTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGCAACTATGGAAGAGTACATCAGAGAAGCACCCAGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCACGAAGATGAAGCTCCACAGGAAACCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCTGAAGAAGAGCCACCATATACCACTCTCTCGGAAGAAGATGAACCCCCACCATTGCGGCCAACC---ACTGGGGATCTACTAAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTTGAACAAAGCAACGCACTTGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATGCCTCGGCCCCTCTAGACTTGTTTGCCATTGACAAAGCTGGGTGGGAATTGGCACTGGTCACTGCCCAGAGTAACCACGCAAGCCAACCAGCTGTCAGCCAAGTGCAAGCCGGAGGGTTCGACAAGCTGCTGCTAGACAGCCTATACGAAGACGACGCGAGGAGGCAGCAAATTGCCAGTGTGACCTACACCGGCGGCGTCACGGTGAACCCATTTGACCCCAATGACCCGTTCGCCATGTCCAACAGCTTCGCGCCGCCATCAAACGTGCAGTTCGCCATGATGGGC---CAGCAGCAGCAGCAGTACTACCAGGCACAGCAGCATGGCTACTTCCAGATGCAGCAGCAACAACAACATCAAATG---CTGGCGATGCCGTCA---CAGACATACCAGCAGCAGCAGGCTCAGTACGCCGTGAATGCCGGATTATCCAACCCGTTCGGCGATCCGTTCAGTGCTCTCGTCACGACGGCGAATCCGCCAAAGCAAAACAATCAG------ +>Ae_longissima_Tr355 +TTCAGAGATGACTCAAGCCCATTAGCATGGGATTCCTCTGCTTGGGTTCGCCTGTATGCGTTCTACCTACATGAACGCGTCGAATGCTTTAGGGTTCTGAAATATGACGTAGAAGCCGATCGTCTGGTGAAATTACCCCAGGCTTCTGGCAAGGCACACAGTAGAACAAGAACCCTTCCATGTGAAGATCTTTTAGATCAGTTGCCTGCATTGCAGAAGCTACTACTCCGGCTTATTTCTTGCCAGCCTGAAGGTACAGCCTGCACAAATCACCTTATACAATATGCATTAGCCCTTGTTTTGAAGGAGAGCTTCAAAATATACTGTTCGATAAATGACGGCATCATCAATCTTGTTGATATGTATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTTTTATGACTACTGCAAAAATCTTGAGCTCGCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGTAACTATGGAAGAGTACATCAGAGAAGCACCCAGTGTCAGCATCACGAGAAAGAGTGTGAGTTCACCTAGTGACCATGAAGATGAAGCTCCACAGGAAACCGAGAAACCGGTTCAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCCGAAGAAGAGCCACAATATACCACTCTCTCAGAAGAAGATGAACCCCCACCATTGCGGCCAACC---AAC---AATNNNNNNAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTTGAACAAAGCAACGCACATGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATGCCTCGGCCCCTCTAGACTTGTTTGCCATTGACAAAGCTGGGTGGGAATTGGCACTGGTCACTGCCCAGAGTAACCACACAGGCCAACCAGCTGTCAGCCAAGTGCAAGCCGGAGGGTTCGACAAGCTGCTGCTAGACAGCCTATACGAAGACGACGCGAGGAGGCAGCAAATCGCCAGTGTGACCTACACCGGCGGCGTCACGGTGAACCCATTTGACCCCAATGACCCGTTCGCCATGTCCAGCAGCTTCTCGCCGCCATCAAACGTGCAGTTCGCCATGATGGGGCAGCAGCAGCAGCAGCAGTACTACCAGGCACAGCAGCATGGCTACTTCCAGATGCAGCAGCAACAACAACATCAAATG---GCGGCGATGCCGCCA---CAGACATACCAGCAGCAGCAGGCTCAGTACGCCGTGAATGCCGGATTATCCAACCCGTTCGGCGATCCGTTCAGCGCCCTCGTCACGACGGCGAATCCGCCAAAGCAAAACAATCAGATT--- +>Ae_caudata_Tr139 +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------GCCTGCACAAATCACCTTATACAATATGCATTAGCCCTTGTTTTGAAGGAGAGCTTCAAAATATACTGTTCGATAAATGACGGCATCATCAATCTTGTTGATATGTATTTTGATATGGCAAAAATGGATGCTATCAAGGCCCTTGAAATTTATAAAAGAGCTGGCCAGCAGGCAGAAAAGCTTTCTGCGTATTATGACTACTGCAAAAATCTTGAGCTCGCCAAGACTTTCCAGTTTCCTACTTTGAGGCAGCCACCTTCTTCATTCCTTGCAACCATGGAAGAGTACATCAGAGAAGCACCCAGTGTCAGCATCACGAGAAAGAGTGTGAGTTTACCTAGTGACCACGAAGATGAAGCTCCACAGCAAACCGAGAAACCGGTTGAAGAGGAGAAAGAAGAGCCAGCAGAAGCTGCACCTGAAGAAGAGCCACCATATACCACTCTCTCAGAAGAAGATGAAGCCCCACCATTGCGGCCAACC---ACTGGGGATCTACTAAACTTGGATGAAGAATTGCACCCCATGATTGCAAACCTTGAACAAAGCAACGCACATGCTCTTGCCATCGTGGAACCAGGGAGTGAGAACAATACATCGGCCCCTCTAGACTTGTTTGCTATTGACAAAGCTGGGTGGGAATTGGCACTGGTCGCTGCCCAGAGTAACCACACAAGCCAACCAGCTGTCAGCCAAGTGCAGCCCGGAGGGTTCGACAAGCTGCTGCTAGACAGCCTATACGAAGACGACACGAGGAGGCAGCAAATCGGCAATGTGACCTACACTGGCAGCGTCACGGTGAACCCATTTGACCCCAACGACCCGTTCGCCATGTCCAACAGCTTCGCGCCGCCATCAAACGTGCAGTTGGCCATGATGGGG---CAGCAGCAGCAGCAGTACTACCAGGCACAGCAGCATGGCTACTTCCAG---CAACAACAACAACAACATCAAATG---GTGGCGATGCCGCCA---CAGACATACCAGCAGCAGCAGGCTCAGTACGCCGTGAATGCCGGATTATCCAACCCCTTCGGCGATCCGTTCAGTGCTCTCGTCACGACAGCGAATCCGCCAAAGCAAAACAATCAGATT--- diff --git a/examples/Ae_bicornis_Tr406_Contig10722.aln b/examples/Ae_bicornis_Tr406_Contig10722.aln new file mode 100644 index 0000000..3d4e33c --- /dev/null +++ b/examples/Ae_bicornis_Tr406_Contig10722.aln @@ -0,0 +1,88 @@ +>Ae_longissima_Tr242 +ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCAATTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGTTAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCAGCCAACAGTATGATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTTATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATAATCGGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGAATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGGTTTACTTAAATCCACTGAAGAGACCCTGAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGCACCTTGATGAAGCAAATAGAACAAATAAAGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCCGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAATTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAACAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAGTTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA +>Ae_mutica_Tr237 +---CTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGACTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCACTGGTGCAAAAACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAAGCAGCAATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAAGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGCGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGCATTGATAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATGATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTACGCCGTGTCTCTCATCAAATGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATTGTCAGTTGATTCACTGAGTGAGGAACTTCAAGTATTAAACTCTGCAAAAAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCACGATTCCGAACTACTGTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGAAGATGAAGTTGCAGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCTGGACTGAGGTTTCCAAACTTTCCAAGGACCTTGATGAAGCAAATAGAACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGAAAGAACTTGAAGCTACCGCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAATAATGCCACTCTCGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGCGAGATGTTGCGCCTAAGGAGGCAGATTAGCGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACGAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGTGAAATTGCTGCTGAGACTCCTTATACTGTAAGAGTGAAGGCTAGGAGAGGAAAAGGTGGTGCGTCG--- +>Ae_longissima_Tr241 +---------GAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCAATTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGTTAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCAGCCAACAGTATGATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTTATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATAATCGGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGAATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGGTTTACTTAAATCCACTGAAGAGACCCTGAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGCACCTTGATGAAGCAAATAGAACAAATAAAGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCCGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAATTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAACAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAGTTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCG--- +>Ae_uniaristata_Tr357 +ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCAGAATCATCCTTACCAGTGGTGCAAACACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGCACATCTCGACAGGAAAAGGAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGATATTAGAGAGCAGTATTGATAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATGCTAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTTGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGACGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCAAACCACGATTCTGAACTACTCTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAACTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGGACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAACGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCCGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGAAGCTACCTCTAATGAGCTTACTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTGGCTAAACAATTGAATGCAGATTCTCAAACACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGAGAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAACAAGTCCATCCACAGAAGCCAGCACTGCTCCCAGAACAAGTTCGCCCACAGAGACCAGCAGTGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAGTTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA +>Ae_umbellulata_Tr266 +ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTGTGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACAGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGTTAAAGCTGGGGGTGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCGGCCAACAGTATGATAGCAAGGAGAAACGCATTGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATAATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTAATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTGAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGCACCTTGATGAAGCAAATAGAACAAATAAAGACCTGGTATTGCAGATTTCAAATCTCCAAAGAGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTCTCAGCCAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTTGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAACAGGGAGCTTGAGGCTTTAGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAACAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTGGAAGAGGAACTGGCGTTAGCAAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAACAAGTCCATCCACAGAAGCCAGCACTGCTCCCAGAACAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTATGAATGATGGT---ACTCAGAAGACCGGCGAAGTTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA +>Ae_mutica_Tr329 +ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCACTGGTGCAAAAACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAAGCAGCAATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGCATTGATAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATAATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTACGCCGTGTCTCTCATCAAATGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATTGTCAGTTGATTCACTGAGTGAGGAACTTCAAGTATTAAACTCTGCAAAAAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCCGAACTACTGTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCAGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCAAGGACCTTGATGAAGCAAATAGAACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGAAAGAACTTGAAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACGAGCAATGCTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGTGAAATTGCTGCTGAGACTCCTTATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCG--- +>Ae_tauschii_Tr125 +ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAGCTCCTCTGCTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGCACATCTCGACAGGAAAAGGAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTCTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGATATTGGAGAGTAGTATTGATAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATGCTAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAGTTGATTCACTCAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCAAACCACGATTCTGAACTACTGTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAACTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGGACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTAAGGAAGAACTTGAAGCTACCTCTAATGAGCTTACTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTGGCTAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCTGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGTGAAATTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA +>Ae_searsii_Tr165 +ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGACGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCAATTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAAATTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAAAATGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGTTAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGCGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCAGCCAACAGTATGATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATAATCGGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGGTTTACTTAAATCCACTGAAGAGACCCTGAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGCACCTTGATGAAGCAAATAGAACAAATAAAGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCCGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAATTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAACAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAGTTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA +>H_vulgare_HVens23 +---CTTGATGAGACAAAGGATGTCCCAAAGGTGGATGAACCTCAGACTGGTGGGACTATGGTTGATGAACCTCAGACTGGTGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCTGAATCACCCTTACCACTGGTGCAAAAACAATCTCCAGGGAATCCACTTGCTGGCCTTCTGAATGCAATTGCAGTTATTGCCTCAGGCGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCAATCTCATCGATGAGGGAGACATATGAAAAAAGGTTATTAGAGCAGCAAGCGGCACAAAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTGCTAGATCAATTGTCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGATTTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGCGATTAGAAAGTAGTATTGATAAAGCTGGGAATGATAAAGAAGTGCTTGAAGCCCAACTGACAGAAAAGTTTGGTGAAATGAGTGATTTGGAGGAAAAATTAAGTCTTCTCAGCCAACAGAATGATAGTAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACTAAAGAGAGTCTTGAATTTGCAAATGCTAAAATACAACAGCTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCTTCAATTGACTCACTGAATGAGAAACTTCAAGCATTAAACTCTGCAAAGAAGGAAGCTGATGAAAAAATAAATGAGCTAATCAAAGAGTGTACAGACTTGAAGGCTTCTTCTGAGATGAGAGCGAATCATGATTCTGAATTATTGTCTGAGAAAGATGATCTGATCAAACAACTGGAAGAAAAGCTCTCTGTTGCACTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGAGTTGAACAAGGAATTGGATTCCACCAAAGCAATGTTAGACGATGAAGTTGCGGCACTGAAAAGTCTTAGAGATCTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGAATGAACAAGGACCTGTCATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCAAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATGTAAAGCTCTATCAGATGAAGTGGTGTCAGCTAAAGAGATGGTTCAAAAGGGACAGGAAGAACTTGAAGCTACCTCTAATGGGCTTGCTTCTGCTGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAATTTGAATCCACCACACAGGAGCTTGTTGATGAAAGGAGAGTTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTGGACGAGATGAACACGAGTGCACTGTCACTATCTAAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAGGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACGAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGTCTAAGAAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAACAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACGAGCAATGTTCCCAGAACAAGTGTTGCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACGCAGAAGGCTGGCGAAATTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGCGGTGCATCGCGA +>Ae_caudata_Tr276 +ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGTTGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCAATTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGACTAGAGAGTAGTATTGTTAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCAGCCAACAGTATGATAGCAAGGAGAAACGCATTGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGGTTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATAATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTAATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTGAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGCACCTTGATGAAGCAAATAGAACAAATAAAGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTTTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACTAGATCACTAAACGAGATGAACACAAGCGCAGTGTCACTCTCAGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACGTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAACAAGTCCATCCACAGAAGCCAGCACTGCTCCCAGAACAAGTTCGCCCACAGAGACCAGCAATGTT---------------CCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGTGAAATTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA +>Ae_uniaristata_Tr403 +ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCAGAATCATCCTTACCAGTGGTGCAAACACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGCACATCTCGACAGGAAAAGGAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGATATTAGAGAGCAGTATTGATAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATGCTAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTTGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGACGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCAAACCACGATTCTGAACTACTCTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAACTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGGACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAACGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCCGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGAAGCTACCTCTAATGAGCTTACTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTGGCTAAACAATTGAATGCAGATTCTCAAACACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGAGAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAACAAGTCCATCCACAGAAGCCAGCACTGCTCCCAGAACAAGTTCGCCCACAGAGACCAGCAGTGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAGTTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCG--- +>Ae_sharonensis_Tr265 +---------GAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCAATTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGTTAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCAGCCAACAGTATGATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATAATCGGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGAATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGGTTTACTTAAATCCACTGAAGAGACCCTGAGTGATTCCCGAACTGAGGTTTCCAAATTTTCCGAGCACCTTGATGAAGCAAATAGAACAAATAAAGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCCGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAATTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCGCAGAAACCAGCACTGCTCCCAGAACAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAGTTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA +>Ae_umbellulata_Tr257 +---CTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTGTGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACAGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGTTAAAGCTGGGGGTGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCGGCCAACAGTATGATAGCAAGGAGAAACGCATTGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATAATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTAATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTGAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGCACCTTGATGAAGCAAATAGAACAAATAAAGACCTGGTATTGCAGATTTCAAATCTCCAAAGAGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTCTCAGCCAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTTGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAACAGGGAGCTTGAGGCTTTAGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAACAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTGGAAGAGGAACTGGCGTTAGCAAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAACAAGTCCATCCACAGAAGCCAGCACTGCTCCCAGAACAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTATGAATGATGGT---ACTCAGAAGACCGGCGAAGTTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA +>Ae_speltoides_Tr223 +ATGCTTGATGAGACAAAAGATGTCCCAAAT------------------------------GTGGATGAACCTCAGAATGGCGGGACTTTGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCACTGGTGCAAAAACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGCGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGATAAAGCTGGGGATGACAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATGATAGCAAGGAGAAACGGATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTCGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAACTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCCGAACTACTGTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGTTGCCACCAAAGCAATGCTAGATGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAATGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGAACAAATAAGGACCTGGTATTGCAGATCTCAAATCTCCAAAGCGAGTTCAGTGAAATGCGAGAAGGTCTGACTCACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCCCTATCAGATGAACTGGTCTCAGCTAAAGAGACGATTCAAAAGGGTCAGGAAGAACTTGAAGCTACCTCTAATGAGCTTGCTTCTGCTGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTAGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAACAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAATGTCACTCTCTGAGGCGCTCGAGAGCACTCATTCCAAGAATGCCACTCTCGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACGGAAAGGGAGACTTTTGAAATGAGGTCTCGGCACCTCGAAGAGGAACTGGCCTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACCAGCAGTGTTCCCAGAACAAGTGTTCCCGCAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAATTGCTGCCGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA +>Ae_comosa_Tr272 +ATGCTTGATGAGACAAAGGATGTCCAAAAG------------------------------GTGGATGAACCTCAGACTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCACTGGTGCAAGAACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAAGCAGCAATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGCGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATAGGGAGATTAGAGAGTAGCATTGATAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATGATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTGGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAAATTCACACAACTAAAATTGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAACTCTGCAAAGAAGGAAGCCAAGGAAAAAATAAATGAGCTAATTAAAGAGAGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCACGATTCCAAACTACTGTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGACGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTCAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGAACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTGTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTTGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAACAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACGAGCAATGTCCCCGGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGTAGTACTCAGAAGACCGGCGAAATTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCG--- +>Ae_mutica_Tr244 +ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGACTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGACAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCACTGGTGCAAAAACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGCACATCTCGACAGGAAAAGGAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAAGCAGCAATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGCGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGCATTGATAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATAATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTACGCCGTGTCTCTCATCAAATGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATTGTCAGTTGATTCACTGAGTGAGGAACTTCAAGTATTAAACTCTGCAAAAAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCCGAACTACTGTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCAGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCAAGGACCTTGATGAAGCAAATAGAACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGAAAGAACTTGAAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTTGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCAAGAGCAAGTTCGCCCACAGAGACGAGCAATGCTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGTGAAATTGCTGCTGAGACTCCTTATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA +>Ae_caudata_Tr139 +---GTGACTGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCAGGACTATGGTTGGTGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCAATTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAACGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGACTAGAGAGTAGTATTGTTAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCAGCCAACAGTATGATAGCAAGGAGAAACGCATTGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGGTTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCATGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATAATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTAATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGGACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTTTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAACGTACTCGAAGCAGACCTGGATGAAGCAACTAGATCACTAAACGAGATGAACACAAGCGCAGTGTCACTCTCAGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACGTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAACAAGTCCATCCACAGAAGCCAGCACTGCTCCCAGAACAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGTGAAATTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCG--- +>Ae_uniaristata_Tr402 +---CTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCAGAATCATCCTTACCAGTGGTGCAAACACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGCACATCTCGACAGGAAAAGGAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGATATTAGAGAGCAGTATTGATAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATGCTAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTTGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGACGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCAAACCACGATTCTGAACTACTCTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAACTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGGACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAACGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCCGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGAAGCTACCTCTAATGAGCTTACTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTGGCTAAACAATTGAATGCAGATTCTCAAACACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGAGAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAACAAGTCCATCCACAGAAGCCAGCACTGCTCCCAGAACAAGTTCGCCCACAGAGACCAGCAGTGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAGTTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCG--- +>T_urartu_Tr232 +ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACTTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTGCTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGTTAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCAGCCAACAGTATGATAGCAAGGAGAAACGCATTGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCGGAGTATCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGCACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATGATCTGATCAAACAGATGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCAGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGGACAAATAAGGACCTGGCATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAAAACTTGAAGCTACCTCTAATGAGTTTGCTTCTGCCGTGGAAGCTCGTGACAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATCGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGCGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATACCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGTGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCCTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACCAGCAATGTTCCCCGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAG---ACCGGCGAAATTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGCGGT--------- +>T_urartu_Tr315 +---CTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACTTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTGCTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGTTAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCAGCCAACAGTATGATAGCAAGGAGAAACGCATTGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCGGAGTATCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGCACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATGATCTGATCAAACAGATGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCAGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGGACAAATAAGGACCTGGCATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAAAACTTGAAGCTACCTCTAATGAGTTTGCTTCTGCCGTGGAAGCTCGTGACAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATCGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGCGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATACCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGTGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCCTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACCAGCAATGTTCCCCGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAG---ACCGGCGAAATTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGCGGTGGGCCG--- +>Ae_longissima_Tr355 +ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCAATTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGTTAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCAGCCAACAGTATGATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTTATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATAATCGGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGAATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGGTTTACTTAAATCCACTGAAGAGACCCTGAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGCACCTTGATGAAGCAAATAGAACAAATAAAGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCCGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAATTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAACAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAGTTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA +>Ae_comosa_Tr271 +---------GAGACAAAGGATGTCCAAAAG------------------------------GTGGATGAACCTCAGACTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCACTGGTGCAAGAACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAAGCAGCAATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGCGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATAGGGAGATTAGAGAGTAGCATTGATAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATGATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTGGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAAATTCACACAACTAAAATTGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAACTCTGCAAAGAAGGAAGCCAAGGAAAAAATAAATGAGCTAATTAAAGAGAGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCACGATTCCAAACTACTGTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGACGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTCAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGAACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTGTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTTGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAACAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACGAGCAATGTCCCCGGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGTAGTACTCAGAAGACCGGCGAAATTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCG--- +>Ae_uniaristata_Tr404 +ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGACTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCTGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCACTGGTGCAAAAACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAAGCAGCAATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCCCTAAGCGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGCATTGATAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGATGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATGATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTGGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCACACAACTAAAATTGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAACTCTGCAAAGAAGGAAGCCGAGGAAAAAATAACTGAGCTAATTAAAGAGAGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCACGATTCCAAACTACTGTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTCAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGAACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAAGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTGTCAGCTAAAGAGATGATTCAAAAGGGTCAAGAAGAACTTGTAGTTACCTCTAATGGGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTTGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGCATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAACAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACGAGCAATGTCCCTGGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGTAGTACTCAGAAGACCGGCGAAATTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCG--- +>Ae_mutica_Tr332 +---------GAGACAAAGGATGTCCCAAAGGTGGATGAACCTCAGACTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCACTGGTGCAAAAACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGCACATCTCGACAGGAAAAGGAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAAGCAGCAATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGCGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGCATTGATGAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATGATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTACGCCGTGTCTCTCATCAAATGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAGAAATGATCTTGCTTCTAAGATATTGTCAGTTGATTCACTGAGTGAGGAACTTCAAGTATTAAACTCTGCAAAAAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCACGATGCCGAACTACTGTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCAGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCAAGGACCTTGATGAAGCAAATAGAACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGAAAGAACTTGAAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACCACTTTGAATAGGGAACTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGAGGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAAATGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAACAAGTCCATCCACAGAAACCAGCACTGCTCCAAGAGCAAATTCGCCCACAGAGACCAGCAATGCTCCGAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAATTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCG--- +>Ae_speltoides_Tr323 +ATGCTTGATGAGACAAAAGATGTCCCAAAT------------------------------GTGGATGAACCTCAGAATGGCGGGACTTTGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCACTGGTGCAAAAACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGCGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGATAAAGCTGGGGATGACAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATGATAGCAAGGAGAAACGGATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTCGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAACTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCCGAACTACTGTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGTTGCCACCAAAGCAATGCTAGATGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAATGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGAACAAATAAGGACCTGGTATTGCAGATCTCAAATCTCCAAAGCGAGTTCAGTGAAATGCGAGAAGGTCTGACTCACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCCCTATCAGATGAACTGGTCTCAGCTAAAGAGACGATTCAAAAGGGTCAGGAAGAACTTGAAGCTACCTCTAATGAGCTTGCTTCTGCTGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTAGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAACAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAATGTCACTCTCTGAGGCGCTCGAGAGCACTCATTCCAAGAATGCCACTCTCGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACGGAAAGGGAGACTTTTGAAATGAGGTCTCGGCACCTCGAAGAGGAACTGGCCTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACCAGCAGTGTTCCCAGAACAAGTGTTCCCGCAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAATTGCTGCCGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA +>Ta_caputMedusae_TB2 +ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------ATGGATGAACCTCAGGCTGGCGGGACTATGATTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCGACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCTATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGATAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAAGTGACAGAAAAGGTTGGTGAAATGAACGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATGATAACAAGGAGAAACGCATTGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCTGAGGAAAAAATAAATGAGTTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCAAACCACGATTCTGAACTACTGTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTTCAATCCACTGAAGAGACCCTAATTGATTCCCGAACTGAGGTTTCCAAACTTTCCAAGGACCTTGATGAAGCAAATAGAACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGAAGCTACCTTTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGACAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTGGACGAGATGAACACGAGTGCATTGTCACTATCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAGGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACGAGGCTTCAGACAGAGAGGGAGACTTTTGAAATGAGGTCTAGGCACCTGGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAATTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCG--- +>Ae_bicornis_Tr408 +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATAATCGGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGAATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAAGTTTACTTAAATCCACTGAAGAGACCCTGAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGCACCTTGATGAAGCAAATAGAACAAATAAAGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCCGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAATTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCAAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCCCCCAGAACAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAGTTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCG--- +>Ae_speltoides_Tr251 +ATGCTTGATGAGACAAAAGATGTCCCAAAG------------------------------GTGGATGAACCTCAGAATGGCGGGACTTTGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCTGAATCATCCTTACCACTGGTGCAAAAACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCAATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGATAAAGCTGGGGATGACAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATGATAGCAAGGAGAAACGGATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTCGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAACTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCCGAACTACTGTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTTTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCTGGATTGAACAAGGAATTGGTTGCCACCAAAGCAATGCTAGATGATGAAGTTGCGGTACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGAAGAAGCAAATAGAACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGGAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTAGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAACAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCATTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTCGAAGCAGAGAAAGAAATGCTATCAAAAGCCCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACGGAAAGGGAGACTTTTGAAATGAGGTCTCGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGCGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCGCAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAATTGCTGCTGAGACTCCATATACTGTCAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCG--- +>T_boeoticum_TS10 +------------------------------------------------------------------------------------------------------------------------------------CTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCACTTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACGGAAGAAGCAAGCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAGTTGGCTTCAACAAAAAAGACTGTAACATCACTAAGCGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGATAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAAGAAAAAATAAGTCTACTCAGCCAACAGAATGATAGCAAGGGGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAACTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAATCACGATTCCAAACTACTGTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAGGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGCACCTTGATGAAGCAAATAGAACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCCGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGAAGCTACCTCTAATGAGCTTACTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTGGCTAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGCGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATACCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCAAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCTTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAACAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACGAGCAATGTACCCAGAACAAGTGTTCCCACAGAGACCAGTCAGGCCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAGGACCGGCGAAATTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA +>S_vavilovii_Tr279 +---CTTGATGAGACAAAAGATGTCCCAAAGGTGGATGAACCTCAGGCTGGCGGAACTATGGTTGATGATCCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAAAACCTCTACCTGAAGCCCCTCAACCTGAATCATCCTTACCGGTGGTGCAAACACAATCTTCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCGACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGCGGGAGACCTATGAAAAAAGGTTATCAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGCGACGAATTCAGAAGAGAGAAGGCACAGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGATAAAGCTGGGGGTGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATGATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCACCAAACAAAAGAGAGTCTTGAAGTTGCAAATGCTAAAATACAACAGCTGGAGGAAGAGATTCATACGACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTTATTGAGTGAGAAACTTCAAGTATTAAACTCTGCAAAGAAGCAAGCCGAGGAAAATATAAATGAGCTAATCAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCACGATTCCGAACTACTGTTTCAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTATGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGAATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTCGCGGCACTGAAAAGCCTTCGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGAACAAATAAGGACCTGGTATTGCAGATTTCAAACCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTCCAAGCTTGGAGAGGCAGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGGTTCAAAAGGGCCAGGAAGAACTTGAAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGACAACCTGAAGAAAGAACTGCTGGATGTGTACAAGAAGTTCGAATCCACCACGCAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTGGACGAGATGAACACGAGTGCATTGTCACTATCTAAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAGGCAGAGAAAGAAATGCTATCAAAAGCTCTTGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACGAGGCTTCAGACGGAGAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTCCCCAGAACAAGTCCATCGCCAGAAACCAGCACTGCTCCCAGAGCAAATAAGCCCACGGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAATTGCTGCCGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCG------ +>Ae_searsii_Tr164 +ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGACGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCAATTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAAATTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAAAATGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGTTAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCAGCCAACAGTATGATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATAATCGGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGGTTTACTTAAATCCACTGAAGAGACCCTGAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGCACCTTGATGAAGCAAATAGAACAAATAAAGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCCGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAATTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAACAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAGTTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA +>Ae_tauschii_Tr352 +ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAGCTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGCACATCTCGACAGGAAAAGGAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGATCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGATATTGGAGAGTAGTATTGATAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATGCTAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAGTTGATTCACTCAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCAAACCACGATTCTGAACTACTGTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAACTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGGACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTAAGGAAGAACTTGAAGCTACCTCTAATGAGCTTACTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTGGCTAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGTGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAATGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGTGAAATTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA +>T_urartu_Tr317 +---------GAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACTTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTGCTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGTTAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCAGCCAACAGTATGATAGCAAGGAGAAACGCATTGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCGGAGTATCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGCACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATGATCTGATCAAACGGATGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCAGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGGACAAATAAGGACCTGGCATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAAAACTTGAAGCTACCTCTAATGAGTTTGCTTCTGCCGTGGAAGCTCGTGACAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATCGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGCGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATACCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGTGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCCTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACCAGCCATGTTCCCCGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAATTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGCGGTGGGCCG--- +>Ae_caudata_Tr275 +ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGTTGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCAATTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAGGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGACTAGAGAGTAGTATTGTTAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCAGCCAACAGTATGATAGCAAGGAGAAACGCATTGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGGTTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGACTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATAATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTAATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTGAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGCACCTTGATGAAGCAAATAGAACAAATAAAGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTTTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACTAGATCACTAAACGAGATGAACACAAGCGCAGTGTCACTCTCAGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACGTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAACAAGTCCATCCACAGAAGCCAGCACTGCTCCCAGAACAAGTTCGCCCACAGAGACCAGCAATGTT---------------CCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGTGAAATTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCG--- +>Ae_tauschii_Tr180 +ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAGCTCCTCTGCTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGCACATCTCGACAGGAAAAGGAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTCTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGATATTGGAGAGTAGTATTGATAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATGCTAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAGTTGATTCACTCAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCAAACCACGATTCTGAACTACTGTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAACTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGGTGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGGACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTAAGGAAGAACTTGAAGCTACCTCTAATGAGCTTACTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTGGCTAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGTGAAATTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA +>Ae_sharonensis_Tr264 +ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCAATTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGTTAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCAGCCAACAGTATGATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAGACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATAATCGAATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGGTTTACTTAAATCCACTGAAGAGACCCTGAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGCACCTTGATGAAGCAAATAGAACAAATAAAGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCCGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTAAAGAGAATTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTTCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGGAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAACAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCAAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCAAAGTTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCG--- +>Er_bonaepartis_TB1 +------------ACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGACTGGCCGGACTATGATTGAAGAACCTCAGACTGGCAGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCAGCCTTACCAGTGGTGCAAAAACAATCTCCAGGGAATCCACTTGCTGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCGACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAAGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAACTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGCGAAGAATTCAGAAGAGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGATAAAGCTGGGGATGATAAAGGTGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAATCTACTCAGCCAACAGAATGATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCACCAAACTAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAGCTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCTTCAATTGAGTCACTGAGTGAGAAACTTCAAACATTAAATTCTGCAAAGAAGGAAGCCGATGAAAAAGTAAATGAGCTAATCAAAGAATGTACAGACTTGAAGGCTTCTTCTGAGATAAGAGCGAATCATGATTCCGAATTATTGTCTGAGAAAGATGATCTGATCAAACAACTGGAAGAGAAGCTCTCTGTTGCACTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGAGTTGAACAAGGAGTTGGATGCCACCAAAGCAATGCTAGACGACGAAGTCGCGGCACTGAAAAGTCTTAGAGATTTACTCAAATCCACTGAAGAGACCCTAAGTGATTCCCGTACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGAATGAACAAGGACCTGGCATTGCAGATTTCAAATCTCCAAAGCAAGTTCGATGAAACGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGGTTCAAAAGGGACAGGAAAAACTTGAAGCTACCTCTAATGAGCTTGCTTCTGCTGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAATCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTGGACGAGATGAACACGAGTGCATTGTCACTATCTAAGGCGCTAGAGAGCACTCATTCCAAGAATGCGACTCTTGAGGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAAAGAAAATGACGATTGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGACAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAACAAGTGCATCCACAGAAACCAGCAGTGCTCCAAGAGCAAGTTCGCCCACAGAGATCAGCAATGTTCCCAGTACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGCCTGTGAATGATGGT---ACTCAGAAGACCGGTGAAATTGCTGCTGAGACTCCATATACGGTAAGAGTAAAGGCTAGAAGAGGAAAAGGTGGTGCGTTGCGA +>Ae_bicornis_Tr406 +---CTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCTATTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCCTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGTTAAAGCTAGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCAGCCAACAGTATGATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATAATCGGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGAATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAAGTTTACTTAAATCCACTGAAGAGACCCTGAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGCACCTTGATGAAGCAAATAGAACAAATAAAGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCCGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAATTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCAAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCCCCCAGAACAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAGTTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA +>Ae_searsii_Tr161 +---------------------------------------------------------------------------------------------------------------------------------------------------CAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCAATTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAAATTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAAAATGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGTTAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCAGCCAACAGTATGATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATAATCGGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGGTTTACTTAAATCCACTGAAGAGACCCTGAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGCACCTTGATGAAGCAAATAGAACAAATAAAGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCCGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAATTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAACAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAGTTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCG--- +>Ae_umbellulata_Tr268 +ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTGTGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACAGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGTTAAAGCTGGGGGTGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCGGCCAACAGTATGATAGCAAGGAGAAACGCATTGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATAATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTAATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTGAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGCACCTTGATGAAGCAAATAGAACAAATAAAGACCTGGTATTGCAGATTTCAAATCTCCAAAGAGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTCTCAGCCAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTTGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAACAGGGAGCTTGAGGCTTTAGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAACAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTGGAAGAGGAACTGGCGTTAGCAAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAACAAGTCCATCCACAGAAGCCAGCACTGCTCCCAGAACAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTATGAATGATGGT---ACTCAGAAGACCGGCGAAGTTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCG--- +>T_urartu_Tr309 +ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACTTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTGCTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGTTAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCAGCCAACAGTATGATAGCAAGGAGAAACGCATTGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCGGAGTATCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGCACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATGATCTGATCAAACGGATGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCAGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGGACAAATAAGGACCTGGCATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAAAACTTGAAGCTACCTCTAATGAGTTTGCTTCTGCCGTGGAAGCTCGTGACAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATCGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGCGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATACCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGTGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCCTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACCAGCCATGTTCCCCGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAATTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGCGGT--------- +>Ae_tauschii_Tr351 +ATGCTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAGCTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGCACATCTCGACAGGAAAAGGAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGATCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGATATTGGAGAGTAGTATTGATAAAGCTGGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATGCTAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAGTTGATTCACTCAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCAAACCACGATTCTGAACTACTGTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAACTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGGATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGATGAAGCAAATAGGACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTAAGGAAGAACTTGAAGCTACCTCTAATGAGCTTACTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTGGCTAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGTGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAATGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGTGAAATTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA +>Ae_bicornis_Tr407 +---CTTGATGAGACAAAGGATGTCCCAAAG------------------------------GTGGATGAACCTCAGGCTGGCGGGACTATGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCCGAATCATCCTTACCAGTGGTGCAAACACAATCTTCAGGGAATCCTATTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTGTAAATGTCAAATTGGCTGAAAATGAGGCAGCGATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCCTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGTTAAAGCTAGGGATGATAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAGTTAAGTCTACTCAGCCAACAGTATGATAGCAAGGAGAAACGCATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTTGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAGCTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCTGAACTACTGTCTGAGAAAGATAATCGGATCAAACAGCTGGAAGAAAAGCTCTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCCGGATTGAACAAGGAATTGAATGCCACCAAAGCAATGCTAGACGATGAAGTTGCGGCACTGAAAAGCCTTAGAAGTTTACTTAAATCCACTGAAGAGACCCTGAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGCACCTTGATGAAGCAAATAGAACAAATAAAGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTGTCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGTAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACCACTTTGAATAGGGAGCTTGAGGCTTTGGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAGCAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCAGTGTCACTCTCCGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTTGAAGCAGAGAAAGAAATGCTATCAAAAGCTCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAATTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACAGAAAGGGAGACTTTTGAAATGAGGTCTAGGCACCTCGAAGAGGAACTGGCGTTAGCAAAGGGTGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCCCCCAGAACAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCACAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAGTTGCTGCTGAGACTCCATATACTGTAAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCGCGA +>Ae_speltoides_Tr320 +ATGCTTGATGAGACAAAAGATGTCCCAAAG------------------------------GTGGATGAACCTCAGAATGGCGGGACTTTGGTTGATGAACCTCAGACTGGCGGGACTCAGTCAGAAACTCCTCTACTTGAAGCCCCTCAACCTGAATCATCCTTACCACTGGTGCAAAAACAATCTCCAGGGAATCCACTTGCCGGACTTCTGAATGCAATTGCGGTTATTGCCTCGGGAGTTCTTGCTGGATTGTATGGTACATCTCAACAGGAAAAGAAGGCCCTGCAATCTGTCGTCTCATCTTTGGAGGTCAAATTGGCTGAAAATGAGGCAGCAATCTCATTGATGAGGGAGACCTATGAAAAAAGGTTATTAGAGCAACAAGCAGCACAGAAGAAGCAATCTATGAAGTTCCAGGAGCAGGAAGCTTCATTACTAGATCAATTGGCTTCAACAAAAAAGACTGTAACATCACTAAGTGAAGAATTCAGAAGGGAGAAGGCACGGGCTGAGGAGCTCAAGGATGAAATACGGAGATTAGAGAGTAGTATTGATAAAGCTGGGGATGACAAAGATGTGCTTGAAGCCAAACTGACAGAAAAGGTTGGTGAAATGAATGATTTGCAGGAAAAATTAAGTCTACTCAGCCAACAGAATGATAGCAAGGAGAAACGGATCGAGGAACTCAACTCATCACTTTCTTCAAAGGAAGCAGAGTACCAGAACCTGCGCCGTTTCTCTCATCAAACGAAAGAGAGTCTTGAACTCGCAAATGCTAAAATACAACAACTGGAGGAAGAGATTCATACAACTAAAAATGATCTTGCTTCTAAGATATCGTCAATTGATTCACTGAGTGAGAAACTTCAAGTATTAAACTCTGCAAAGAAGGAAGCCGAGGAAAAAATAAATGAGCTAATTAAAGAGTGTACAGACTTAAAGGCTTCTTCTGAGATAAGAGCGAACCATGATTCCGAACTACTGTCTGAGAAAGATGATCTGATCAAACAGCTGGAAGAAAAGCTTTCTGTTGCATTAAGTGCCTCTAGCAAAGACCATGAAGTCATTGCTGGATTGAACAAGGAATTGGTTGCCACCAAAGCAATGCTAGATGATGAAGTTGCGGTACTGAAAAGCCTTAGAGATTTACTTAAATCCACTGAAGAGACCCTAAGTGATTCCCGAACTGAGGTTTCCAAACTTTCCGAGGACCTTGAAGAAGCAAATAGAACAAATAAGGACCTGGTATTGCAGATTTCAAATCTCCAAAGCGAGTTCAATGAAATGCGAGAAGGTCTGACTTACAAGCTTGGAGAGGCTGAATCAGTATCTAAAGCTCTATCAGATGAACTGGTCTCAGCTAAAGAGATGATTCAAAAGGGTCAGGAAGAACTTGGAGCTACCTCTAATGAGCTTGCTTCTGCCGTGGAAGCTCGTGATAACCTGAAGAAAGAATTGCTGGATGTGTACAAGAAGTTCGAGTCCACCACACAGGAGCTTGTTGATGAAAGGAGAATTGTGACTACTTTGAATAGGGAGCTTGAGGCTTTAGCCAAACAATTGAATGCAGATTCTCAAGCACGAAAAGTACTCGAAACAGACCTGGATGAAGCAACCAGATCACTAAACGAGATGAACACGAGTGCATTGTCACTCTCTGAGGCGCTAGAGAGCACTCATTCCAAGAATGCCACTCTCGAAGCAGAGAAAGAAATGCTATCAAAAGCCCTCGATGAACAAACAAAACTGACAACCGAGGCTCAAGAGAACTGCGAGGATGCTCAGAATCTTATCACAAGGCTTCAGACGGAAAGGGAGACTTTTGAAATGAGGTCTCGGCACCTCGAAGAGGAACTGGCGTTAGCGAAGGGCGAGATGTTGCGCCTAAGGAGGCAGATTAGTGCAAGCAAATCCCAGAAAACAAGATATGTTCCCAGAGCAAGTGCATCCACAGAAACCAGCACTGCTCCCAGAGCAAGTTCGCCCACAGAGACCAGCAATGTTCCCAGAACAAGTGTTCCCGCAGAGACCAGTCAGACCCCGAACGAGCAGTCTGTGAATGATGGT---ACTCAGAAGACCGGCGAAATTGCTGCTGAGACTCCATATACTGTCAGAGTAAAGGCTAGGAGAGGAAAAGGTGGTGCGTCG--- diff --git a/examples/carnivores_trait.txt b/examples/carnivores_trait.txt new file mode 100644 index 0000000..37a1936 --- /dev/null +++ b/examples/carnivores_trait.txt @@ -0,0 +1,17 @@ +"tipnames","trait" +"Ailuridae",1.64288816228843 +"Canidae",1.67724405797551 +"Eupleridae",0.331567884748627 +"Felidae",2.27394657977653 +"Herpestidae",0.27523721665008 +"Hyaenidae",3.39093820521727 +"Mephitidae",0.355798965678337 +"Mustelidae",0.542564685398103 +"Nandiniidae",0.773436011788748 +"Odobenidae",6.94985285959642 +"Otariidae",4.78323112624972 +"Phocidae",5.33016498299617 +"Prionodontidae",-0.122604133046084 +"Procyonidae",0.739890139901583 +"Ursidae",4.84235723118862 +"Viverridae",1.0694997360571 diff --git a/examples/carnivores_tree.txt b/examples/carnivores_tree.txt new file mode 100644 index 0000000..4c3127b --- /dev/null +++ b/examples/carnivores_tree.txt @@ -0,0 +1 @@ +((((Prionodontidae:33.3,Felidae:33.3):5.3,(Viverridae:37.4,((Herpestidae:25.5,Eupleridae:25.5):6.7,Hyaenidae:32.2):5.2):1.2):5.9,Nandiniidae:44.5):14.7,(Canidae:48.9,(Ursidae:42.6,(((Odobenidae:14.1,Otariidae:14.1):10.4,Phocidae:24.5):16,(Mephitidae:32,(Ailuridae:30,(Mustelidae:27.4,Procyonidae:27.4):2.6):2):8.5):2.1):6.3):10.3); diff --git a/examples/caudata_Phytools.txt b/examples/caudata_Phytools.txt new file mode 100644 index 0000000..82f4bf8 --- /dev/null +++ b/examples/caudata_Phytools.txt @@ -0,0 +1,197 @@ +"trait","var" +4.67899890013259,0.109314410039819 +4.64311270571125,0.0698292915157906 +4.56976732699187,0.0553208146307361 +4.47122308926633,0.0637961125038939 +4.43930886351158,0.0780114436509626 +4.54413277790729,0.0266618708375659 +4.50621723981732,0.0183944596337243 +4.33235509318675,0.0252202820979854 +4.32770932002891,0.0236251122765271 +4.3327607245234,0.0183873684820126 +4.32890246447158,0.0182835570000748 +4.32610133513444,0.0198698643619857 +4.3489400904391,0.0246377707989465 +4.37349019541877,0.012683585757044 +4.31227626094053,0.0231102768292935 +4.27343537929314,0.0297840453123283 +4.38048358948841,0.0250524182947867 +4.40698730387776,0.0243156746810081 +4.41635664540065,0.0180161704198968 +4.34297694043103,0.0327375515158743 +4.18529459785425,0.0456889263799745 +4.08480885217138,0.040530871644948 +4.11952288595595,0.036837058031155 +4.38451821517461,0.0295438454444307 +4.11078294231073,0.0386365146583892 +4.15453245710416,0.0315978821201537 +4.10247652274494,0.0282518734243502 +4.08187449132479,0.0326815392179899 +4.23833187265699,0.0303199231384712 +4.25707227867322,0.0285526796918543 +3.99722036552212,0.0384475520332369 +3.94375798837552,0.0399111527121271 +4.01990955837853,0.0260432089842571 +4.01636434921841,0.0263331742940494 +3.76919113052195,0.0311961953152167 +3.7512153189483,0.0140929682689123 +3.67954781367588,0.0284804103025293 +4.10945162915407,0.0204200653480381 +4.10917044173029,0.020183018272656 +4.09420180355453,0.0269345025340272 +4.08524504552715,0.0248761056629811 +4.10932999529206,0.0203403190688002 +4.24444530466793,0.0276910051237845 +4.22195047944959,0.0227397271846079 +4.14645886222557,0.0124995586683843 +4.28564425796037,0.0200818603803941 +4.26640413644308,0.0162533827450683 +4.26456762453504,0.0135632240304726 +4.21524533614564,0.0395660065857571 +4.26160596048333,0.040472555024852 +4.2487776838365,0.0347102859074777 +4.3182463740002,0.0232306177329807 +4.5679273313009,0.0547185023008954 +4.47182842562339,0.0594481274490567 +4.46006659871382,0.0593280919374199 +4.08079006605161,0.0378350118442234 +3.98686231734448,0.0364369827304945 +3.90263454896072,0.0294914268477531 +3.82754578669576,0.0263905089183132 +3.7371193344236,0.0218887002676623 +3.73053662943123,0.0208841692658154 +3.72477902794296,0.0219844961298652 +3.79031117410085,0.0186203415374133 +3.91355447392164,0.0171486856442945 +3.93673168830398,0.0231246056727114 +3.92387140724521,0.015810542492652 +3.93788995261353,0.0160155138424257 +3.99827057809444,0.0177850261278542 +4.03541990331576,0.0192761866706572 +3.86532881699773,0.0168532834939069 +3.92862084078755,0.0183267135194587 +4.07864823137636,0.0185556116979347 +4.08195830296188,0.0119644596443707 +3.72006976565046,0.0191700511310791 +3.77417129770844,0.0186683936780537 +3.72945350552682,0.0203724569439805 +3.76102877143299,0.0216541102474904 +3.84709049006807,0.0238431390332153 +3.61997760367219,0.0187971667075353 +3.60159902470977,0.0121047455967402 +3.87556414789326,0.0253723308918168 +3.86849707484505,0.0243850799691118 +3.46018462598235,0.0221205791113163 +3.46668557803925,0.0188769266889322 +3.49658209071477,0.0159169693296282 +3.41010301339311,0.013825520693419 +3.70477683927952,0.0254981791739015 +3.67198364921292,0.0284043019314907 +3.70064038715898,0.0292228231467017 +3.73467979766918,0.0247652809022266 +3.59318451643607,0.012054058016927 +3.79868905240838,0.0233385851790114 +3.8356443279728,0.0397601776018479 +3.86575538016918,0.0398887363613873 +3.94270275611983,0.0347558514814494 +4.16276212649559,0.0268570858711541 +4.17092882594927,0.0281570164614328 +4.1916994606418,0.0280756745009395 +3.76093614059894,0.0181653853544619 +3.75161505329369,0.0202174118365854 +3.73470790970804,0.023393437377973 +3.74529377608786,0.0159847052082019 +3.75162737736798,0.0155591712145376 +3.77824362176149,0.0158729430084499 +3.99099674155283,0.0180824710437005 +3.72199088171876,0.0146921524249186 +3.71735334161905,0.0155950660641471 +3.67537062773419,0.0118964525488157 +3.67649748544402,0.010423501424044 +3.68090655469955,0.0124371419666096 +3.43593751044351,0.00290330536201637 +3.44685826884209,0.00242479493062794 +3.52832002345012,0.00183371225369777 +4.03888041448228,0.0274926298436421 +4.0092565478052,0.0305151894136195 +4.00052736372841,0.0289934712473055 +3.9979801406852,0.0304361898883555 +4.00567591995215,0.0296901272617857 +4.00031802921111,0.0297032757331755 +3.89142187798065,0.0153417205139238 +3.95011539169467,0.0238818517576036 +3.86793604062405,0.0231881584654679 +3.87795459826058,0.0136213858600441 +3.87819636152945,0.0123033934666079 +3.85333563763199,0.0126516592384117 +3.90181542444216,0.0104077540702241 +3.90069609712315,0.0101296794563937 +3.97004100971081,0.0191219208543058 +3.93808498893775,0.0196877375524917 +4.08235374425903,0.0115250659061056 +3.85911379624722,0.019488589276692 +3.79116966042657,0.0153667378194603 +3.77104315458489,0.0143791193929351 +4.08215389603982,0.0125313977617946 +4.07569320117954,0.0100173167149317 +4.07003583429668,0.00883786985999436 +4.06453755120777,0.014446756574711 +4.06684841902109,0.00855747224373044 +3.99504088999451,0.0135384611260499 +4.08010097976485,0.00891032523879438 +4.07181618539405,0.0102280253004767 +4.06955234140947,0.00901507802355138 +4.10085301721402,0.00535434717368554 +4.06317933723037,0.00640766821166191 +4.05056253414683,0.00663579343371508 +4.08515806804706,0.00629332303195367 +4.22417106412224,0.00452886540912638 +4.14520794581829,0.0113062713115813 +4.1642085976819,0.00904943462033821 +4.16744729579908,0.00809461309136364 +4.04396722048839,0.0259433686989069 +3.98489789757831,0.0413232442061479 +4.04919661198704,0.0257589485109312 +4.0513061337723,0.0261867513806219 +4.06309066688248,0.0357984757450229 +4.11745386447842,0.0306486553990582 +4.17495580369649,0.0284823887312932 +4.05274972281571,0.0315418327472608 +3.90294694997991,0.0308783644174905 +3.92115614932133,0.019053537621469 +3.98078533786807,0.0158123823491711 +4.04665033881598,0.0186668808921013 +3.98848144066389,0.0144302805011662 +4.02569094550892,0.0115813645064581 +4.00007364542004,0.0122164756988997 +4.02882252742083,0.0127189983375407 +4.06596814938632,0.0120673974623446 +4.08815884823344,0.0130684741137234 +5.96052648673321,0.00859508253343634 +5.79256514055283,0.00358190937228995 +3.84705582917961,0.00881631858643411 +3.84858095829371,0.00758389691126407 +3.85263712756421,0.00239550068687239 +4.69204466948456,0.0755725774712499 +4.884965507576,0.0587518335456658 +4.91961099305853,0.0521026994179491 +4.91802263560587,0.0527669273514701 +4.77008490781907,0.0917822653127358 +5.50992353396366,0.078603180832452 +4.37820011005071,0.0327039469025437 +4.36046735944414,0.0278081318712985 +4.3112733676559,0.0237663739352408 +4.29701350993971,0.0244551850610755 +4.33188528003585,0.0266279229941756 +4.45685162234265,0.0255786619368063 +4.18153644024446,0.0140419658445707 +4.17447660773753,0.0133751163033331 +4.16828117632518,0.0131676964978828 +4.1527356216972,0.0136705890281972 +4.15850153336582,0.0126951984375721 +4.15900363047967,0.0107173040085419 +4.17574722692131,0.0152621706167468 +4.19100769117827,0.015800769201849 +4.37668498481547,0.0390331749998527 +4.93020226108198,0.0860093273478187 +5.3445831084132,0.0263401817963831 diff --git a/examples/caudata_Rphylopars.txt b/examples/caudata_Rphylopars.txt new file mode 100644 index 0000000..9567f7d --- /dev/null +++ b/examples/caudata_Rphylopars.txt @@ -0,0 +1,394 @@ +"trait","var" +4.42184812886055,0 +4.51743127168008,0 +4.68213122712422,0 +4.43355115232727,0 +4.3210617205896,0 +4.47966365074837,0 +3.98713047791495,0 +4.44135041075727,0 +4.00551334851548,0 +4.40854684448328,0 +4.46791759256172,0 +4.37682400470252,0 +4.43698819274786,0 +4.51961229762644,0 +4.0943445622221,0 +4.39911725446659,0 +4.35502150652934,0 +3.52547778217249,0 +4.20123141243846,0 +4.76294286986063,0 +3.82537519870247,0 +4.30271282795416,0 +4.29387824789718,0 +4.35169628486605,0 +4.23555473077362,0 +3.79323946943818,0 +3.76699723337789,0 +3.99231183665695,0 +3.85142338329922,0 +3.70480201465775,0 +3.79098467705109,0 +3.6988297849671,0 +3.41772668361337,0 +4.00551334851548,0 +4.15304576682959,0 +4.05817319508393,0 +3.89182029811063,0 +4.32057002622753,0 +4.30811095172371,0 +4.15543966158191,0 +4.10791868224922,0 +4.22829253473184,0 +4.16278172377533,0 +4.36246147917904,0 +4.60266705576997,0 +4.41279829334063,0 +4.23916614676084,0 +4.4672864786247,0 +4.07584109065754,0 +4.50454842467744,0 +3.69424006035603,0 +3.98898404656427,0 +3.84801767545223,0 +4.01241117945941,0 +4.63812128612778,0 +3.94893335944824,0 +3.82319179172153,0 +3.80058852498184,0 +4.37866473983298,0 +4.12552017969055,0 +4.04129534113228,0 +3.55105313720653,0 +3.60114053980593,0 +2.96225304647982,0 +4.06263887373527,0 +3.97066920086088,0 +3.8649313978943,0 +3.3178157727231,0 +3.4904285153901,0 +4.29907292330404,0 +3.80291101734437,0 +3.92395157629342,0 +3.22286784613774,0 +3.40119738166216,0 +3.87057581551397,0 +3.38777436133001,0 +3.18013499655177,0 +3.75185425327532,0 +3.44680789291421,0 +3.68260984110034,0 +3.89792408104864,0 +3.90801498403061,0 +3.27336401015227,0 +3.68637632389582,0 +3.38777436133001,0 +3.79773385902602,0 +3.79773385902602,0 +3.9759363311718,0 +3.90197266957464,0 +4.50468664740977,0 +4.31715472463507,0 +4.32446372727274,0 +3.71332813451625,0 +3.50480636428118,0 +3.92592591059714,0 +3.40734511224839,0 +4.14128380814951,0 +4.07889245766318,0 +3.65970807681366,0 +3.7536132686805,0 +3.58351893845611,0 +3.77292184468871,0 +3.60086757679072,0 +3.99452422693989,0 +3.25848107946056,0 +3.30688670219091,0 +3.5548765217606,0 +3.62667154831465,0 +3.96128924673106,0 +3.9383435604935,0 +4.09217554493726,0 +4.12834333139423,0 +3.97687397774776,0 +3.77620328228561,0 +3.67545221079991,0 +3.89406268005115,0 +3.81308625756812,0 +3.84801767545223,0 +3.96043214463583,0 +3.80832776908938,0 +3.98555223871626,0 +4.0515240442057,0 +4.16037415865418,0 +3.75419892023458,0 +3.77007918448618,0 +3.73766961828337,0 +3.71153340467847,0 +4.40575536824794,0 +4.11998794220208,0 +4.00369019395397,0 +4.11414718951828,0 +3.70990682130601,0 +4.02980604108453,0 +4.00733318523247,0 +4.11087386417331,0 +4.11903717481247,0 +4.00914971615887,0 +3.96081316959758,0 +3.93116855415038,0 +4.26127043353808,0 +4.31160417037734,0 +4.26275029709698,0 +4.18677180246803,0 +4.26436859120565,0 +4.08092154188996,0 +3.94931879017184,0 +3.96651119071222,0 +4.16666522380173,0 +3.90841650983403,0 +3.98898404656427,0 +4.37332639712838,0 +4.17899203628239,0 +4.68203863024467,0 +3.37142522332849,0 +3.2557861788883,0 +4.3391191336626,0 +4.2850337899827,0 +3.81286543389493,0 +3.70831436675254,0 +4.19968007756742,0 +4.02168425963766,0 +4.14938499397991,0 +4.32714797316389,0 +4.01223026584517,0 +5.24372917626363,0 +6.22455842927536,0 +6.32051106692587,0 +3.89100363820407,0 +3.8155121050473,0 +3.85333400907947,0 +3.79773385902602,0 +4.98907111618042,0 +4.88225252927326,0 +4.92667380691538,0 +5.22666292049755,0 +4.83707524297087,0 +5.80211837537706,0 +5.73172184334544,0 +4.65538790214871,0 +4.42157782206069,0 +4.31079912538551,0 +3.82209829790016,0 +4.14472076954717,0 +4.17438726989564,0 +4.16666522380173,0 +3.94449019556565,0 +4.30541553230204,0 +4.11414718951828,0 +4.20841701848195,0 +4.25773810913054,0 +4.05644364442232,0 +4.67888522381037,0 +4.2941307757363,0 +4.45408563411598,0 +4.5013640172625,0 +5.55218409050509,0 +5.28421844216853,0 +4.67899890013258,0.108759514557383 +4.64311270571124,0.0694748281070804 +4.56976732699186,0.0550399983128131 +4.47122308926633,0.0634722743693561 +4.43930886351157,0.0776154464750694 +4.54413277790728,0.0265265313916899 +4.50621723981732,0.0183010867421825 +4.33235509318675,0.0250922603614475 +4.32770932002891,0.0235051878487275 +4.3327607245234,0.0182940315861649 +4.32890246447157,0.0181907470660643 +4.32610133513444,0.0197690021063412 +4.3489400904391,0.0245127059725559 +4.37349019541877,0.0126192020729981 +4.31227626094052,0.0229929657793986 +4.27343537929314,0.0296328572650577 +4.3804835894884,0.0249252486587726 +4.40698730387776,0.0241922448602923 +4.41635664540065,0.0179247177781714 +4.34297694043103,0.0325713710513268 +4.18529459785424,0.0454570028958121 +4.08480885217138,0.0403251311797452 +4.11952288595596,0.0366500678888648 +4.38451821517461,0.0293938766858295 +4.11078294231073,0.0384403902184989 +4.15453245710416,0.0314374867794422 +4.10247652274493,0.0281084628993535 +4.08187449132479,0.0325156430798275 +4.23833187265699,0.0301660148991896 +4.25707227867322,0.0284077422314895 +3.99722036552211,0.0382523867944894 +3.94375798837552,0.0397085580283092 +4.01990955837853,0.0259110099538802 +4.01636434921841,0.0261995033585466 +3.76919113052195,0.0310378389938197 +3.75121531894831,0.0140214303589178 +3.67954781367588,0.0283358396918565 +4.10945162915407,0.0203164101939872 +4.10917044173029,0.0200805664032517 +4.09420180355453,0.0267977791709103 +4.08524504552714,0.0247498310149456 +4.10932999529205,0.0202370687181971 +4.24444530466793,0.0275504416459988 +4.22195047944959,0.0226242970973764 +4.14645886222557,0.0124361091319965 +4.28564425796037,0.0199799220028286 +4.26640413644308,0.0161708782641289 +4.26456762453504,0.013494375177526 +4.21524533614563,0.0393651639127329 +4.26160596048332,0.0402671105831014 +4.2487776838365,0.0345340915627697 +4.3182463740002,0.0231126958155544 +4.5679273313009,0.0544407434059665 +4.47182842562339,0.0591463603046446 +4.46006659871382,0.0590269341103257 +4.08079006605161,0.0376429559465366 +3.98686231734447,0.0362520234272936 +3.90263454896071,0.0293417241733987 +3.82754578669576,0.0262565469441084 +3.7371193344236,0.0217775901140193 +3.73053662943123,0.0207781582543137 +3.72477902794297,0.02187289970281 +3.79031117410085,0.0185258220372234 +3.91355447392165,0.0170616364785874 +3.93673168830398,0.0230072218875707 +3.92387140724521,0.0157302859317756 +3.93788995261353,0.0159342168178449 +3.99827057809444,0.0176947468074083 +4.03541990331576,0.0191783380073544 +3.86532881699773,0.0167677338315013 +3.92862084078756,0.0182336845168218 +4.07864823137637,0.0184614207756101 +4.08195830296188,0.0119037263466836 +3.72006976565046,0.0190727412268604 +3.77417129770844,0.0185736302583682 +3.72945350552683,0.0202690434569552 +3.76102877143299,0.0215441909061326 +3.84709049006808,0.0237221078706102 +3.61997760367219,0.0187017496176494 +3.60159902470977,0.0120433001876197 +3.87556414789326,0.0252435373339904 +3.86849707484505,0.0242612978372889 +3.46018462598235,0.0220082919077056 +3.46668557803925,0.0187811047260442 +3.49658209071477,0.0158361725310006 +3.41010301339311,0.0137553403853305 +3.70477683927952,0.025368746792308 +3.67198364921292,0.0282601176577267 +3.70064038715898,0.0290744839429113 +3.73467979766918,0.0246395688164284 +3.59318451643607,0.0119928699051659 +3.79868905240838,0.0232201152034834 +3.83564432797281,0.039558349289148 +3.86575538016918,0.0396862554661517 +3.94270275611981,0.0345794258394112 +4.16276212649558,0.0267207554860212 +4.17092882594926,0.028014087443862 +4.19169946064179,0.0279331583867214 +3.76093614059892,0.0180731752765203 +3.75161505329368,0.020114785380562 +3.73470790970804,0.0232746889648867 +3.74529377608784,0.0159035645726272 +3.75162737736797,0.0154801906499967 +3.77824362176148,0.0157923696936861 +3.99099674155283,0.0179906818505852 +3.72199088171875,0.014617572970985 +3.71735334161905,0.0155159032922479 +3.67537062773419,0.0118360644648115 +3.67649748544402,0.0103705902493027 +3.68090655469952,0.0123740092662714 +3.4359375104435,0.00288856777134622 +3.44685826884209,0.00241248632691916 +3.52832002345011,0.00182440406966884 +4.03888041448229,0.0273530733469738 +4.0092565478052,0.0303602899749716 +4.00052736372841,0.0288462962663547 +3.9979801406852,0.0302816914625263 +4.00567591995215,0.0295394159558883 +4.00031802921111,0.0295524976837685 +3.89142187798065,0.0152638437600461 +3.95011539169467,0.0237606240837073 +3.86793604062404,0.0230704520773183 +3.87795459826058,0.013552241769384 +3.87819636152944,0.0122409396926657 +3.85333563763199,0.0125874376179121 +3.90181542444216,0.0103549228312889 +3.90069609712315,0.0100782597637216 +3.97004100971081,0.019024855266213 +3.93808498893775,0.0195877997984182 +4.08235374425903,0.0114665630334857 +3.85911379624722,0.0193896624275718 +3.79116966042657,0.0152887340741839 +3.77104315458489,0.0143061289391639 +4.08215389603982,0.0124677866056434 +4.07569320117954,0.00996646739150563 +4.07003583429668,0.0087930075764411 +4.06453755120777,0.0143734227849917 +4.06684841902109,0.0085140332983308 +3.99504088999451,0.0134697379731258 +4.08010097976486,0.00886509516144011 +4.07181618539405,0.010176106390322 +4.06955234140947,0.00896931620617295 +4.10085301721402,0.00532716774640795 +4.06317933723036,0.00637514197708495 +4.05056253414682,0.00660210920308709 +4.08515806804706,0.00626137722976101 +4.22417106412224,0.00450587624461304 +4.14520794581829,0.011248879071421 +4.1642085976819,0.00900349840399131 +4.16744729579908,0.00805352368480849 +4.0439672204884,0.0258116764720089 +3.98489789757831,0.041113481545203 +4.04919661198704,0.0256281924271194 +4.0513061337723,0.026053823708639 +4.06309066688248,0.0356167575940329 +4.11745386447842,0.0304930784680985 +4.17495580369649,0.0283378080778349 +4.05274972281571,0.0313817219211325 +3.90294694997991,0.0307216214509042 +3.92115614932133,0.0189568191563854 +3.98078533786806,0.0157321164489215 +4.04665033881598,0.0185721251515323 +3.98848144066389,0.014357030346338 +4.02569094550892,0.011522575854141 +4.00007364542004,0.0121544631319002 +4.02882252742083,0.0126544348942029 +4.06596814938631,0.0120061416376626 +4.08815884823344,0.013002136681674 +5.96052648673317,0.00855145267286051 +5.79256514055282,0.00356372709121233 +3.84705582917972,0.00877156570020868 +3.84858095829379,0.00754539997262829 +3.85263712756422,0.00238334078490857 +4.69204466948456,0.0751889603267253 +4.88496550757599,0.0584536008880735 +4.91961099305853,0.0518382187102437 +4.91802263560587,0.0524990749283662 +4.77008490781906,0.0913163654888126 +5.50992353396366,0.0782041799145207 +4.3782001100507,0.0325379370197896 +4.36046735944413,0.0276669738414949 +4.31127336765589,0.0236457324431837 +4.2970135099397,0.0243310470658416 +4.33188528003584,0.0264927558723777 +4.45685162234265,0.0254488210132692 +4.18153644024445,0.0139706868301312 +4.17447660773752,0.0133072223119456 +4.16828117632517,0.0131008553989087 +4.1527356216972,0.0136011951752622 +4.15850153336582,0.0126307558059093 +4.15900363047967,0.0106629014501229 +4.1757472269213,0.0151846976694536 +4.19100769117827,0.0157205622515858 +4.37668498481546,0.0388350370556909 +4.93020226108197,0.0855727317775253 +5.3445831084132,0.0262064752898024 diff --git a/examples/caudata_shared_paths.txt b/examples/caudata_shared_paths.txt new file mode 100644 index 0000000..572c5c5 --- /dev/null +++ b/examples/caudata_shared_paths.txt @@ -0,0 +1,394 @@ +"V1","V2","V3","V4","V5","V6","V7","V8","V9","V10","V11","V12","V13","V14","V15","V16","V17","V18","V19","V20","V21","V22","V23","V24","V25","V26","V27","V28","V29","V30","V31","V32","V33","V34","V35","V36","V37","V38","V39","V40","V41","V42","V43","V44","V45","V46","V47","V48","V49","V50","V51","V52","V53","V54","V55","V56","V57","V58","V59","V60","V61","V62","V63","V64","V65","V66","V67","V68","V69","V70","V71","V72","V73","V74","V75","V76","V77","V78","V79","V80","V81","V82","V83","V84","V85","V86","V87","V88","V89","V90","V91","V92","V93","V94","V95","V96","V97","V98","V99","V100","V101","V102","V103","V104","V105","V106","V107","V108","V109","V110","V111","V112","V113","V114","V115","V116","V117","V118","V119","V120","V121","V122","V123","V124","V125","V126","V127","V128","V129","V130","V131","V132","V133","V134","V135","V136","V137","V138","V139","V140","V141","V142","V143","V144","V145","V146","V147","V148","V149","V150","V151","V152","V153","V154","V155","V156","V157","V158","V159","V160","V161","V162","V163","V164","V165","V166","V167","V168","V169","V170","V171","V172","V173","V174","V175","V176","V177","V178","V179","V180","V181","V182","V183","V184","V185","V186","V187","V188","V189","V190","V191","V192","V193","V194","V195","V196","V197","V198","V199","V200","V201","V202","V203","V204","V205","V206","V207","V208","V209","V210","V211","V212","V213","V214","V215","V216","V217","V218","V219","V220","V221","V222","V223","V224","V225","V226","V227","V228","V229","V230","V231","V232","V233","V234","V235","V236","V237","V238","V239","V240","V241","V242","V243","V244","V245","V246","V247","V248","V249","V250","V251","V252","V253","V254","V255","V256","V257","V258","V259","V260","V261","V262","V263","V264","V265","V266","V267","V268","V269","V270","V271","V272","V273","V274","V275","V276","V277","V278","V279","V280","V281","V282","V283","V284","V285","V286","V287","V288","V289","V290","V291","V292","V293","V294","V295","V296","V297","V298","V299","V300","V301","V302","V303","V304","V305","V306","V307","V308","V309","V310","V311","V312","V313","V314","V315","V316","V317","V318","V319","V320","V321","V322","V323","V324","V325","V326","V327","V328","V329","V330","V331","V332","V333","V334","V335","V336","V337","V338","V339","V340","V341","V342","V343","V344","V345","V346","V347","V348","V349","V350","V351","V352","V353","V354","V355","V356","V357","V358","V359","V360","V361","V362","V363","V364","V365","V366","V367","V368","V369","V370","V371","V372","V373","V374","V375","V376","V377","V378","V379","V380","V381","V382","V383","V384","V385","V386","V387","V388","V389","V390","V391","V392","V393" +213.99708805,198.11302516,189.88047591,96,96,96,96,96,96,96,96,96,96,96,96,96,96,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,189.88047591,198.11302516,96,96,96,96,96,96,96,96,96,96,96,96,96,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +198.11302516,213.99708805,189.88047591,96,96,96,96,96,96,96,96,96,96,96,96,96,96,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,189.88047591,198.11302516,96,96,96,96,96,96,96,96,96,96,96,96,96,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +189.88047591,189.88047591,213.99708805,96,96,96,96,96,96,96,96,96,96,96,96,96,96,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,189.88047591,189.88047591,96,96,96,96,96,96,96,96,96,96,96,96,96,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,214,204.44673321,173.71836724,168.07105209,168.07105209,162.74420694,162.74420694,161.82538688,161.82538688,161.82538688,161.82538688,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,162.74420694,168.07105209,173.71836724,204.44673321,168.07105209,162.74420694,161.82538688,161.82538688,161.82538688,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,204.44673321,214,173.71836724,168.07105209,168.07105209,162.74420694,162.74420694,161.82538688,161.82538688,161.82538688,161.82538688,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,162.74420694,168.07105209,173.71836724,204.44673321,168.07105209,162.74420694,161.82538688,161.82538688,161.82538688,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,173.71836724,173.71836724,214.00000001,168.07105209,168.07105209,162.74420694,162.74420694,161.82538688,161.82538688,161.82538688,161.82538688,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,162.74420694,168.07105209,173.71836724,173.71836724,168.07105209,162.74420694,161.82538688,161.82538688,161.82538688,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,168.07105209,168.07105209,168.07105209,214.00000002,171.09621204,162.74420694,162.74420694,161.82538688,161.82538688,161.82538688,161.82538688,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,162.74420694,168.07105209,168.07105209,168.07105209,171.09621204,162.74420694,161.82538688,161.82538688,161.82538688,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,168.07105209,168.07105209,168.07105209,171.09621204,214.00000001,162.74420694,162.74420694,161.82538688,161.82538688,161.82538688,161.82538688,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,162.74420694,168.07105209,168.07105209,168.07105209,171.09621204,162.74420694,161.82538688,161.82538688,161.82538688,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,162.74420694,162.74420694,162.74420694,162.74420694,162.74420694,214,177.84429677,161.82538688,161.82538688,161.82538688,161.82538688,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,162.74420694,162.74420694,162.74420694,162.74420694,162.74420694,177.84429677,161.82538688,161.82538688,161.82538688,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,162.74420694,162.74420694,162.74420694,162.74420694,162.74420694,177.84429677,214,161.82538688,161.82538688,161.82538688,161.82538688,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,162.74420694,162.74420694,162.74420694,162.74420694,162.74420694,177.84429677,161.82538688,161.82538688,161.82538688,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,213.99999998,198.13727189,185.78114203,171.23005562,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,171.23005562,185.78114203,198.13727189,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,198.13727189,213.99999999,185.78114203,171.23005562,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,171.23005562,185.78114203,198.13727189,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,185.78114203,185.78114203,213.99999998,171.23005562,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,171.23005562,185.78114203,185.78114203,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,171.23005562,171.23005562,171.23005562,213.99999999,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,171.23005562,171.23005562,171.23005562,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,213.99999999,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,213.99999999,162.5888361,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,162.5888361,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,162.5888361,213.99999999,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,162.5888361,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,213.999794,149.73678053,149.73678053,149.73678053,149.73678053,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,149.73678053,149.73678053,149.73678053,149.73678053,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,149.73678053,213.99989699,189.15614069,155.41855816,155.41855816,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,149.73678053,155.41855816,189.15614069,155.41855816,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,149.73678053,189.15614069,213.999897,155.41855816,155.41855816,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,149.73678053,155.41855816,189.15614069,155.41855816,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,149.73678053,155.41855816,155.41855816,213.99979402,160.42743814,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,149.73678053,155.41855816,155.41855816,160.42743814,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,149.73678053,155.41855816,155.41855816,160.42743814,213.99979402,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,149.73678053,155.41855816,155.41855816,160.42743814,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,213.99969097,182.95648009,178.53006394,140.87910724,140.87910724,140.87910724,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,140.87910724,178.53006394,182.95648009,140.87910724,140.87910724,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,182.95648009,213.99979398,178.53006394,140.87910724,140.87910724,140.87910724,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,140.87910724,178.53006394,182.95648009,140.87910724,140.87910724,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,178.53006394,178.53006394,213.999794,140.87910724,140.87910724,140.87910724,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,140.87910724,178.53006394,178.53006394,140.87910724,140.87910724,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,140.87910724,140.87910724,140.87910724,213.99979402,154.04072992,154.04072992,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,140.87910724,140.87910724,140.87910724,154.04072992,154.04072992,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,140.87910724,140.87910724,140.87910724,154.04072992,213.99979401,171.68572763,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,140.87910724,140.87910724,140.87910724,154.04072992,171.68572763,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,140.87910724,140.87910724,140.87910724,154.04072992,171.68572763,213.99979401,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,140.87910724,140.87910724,140.87910724,154.04072992,171.68572763,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,213.99989697,147.0483829,147.0483829,147.0483829,147.0483829,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,147.0483829,147.0483829,147.0483829,147.0483829,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,147.0483829,213.99979401,203.32621888,174.4478731,174.4478731,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,147.0483829,174.4478731,203.32621888,174.4478731,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,147.0483829,203.32621888,213.99979401,174.4478731,174.4478731,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,147.0483829,174.4478731,203.32621888,174.4478731,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,147.0483829,174.4478731,174.4478731,213.999897,185.12144823,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,147.0483829,174.4478731,174.4478731,185.12144823,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,147.0483829,174.4478731,174.4478731,185.12144823,213.999897,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,147.0483829,174.4478731,174.4478731,185.12144823,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,213.99979401,190.84430732,173.4615839,162.8003474,162.8003474,162.8003474,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,162.8003474,173.4615839,190.84430732,162.8003474,162.8003474,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,190.84430732,213.99989697,173.4615839,162.8003474,162.8003474,162.8003474,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,162.8003474,173.4615839,190.84430732,162.8003474,162.8003474,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,173.4615839,173.4615839,213.99979397,162.8003474,162.8003474,162.8003474,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,162.8003474,173.4615839,173.4615839,162.8003474,162.8003474,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,162.8003474,162.8003474,162.8003474,213.999897,162.94228111,162.94228111,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,162.8003474,162.8003474,162.8003474,162.94228111,162.94228111,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,162.8003474,162.8003474,162.8003474,162.94228111,213.99989701,188.03694493,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,162.8003474,162.8003474,162.8003474,162.94228111,188.03694493,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,162.8003474,162.8003474,162.8003474,162.94228111,188.03694493,213.99989706,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,162.8003474,162.8003474,162.8003474,162.94228111,188.03694493,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,213.999794,204.39393021,179.86154228,179.86154228,179.86154228,179.86154228,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,204.39393021,179.86154228,179.86154228,179.86154228,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,204.39393021,213.999794,179.86154228,179.86154228,179.86154228,179.86154228,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,204.39393021,179.86154228,179.86154228,179.86154228,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,179.86154228,213.99979404,195.03166093,195.03166093,186.70711458,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,179.86154228,186.70711458,195.03166093,195.03166093,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,179.86154228,195.03166093,213.99989701,201.11266578,186.70711458,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,179.86154228,186.70711458,195.03166093,201.11266578,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,179.86154228,195.03166093,201.11266578,213.99989706,186.70711458,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,179.86154228,186.70711458,195.03166093,201.11266578,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,179.86154228,186.70711458,186.70711458,186.70711458,213.999897,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,179.86154228,186.70711458,186.70711458,186.70711458,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,213.99989703,159.86289628,159.86289628,159.86289628,135.92698014,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,135.92698014,159.86289628,159.86289628,159.86289628,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,159.86289628,213.99989702,194.3563943,174.85080831,135.92698014,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,135.92698014,159.86289628,174.85080831,194.3563943,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,159.86289628,194.3563943,213.99989702,174.85080831,135.92698014,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,135.92698014,159.86289628,174.85080831,194.3563943,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,159.86289628,174.85080831,174.85080831,213.99989702,135.92698014,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,135.92698014,159.86289628,174.85080831,174.85080831,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,135.92698014,135.92698014,135.92698014,135.92698014,213.99979401,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,135.92698014,135.92698014,135.92698014,135.92698014,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,213.98213407,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,213.98213409,200.76135061,184.93214228,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,184.93214228,200.76135061,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,200.76135061,213.98213408,184.93214228,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,184.93214228,200.76135061,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,184.93214228,184.93214228,213.96426815,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,184.93214228,184.93214228,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,172.0150795,172.0150795,172.0150795,213.98213407,183.44927061,181.25176201,181.25176201,174.94509097,174.94509097,174.94509097,174.94509097,174.94509097,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,172.0150795,172.0150795,174.94509097,181.25176201,183.44927061,181.25176201,174.94509097,174.94509097,174.94509097,174.94509097,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,172.0150795,172.0150795,172.0150795,183.44927061,213.96426814,181.25176201,181.25176201,174.94509097,174.94509097,174.94509097,174.94509097,174.94509097,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,172.0150795,172.0150795,174.94509097,181.25176201,183.44927061,181.25176201,174.94509097,174.94509097,174.94509097,174.94509097,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,172.0150795,172.0150795,172.0150795,181.25176201,181.25176201,213.96426815,199.38567448,174.94509097,174.94509097,174.94509097,174.94509097,174.94509097,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,172.0150795,172.0150795,174.94509097,181.25176201,181.25176201,199.38567448,174.94509097,174.94509097,174.94509097,174.94509097,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,172.0150795,172.0150795,172.0150795,181.25176201,181.25176201,199.38567448,213.96426815,174.94509097,174.94509097,174.94509097,174.94509097,174.94509097,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,172.0150795,172.0150795,174.94509097,181.25176201,181.25176201,199.38567448,174.94509097,174.94509097,174.94509097,174.94509097,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,213.98213407,192.68595312,192.68595312,182.25225373,182.25225373,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,182.25225373,192.68595312,192.68595312,182.25225373,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,192.68595312,213.99999999,204.04868053,182.25225373,182.25225373,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,182.25225373,192.68595312,204.04868053,182.25225373,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,192.68595312,204.04868053,213.99999999,182.25225373,182.25225373,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,182.25225373,192.68595312,204.04868053,182.25225373,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,182.25225373,182.25225373,182.25225373,213.98213407,195.58023275,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,182.25225373,182.25225373,182.25225373,195.58023275,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,182.25225373,182.25225373,182.25225373,195.58023275,213.98213407,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,182.25225373,182.25225373,182.25225373,195.58023275,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,213.96426815,168.17390592,168.17390592,168.17390592,168.17390592,168.17390592,164.86871005,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,168.17390592,168.17390592,168.17390592,168.17390592,168.17390592,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,168.17390592,213.96426814,185.25372889,177.96443206,177.96443206,177.96443206,164.86871005,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,168.17390592,177.96443206,185.25372889,177.96443206,177.96443206,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,168.17390592,185.25372889,213.99999998,177.96443206,177.96443206,177.96443206,164.86871005,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,168.17390592,177.96443206,185.25372889,177.96443206,177.96443206,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,168.17390592,177.96443206,177.96443206,213.96426816,203.78069169,194.40108179,164.86871005,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,168.17390592,177.96443206,177.96443206,194.40108179,203.78069169,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,168.17390592,177.96443206,177.96443206,203.78069169,213.98213407,194.40108179,164.86871005,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,168.17390592,177.96443206,177.96443206,194.40108179,203.78069169,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,168.17390592,177.96443206,177.96443206,194.40108179,194.40108179,213.96426816,164.86871005,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,168.17390592,177.96443206,177.96443206,194.40108179,194.40108179,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,213.98213408,174.67710212,174.67710212,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,174.67710212,174.67710212,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,174.67710212,213.98213408,190.82789707,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,174.67710212,190.82789707,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,174.67710212,190.82789707,213.98213408,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,174.67710212,190.82789707,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,213.96426815,200.51122766,194.57974102,188.23733814,184.28896902,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,184.28896902,188.23733814,194.57974102,200.51122766,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,200.51122766,213.96426815,194.57974102,188.23733814,184.28896902,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,184.28896902,188.23733814,194.57974102,200.51122766,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,194.57974102,194.57974102,213.96426814,188.23733814,184.28896902,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,184.28896902,188.23733814,194.57974102,194.57974102,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,188.23733814,188.23733814,188.23733814,213.96426814,184.28896902,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,184.28896902,188.23733814,188.23733814,188.23733814,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,184.28896902,184.28896902,184.28896902,184.28896902,213.96426815,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,184.28896902,184.28896902,184.28896902,184.28896902,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,213.96426815,167.11981642,167.11981642,167.11981642,167.11981642,158.7049664,150.09359122,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,150.09359122,158.7049664,167.11981642,167.11981642,167.11981642,167.11981642,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,167.11981642,213.96426816,204.74545157,181.84133749,181.84133749,158.7049664,150.09359122,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,150.09359122,158.7049664,167.11981642,181.84133749,204.74545157,181.84133749,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,167.11981642,204.74545157,213.96426816,181.84133749,181.84133749,158.7049664,150.09359122,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,150.09359122,158.7049664,167.11981642,181.84133749,204.74545157,181.84133749,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,167.11981642,181.84133749,181.84133749,213.94640223,189.38075726,158.7049664,150.09359122,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,150.09359122,158.7049664,167.11981642,181.84133749,181.84133749,189.38075726,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,167.11981642,181.84133749,181.84133749,189.38075726,213.94640224,158.7049664,150.09359122,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,150.09359122,158.7049664,167.11981642,181.84133749,181.84133749,189.38075726,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,158.7049664,158.7049664,158.7049664,158.7049664,158.7049664,213.96426814,150.09359122,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,150.09359122,158.7049664,158.7049664,158.7049664,158.7049664,158.7049664,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,150.09359122,150.09359122,150.09359122,150.09359122,150.09359122,150.09359122,213.98213407,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,150.09359122,150.09359122,150.09359122,150.09359122,150.09359122,150.09359122,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,213.96426815,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,213.96426815,148.70004917,148.70004917,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,148.70004917,148.70004917,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,148.70004917,213.96426814,175.89198491,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,148.70004917,175.89198491,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,148.70004917,175.89198491,213.96426814,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,148.70004917,175.89198491,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,213.98213407,176.98180625,172.31880019,172.31880019,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,172.31880019,176.98180625,172.31880019,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,176.98180625,213.98213407,172.31880019,172.31880019,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,172.31880019,176.98180625,172.31880019,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,172.31880019,172.31880019,213.98213406,176.51729224,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,172.31880019,172.31880019,176.51729224,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,172.31880019,172.31880019,176.51729224,213.98213406,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,172.31880019,172.31880019,176.51729224,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,213.98213408,177.28552697,177.28552697,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,177.28552697,177.28552697,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,177.28552697,214.00000001,188.45172923,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,177.28552697,188.45172923,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,177.28552697,188.45172923,214.00000001,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,177.28552697,188.45172923,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,213.98213407,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,213.98213407,197.08097033,181.98426488,181.98426488,181.98426488,181.98426488,181.98426488,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,181.98426488,197.08097033,181.98426488,181.98426488,181.98426488,181.98426488,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,197.08097033,213.98213407,181.98426488,181.98426488,181.98426488,181.98426488,181.98426488,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,181.98426488,197.08097033,181.98426488,181.98426488,181.98426488,181.98426488,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,181.98426488,181.98426488,214,195.13358466,191.04228815,191.04228815,191.04228815,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,181.98426488,181.98426488,191.04228815,195.13358466,191.04228815,191.04228815,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,181.98426488,181.98426488,195.13358466,214,191.04228815,191.04228815,191.04228815,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,181.98426488,181.98426488,191.04228815,195.13358466,191.04228815,191.04228815,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,181.98426488,181.98426488,191.04228815,191.04228815,214,203.61989838,200.22537289,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,181.98426488,181.98426488,191.04228815,191.04228815,200.22537289,203.61989838,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,181.98426488,181.98426488,191.04228815,191.04228815,203.61989838,214,200.22537289,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,181.98426488,181.98426488,191.04228815,191.04228815,200.22537289,203.61989838,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,181.98426488,181.98426488,191.04228815,191.04228815,200.22537289,200.22537289,214,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,181.98426488,181.98426488,191.04228815,191.04228815,200.22537289,200.22537289,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,213.98213408,203.08392067,203.08392067,203.08392067,203.08392067,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,203.08392067,203.08392067,203.08392067,203.08392067,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,203.08392067,213.98213408,210.8198656,210.8198656,210.8198656,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,203.08392067,210.8198656,210.8198656,210.8198656,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,203.08392067,210.8198656,213.98213408,211.26651369,211.26651369,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,203.08392067,210.8198656,211.26651369,211.26651369,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,203.08392067,210.8198656,211.26651369,213.98213408,212.33846911,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,203.08392067,210.8198656,211.26651369,212.33846911,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,203.08392067,210.8198656,211.26651369,212.33846911,213.98213408,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,203.08392067,210.8198656,211.26651369,212.33846911,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,213.96426813,170.76446483,170.76446483,159.58039665,159.58039665,159.58039665,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,159.58039665,170.76446483,170.76446483,159.58039665,159.58039665,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,170.76446483,213.98213406,183.1455499,159.58039665,159.58039665,159.58039665,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,159.58039665,170.76446483,183.1455499,159.58039665,159.58039665,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,170.76446483,183.1455499,213.98213406,159.58039665,159.58039665,159.58039665,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,159.58039665,170.76446483,183.1455499,159.58039665,159.58039665,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,159.58039665,159.58039665,159.58039665,213.96426814,160.63448614,160.63448614,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,159.58039665,159.58039665,159.58039665,160.63448614,160.63448614,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,159.58039665,159.58039665,159.58039665,160.63448614,213.98213406,202.53007702,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,159.58039665,159.58039665,159.58039665,160.63448614,202.53007702,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,159.58039665,159.58039665,159.58039665,160.63448614,202.53007702,213.98213406,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,159.58039665,159.58039665,159.58039665,160.63448614,202.53007702,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,213.96426814,181.78773971,181.78773971,181.78773971,181.78773971,181.78773971,181.78773971,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,181.78773971,181.78773971,181.78773971,181.78773971,181.78773971,181.78773971,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,181.78773971,213.94640223,192.72168497,192.72168497,192.72168497,192.72168497,192.72168497,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,181.78773971,192.72168497,192.72168497,192.72168497,192.72168497,192.72168497,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,181.78773971,192.72168497,213.94640223,201.20799869,194.2581544,194.2581544,194.2581544,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,181.78773971,192.72168497,194.2581544,201.20799869,194.2581544,194.2581544,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,181.78773971,192.72168497,201.20799869,213.94640223,194.2581544,194.2581544,194.2581544,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,181.78773971,192.72168497,194.2581544,201.20799869,194.2581544,194.2581544,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,181.78773971,192.72168497,194.2581544,194.2581544,213.96426814,200.58269136,200.58269136,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,181.78773971,192.72168497,194.2581544,194.2581544,200.58269136,200.58269136,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,181.78773971,192.72168497,194.2581544,194.2581544,200.58269136,213.94640222,202.31568595,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,181.78773971,192.72168497,194.2581544,194.2581544,200.58269136,202.31568595,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,181.78773971,192.72168497,194.2581544,194.2581544,200.58269136,202.31568595,213.94640222,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,181.78773971,192.72168497,194.2581544,194.2581544,200.58269136,202.31568595,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,213.96426814,205.20996557,178.44681199,178.44681199,178.44681199,178.44681199,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,178.44681199,205.20996557,178.44681199,178.44681199,178.44681199,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,205.20996557,213.96426814,178.44681199,178.44681199,178.44681199,178.44681199,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,178.44681199,205.20996557,178.44681199,178.44681199,178.44681199,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,178.44681199,178.44681199,213.98213406,185.7182429,185.7182429,185.7182429,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,178.44681199,178.44681199,185.7182429,185.7182429,185.7182429,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,178.44681199,178.44681199,185.7182429,213.98213406,195.22291427,195.22291427,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,178.44681199,178.44681199,185.7182429,195.22291427,195.22291427,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,178.44681199,178.44681199,185.7182429,195.22291427,213.98213407,198.56384199,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,178.44681199,178.44681199,185.7182429,195.22291427,198.56384199,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,178.44681199,178.44681199,185.7182429,195.22291427,198.56384199,213.98213407,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,178.44681199,178.44681199,185.7182429,195.22291427,198.56384199,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,213.96426814,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,213.98213406,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,213.98213406,197.33109325,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,197.33109325,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,197.33109325,213.98213406,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,197.33109325,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,213.96426814,195.27651204,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,195.27651204,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,195.27651204,213.96426814,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,195.27651204,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,213.96426815,204.69185379,204.69185379,196.95590886,196.95590886,196.95590886,196.95590886,196.95590886,191.38174069,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,196.95590886,204.69185379,204.69185379,196.95590886,196.95590886,196.95590886,196.95590886,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,204.69185379,213.96426815,209.56925094,196.95590886,196.95590886,196.95590886,196.95590886,196.95590886,191.38174069,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,196.95590886,204.69185379,209.56925094,196.95590886,196.95590886,196.95590886,196.95590886,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,204.69185379,209.56925094,213.96426815,196.95590886,196.95590886,196.95590886,196.95590886,196.95590886,191.38174069,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,196.95590886,204.69185379,209.56925094,196.95590886,196.95590886,196.95590886,196.95590886,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,196.95590886,196.95590886,196.95590886,213.96426814,205.04917226,204.19160793,204.19160793,204.19160793,191.38174069,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,196.95590886,196.95590886,196.95590886,204.19160793,205.04917226,204.19160793,204.19160793,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,196.95590886,196.95590886,196.95590886,205.04917226,213.96426814,204.19160793,204.19160793,204.19160793,191.38174069,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,196.95590886,196.95590886,196.95590886,204.19160793,205.04917226,204.19160793,204.19160793,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,196.95590886,196.95590886,196.95590886,204.19160793,204.19160793,213.96426815,205.81740698,205.81740698,191.38174069,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,196.95590886,196.95590886,196.95590886,204.19160793,204.19160793,205.81740698,205.81740698,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,196.95590886,196.95590886,196.95590886,204.19160793,204.19160793,205.81740698,213.94640223,210.10522865,191.38174069,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,196.95590886,196.95590886,196.95590886,204.19160793,204.19160793,205.81740698,210.10522865,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,196.95590886,196.95590886,196.95590886,204.19160793,204.19160793,205.81740698,210.10522865,213.94640223,191.38174069,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,196.95590886,196.95590886,196.95590886,204.19160793,204.19160793,205.81740698,210.10522865,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,213.96426814,197.56335026,197.56335026,197.56335026,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,197.56335026,197.56335026,197.56335026,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,197.56335026,213.96426814,203.20898212,203.20898212,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,197.56335026,203.20898212,203.20898212,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,197.56335026,203.20898212,213.96426814,205.7638092,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,197.56335026,203.20898212,205.7638092,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,197.56335026,203.20898212,205.7638092,213.96426814,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,197.56335026,203.20898212,205.7638092,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,213.98213406,175.82052121,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,175.82052121,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,175.82052121,213.98213406,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,175.82052121,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,213.98213407,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,213.98213407,159.75905589,159.75905589,159.75905589,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,159.75905589,159.75905589,159.75905589,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,159.75905589,213.98213407,175.62399607,175.62399607,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,159.75905589,175.62399607,175.62399607,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,159.75905589,175.62399607,213.98213408,184.11030979,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,159.75905589,175.62399607,184.11030979,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,159.75905589,175.62399607,184.11030979,213.98213408,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,159.75905589,175.62399607,184.11030979,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,213.98213406,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,213.96426815,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,213.98213408,178.446812,178.446812,178.446812,178.446812,178.446812,178.446812,178.446812,178.446812,178.446812,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,178.446812,178.446812,178.446812,178.446812,178.446812,178.446812,178.446812,178.446812,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,213.96426815,185.02147189,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,185.02147189,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,185.02147189,213.96426815,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,185.02147189,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,213.96426815,186.11129323,186.11129323,186.11129323,186.11129323,186.11129323,186.11129323,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,186.11129323,186.11129323,186.11129323,186.11129323,186.11129323,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,213.96426815,195.5445009,195.5445009,190.79216522,190.79216522,190.79216522,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,190.79216522,195.5445009,195.5445009,190.79216522,190.79216522,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,195.5445009,213.96426815,198.29585314,190.79216522,190.79216522,190.79216522,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,190.79216522,195.5445009,198.29585314,190.79216522,190.79216522,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,195.5445009,198.29585314,213.96426815,190.79216522,190.79216522,190.79216522,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,190.79216522,195.5445009,198.29585314,190.79216522,190.79216522,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,190.79216522,190.79216522,190.79216522,213.96426815,193.81150631,193.81150631,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,190.79216522,190.79216522,190.79216522,193.81150631,193.81150631,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,190.79216522,190.79216522,190.79216522,193.81150631,213.94640223,196.223406,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,190.79216522,190.79216522,190.79216522,193.81150631,196.223406,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,190.79216522,190.79216522,190.79216522,193.81150631,196.223406,213.94640223,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,190.79216522,190.79216522,190.79216522,193.81150631,196.223406,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,214,211.25948718,207.32,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,207.32,211.25948718,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,211.25948718,214,207.32,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,207.32,211.25948718,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,207.32,207.32,214,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,207.32,207.32,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,214.00000001,212.2379394,206.48096439,205.34,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,205.34,206.48096439,212.2379394,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,212.2379394,214.00000001,206.48096439,205.34,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,205.34,206.48096439,212.2379394,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,206.48096439,206.48096439,214,205.34,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,205.34,206.48096439,206.48096439,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,205.34,205.34,205.34,214,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,205.34,205.34,205.34,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,214,68,68,68,68,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,68,68,68,68,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,68,213.99999999,143.00792519,138.84991563,129.49600386,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,68,129.49600386,138.84991563,143.00792519,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,68,143.00792519,214,138.84991563,129.49600386,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,68,129.49600386,138.84991563,143.00792519,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,68,138.84991563,138.84991563,214,129.49600386,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,68,129.49600386,138.84991563,138.84991563,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,68,129.49600386,129.49600386,129.49600386,213.99999999,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,68,129.49600386,129.49600386,129.49600386,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,214,148,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,148,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,148,214,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,148,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,214,190.07317073,171.75880759,166.24480578,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,166.24480578,171.75880759,190.07317073,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,190.07317073,213.99999999,171.75880759,166.24480578,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,166.24480578,171.75880759,190.07317073,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,171.75880759,171.75880759,214.00000001,166.24480578,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,166.24480578,171.75880759,171.75880759,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,166.24480578,166.24480578,166.24480578,214,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,166.24480578,166.24480578,166.24480578,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,162.30623306,162.30623306,162.30623306,162.30623306,213.999999979,203.738639789,199.058134662,190.236868794,188.319970853,186.083053214,184.65123044,184.65123044,184.65123044,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,186.083053214,188.319970853,190.236868794,199.058134662,203.738639789,184.65123044,184.65123044,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,162.30623306,162.30623306,162.30623306,162.30623306,203.738639789,213.999999979,199.058134662,190.236868794,188.319970853,186.083053214,184.65123044,184.65123044,184.65123044,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,186.083053214,188.319970853,190.236868794,199.058134662,203.738639789,184.65123044,184.65123044,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,162.30623306,162.30623306,162.30623306,162.30623306,199.058134662,199.058134662,213.999999982,190.236868794,188.319970853,186.083053214,184.65123044,184.65123044,184.65123044,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,186.083053214,188.319970853,190.236868794,199.058134662,199.058134662,184.65123044,184.65123044,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,162.30623306,162.30623306,162.30623306,162.30623306,190.236868794,190.236868794,190.236868794,213.999999984,188.319970853,186.083053214,184.65123044,184.65123044,184.65123044,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,186.083053214,188.319970853,190.236868794,190.236868794,190.236868794,184.65123044,184.65123044,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,162.30623306,162.30623306,162.30623306,162.30623306,188.319970853,188.319970853,188.319970853,188.319970853,213.999999983,186.083053214,184.65123044,184.65123044,184.65123044,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,186.083053214,188.319970853,188.319970853,188.319970853,188.319970853,184.65123044,184.65123044,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,162.30623306,162.30623306,162.30623306,162.30623306,186.083053214,186.083053214,186.083053214,186.083053214,186.083053214,213.999999984,184.65123044,184.65123044,184.65123044,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,186.083053214,186.083053214,186.083053214,186.083053214,186.083053214,184.65123044,184.65123044,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,213.999999985,194.754790235,191.2642777,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,191.2642777,194.754790235,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,194.754790235,213.999999985,191.2642777,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,191.2642777,194.754790235,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,191.2642777,191.2642777,213.99999998,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,191.2642777,191.2642777,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,214,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,213.99999998,166.44173441,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,166.44173441,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,166.44173441,213.99999998,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,166.44173441,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,214,140,140,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,140 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,214,194.59979629,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,194.59979629 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,194.59979629,214,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,194.59979629 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +189.88047591,189.88047591,189.88047591,96,96,96,96,96,96,96,96,96,96,96,96,96,96,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,189.88047591,189.88047591,96,96,96,96,96,96,96,96,96,96,96,96,96,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +198.11302516,198.11302516,189.88047591,96,96,96,96,96,96,96,96,96,96,96,96,96,96,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,189.88047591,198.11302516,96,96,96,96,96,96,96,96,96,96,96,96,96,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,156.05389465,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,162.74420694,162.74420694,162.74420694,162.74420694,162.74420694,162.74420694,162.74420694,161.82538688,161.82538688,161.82538688,161.82538688,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,162.74420694,162.74420694,162.74420694,162.74420694,162.74420694,162.74420694,161.82538688,161.82538688,161.82538688,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,168.07105209,168.07105209,168.07105209,168.07105209,168.07105209,162.74420694,162.74420694,161.82538688,161.82538688,161.82538688,161.82538688,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,162.74420694,168.07105209,168.07105209,168.07105209,168.07105209,162.74420694,161.82538688,161.82538688,161.82538688,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,173.71836724,173.71836724,173.71836724,168.07105209,168.07105209,162.74420694,162.74420694,161.82538688,161.82538688,161.82538688,161.82538688,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,162.74420694,168.07105209,173.71836724,173.71836724,168.07105209,162.74420694,161.82538688,161.82538688,161.82538688,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,204.44673321,204.44673321,173.71836724,168.07105209,168.07105209,162.74420694,162.74420694,161.82538688,161.82538688,161.82538688,161.82538688,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,162.74420694,168.07105209,173.71836724,204.44673321,168.07105209,162.74420694,161.82538688,161.82538688,161.82538688,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,168.07105209,168.07105209,168.07105209,171.09621204,171.09621204,162.74420694,162.74420694,161.82538688,161.82538688,161.82538688,161.82538688,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,162.74420694,168.07105209,168.07105209,168.07105209,171.09621204,162.74420694,161.82538688,161.82538688,161.82538688,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,162.74420694,162.74420694,162.74420694,162.74420694,162.74420694,177.84429677,177.84429677,161.82538688,161.82538688,161.82538688,161.82538688,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,162.74420694,162.74420694,162.74420694,162.74420694,162.74420694,177.84429677,161.82538688,161.82538688,161.82538688,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,171.23005562,171.23005562,171.23005562,171.23005562,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,171.23005562,171.23005562,171.23005562,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,185.78114203,185.78114203,185.78114203,171.23005562,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,171.23005562,185.78114203,185.78114203,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,198.13727189,198.13727189,185.78114203,171.23005562,156.05389465,154.58,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,156.05389465,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,161.82538688,171.23005562,185.78114203,198.13727189,154.58,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +96,96,96,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,162.5888361,162.5888361,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,96,96,96,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,154.58,162.5888361,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,149.73678053,149.73678053,149.73678053,149.73678053,149.73678053,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,149.73678053,149.73678053,149.73678053,149.73678053,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,149.73678053,155.41855816,155.41855816,155.41855816,155.41855816,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,149.73678053,155.41855816,155.41855816,155.41855816,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,149.73678053,189.15614069,189.15614069,155.41855816,155.41855816,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,149.73678053,155.41855816,189.15614069,155.41855816,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,149.73678053,155.41855816,155.41855816,160.42743814,160.42743814,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,149.73678053,155.41855816,155.41855816,160.42743814,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,140.87910724,140.87910724,140.87910724,140.87910724,140.87910724,140.87910724,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,140.87910724,140.87910724,140.87910724,140.87910724,140.87910724,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,178.53006394,178.53006394,178.53006394,140.87910724,140.87910724,140.87910724,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,140.87910724,178.53006394,178.53006394,140.87910724,140.87910724,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,182.95648009,182.95648009,178.53006394,140.87910724,140.87910724,140.87910724,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,140.87910724,178.53006394,182.95648009,140.87910724,140.87910724,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,140.87910724,140.87910724,140.87910724,154.04072992,154.04072992,154.04072992,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,140.87910724,140.87910724,140.87910724,154.04072992,154.04072992,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,140.87910724,140.87910724,140.87910724,154.04072992,171.68572763,171.68572763,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,140.87910724,140.87910724,140.87910724,154.04072992,171.68572763,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,147.0483829,147.0483829,147.0483829,147.0483829,147.0483829,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,147.0483829,147.0483829,147.0483829,147.0483829,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,147.0483829,174.4478731,174.4478731,174.4478731,174.4478731,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,147.0483829,174.4478731,174.4478731,174.4478731,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,147.0483829,203.32621888,203.32621888,174.4478731,174.4478731,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,147.0483829,174.4478731,203.32621888,174.4478731,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,147.0483829,174.4478731,174.4478731,185.12144823,185.12144823,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,147.0483829,174.4478731,174.4478731,185.12144823,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,162.8003474,162.8003474,162.8003474,162.8003474,162.8003474,162.8003474,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,162.8003474,162.8003474,162.8003474,162.8003474,162.8003474,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,173.4615839,173.4615839,173.4615839,162.8003474,162.8003474,162.8003474,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,162.8003474,173.4615839,173.4615839,162.8003474,162.8003474,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,190.84430732,190.84430732,173.4615839,162.8003474,162.8003474,162.8003474,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,162.8003474,173.4615839,190.84430732,162.8003474,162.8003474,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,162.8003474,162.8003474,162.8003474,162.94228111,162.94228111,162.94228111,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,162.8003474,162.8003474,162.8003474,162.94228111,162.94228111,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,162.8003474,162.8003474,162.8003474,162.94228111,188.03694493,188.03694493,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,162.8003474,162.8003474,162.8003474,162.94228111,188.03694493,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,179.86154228,179.86154228,179.86154228,179.86154228,179.86154228,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,179.86154228,179.86154228,179.86154228,179.86154228,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,204.39393021,204.39393021,179.86154228,179.86154228,179.86154228,179.86154228,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,204.39393021,179.86154228,179.86154228,179.86154228,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,179.86154228,186.70711458,186.70711458,186.70711458,186.70711458,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,179.86154228,186.70711458,186.70711458,186.70711458,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,179.86154228,195.03166093,195.03166093,195.03166093,186.70711458,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,179.86154228,186.70711458,195.03166093,195.03166093,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,179.86154228,195.03166093,201.11266578,201.11266578,186.70711458,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,131.82892734,146.73969252,146.73969252,146.73969252,146.73969252,146.73969252,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,161.79568741,179.86154228,179.86154228,186.70711458,195.03166093,201.11266578,125.16690066,125.16690066,125.16690066,125.16690066,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,135.92698014,135.92698014,135.92698014,135.92698014,135.92698014,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,135.92698014,135.92698014,135.92698014,135.92698014,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,159.86289628,159.86289628,159.86289628,159.86289628,135.92698014,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,135.92698014,159.86289628,159.86289628,159.86289628,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,159.86289628,174.85080831,174.85080831,174.85080831,135.92698014,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,135.92698014,159.86289628,174.85080831,174.85080831,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,159.86289628,194.3563943,194.3563943,174.85080831,135.92698014,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,111,111,111,111,111,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,125.16690066,135.92698014,159.86289628,174.85080831,194.3563943,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,114.02229143,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,142.48270776,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,184.93214228,184.93214228,184.93214228,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,184.93214228,184.93214228,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,200.76135061,200.76135061,184.93214228,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,184.93214228,200.76135061,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,172.0150795,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,174.94509097,174.94509097,174.94509097,174.94509097,174.94509097,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,174.94509097,174.94509097,174.94509097,174.94509097,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,172.0150795,172.0150795,172.0150795,181.25176201,181.25176201,181.25176201,181.25176201,174.94509097,174.94509097,174.94509097,174.94509097,174.94509097,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,172.0150795,172.0150795,174.94509097,181.25176201,181.25176201,181.25176201,174.94509097,174.94509097,174.94509097,174.94509097,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,172.0150795,172.0150795,172.0150795,183.44927061,183.44927061,181.25176201,181.25176201,174.94509097,174.94509097,174.94509097,174.94509097,174.94509097,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,172.0150795,172.0150795,174.94509097,181.25176201,183.44927061,181.25176201,174.94509097,174.94509097,174.94509097,174.94509097,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,172.0150795,172.0150795,172.0150795,181.25176201,181.25176201,199.38567448,199.38567448,174.94509097,174.94509097,174.94509097,174.94509097,174.94509097,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,172.0150795,172.0150795,174.94509097,181.25176201,181.25176201,199.38567448,174.94509097,174.94509097,174.94509097,174.94509097,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,182.25225373,182.25225373,182.25225373,182.25225373,182.25225373,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,182.25225373,182.25225373,182.25225373,182.25225373,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,192.68595312,192.68595312,192.68595312,182.25225373,182.25225373,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,182.25225373,192.68595312,192.68595312,182.25225373,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,192.68595312,204.04868053,204.04868053,182.25225373,182.25225373,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,182.25225373,192.68595312,204.04868053,182.25225373,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,182.25225373,182.25225373,182.25225373,195.58023275,195.58023275,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,172.0150795,172.0150795,172.0150795,174.94509097,174.94509097,174.94509097,174.94509097,182.25225373,182.25225373,182.25225373,195.58023275,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,168.17390592,168.17390592,168.17390592,168.17390592,168.17390592,168.17390592,164.86871005,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,168.17390592,168.17390592,168.17390592,168.17390592,168.17390592,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,168.17390592,177.96443206,177.96443206,177.96443206,177.96443206,177.96443206,164.86871005,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,168.17390592,177.96443206,177.96443206,177.96443206,177.96443206,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,168.17390592,185.25372889,185.25372889,177.96443206,177.96443206,177.96443206,164.86871005,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,168.17390592,177.96443206,185.25372889,177.96443206,177.96443206,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,168.17390592,177.96443206,177.96443206,194.40108179,194.40108179,194.40108179,164.86871005,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,168.17390592,177.96443206,177.96443206,194.40108179,194.40108179,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,168.17390592,177.96443206,177.96443206,203.78069169,203.78069169,194.40108179,164.86871005,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,168.17390592,177.96443206,177.96443206,194.40108179,203.78069169,164.86871005,164.86871005,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,174.67710212,174.67710212,174.67710212,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,174.67710212,174.67710212,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,174.67710212,190.82789707,190.82789707,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,159.81265367,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,164.86871005,174.67710212,190.82789707,150.32584823,150.32584823,150.32584823,150.32584823,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,184.28896902,184.28896902,184.28896902,184.28896902,184.28896902,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,184.28896902,184.28896902,184.28896902,184.28896902,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,188.23733814,188.23733814,188.23733814,188.23733814,184.28896902,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,184.28896902,188.23733814,188.23733814,188.23733814,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,194.57974102,194.57974102,194.57974102,188.23733814,184.28896902,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,184.28896902,188.23733814,194.57974102,194.57974102,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,200.51122766,200.51122766,194.57974102,188.23733814,184.28896902,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,150.32584823,184.28896902,188.23733814,194.57974102,200.51122766,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,150.09359122,150.09359122,150.09359122,150.09359122,150.09359122,150.09359122,150.09359122,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,150.09359122,150.09359122,150.09359122,150.09359122,150.09359122,150.09359122,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,158.7049664,158.7049664,158.7049664,158.7049664,158.7049664,158.7049664,150.09359122,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,150.09359122,158.7049664,158.7049664,158.7049664,158.7049664,158.7049664,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,167.11981642,167.11981642,167.11981642,167.11981642,167.11981642,158.7049664,150.09359122,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,150.09359122,158.7049664,167.11981642,167.11981642,167.11981642,167.11981642,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,167.11981642,181.84133749,181.84133749,181.84133749,181.84133749,158.7049664,150.09359122,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,150.09359122,158.7049664,167.11981642,181.84133749,181.84133749,181.84133749,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,167.11981642,204.74545157,204.74545157,181.84133749,181.84133749,158.7049664,150.09359122,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,150.09359122,158.7049664,167.11981642,181.84133749,204.74545157,181.84133749,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,167.11981642,181.84133749,181.84133749,189.38075726,189.38075726,158.7049664,150.09359122,142.48270776,133.31748894,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,142.48270776,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,143.80478611,150.09359122,158.7049664,167.11981642,181.84133749,181.84133749,189.38075726,133.31748894,133.31748894,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,148.70004917,148.70004917,148.70004917,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,148.70004917,148.70004917,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,148.70004917,175.89198491,175.89198491,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,133.31748894,148.70004917,175.89198491,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,172.31880019,172.31880019,172.31880019,172.31880019,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,172.31880019,172.31880019,172.31880019,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,176.98180625,176.98180625,172.31880019,172.31880019,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,172.31880019,176.98180625,172.31880019,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,172.31880019,172.31880019,176.51729224,176.51729224,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,172.31880019,172.31880019,176.51729224,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,146.85985904,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,177.28552697,177.28552697,177.28552697,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,177.28552697,177.28552697,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,177.28552697,188.45172923,188.45172923,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,177.28552697,188.45172923,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,173.64087855,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,177.33912474,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,181.98426488,181.98426488,181.98426488,181.98426488,181.98426488,181.98426488,181.98426488,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,181.98426488,181.98426488,181.98426488,181.98426488,181.98426488,181.98426488,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,197.08097033,197.08097033,181.98426488,181.98426488,181.98426488,181.98426488,181.98426488,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,181.98426488,197.08097033,181.98426488,181.98426488,181.98426488,181.98426488,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,181.98426488,181.98426488,191.04228815,191.04228815,191.04228815,191.04228815,191.04228815,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,181.98426488,181.98426488,191.04228815,191.04228815,191.04228815,191.04228815,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,181.98426488,181.98426488,195.13358466,195.13358466,191.04228815,191.04228815,191.04228815,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,181.98426488,181.98426488,191.04228815,195.13358466,191.04228815,191.04228815,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,181.98426488,181.98426488,191.04228815,191.04228815,200.22537289,200.22537289,200.22537289,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,181.98426488,181.98426488,191.04228815,191.04228815,200.22537289,200.22537289,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,181.98426488,181.98426488,191.04228815,191.04228815,203.61989838,203.61989838,200.22537289,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,181.98426488,181.98426488,191.04228815,191.04228815,200.22537289,203.61989838,178.60760532,178.60760532,178.60760532,178.60760532,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,203.08392067,203.08392067,203.08392067,203.08392067,203.08392067,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,203.08392067,203.08392067,203.08392067,203.08392067,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,203.08392067,210.8198656,210.8198656,210.8198656,210.8198656,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,203.08392067,210.8198656,210.8198656,210.8198656,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,203.08392067,210.8198656,211.26651369,211.26651369,211.26651369,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,203.08392067,210.8198656,211.26651369,211.26651369,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,203.08392067,210.8198656,211.26651369,212.33846911,212.33846911,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,114.02229143,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,125.27782331,146.85985904,146.85985904,146.85985904,146.85985904,173.64087855,173.64087855,173.64087855,177.33912474,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,178.60760532,203.08392067,210.8198656,211.26651369,212.33846911,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,159.58039665,159.58039665,159.58039665,159.58039665,159.58039665,159.58039665,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,159.58039665,159.58039665,159.58039665,159.58039665,159.58039665,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,170.76446483,170.76446483,170.76446483,159.58039665,159.58039665,159.58039665,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,159.58039665,170.76446483,170.76446483,159.58039665,159.58039665,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,170.76446483,183.1455499,183.1455499,159.58039665,159.58039665,159.58039665,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,159.58039665,170.76446483,183.1455499,159.58039665,159.58039665,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,159.58039665,159.58039665,159.58039665,160.63448614,160.63448614,160.63448614,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,159.58039665,159.58039665,159.58039665,160.63448614,160.63448614,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,159.58039665,159.58039665,159.58039665,160.63448614,202.53007702,202.53007702,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,159.58039665,159.58039665,159.58039665,160.63448614,202.53007702,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,181.78773971,181.78773971,181.78773971,181.78773971,181.78773971,181.78773971,181.78773971,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,181.78773971,181.78773971,181.78773971,181.78773971,181.78773971,181.78773971,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,181.78773971,192.72168497,192.72168497,192.72168497,192.72168497,192.72168497,192.72168497,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,181.78773971,192.72168497,192.72168497,192.72168497,192.72168497,192.72168497,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,181.78773971,192.72168497,194.2581544,194.2581544,194.2581544,194.2581544,194.2581544,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,181.78773971,192.72168497,194.2581544,194.2581544,194.2581544,194.2581544,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,181.78773971,192.72168497,201.20799869,201.20799869,194.2581544,194.2581544,194.2581544,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,181.78773971,192.72168497,194.2581544,201.20799869,194.2581544,194.2581544,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,181.78773971,192.72168497,194.2581544,194.2581544,200.58269136,200.58269136,200.58269136,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,181.78773971,192.72168497,194.2581544,194.2581544,200.58269136,200.58269136,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,181.78773971,192.72168497,194.2581544,194.2581544,200.58269136,202.31568595,202.31568595,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,181.78773971,192.72168497,194.2581544,194.2581544,200.58269136,202.31568595,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,178.44681199,178.44681199,178.44681199,178.44681199,178.44681199,178.44681199,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,178.44681199,178.44681199,178.44681199,178.44681199,178.44681199,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,205.20996557,205.20996557,178.44681199,178.44681199,178.44681199,178.44681199,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,178.44681199,205.20996557,178.44681199,178.44681199,178.44681199,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,178.44681199,178.44681199,185.7182429,185.7182429,185.7182429,185.7182429,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,178.44681199,178.44681199,185.7182429,185.7182429,185.7182429,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,178.44681199,178.44681199,185.7182429,195.22291427,195.22291427,195.22291427,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,178.44681199,178.44681199,185.7182429,195.22291427,195.22291427,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,178.44681199,178.44681199,185.7182429,195.22291427,198.56384199,198.56384199,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,178.44681199,178.44681199,185.7182429,195.22291427,198.56384199,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,186.11129322,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,188.05867889,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,197.33109325,197.33109325,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,197.33109325,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,189.18423208,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,195.27651204,195.27651204,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,195.27651204,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,189.91673495,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,196.95590886,196.95590886,196.95590886,196.95590886,196.95590886,196.95590886,196.95590886,196.95590886,191.38174069,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,196.95590886,196.95590886,196.95590886,196.95590886,196.95590886,196.95590886,196.95590886,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,204.69185379,204.69185379,204.69185379,196.95590886,196.95590886,196.95590886,196.95590886,196.95590886,191.38174069,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,196.95590886,204.69185379,204.69185379,196.95590886,196.95590886,196.95590886,196.95590886,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,204.69185379,209.56925094,209.56925094,196.95590886,196.95590886,196.95590886,196.95590886,196.95590886,191.38174069,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,196.95590886,204.69185379,209.56925094,196.95590886,196.95590886,196.95590886,196.95590886,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,196.95590886,196.95590886,196.95590886,204.19160793,204.19160793,204.19160793,204.19160793,204.19160793,191.38174069,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,196.95590886,196.95590886,196.95590886,204.19160793,204.19160793,204.19160793,204.19160793,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,196.95590886,196.95590886,196.95590886,205.04917226,205.04917226,204.19160793,204.19160793,204.19160793,191.38174069,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,196.95590886,196.95590886,196.95590886,204.19160793,205.04917226,204.19160793,204.19160793,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,196.95590886,196.95590886,196.95590886,204.19160793,204.19160793,205.81740698,205.81740698,205.81740698,191.38174069,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,196.95590886,196.95590886,196.95590886,204.19160793,204.19160793,205.81740698,205.81740698,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,196.95590886,196.95590886,196.95590886,204.19160793,204.19160793,205.81740698,210.10522865,210.10522865,191.38174069,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,196.95590886,196.95590886,196.95590886,204.19160793,204.19160793,205.81740698,210.10522865,191.38174069,191.38174069,191.38174069,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,197.56335026,197.56335026,197.56335026,197.56335026,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,197.56335026,197.56335026,197.56335026,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,197.56335026,203.20898212,203.20898212,203.20898212,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,197.56335026,203.20898212,203.20898212,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,197.56335026,203.20898212,205.7638092,205.7638092,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,139.10604819,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,165.56548106,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,172.60465497,186.11129322,188.05867889,189.18423208,189.18423208,189.91673495,189.91673495,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,191.38174069,197.56335026,203.20898212,205.7638092,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,175.82052121,175.82052121,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,175.82052121,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,134.0499918,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,136.37256187,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,159.75905589,159.75905589,159.75905589,159.75905589,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,159.75905589,159.75905589,159.75905589,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,159.75905589,175.62399607,175.62399607,175.62399607,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,159.75905589,175.62399607,175.62399607,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,159.75905589,175.62399607,184.11030979,184.11030979,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,159.75905589,175.62399607,184.11030979,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,139.23110965,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,148.03900999,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,164.01114571,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,178.446812,178.446812,178.446812,178.446812,178.446812,178.446812,178.446812,178.446812,178.446812,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,178.446812,178.446812,178.446812,178.446812,178.446812,178.446812,178.446812,178.446812,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,185.02147189,185.02147189,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,185.02147189,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,181.43042124,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,186.11129323,186.11129323,186.11129323,186.11129323,186.11129323,186.11129323,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,186.11129323,186.11129323,186.11129323,186.11129323,186.11129323,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,190.79216522,190.79216522,190.79216522,190.79216522,190.79216522,190.79216522,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,190.79216522,190.79216522,190.79216522,190.79216522,190.79216522,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,195.5445009,195.5445009,195.5445009,190.79216522,190.79216522,190.79216522,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,190.79216522,195.5445009,195.5445009,190.79216522,190.79216522,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,195.5445009,198.29585314,198.29585314,190.79216522,190.79216522,190.79216522,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,190.79216522,195.5445009,198.29585314,190.79216522,190.79216522,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,190.79216522,190.79216522,190.79216522,193.81150631,193.81150631,193.81150631,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,190.79216522,190.79216522,190.79216522,193.81150631,193.81150631,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,190.79216522,190.79216522,190.79216522,193.81150631,196.223406,196.223406,74,74,74,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,127.97557777,134.0499918,134.0499918,136.37256187,139.23110965,139.23110965,139.23110965,139.23110965,148.03900999,164.01114571,178.446812,181.43042124,181.43042124,186.11129323,190.79216522,190.79216522,190.79216522,193.81150631,196.223406,74,74,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,207.32,207.32,207.32,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,207.32,207.32,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,211.25948718,211.25948718,207.32,62,62,62,62,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,207.32,211.25948718,62,62,62,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,205.34,205.34,205.34,205.34,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,205.34,205.34,205.34,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,206.48096439,206.48096439,206.48096439,205.34,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,205.34,206.48096439,206.48096439,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,212.2379394,212.2379394,206.48096439,205.34,44,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,205.34,206.48096439,212.2379394,44,44,44,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,68,68,68,68,68,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,68,68,68,68,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,68,129.49600386,129.49600386,129.49600386,129.49600386,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,68,129.49600386,129.49600386,129.49600386,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,68,138.84991563,138.84991563,138.84991563,129.49600386,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,68,129.49600386,138.84991563,138.84991563,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,68,143.00792519,143.00792519,138.84991563,129.49600386,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,20,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,68,129.49600386,138.84991563,143.00792519,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,148,148,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,148,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,157.08762421,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,166.24480578,166.24480578,166.24480578,166.24480578,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,166.24480578,166.24480578,166.24480578,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,171.75880759,171.75880759,171.75880759,166.24480578,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,166.24480578,171.75880759,171.75880759,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,190.07317073,190.07317073,171.75880759,166.24480578,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,166.24480578,171.75880759,190.07317073,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,162.30623306,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,162.30623306,162.30623306,162.30623306,162.30623306,186.083053214,186.083053214,186.083053214,186.083053214,186.083053214,186.083053214,184.65123044,184.65123044,184.65123044,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,186.083053214,186.083053214,186.083053214,186.083053214,186.083053214,184.65123044,184.65123044,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,162.30623306,162.30623306,162.30623306,162.30623306,188.319970853,188.319970853,188.319970853,188.319970853,188.319970853,186.083053214,184.65123044,184.65123044,184.65123044,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,186.083053214,188.319970853,188.319970853,188.319970853,188.319970853,184.65123044,184.65123044,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,162.30623306,162.30623306,162.30623306,162.30623306,190.236868794,190.236868794,190.236868794,190.236868794,188.319970853,186.083053214,184.65123044,184.65123044,184.65123044,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,186.083053214,188.319970853,190.236868794,190.236868794,190.236868794,184.65123044,184.65123044,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,162.30623306,162.30623306,162.30623306,162.30623306,199.058134662,199.058134662,199.058134662,190.236868794,188.319970853,186.083053214,184.65123044,184.65123044,184.65123044,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,186.083053214,188.319970853,190.236868794,199.058134662,199.058134662,184.65123044,184.65123044,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,162.30623306,162.30623306,162.30623306,162.30623306,203.738639789,203.738639789,199.058134662,190.236868794,188.319970853,186.083053214,184.65123044,184.65123044,184.65123044,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,186.083053214,188.319970853,190.236868794,199.058134662,203.738639789,184.65123044,184.65123044,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,191.2642777,191.2642777,191.2642777,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,191.2642777,191.2642777,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,194.754790235,194.754790235,191.2642777,157.08762421,152.45980126,152.45980126,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,157.08762421,162.30623306,162.30623306,162.30623306,162.30623306,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,184.65123044,191.2642777,194.754790235,152.45980126,0,0 +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,166.44173441,166.44173441,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,53,53,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,152.45980126,166.44173441,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,140,140,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,140 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,194.59979629,194.59979629,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,194.59979629 diff --git a/examples/caudata_trait.txt b/examples/caudata_trait.txt new file mode 100644 index 0000000..b458d10 --- /dev/null +++ b/examples/caudata_trait.txt @@ -0,0 +1,198 @@ +"tipnames","trait" +"Ambystoma_annulatum",4.44135041075727 +"Ambystoma_barbouri",4.3210617205896 +"Ambystoma_californiense",4.51961229762644 +"Ambystoma_cingulatum",3.98713047791495 +"Ambystoma_gracile",4.35502150652934 +"Ambystoma_jeffersonianum",4.40854684448328 +"Ambystoma_laterale",4.00551334851548 +"Ambystoma_macrodactylum",4.0943445622221 +"Ambystoma_maculatum",4.39911725446659 +"Ambystoma_mavortium",4.37682400470252 +"Ambystoma_opacum",4.47966365074837 +"Ambystoma_ordinarium",4.46791759256172 +"Ambystoma_texanum",4.43355115232727 +"Ambystoma_velasci",4.43698819274786 +"Amphiuma_means",6.22455842927536 +"Amphiuma_pholeter",5.24372917626363 +"Amphiuma_tridactylum",6.32051106692587 +"Andrias_davidianus",5.80211837537706 +"Aneides_aeneus",3.90841650983403 +"Aneides_flavipunctatus",4.17899203628239 +"Aneides_hardii",3.98898404656427 +"Aneides_lugubris",4.37332639712838 +"Batrachoseps_attenuatus",3.79773385902602 +"Batrachoseps_major",3.9759363311718 +"Batrachoseps_wrighti",3.79773385902602 +"Batrachuperus_pinchonii",4.65538790214871 +"Batrachuperus_yenyuanensis",4.42157782206069 +"Bolitoglossa_adspersa",3.98898404656427 +"Bolitoglossa_dofleini",4.63812128612778 +"Bolitoglossa_engelhardti",3.82319179172153 +"Bolitoglossa_mexicana",4.12552017969055 +"Bolitoglossa_morio",3.94893335944824 +"Bolitoglossa_occidentalis",3.55105313720653 +"Bolitoglossa_palmata",3.84801767545223 +"Bolitoglossa_platydactyla",4.37866473983298 +"Bolitoglossa_rostrata",3.80058852498184 +"Bolitoglossa_rufescens",3.60114053980593 +"Bolitoglossa_subpalmata",4.01241117945941 +"Bolitoglossa_yucatana",4.04129534113228 +"Bradytriton_silus",3.75185425327532 +"Calotriton_asper",4.05817319508393 +"Chioglossa_lusitanica",3.82537519870247 +"Chiropterotriton_chondrostega",3.18013499655177 +"Chiropterotriton_dimidiatus",3.22286784613774 +"Chiropterotriton_lavae",3.40119738166216 +"Chiropterotriton_multidentatus",3.38777436133001 +"Chiropterotriton_priscus",3.87057581551397 +"Cryptobranchus_alleganiensis",5.73172184334544 +"Cryptotriton_nasalis",3.38777436133001 +"Cynops_ensicauda",4.10791868224922 +"Cynops_pyrrhogaster",4.15543966158191 +"Desmognathus_aeneus",3.2557861788883 +"Desmognathus_auriculatus",4.01223026584517 +"Desmognathus_brimleyorum",4.32714797316389 +"Desmognathus_fuscus",4.02168425963766 +"Desmognathus_imitator",3.81286543389493 +"Desmognathus_marmoratus",4.2850337899827 +"Desmognathus_monticola",4.14938499397991 +"Desmognathus_ochrophaeus",3.70831436675254 +"Desmognathus_quadramaculatus",4.3391191336626 +"Desmognathus_welteri",4.19968007756742 +"Desmognathus_wrighti",3.37142522332849 +"Dicamptodon_copei",4.42184812886055 +"Dicamptodon_ensatus",4.68213122712422 +"Dicamptodon_tenebrosus",4.51743127168008 +"Echinotriton_andersoni",4.41279829334063 +"Ensatina_eschscholtzii",4.16666522380173 +"Eurycea_aquatica",3.58351893845611 +"Eurycea_bislineata",3.7536132686805 +"Eurycea_cirrigera",3.65970807681366 +"Eurycea_junaluska",3.77292184468871 +"Eurycea_longicauda",4.07889245766318 +"Eurycea_lucifuga",4.14128380814951 +"Eurycea_multiplicata",3.71332813451625 +"Eurycea_nana",3.25848107946056 +"Eurycea_neotenes",3.5548765217606 +"Eurycea_quadridigitata",3.40734511224839 +"Eurycea_rathbuni",3.99452422693989 +"Eurycea_sosorum",3.30688670219091 +"Eurycea_spelaea",3.92592591059714 +"Eurycea_tridentifera",3.62667154831465 +"Eurycea_tynerensis",3.50480636428118 +"Eurycea_wilderae",3.60086757679072 +"Gyrinophilus_porphyriticus",4.50468664740977 +"Hemidactylium_scutatum",3.69424006035603 +"Hydromantes_italicus",3.94931879017184 +"Hydromantes_platycephalus",3.96651119071222 +"Hynobius_abei",4.05644364442232 +"Hynobius_dunni",4.17438726989564 +"Hynobius_leechii",3.94449019556565 +"Hynobius_lichenatus",4.25773810913054 +"Hynobius_naevius",4.30541553230204 +"Hynobius_nebulosus",4.14472076954717 +"Hynobius_nigrescens",4.20841701848195 +"Hynobius_stejnegeri",4.11414718951828 +"Hynobius_tsuensis",4.16666522380173 +"Lissotriton_boscai",3.41772668361337 +"Lissotriton_helveticus",3.6988297849671 +"Lissotriton_montandoni",3.79098467705109 +"Lissotriton_vulgaris",3.70480201465775 +"Liua_shihi",4.31079912538551 +"Mertensiella_caucasica",4.30271282795416 +"Ichthyosaura_alpestris",3.85142338329922 +"Necturus_alabamensis",4.88225252927326 +"Necturus_beyeri",4.92667380691538 +"Necturus_maculosus",5.22666292049755 +"Necturus_punctatus",4.83707524297087 +"Neurergus_crocatus",4.32057002622753 +"Neurergus_strauchii",4.30811095172371 +"Notophthalmus_meridionalis",3.79323946943818 +"Notophthalmus_perstriatus",3.76699723337789 +"Notophthalmus_viridescens",3.99231183665695 +"Nototriton_picadoi",3.27336401015227 +"Nyctanolis_pernix",3.68637632389582 +"Oedipina_complex",3.44680789291421 +"Oedipina_cyclocauda",3.89792408104864 +"Oedipina_parvipes",3.68260984110034 +"Oedipina_uniformis",3.90801498403061 +"Ommatotriton_vittatus",3.89182029811063 +"Pachyhynobius_shangchengensis",4.67888522381037 +"Pachytriton_brevipes",4.60266705576997 +"Paradactylodon_mustersi",4.2941307757363 +"Paramesotriton_caudopunctatus",4.22829253473184 +"Paramesotriton_chinensis",4.16278172377533 +"Paramesotriton_hongkongensis",4.36246147917904 +"Parvimolge_townsendi",2.96225304647982 +"Phaeognathus_hubrichti",4.68203863024467 +"Plethodon_albagula",4.26436859120565 +"Plethodon_amplus",4.11087386417331 +"Plethodon_angusticlavius",3.77007918448618 +"Plethodon_caddoensis",3.70990682130601 +"Plethodon_cheoah",3.96081316959758 +"Plethodon_chlorobryonis",3.93116855415038 +"Plethodon_cinereus",3.81308625756812 +"Plethodon_cylindraceus",4.31160417037734 +"Plethodon_dorsalis",3.71153340467847 +"Plethodon_dunni",4.09217554493726 +"Plethodon_elongatus",3.96128924673106 +"Plethodon_glutinosus",4.26275029709698 +"Plethodon_grobmani",4.08092154188996 +"Plethodon_hoffmani",3.89406268005115 +"Plethodon_hubrichti",3.98555223871626 +"Plethodon_idahoensis",3.77620328228561 +"Plethodon_jordani",4.11414718951828 +"Plethodon_kentucki",4.11998794220208 +"Plethodon_meridianus",4.11903717481247 +"Plethodon_metcalfi",4.00369019395397 +"Plethodon_mississippi",4.18677180246803 +"Plethodon_montanus",4.00733318523247 +"Plethodon_neomexicanus",4.12834333139423 +"Plethodon_nettingi",3.80832776908938 +"Plethodon_ouachitae",4.02980604108453 +"Plethodon_punctatus",4.16037415865418 +"Plethodon_richmondi",3.96043214463583 +"Plethodon_serratus",3.67545221079991 +"Plethodon_shenandoah",3.84801767545223 +"Plethodon_shermani",4.00914971615887 +"Plethodon_teyahalee",4.26127043353808 +"Plethodon_vandykei",3.97687397774776 +"Plethodon_vehiculum",3.9383435604935 +"Plethodon_ventralis",3.73766961828337 +"Plethodon_wehrlei",4.0515240442057 +"Plethodon_welleri",3.75419892023458 +"Plethodon_yonahlossee",4.40575536824794 +"Pleurodeles_waltl",4.50454842467744 +"Proteus_anguinus",4.98907111618042 +"Pseudobranchus_axanthus",4.5013640172625 +"Pseudoeurycea_bellii",4.29907292330404 +"Pseudoeurycea_cephalica",3.80291101734437 +"Pseudoeurycea_gadovii",3.3178157727231 +"Pseudoeurycea_galeanae",3.92395157629342 +"Pseudoeurycea_leprosa",4.06263887373527 +"Pseudoeurycea_rex",3.4904285153901 +"Pseudoeurycea_robertsi",3.8649313978943 +"Pseudoeurycea_werleri",3.97066920086088 +"Pseudotriton_montanus",4.31715472463507 +"Pseudotriton_ruber",4.32446372727274 +"Ranodon_sibiricus",4.45408563411598 +"Rhyacotriton_cascadae",3.85333400907947 +"Rhyacotriton_kezeri",3.8155121050473 +"Rhyacotriton_olympicus",3.89100363820407 +"Rhyacotriton_variegatus",3.79773385902602 +"Salamandra_atra",4.20123141243846 +"Salamandra_salamandra",4.76294286986063 +"Salamandrella_keyserlingii",3.82209829790016 +"Salamandrina_terdigitata",3.52547778217249 +"Siren_intermedia",5.28421844216853 +"Siren_lacertina",5.55218409050509 +"Stereochilus_marginatus",3.90197266957464 +"Taricha_granulosa",4.29387824789718 +"Taricha_rivularis",4.23555473077362 +"Taricha_torosa",4.35169628486605 +"Triturus_cristatus",4.15304576682959 +"Triturus_pygmaeus",4.00551334851548 +"Tylototriton_asperrimus",4.07584109065754 +"Tylototriton_kweichowensis",4.4672864786247 +"Tylototriton_verrucosus",4.23916614676084 diff --git a/examples/caudata_tree.txt b/examples/caudata_tree.txt new file mode 100644 index 0000000..e41a881 --- /dev/null +++ b/examples/caudata_tree.txt @@ -0,0 +1 @@ +(((((((Dicamptodon_copei:15.88406289,Dicamptodon_tenebrosus:15.88406289):8.23254925,Dicamptodon_ensatus:24.11661214):93.88047591,(((((((Ambystoma_texanum:9.55326679,Ambystoma_barbouri:9.55326679):30.72836597,Ambystoma_opacum:40.28163277):5.64731515,(Ambystoma_cingulatum:42.90378798,Ambystoma_annulatum:42.90378797):3.02515995):5.32684515,(Ambystoma_laterale:36.15570323,Ambystoma_jeffersonianum:36.15570323):15.10008983):0.91882006,(((Ambystoma_ordinarium:15.86272809,Ambystoma_mavortium:15.8627281):12.35612986,Ambystoma_velasci:28.21885795):14.55108641,Ambystoma_californiense:42.76994437):9.40466874):5.77149223,Ambystoma_macrodactylum:57.94610534):1.47389465,(Ambystoma_maculatum:51.41116389,Ambystoma_gracile:51.41116389):8.0088361):58.58):45,((Salamandrina_terdigitata:64.26301347,((Salamandra_atra:24.8437563,Salamandra_salamandra:24.84375631):33.73758253,(Chioglossa_lusitanica:53.57235588,Mertensiella_caucasica:53.57235588):5.00887998):5.68177763):38.73678053,(((((Taricha_granulosa:31.04321088,Taricha_torosa:31.04331389):4.42641615,Taricha_rivularis:35.46973006):37.6509567,(Notophthalmus_meridionalis:59.9590641,(Notophthalmus_perstriatus:42.31406638,Notophthalmus_viridescens:42.31406638):17.64499771):13.16162268):9.0501799,((Ichthyosaura_alpestris:66.95151407,((Lissotriton_vulgaris:10.67357513,Lissotriton_montandoni:10.67357513):28.87834578,(Lissotriton_helveticus:28.87844877,Lissotriton_boscai:28.87844877):10.67357513):27.3994902):0.30869038,((((Triturus_pygmaeus:23.15548669,Triturus_cristatus:23.15558965):17.38272342,Calotriton_asper:40.53821007):10.6612365,(Ommatotriton_vittatus:51.05761589,(Neurergus_crocatus:25.96295208,Neurergus_strauchii:25.96295213):25.09466382):0.14193371):1.00465999,((Cynops_pyrrhogaster:9.60586379,Cynops_ensicauda:9.60586379):24.53238793,((Paramesotriton_caudopunctatus:18.96813311,(Paramesotriton_chinensis:12.88723123,Paramesotriton_hongkongensis:12.88723128):6.08100485):8.32454635,Pachytriton_brevipes:27.29278242):6.8455723):18.06585487):15.05599489):14.91076518):6.66202668,((Echinotriton_andersoni:54.13700075,((Tylototriton_verrucosus:19.64350272,Tylototriton_kweichowensis:19.64350272):19.50558599,Tylototriton_asperrimus:39.14908871):14.98791203):23.93591614,Pleurodeles_waltl:78.07281387):10.76007948):14.16690066):60):18,(((((Hemidactylium_scutatum:99.95984264,(((((((((Bolitoglossa_adspersa:13.22078348,Bolitoglossa_palmata:13.22078347):15.82920833,Bolitoglossa_subpalmata:29.03212587):12.91706278,(((Bolitoglossa_dofleini:30.53286346,Bolitoglossa_morio:30.51499753):2.1975086,(Bolitoglossa_engelhardti:14.57859367,Bolitoglossa_rostrata:14.57859367):18.13391247):6.30667104,((Bolitoglossa_platydactyla:21.29618095,(Bolitoglossa_mexicana:9.95131946,Bolitoglossa_yucatana:9.95131946):11.36272741):10.43369939,(Bolitoglossa_occidentalis:18.40190132,Bolitoglossa_rufescens:18.40190132):13.32797902):7.30716276):2.93001147):12.20242583,((Parvimolge_townsendi:45.79036223,((Pseudoeurycea_leprosa:28.71053925,Pseudoeurycea_werleri:28.74627109):7.28929683,((Pseudoeurycea_robertsi:10.18357647,Pseudoeurycea_gadovii:10.20144238):9.3796099,Pseudoeurycea_rex:19.56318637):16.43664973):9.79052614):3.30519587,(Pseudoeurycea_bellii:39.30503196,(Pseudoeurycea_cephalica:23.15423701,Pseudoeurycea_galeanae:23.15423701):16.15079495):9.80839207):5.05605638):9.48680544,((((Chiropterotriton_dimidiatus:13.45304049,Chiropterotriton_lavae:13.45304049):5.93148664,Chiropterotriton_priscus:19.38452712):6.34240288,Chiropterotriton_multidentatus:25.72693):3.94836912,Chiropterotriton_chondrostega:29.67529913):33.96312079):6.52106212,(((Bradytriton_silus:46.84445173,((Oedipina_complex:9.21881659,Oedipina_parvipes:9.21881659):22.90411408,(Oedipina_cyclocauda:24.56564497,Oedipina_uniformis:24.56564498):7.53941977):14.72152107):8.41485002,Nototriton_picadoi:55.25930174):8.61137518,Nyctanolis_pernix:63.88854285):6.28880511):1.32207835,Cryptotriton_nasalis:71.48156039):9.16521882,(Batrachoseps_wrighti:65.26421898,(Batrachoseps_attenuatus:38.07228323,Batrachoseps_major:38.07228323):27.19193574):15.38256023):8.03966563,(((Stereochilus_marginatus:37.00032782,Gyrinophilus_porphyriticus:37.00032782):4.66300606,(Pseudotriton_montanus:37.46484182,Pseudotriton_ruber:37.46484182):4.19849205):25.45894115,((Eurycea_multiplicata:36.69660711,(Eurycea_tynerensis:25.54827078,Eurycea_spelaea:25.54827078):11.16620226):3.64464842,(Eurycea_quadridigitata:36.64300933,(((Eurycea_lucifuga:16.90116374,Eurycea_longicauda:16.90116374):15.09670545,((Eurycea_cirrigera:18.86641534,Eurycea_bislineata:18.86641534):4.09129651,((Eurycea_aquatica:10.38010162,Eurycea_junaluska:10.38010162):3.39452549,Eurycea_wilderae:13.77462711):9.18308474):9.05802327):3.37665956,(Eurycea_rathbuni:10.89821341,(Eurycea_nana:3.16226848,(Eurycea_sosorum:2.71562039,(Eurycea_neotenes:1.64366497,Eurycea_tridentifera:1.64366497):1.07195542):0.44664809):7.73594493):24.47631535):1.26848058):3.69824619):26.78101951):21.58203573):11.25553188):9.02229143,((((Plethodon_elongatus:43.1998033,(Plethodon_vehiculum:30.83658416,Plethodon_dunni:30.83658416):12.38108507):11.18406818,(Plethodon_neomexicanus:53.329782,(Plethodon_vandykei:11.45205704,Plethodon_idahoensis:11.45205704):41.89559088):1.05408949):20.47434846,((Plethodon_serratus:32.17652843,(Plethodon_hoffmani:21.22471726,((Plethodon_cinereus:12.73840354,Plethodon_shenandoah:12.73840354):6.94984429,(Plethodon_richmondi:13.38157678,(Plethodon_nettingi:11.63071627,Plethodon_hubrichti:11.63071627):1.73299459):6.32453696):1.53646943):10.93394526):16.22225865,(((Plethodon_wehrlei:8.75430257,Plethodon_punctatus:8.75430257):26.76315358,(Plethodon_welleri:28.26389116,(Plethodon_angusticlavius:18.75921979,(Plethodon_ventralis:15.41829208,Plethodon_dorsalis:15.41829208):3.34092772):9.50467137):7.27143091):5.84215702,(Plethodon_yonahlossee:27.85297492,(Plethodon_kentucki:25.92345517,((Plethodon_metcalfi:16.65104081,Plethodon_jordani:16.65104081):8.14686117,((Plethodon_caddoensis:18.6877561,Plethodon_ouachitae:18.6877561):5.35977709,(((Plethodon_montanus:9.27241436,(Plethodon_amplus:4.39501721,Plethodon_meridianus:4.39501721):4.87739715):7.73594493,((Plethodon_shermani:8.91509588,Plethodon_cheoah:8.91509588):0.85756433,(Plethodon_chlorobryonis:8.14686117,(Plethodon_teyahalee:3.84117358,Plethodon_cylindraceus:3.84117358):4.28782167):1.62579905):7.23569907):5.57416817,(Plethodon_glutinosus:16.40091788,(Plethodon_mississippi:10.75528602,(Plethodon_albagula:8.20045894,Plethodon_grobmani:8.20045894):2.55482708):5.64563186):6.18160957):1.46500574):0.73250287):1.12555319):1.94738567):13.50663825):7.03917391):26.45943287):11.13047042,((Hydromantes_italicus:38.16161285,Hydromantes_platycephalus:38.16161285):41.77052941,(Ensatina_eschscholtzii:77.6095722,((Aneides_aeneus:54.22307818,(Aneides_hardii:38.358138,(Aneides_lugubris:29.87182429,Aneides_flavipunctatus:29.87182429):8.48631372):15.86494018):20.52794624,(Phaeognathus_hubrichti:65.94312407,(Desmognathus_wrighti:49.95312244,(Desmognathus_aeneus:35.53532208,((Desmognathus_quadramaculatus:28.94279626,Desmognathus_marmoratus:28.94279626):3.59105065,(Desmognathus_imitator:27.85297492,((Desmognathus_ochrophaeus:18.41976725,(Desmognathus_welteri:15.66841501,Desmognathus_fuscus:15.66841501):2.75135224):4.75233568,(Desmognathus_monticola:20.15276184,(Desmognathus_brimleyorum:17.72299623,Desmognathus_auriculatus:17.72299623):2.41189969):3.01934109):4.68087199):4.68087199):2.98360924):14.43566629):15.97213572):8.80790034):2.85854778):2.32257007):6.07441403):22.97557777):31,((Amphiuma_pholeter:2.74051282,Amphiuma_means:2.74051282):3.93948718,Amphiuma_tridactylum:6.68):133.32):12,(((Rhyacotriton_olympicus:1.76206061,Rhyacotriton_kezeri:1.76206061):5.75697501,Rhyacotriton_cascadae:7.51903561):1.14096439,Rhyacotriton_variegatus:8.66):143.34):18,(Proteus_anguinus:146,(((Necturus_alabamensis:70.9920748,Necturus_beyeri:70.99207481):4.15800956,Necturus_maculosus:75.15008437):9.35391177,Necturus_punctatus:84.50399613):61.49600386):24):11):13,((Andrias_davidianus:66,Cryptobranchus_alleganiensis:66):95,((((((Batrachuperus_pinchonii:23.92682927,Batrachuperus_yenyuanensis:23.92682926):18.31436314,Liua_shihi:42.24119242):5.51400181,Salamandrella_keyserlingii:47.75519422):3.93857272,((((((Hynobius_nebulosus:10.26136019,Hynobius_dunni:10.26136019):4.680505127,Hynobius_tsuensis:14.94186532):8.821265868,Hynobius_leechii:23.76313119):1.916897941,Hynobius_naevius:25.68002913):2.236917639,Hynobius_stejnegeri:27.91694677):1.431822774,((Hynobius_nigrescens:19.24520975,Hynobius_lichenatus:19.24520975):3.490512535,Hynobius_abei:22.73572228):6.61304726):22.34499738):5.21860885,Pachyhynobius_shangchengensis:56.91237579):4.62782295,(Paradactylodon_mustersi:47.55826557,Ranodon_sibiricus:47.55826557):13.98193315):99.45980126):33):20,(Pseudobranchus_axanthus:74,(Siren_lacertina:19.40020371,Siren_intermedia:19.40020371):54.59979629):140); diff --git a/examples/lizard_trait.txt b/examples/lizard_trait.txt new file mode 100644 index 0000000..3f51e46 --- /dev/null +++ b/examples/lizard_trait.txt @@ -0,0 +1,101 @@ +"tipnames","AVG_SVL","AVG_ltoe_IV","AVG_lfing_IV","region" +"ahli",4.039125443,2.553343811,1.943287666,0 +"alayoni",3.815704818,1.875257738,1.40302856,0 +"alfaroi",3.526654599,1.73254011,1.040276712,0 +"aliniger",4.036556538,2.256541154,1.702199393,1 +"allisoni",4.375390078,2.533696814,1.983412353,0 +"allogus",4.040138442,2.494900405,1.919010215,0 +"altitudinalis",3.842994419,1.786746927,1.349371007,0 +"alumina",3.588940722,1.991390664,1.179972809,1 +"alutaceus",3.554890814,1.86392508,1.133335725,0 +"angusticeps",3.788595498,1.813660733,1.270161748,0 +"argenteolus",3.971307363,2.365054167,1.763148935,0 +"argillaceus",3.757868992,2.002830439,1.467413412,0 +"armouri",4.121684075,2.580141069,1.938597764,1 +"bahorucoensis",3.827445029,2.261033666,1.538800833,1 +"baleatus",5.05305601,3.333632062,2.79766236,1 +"baracoae",5.042779747,3.320276511,2.757792293,0 +"barahonae",5.076957937,3.350305009,2.842248038,1 +"barbatus",5.003946306,3.142282716,2.759798947,0 +"barbouri",3.663931948,2.012084237,1.443252138,1 +"bartschi",4.280547466,2.655735652,2.110103001,0 +"bremeri",4.113370744,2.543110042,1.891981807,0 +"breslini",4.051110808,2.478951453,1.851206928,1 +"brevirostris",3.874154977,2.186725207,1.720979287,1 +"caudalis",3.911742966,2.144761008,1.698547088,1 +"centralis",3.697941213,1.878206962,1.330968178,0 +"chamaeleonides",5.04234927,3.148167197,2.791778417,0 +"chlorocyanus",4.275448057,2.538772612,1.976365995,1 +"christophei",3.884651809,2.387057535,1.867065703,1 +"clivicola",3.758726128,2.134905813,1.503521687,0 +"coelestinus",4.297965447,2.563339671,1.956760165,1 +"confusus",3.938442349,2.320144309,1.744717776,0 +"cooki",4.091535064,2.436241478,1.856818688,3 +"cristatellus",4.189820018,2.599384566,2.027071112,3 +"cupeyalensis",3.462013706,1.65653352,0.956365781,0 +"cuvieri",4.875011919,3.238062016,2.725422239,3 +"cyanopleurus",3.630161001,2.019485099,1.299585969,0 +"cybotes",4.210982161,2.650870397,2.035418406,1 +"darlingtoni",4.302036009,2.427454075,1.925707442,1 +"distichus",3.928795837,2.301298551,1.80194551,1 +"dolichocephalus",3.908550316,2.267475916,1.494027061,1 +"equestris",5.113993807,3.30953886,2.821031604,0 +"etheridgei",3.657990601,2.278975227,1.552514765,1 +"eugenegrahami",4.128504414,2.684781574,2.089391873,1 +"evermanni",4.165605231,2.613373154,2.015569465,3 +"fowleri",4.288779949,2.704544062,2.115652924,1 +"garmani",4.769473237,3.107656912,2.525042695,2 +"grahami",4.154274265,2.491787683,1.922578854,2 +"guafe",3.87745744,2.230954818,1.658942107,0 +"guamuhaya",5.036952602,3.238286218,2.841998174,0 +"guazuma",3.76388385,1.59240478,1.094901709,0 +"gundlachi",4.18810472,2.702255667,2.070372767,3 +"haetianus",4.316542212,2.823972922,2.193784323,1 +"hendersoni",3.859834574,2.264190705,1.508143194,1 +"homolechis",4.032805981,2.443650533,1.881752508,0 +"imias",4.099687407,2.489538762,1.926331986,0 +"inexpectatus",3.537438641,1.812582817,1.031403539,0 +"insolitus",3.80047052,1.856645152,1.337337516,1 +"isolepis",3.657087744,1.598039867,1.148988496,0 +"jubar",3.952604971,2.309477949,1.725738368,0 +"krugi",3.886500048,2.332338051,1.627670681,3 +"lineatopus",4.128611788,2.585505848,1.984901898,2 +"longitibialis",4.242103429,2.617979604,2.0589837,1 +"loysiana",3.701240244,1.894240844,1.418277407,0 +"lucius",4.198914766,2.616957781,2.140066163,0 +"luteogularis",5.101085197,3.346670796,2.832095072,0 +"macilentus",3.715764783,1.909542505,1.252762968,0 +"marcanoi",4.079484699,2.518985963,1.901062204,1 +"marron",3.831810283,2.143120318,1.662409797,1 +"mestrei",3.987147344,2.371347635,1.785527973,0 +"monticola",3.770613039,2.325976046,1.642872689,1 +"noblei",5.083472618,3.314549575,2.832428723,0 +"occultus",3.663048694,1.457451555,0.972671065,3 +"olssoni",3.79389884,2.275140483,1.406096988,1 +"opalinus",3.838376465,2.25800605,1.673726402,2 +"ophiolepis",3.637962029,1.986895396,1.279345283,0 +"oporinus",3.845669505,1.74745921,1.366091654,0 +"paternus",3.802961204,1.957979873,1.398716881,0 +"placidus",3.773967107,1.549687908,1.129787906,1 +"poncensis",3.820377531,2.183640669,1.468532459,3 +"porcatus",4.258990989,2.429091871,1.860974538,0 +"porcus",5.038034268,3.117876157,2.729594231,0 +"pulchellus",3.799022266,2.187454786,1.522244701,3 +"pumilis",3.46686027,1.588009965,1.088561953,0 +"quadriocellifer",3.901619072,2.25627934,1.690326416,0 +"reconditus",4.482606994,3.087171334,2.498768463,2 +"ricordii",5.013963084,3.359101428,2.839760492,1 +"rubribarbus",4.078469213,2.504055469,1.916628451,0 +"sagrei",4.067161768,2.476118144,1.836892159,0 +"semilineatus",3.696630586,2.201935685,1.323753843,1 +"sheplani",3.682924257,1.239822457,0.884800065,1 +"shrevei",3.983003234,2.422410486,1.776984184,1 +"singularis",4.057997494,2.332143895,1.755556421,1 +"smallwoodi",5.035095592,3.302691625,2.741300747,0 +"strahmi",4.274271278,2.654571284,2.074289403,1 +"stratulus",3.869880695,2.185301932,1.677096561,3 +"valencienni",4.321524401,2.378465303,1.869234781,2 +"vanidicus",3.62620586,1.77579945,1.067293605,0 +"vermiculatus",4.802849398,3.229900543,2.606386547,0 +"websteri",3.916546094,2.204604685,1.7275172,1 +"whitemani",4.097478535,2.51244075,1.881752508,1 diff --git a/examples/lizard_tree.txt b/examples/lizard_tree.txt new file mode 100644 index 0000000..f5d0bbb --- /dev/null +++ b/examples/lizard_tree.txt @@ -0,0 +1 @@ +((((((((ahli:6.544436481,allogus:6.544436481):5.45394495,rubribarbus:11.99838143):17.38620364,imias:29.38458508):6.398895957,((((sagrei:12.88102021,(bremeri:5.487182621,quadriocellifer:5.487182621):7.39383759):3.075299922,ophiolepis:15.95632013):4.36096088,mestrei:20.31728101):6.490702506,(((jubar:5.943297621,homolechis:5.943297621):4.526135954,confusus:10.46943358):2.107788591,guafe:12.57722217):14.23076135):8.975497514):6.886185624,((((garmani:10.00167905,opalinus:10.00167905):0.9843599411,grahami:10.98603899):10.8904957,valencienni:21.87653468):6.130643032,(lineatopus:23.56855311,reconditus:23.56855311):4.438624604):14.66248894):3.351759762,(((evermanni:10.67601358,stratulus:10.67601358):17.60760293,(((krugi:16.33780327,pulchellus:16.33780327):6.564651854,(gundlachi:19.32330063,poncensis:19.32330063):3.57915449):1.517539033,(cooki:19.7644096,cristatellus:19.7644096):4.655584552):3.863622354):7.477878776,(((brevirostris:13.78711733,(caudalis:8.524873097,marron:8.524873097):5.262244234):1.336374726,websteri:15.12349206):4.917874343,distichus:20.0413664):15.72012888):10.25993114):1.744366152,(((barbouri:40.10542509,(((alumina:13.40538439,semilineatus:13.40538439):10.9683589,olssoni:24.37374329):13.11118303,(etheridgei:29.41536076,(fowleri:18.854692,insolitus:18.854692):10.56066875):8.069565566):2.620498769):3.360194845,((((whitemani:17.10135633,((haetianus:13.34917036,breslini:13.34917036):3.481091738,((armouri:7.419547631,cybotes:7.419547631):2.208359111,shrevei:9.627906742):7.202355359):0.2710942246):5.332800474,(longitibialis:12.60626673,strahmi:12.60626673):9.827890069):4.571501266,marcanoi:27.00565807):12.52637604,((((((baleatus:2.086522712,barahonae:2.086522712):2.631837766,ricordii:4.718360478):10.18010755,eugenegrahami:14.89846803):4.255550995,christophei:19.15401903):4.547667011,cuvieri:23.70168604):5.381927504,(barbatus:7.339713347,(porcus:4.655292118,(chamaeleonides:3.815118093,guamuhaya:3.815118093):0.8401740246):2.68442123):21.74390019):10.44842056):3.933585836):3.798999624,((((((((altitudinalis:8.744497094,oporinus:8.744497094):4.610159031,isolepis:13.35465613):12.69460446,(allisoni:14.8011465,porcatus:14.8011465):11.24811409):1.851745599,(((argillaceus:5.710826139,centralis:5.710826139):1.24881222,pumilis:6.959638359):11.78128137,loysiana:18.74091973):9.160086453):4.261431265,guazuma:32.16243745):2.322058746,((placidus:9.347897895,sheplani:9.347897895):18.86829905,(alayoni:18.96909033,(angusticeps:10.86063481,paternus:10.86063481):8.10845552):9.247106617):6.26829925):3.943522271,((alutaceus:6.04309845,inexpectatus:6.04309845):20.21257905,(((clivicola:16.79799015,(cupeyalensis:4.303151532,cyanopleurus:4.303151532):12.49483861):5.948682113,(alfaroi:14.0116969,macilentus:14.0116969):8.734975363):0.461393415,vanidicus:23.20806568):3.047611821):12.17234097):4.717657381,(argenteolus:32.82165973,lucius:32.82165973):10.32401612):4.118943716):0.5011730105):2.234207429,(((bartschi:26.23626837,vermiculatus:26.23626837):12.4729884,((((baracoae:2.926988768,(noblei:1.070308761,smallwoodi:1.070308761):1.856680007):1.424582119,luteogularis:4.351570887):0.89496035,equestris:5.246531237):31.48597248,(((monticola:30.27768839,(bahorucoensis:19.20550341,(dolichocephalus:7.546354666,hendersoni:7.546354666):11.65914875):11.07218498):1.574600858,darlingtoni:31.85228925):1.644368006,(((aliniger:8.917713736,singularis:8.917713736):6.885287536,chlorocyanus:15.80300127):10.67813301,coelestinus:26.48113428):7.015522978):3.235846465):1.976753045):6.037411928,occultus:44.74666869):5.253331306); diff --git a/examples/test_8_withrepeatingsites.aln b/examples/test_8_withrepeatingsites.aln new file mode 100644 index 0000000..e0b8600 --- /dev/null +++ b/examples/test_8_withrepeatingsites.aln @@ -0,0 +1,12 @@ +>test_1 +GCGCCGAG +>test_2 +GCACCGAG +>test_3 +GCACCGAG +>test_4 +GTACCGAG +>test_5 +GTACCGAG +>test_6 +GTACCGGG \ No newline at end of file diff --git a/src/PhyloTraits.jl b/src/PhyloTraits.jl index 3797b1b..7df76e8 100644 --- a/src/PhyloTraits.jl +++ b/src/PhyloTraits.jl @@ -1,5 +1,89 @@ module PhyloTraits -# Write your package code here. +# default tolerances to optimize parameters in continuous trait evolution models +# like lambda, sigma2_withinspecies / sigma2_BM, etc. +const fAbsTr = 1e-10 +const fRelTr = 1e-12 +const xAbsTr = 1e-10 +const xRelTr = 1e-10 +const alphaRASmin = 0.02 +const alphaRASmax = 50.0 +const pinvRASmin = 1e-8 +const pinvRASmax = 0.99 +const kappamax = 20.0 + +using BioSequences +using BioSymbols +using DataFrames # innerjoin new in v0.21 +using Distributions #for RateVariationAcrossSites +using FASTX +using GLM +using LinearAlgebra: diag, I, logdet, norm, LowerTriangular, mul!, lmul!, rmul!, + Diagonal, cholesky, qr, BLAS +# caution: both LinearAlgebra and PhyloNetworks export rotate! +# alternative: drop support for julia v1.4, as LinearAlgebra.rotate! requires julia v1.5 +# using LinearAlgebra # bring all of LinearAlgebra into scope +# import LinearAlgebra.rotate! # allow re-definition of rotate! +using NLopt +using PhyloNetworks +using PhyloNetworks: Edge, Node, MatrixTopologicalOrder +using Printf: @printf, @sprintf +using Random +using Random: AbstractRNG, default_rng +using StaticArrays +using Statistics: mean, quantile, median +using StatsAPI: StatsAPI, coef, coefnames, coeftable, confint, deviance +using StatsAPI: dof, dof_residual, fit, fit!, fitted, isfitted, islinear, leverage +using StatsAPI: loglikelihood, modelmatrix, nobs, predict, r2, residuals +using StatsAPI: response, stderror, vcov +using StatsBase +using StatsFuns # logsumexp, logaddexp, log2π, various cdf +using StatsModels # re-exported by GLM. for ModelFrame ModelMatrix Formula etc + +const PN = PhyloNetworks + +# import: to extend methods from othe packages with new methods defined here +import Base: show, rand +import GLM: ftest, fit! +import PhyloNetworks: tiplabels +import Random: rand! +import StatsModels: coefnames + +export ftest # from GLM +# continuous traits +export phylolm, PhyloNetworkLinearModel +export rand, TraitSimulation +export ParamsBM, ParamsMultiBM +export ShiftNet, shiftathybrids, getshiftedgenumber, getshiftvalue +export descendencedataframe +export ancestralreconstruction, ReconstructedStates +export sigma2_phylo, sigma2_within +export mu_phylo +export lambda_estim +# discrete traits +export TraitSubstitutionModel +export EqualRatesSubstitutionModel, BinaryTraitSubstitutionModel +export TwoBinaryTraitSubstitutionModel +export JC69, HKY85 +export nstates +export Q +export getlabels +export nparams +export RateVariationAcrossSites +export rand, rand! +export fitdiscrete +export readfastatodna +export stationary +export empiricalDNAfrequencies + +include("nloptsummary.jl") +include("models_continuous.jl") +include("fit_phylolm_continuous.jl") +include("simulate_continuous.jl") +include("ancestral_continuous.jl") +include("models_substitutions.jl") +include("simulate_substitutions.jl") +include("fit_discrete.jl") +include("ancestral_posterior_discrete.jl") end diff --git a/src/ancestral_continuous.jl b/src/ancestral_continuous.jl new file mode 100644 index 0000000..0d44385 --- /dev/null +++ b/src/ancestral_continuous.jl @@ -0,0 +1,532 @@ +############################################################################### +## Ancestral State Reconstruction +############################################################################### +""" + ReconstructedStates + +Type containing the inferred information about the law of the ancestral states +given the observed tips values. The missing tips are considered as ancestral states. + +Reconstructed states and prediction intervals can be recovered with function `predict`, +and the standard error can be obtained with `stderror`. + +The `ReconstructedStates` object has fields: `traits_nodes`, `variances_nodes`, `nodenumbers`, `traits_tips`, `tipnumbers`, `model`. +Type in "?ReconstructedStates.field" to get help on a specific field. +""" +struct ReconstructedStates + "traits_nodes: the infered expectation of 'missing' values (ancestral nodes and missing tips)" + traits_nodes::Vector # Nodes are actually "missing" data (including tips) + "variances_nodes: the variance covariance matrix between all the 'missing' nodes" + variances_nodes::Matrix + "nodenumbers: vector of the nodes numbers, in the same order as `traits_nodes`" + nodenumbers::Vector{Int} + "traits_tips: the observed traits values at the tips" + traits_tips::Vector # Observed values at tips + "tipnumbers: vector of tips numbers, in the same order as `traits_tips`" + tipnumbers::Vector # Observed tips only + "model: if not missing, the `PhyloNetworkLinearModel` used for the computations." + model::Union{PhyloNetworkLinearModel, Missing} # if empirical, corresponding fitted object +end + +""" + predict( + obj::ReconstructedStates; + interval::Union{Symbol,Nothing}=nothing, + level::Real=0.95, + text::Bool=false, + digits::Int=2, + missingmark::AbstractString="*", + combine::Bool=false + ) + +Estimated reconstructed states and, if `interval=:prediction`, prediction +intervals with level `level` at all internal nodes and tips with missing traits. + +If `text=true`, the prediction and intervals are formated as string for easy +plotting with the `nodelabel` argument to `plot` from +package [`PhyloPlots`](https://github.com/juliaphylo/PhyloPlots.jl). +In that case, +`digits` controls the number of digits shown, +`missingmark` adds a distinctive mark to the prediction of tips with missing data, +(set to `missingmark=""` for no mark), +and if `combine=true`, the prediction and bound of the intervals are combined +into a single text string. +""" +function StatsAPI.predict( + obj::ReconstructedStates; + interval::Union{Symbol,Nothing}=nothing, + level::Real=0.95, + text::Bool=false, + digits::Int=2, + missingmark::AbstractString="*", + combine::Bool=false +) + res = DataFrame( + nodenumber = [obj.nodenumbers; obj.tipnumbers], + prediction = [obj.traits_nodes; obj.traits_tips] + ) + if interval === nothing + if text + res[!,:prediction] = string.(round.(res[!,:prediction], digits=digits), getmissingtipmarks(obj, missingmark)) + return res + end + return res + end + if interval === :prediction + pp = getpredint(obj; level) + res[!,:lower] = pp[:,1] + res[!,:upper] = pp[:,2] + if text + res[!,:interval] = formatinterval(obj, res, combine, digits) + res[!,:prediction] = string.(round.(res[!,:prediction], digits=digits), getmissingtipmarks(obj, missingmark)) + return res + end + return res + end + throw(ArgumentError("`interval` must be one of `nothing` or `:prediction`.")) +end + +""" + getmissingtipmarks(obj::ReconstructedStates, missingmark::AbstractString="*") + +Create a vector of string, with a `missingmark` for tips that are missing. +""" +function getmissingtipmarks(obj::ReconstructedStates, missingmark::AbstractString="*") + nodenumber = [obj.nodenumbers; obj.tipnumbers] + ismissingtip = fill("", length(nodenumber)) + if !ismissing(obj.model) + nonmissing = obj.model.nonmissing + ind = obj.model.ind + tipnumbers = obj.model.V.tipnumbers # all tips, even those absent from dataframe + tipnumbers_data = tipnumbers[ind][nonmissing] # listed and data non-missing + tipnumbers_imputed = setdiff(tipnumbers, tipnumbers_data) + indexMissing = indexin(tipnumbers_imputed, nodenumber) + ismissingtip[indexMissing] .*= missingmark + end + return(ismissingtip) +end + +StatsBase.stderror(obj::ReconstructedStates) = sqrt.(diag(obj.variances_nodes)) + +""" + getpredint(obj::ReconstructedStates; level::Real=0.95) + +Prediction intervals with level `level` for internal nodes and missing tips. +""" +function getpredint(obj::ReconstructedStates; level::Real=0.95) + if ismissing(obj.model) + qq = quantile(Normal(), (1. - level)/2.) + else + qq = quantile(GLM.TDist(dof_residual(obj.model)), (1. - level)/2.) # TDist from Distributions + # @warn "As the variance is estimated, the predictions intervals are not exact, and should probably be larger." + end + tmpnode = hcat(obj.traits_nodes, obj.traits_nodes) .+ (stderror(obj) * qq) .* [1. -1.] + return vcat(tmpnode, hcat(obj.traits_tips, obj.traits_tips)) +end + +function Base.show(io::IO, obj::ReconstructedStates) + println(io, "$(typeof(obj)):\n", + CoefTable(hcat(vcat(obj.nodenumbers, obj.tipnumbers), vcat(obj.traits_nodes, obj.traits_tips), getpredint(obj)), + ["Node index", "Pred.", "Min.", "Max. (95%)"], + fill("", length(obj.nodenumbers)+length(obj.tipnumbers)))) +end + +""" + formatinterval(obj::ReconstructedStates, pred::DataFrame, withexpectation::Bool=false, digits::Int=2) + +Format the prediction intervals for the plotting function. +If `withexpectation` is set to true, then the best +predicted value is also shown along with the interval. +""" +function formatinterval(obj::ReconstructedStates, pred::DataFrame, withexpectation::Bool=false, digits::Int=2) + pritxt = Array{AbstractString}(undef, size(pred, 1)) + for i in 1:length(obj.nodenumbers) + !withexpectation ? sep = ", " : sep = "; " * string(round(pred[i,:prediction], digits=digits) )* "; " + pritxt[i] = "[" * string(round(pred[i,:lower], digits=digits)) * sep * string(round(pred[i,:upper], digits=digits)) * "]" + end + for i in (length(obj.nodenumbers)+1):size(pred, 1) + pritxt[i] = string(round(pred[i,:prediction], digits=digits)) + end + return pritxt +end + +#= ----- roadmap of ancestralreconstruction, continuous traits ------ + +all methods return a ReconstructedStates object. +core method called by every other method: + +1. ancestralreconstruction(Vzz, VzyVyinvchol, RL, Y, m_y, m_z, + nodenumbers, tipnumbers, sigma2, add_var, model) + +higher-level methods, for real data: + +2. ancestralreconstruction(dataframe, net; tipnames=:tipnames, kwargs...) + - dataframe: 2 columns only, species names & tip response values + - fits an intercept-only model, then calls #3 + - by default without kwargs: model = BM w/o within-species variation + +3. ancestralreconstruction(PhyloNetworkLinearModel[, Matrix]) + - takes a model already fitted + - if no matrix given: the model must be intercept-only. An expanded intercept + column is created with length = # nodes with *no* data + - matrix: if given, must have same # of columns as the model matrix, and + must contain the predictor(s) at nodes with *no* data, with nodes listed in + the following order: + * internal nodes first, in the same order in which they appear in net.node, + i.e in V.internalnodenumbers + * then leaves with no data, in the same order in which they appear in + tiplabels(net), i.e. in V.tipnumbers. + - extracts the predicted values for all network nodes, and the unscaled + 3 covariance matrices of interest (nodes with data, nodes w/o, crossed) + - computes "universal" kriging (as opposed to "simple" kriging, which would + simply plug-in estimates into the prediction variance formula): a term is + added to the prediction variance, to account for the estimation of β. + +methods based on simulations with a ParamsProcess "params": + +4. ancestralreconstruction(net, Y, params) which calls: + ancestralreconstruction(V::MatrixTopologicalOrder, Y, params) + - intercept-only: known β and known variance: "simple" kriging is correct + - BM only: params must be of type ParamsBM +=# + +""" + ancestralreconstruction(net::HybridNetwork, Y::Vector, params::ParamsBM) + +Compute the conditional expectations and variances of the ancestral (un-observed) +traits values at the internal nodes of the phylogenetic network (`net`), +given the values of the traits at the tips of the network (`Y`) and some +known parameters of the process used for trait evolution (`params`, only BM with fixed root +works for now). + +This function assumes that the parameters of the process are known. For a more general +function, see `ancestralreconstruction(obj::PhyloNetworkLinearModel[, X_n::Matrix])`. + +""" +function ancestralreconstruction( + net::HybridNetwork, + Y::Vector, + params::ParamsBM +) + V = sharedpathmatrix(net) + ancestralreconstruction(V, Y, params) +end + +function ancestralreconstruction( + V::MatrixTopologicalOrder, + Y::Vector, + params::ParamsBM +) + # Variances matrices + Vy = V[:tips] + Vz = V[:internalnodes] + Vyz = V[:tipsnodes] + R = cholesky(Vy) + RL = R.L + VzyVyinvchol = (RL \ Vyz)' + # Vectors of means + m_y = ones(size(Vy)[1]) .* params.mu # !! correct only if no predictor. + m_z = ones(size(Vz)[1]) .* params.mu # !! works if BM no shift. + return ancestralreconstruction(Vz, VzyVyinvchol, RL, + Y, m_y, m_z, + V.internalnodenumbers, + V.tipnumbers, + params.sigma2) +end + +# Reconstruction from all the needed quantities +function ancestralreconstruction( + Vz::Matrix, + VzyVyinvchol::AbstractMatrix, + RL::LowerTriangular, + Y::Vector, + m_y::Vector, + m_z::Vector, + nodenumbers::Vector, + tipnumbers::Vector, + sigma2::Real, + add_var::Matrix=zeros(size(Vz)), # Additional variance for BLUP + model::Union{PhyloNetworkLinearModel,Missing}=missing +) + # E[z∣y] = E[z∣X] + Cov(z,y)⋅Var(y)⁻¹⋅(y-E[y∣X]) + m_z_cond_y = m_z + VzyVyinvchol * (RL \ (Y - m_y)) + V_z_cond_y = sigma2 .* (Vz - VzyVyinvchol * VzyVyinvchol') + if !ismissing(model) && !isnothing(model.model_within) # y = last part of z + Y = similar(Y, 0) # empty vector of similar type as Y + end + ReconstructedStates(m_z_cond_y, V_z_cond_y + add_var, nodenumbers, Y, tipnumbers, model) +end + +#= from a fitted object: see high-level docstring below +X_n: matrix with as many columns as the number of predictors used, + and as many rows as the number of unknown nodes or tips. + +TO DO: Handle the order of internal nodes and no-data tips for matrix X_n +=# +function ancestralreconstruction(obj::PhyloNetworkLinearModel, X_n::Matrix) + if size(X_n)[2] != length(coef(obj)) + error("""The number of predictors for the ancestral states (number of columns of X_n) + does not match the number of predictors at the tips.""") + end + if size(X_n)[1] != length(obj.V.internalnodenumbers) + length(obj.V.tipnumbers)-length(obj.ind) + sum(.!obj.nonmissing) + error("""The number of lines of the predictors does not match + the number of nodes plus the number of missing tips.""") + end + #= y: observed species means at some tips + z: trait (true species mean) at nodes to be predicted: + - at nodes without data, i.e. internal nodes & no-data tips + - at tips with data if within-species variation: y=ytrue+ϵ + Vy,y = Vy,ytrue = Vytrue,y and Vytrue,z = Vyz + =# + m_y = predict(obj) + m_z = X_n * coef(obj) + # If the tips were re-organized, do the same for Vyz + if obj.ind == [0] + @warn """There were no indication for the position of the tips on the network. + I am assuming that they are given in the same order. + Please check that this is what you intended.""" + ind = collect(1:length(obj.V.tipnumbers)) + else + ind = obj.ind + end + # Vyz: sharedpath. rows y: tips w/ data. cols z: internal nodes & tips w/o data + Vyz = obj.V[:tipsnodes, ind, obj.nonmissing] + Vzz = obj.V[:internalnodes, ind, obj.nonmissing] + nmTipNumbers = obj.V.tipnumbers[ind][obj.nonmissing] # tips w/ data + # no-data node numbers: for nodes (internal or tips) with no data + ndNodeNumbers = [obj.V.internalnodenumbers; setdiff(obj.V.tipnumbers, nmTipNumbers)] + if !isnothing(obj.model_within) # add tips with data to z + Vtips = obj.V[:tips, ind, obj.nonmissing] + Vzz = [Vzz Vyz'; Vyz Vtips] + Vyz = [Vyz Vtips] + append!(m_z, m_y) + append!(ndNodeNumbers, nmTipNumbers) + empty!(nmTipNumbers) + X_n = vcat(X_n, obj.X) + end + VzyVyinvchol = (obj.RL \ Vyz)' + # add_var = zeros corresponds to "simple" kriging: E[Y∣X]=Xβ with known β & variance components + # below: "universal" kriging: β estimated, variance components known + U = X_n - VzyVyinvchol * (obj.RL \ obj.X) + add_var = U * vcov(obj) * U' + @warn """These prediction intervals show uncertainty in ancestral values, + assuming that the estimated variance rate of evolution is correct. + Additional uncertainty in the estimation of this variance rate is + ignored, so prediction intervals should be larger.""" + return ancestralreconstruction( + Vzz, + VzyVyinvchol, + obj.RL, + obj.Y, + m_y, + m_z, + ndNodeNumbers, + nmTipNumbers, + sigma2_phylo(obj), + add_var, + obj) +end + +@doc raw""" + ancestralreconstruction(obj::PhyloNetworkLinearModel[, X_n::Matrix]) + +Function to find the ancestral traits reconstruction on a network, given an +object fitted by function [`phylolm`](@ref). By default, the function assumes +that the regressor is just an intercept. If the value of the regressor for +all the ancestral states is known, it can be entered in X_n, a matrix with as +many columns as the number of predictors used, and as many lines as the number +of unknown nodes or tips. + +Returns an object of type [`ReconstructedStates`](@ref). + +# Examples + +```jldoctest; filter = [r" PhyloTraits .*:\d+", ] +julia> using DataFrames, CSV # to read data file + +julia> phy = readnewick(joinpath(dirname(pathof(PhyloTraits)), "..", "examples", "carnivores_tree.txt")); + +julia> dat = CSV.read(joinpath(dirname(pathof(PhyloTraits)), "..", "examples", "carnivores_trait.txt"), DataFrame); + +julia> using StatsModels # for statistical model formulas + +julia> fitBM = phylolm(@formula(trait ~ 1), dat, phy); + +julia> ancStates = ancestralreconstruction(fitBM) # Should produce a warning, as variance is unknown. +┌ Warning: These prediction intervals show uncertainty in ancestral values, +│ assuming that the estimated variance rate of evolution is correct. +│ Additional uncertainty in the estimation of this variance rate is +│ ignored, so prediction intervals should be larger. +└ @ PhyloTraits ~/build/JuliaPhylo/PhyloTraits.jl/src/traits_continuous.jl:2601 +ReconstructedStates: +─────────────────────────────────────────────── + Node index Pred. Min. Max. (95%) +─────────────────────────────────────────────── + -5.0 1.32139 -0.33824 2.98102 + -8.0 1.03258 -0.589695 2.65485 + -7.0 1.41575 -0.140705 2.97221 + -6.0 1.39417 -0.107433 2.89577 + -4.0 1.39961 -0.102501 2.90171 + -3.0 1.51341 -0.220523 3.24733 + -13.0 5.3192 3.92279 6.71561 + -12.0 4.51176 2.89222 6.13131 + -16.0 1.50947 -0.0186118 3.03755 + -15.0 1.67425 0.196069 3.15242 + -14.0 1.80309 0.309992 3.29618 + -11.0 2.7351 1.17608 4.29412 + -10.0 2.73217 1.12361 4.34073 + -9.0 2.41132 0.603932 4.21871 + -2.0 2.04138 -0.0340955 4.11686 + 14.0 1.64289 1.64289 1.64289 + 8.0 1.67724 1.67724 1.67724 + 5.0 0.331568 0.331568 0.331568 + 2.0 2.27395 2.27395 2.27395 + 4.0 0.275237 0.275237 0.275237 + 6.0 3.39094 3.39094 3.39094 + 13.0 0.355799 0.355799 0.355799 + 15.0 0.542565 0.542565 0.542565 + 7.0 0.773436 0.773436 0.773436 + 10.0 6.94985 6.94985 6.94985 + 11.0 4.78323 4.78323 4.78323 + 12.0 5.33016 5.33016 5.33016 + 1.0 -0.122604 -0.122604 -0.122604 + 16.0 0.73989 0.73989 0.73989 + 9.0 4.84236 4.84236 4.84236 + 3.0 1.0695 1.0695 1.0695 +─────────────────────────────────────────────── + +julia> using StatsBase # for predict function + +julia> predict(ancStates) +31×2 DataFrame + Row │ nodenumber prediction + │ Int64 Float64 +─────┼──────────────────────── + 1 │ -5 1.32139 + 2 │ -8 1.03258 + 3 │ -7 1.41575 + 4 │ -6 1.39417 + 5 │ -4 1.39961 + 6 │ -3 1.51341 + 7 │ -13 5.3192 + 8 │ -12 4.51176 + ⋮ │ ⋮ ⋮ + 25 │ 10 6.94985 + 26 │ 11 4.78323 + 27 │ 12 5.33016 + 28 │ 1 -0.122604 + 29 │ 16 0.73989 + 30 │ 9 4.84236 + 31 │ 3 1.0695 + 16 rows omitted + +julia> predict(ancStates, interval = :prediction) +31×4 DataFrame + Row │ nodenumber prediction lower upper + │ Int64 Float64 Float64 Float64 +─────┼─────────────────────────────────────────────── + 1 │ -5 1.32139 -0.33824 2.98102 + 2 │ -8 1.03258 -0.589695 2.65485 + 3 │ -7 1.41575 -0.140705 2.97221 + 4 │ -6 1.39417 -0.107433 2.89577 + 5 │ -4 1.39961 -0.102501 2.90171 + 6 │ -3 1.51341 -0.220523 3.24733 + 7 │ -13 5.3192 3.92279 6.71561 + 8 │ -12 4.51176 2.89222 6.13131 + ⋮ │ ⋮ ⋮ ⋮ ⋮ + 25 │ 10 6.94985 6.94985 6.94985 + 26 │ 11 4.78323 4.78323 4.78323 + 27 │ 12 5.33016 5.33016 5.33016 + 28 │ 1 -0.122604 -0.122604 -0.122604 + 29 │ 16 0.73989 0.73989 0.73989 + 30 │ 9 4.84236 4.84236 4.84236 + 31 │ 3 1.0695 1.0695 1.0695 + 16 rows omitted + +julia> using PhyloPlots # next: plot ancestral states on the tree + +julia> plot(phy, nodelabel = predict(ancStates)); + +julia> pred = predict(ancStates, interval = :prediction, text = true); + +julia> plot(phy, nodelabel = pred[!,[:nodenumber,:interval]]); + +julia> allowmissing!(dat, :trait); + +julia> dat[[2, 5], :trait] .= missing; # missing values allowed to fit model + +julia> fitBM = phylolm(@formula(trait ~ 1), dat, phy); + +julia> ancStates = ancestralreconstruction(fitBM); +┌ Warning: These prediction intervals show uncertainty in ancestral values, +│ assuming that the estimated variance rate of evolution is correct. +│ Additional uncertainty in the estimation of this variance rate is +│ ignored, so prediction intervals should be larger. +└ @ PhyloTraits ~/build/JuliaPhylo/PhyloTraits.jl/src/traits_continuous.jl:2601 + +julia> first(predict(ancStates), 3) # looking at first 3 nodes only +3×2 DataFrame + Row │ nodenumber prediction + │ Int64 Float64 +─────┼──────────────────────── + 1 │ -5 1.42724 + 2 │ -8 1.35185 + 3 │ -7 1.61993 + +julia> first(predict(ancStates, interval=:prediction), 3) +3×4 DataFrame + Row │ nodenumber prediction lower upper + │ Int64 Float64 Float64 Float64 +─────┼──────────────────────────────────────────── + 1 │ -5 1.42724 -0.373749 3.22824 + 2 │ -8 1.35185 -0.698432 3.40214 + 3 │ -7 1.61993 -0.17179 3.41165 + +julia> plot(phy, nodelabel = predict(ancStates, text=true)); + +julia> pred = predict(ancStates, interval = :prediction, text = true); + +julia> plot(phy, nodelabel = pred[!,[:nodenumber,:interval]]); +``` +""" +function ancestralreconstruction(obj::PhyloNetworkLinearModel) + # default reconstruction for known predictors + if ((size(obj.X)[2] != 1) || !any(obj.X .== 1)) # Test if the regressor is just an intercept. + error("""Predictor(s) other than a plain intercept are used in this `PhyloNetworkLinearModel` object. + These predictors are unobserved at ancestral nodes, so they cannot be used + for the ancestral state reconstruction. If these ancestral predictor values + are known, please provide them as a matrix argument to the function. + Otherwise, you might consider doing a multivariate linear regression (not implemented yet).""") + end + X_n = ones((length(obj.V.nodenumbers_toporder) - sum(obj.nonmissing), 1)) + ancestralreconstruction(obj, X_n) +end + +""" + ancestralreconstruction(fr::AbstractDataFrame, net::HybridNetwork; kwargs...) + +Estimate the ancestral traits on a network, given some data at the tips. +Uses function [`phylolm`](@ref) to perform a phylogenetic regression of the data against an +intercept (amounts to fitting an evolutionary model on the network). + +See documentation on [`phylolm`](@ref) and `ancestralreconstruction(obj::PhyloNetworkLinearModel[, X_n::Matrix])` +for further details. + +Returns an object of type [`ReconstructedStates`](@ref). +""" +function ancestralreconstruction( + fr::AbstractDataFrame, + net::HybridNetwork; + tipnames::Symbol=:tipnames, + kwargs... +) + nn = DataFrames.propertynames(fr) + datpos = nn .!= tipnames + if sum(datpos) > 1 + error("""Besides one column labelled '$tipnames', the dataframe fr should have + only one column, corresponding to the data at the tips of the network.""") + end + f = @eval(@formula($(nn[datpos][1]) ~ 1)) + reg = phylolm(f, fr, net; tipnames=tipnames, kwargs...) + return ancestralreconstruction(reg) +end diff --git a/src/ancestral_posterior_discrete.jl b/src/ancestral_posterior_discrete.jl new file mode 100644 index 0000000..f14ef82 --- /dev/null +++ b/src/ancestral_posterior_discrete.jl @@ -0,0 +1,253 @@ +""" + posterior_logtreeweight(obj::SSM, trait = 1) + +Array A of log-posterior probabilities for each tree displayed in the network: +such that A[t] = log of P(tree `t` | trait `trait`) +if a single `trait` is requested, or A[t,i]= log of P(tree `t` | trait `i`) +if `trait` is a vector or range (e.g. `trait = 1:obj.nsites`). +These probabilities are conditional on the model parameters in `obj`. + +Displayed trees are listed in the order in which they are stored in the fitted +model object `obj`. + +**Precondition**: `_loglikcache` updated by [`discrete_corelikelihood!`](@ref) + +# examples + +```jldoctest +julia> net = readnewick("(((A:2.0,(B:1.0)#H1:0.1::0.9):1.5,(C:0.6,#H1:1.0::0.1):1.0):0.5,D:2.0);"); + +julia> m1 = BinaryTraitSubstitutionModel([0.1, 0.1], ["lo", "hi"]); # arbitrary rates + +julia> using DataFrames + +julia> dat = DataFrame(species=["C","A","B","D"], trait=["hi","lo","lo","hi"]); + +julia> fit = fitdiscrete(net, m1, dat); # optimized rates: α=0.27 and β=0.35 + +julia> pltw = PhyloTraits.posterior_logtreeweight(fit); + +julia> round.(exp.(pltw), digits=5) # posterior trees probabilities (sum up to 1) +2-element Vector{Float64}: + 0.91983 + 0.08017 + +julia> round.(exp.(fit.priorltw), digits=4) # the prior tree probabilities are similar here (tiny data set!) +2-element Vector{Float64}: + 0.9 + 0.1 +``` +""" +function posterior_logtreeweight(obj::SSM, trait = 1) + # ts[site,tree] = log P(data and tree) at site, integrated over rates + d = length(size(trait)) # 0 if single trait, 1 if vector of several traits + ts = dropdims(mapslices(logsumexp, view(obj._loglikcache, trait,:,:), + dims=d+1); dims=1) + if d>0 ts = permutedims(ts); end # now: ts[tree] or ts[tree,site] + siteliks = mapslices(logsumexp, ts, dims=1) # 1 x ntraits array (or 1-element vector) + ts .-= siteliks + return ts +end + +""" + posterior_loghybridweight(obj::SSM, hybrid_name, trait = 1) + posterior_loghybridweight(obj::SSM, edge_number, trait = 1) + +Log-posterior probability for all trees displaying the minor parent edge +of hybrid node named `hybrid_name`, or displaying the edge number `edge_number`. +That is: log of P(hybrid minor parent | trait) if a single `trait` is requested, +or A[i]= log of P(hybrid minor parent | trait `i`) +if `trait` is a vector or range (e.g. `trait = 1:obj.nsites`). +These probabilities are conditional on the model parameters in `obj`. + +**Precondition**: `_loglikcache` updated by [`discrete_corelikelihood!`](@ref) + +# examples + +```jldoctest +julia> net = readnewick("(((A:2.0,(B:1.0)#H1:0.1::0.9):1.5,(C:0.6,#H1:1.0::0.1):1.0):0.5,D:2.0);"); + +julia> m1 = BinaryTraitSubstitutionModel([0.1, 0.1], ["lo", "hi"]); # arbitrary rates + +julia> using DataFrames + +julia> dat = DataFrame(species=["C","A","B","D"], trait=["hi","lo","lo","hi"]); + +julia> fit = fitdiscrete(net, m1, dat); # optimized rates: α=0.27 and β=0.35 + +julia> plhw = PhyloTraits.posterior_loghybridweight(fit, "H1"); + +julia> round(exp(plhw), digits=5) # posterior probability of going through minor hybrid edge +0.08017 + +julia> hn = net.node[3]; getparentedgeminor(hn).gamma # prior probability +0.1 +``` +""" +function posterior_loghybridweight(obj::SSM, hybridname::String, trait = 1) + hn_index = findfirst(n -> n.name == hybridname, obj.net.node) + isnothing(hn_index) && error("node named $hybridname not found") + hn = obj.net.node[hn_index] + hn.hybrid || error("node named $hybridname is not a hybrid node") + me = getparentedgeminor(hn) + posterior_loghybridweight(obj, me.number, trait) +end +function posterior_loghybridweight(obj::SSM, edgenum::Integer, trait = 1) + tpp = posterior_logtreeweight(obj, trait) # size: (ntree,) or (ntree,ntraits) + hasedge = tree -> any(e.number == edgenum for e in tree.edge) + tokeep = map(hasedge, obj.displayedtree) + tppe = view(tpp, tokeep, :) # makes it a matrix + epp = dropdims(mapslices(logsumexp, tppe, dims=1); dims=2) + return (size(epp)==(1,) ? epp[1] : epp) # scalar or vector +end + +""" + ancestralreconstruction(obj::SSM, trait::Integer = 1) + +Estimate the marginal probability of ancestral states for discrete character +number `trait` (first trait by default). +The parameters of the [`StatisticalSubstitutionModel`](@ref) object `obj` +must first be fitted using [`fitdiscrete`](@ref), and ancestral state reconstruction +is conditional on the estimated parameters. If these parameters were estimated +using all traits, they are used as is, to do ancestral state reconstruction of the +particular `trait` of interest. + +**output**: data frame with a first column for the node numbers, a second column for +the node labels, and a column for each possible state: the entries in these columns +give the marginal probability that a given node has a given state. + +warnings: +- node numbers and node labels refer to those in `obj.net`, which might + have a different internal representation of nodes than the original network + used to build `obj`. +- `obj` is modified: its likelihood fields (forward, directional & backward) + are updated to make sure that they correspond to the current parameter values + in `obj.model`, and to the `trait` of interest. + +limitations: the following are not checked. +- Assumes that every node in the large network is also present + (with descendant leaves) in each displayed tree. + This is not true if the network is not tree-child... +- Assumes that the root is also in each displayed tree, which + may not be the case if the root had a hybrid child edge. + +See also [`posterior_logtreeweight`](@ref) and +[`discrete_backwardlikelihood_trait!`](@ref) to update `obj.backwardlik`. + +# examples + +```jldoctest +julia> net = readnewick("(((A:2.0,(B:1.0)#H1:0.1::0.9):1.5,(C:0.6,#H1:1.0::0.1):1.0):0.5,D:2.0);"); + +julia> m1 = BinaryTraitSubstitutionModel([0.1, 0.1], ["lo", "hi"]); + +julia> using DataFrames + +julia> dat = DataFrame(species=["C","A","B","D"], trait=["hi","lo","lo","hi"]); + +julia> fit1 = fitdiscrete(net, m1, dat); + +julia> asr = ancestralreconstruction(fit1) +9×4 DataFrame + Row │ nodenumber nodelabel lo hi + │ Int64 String Float64 Float64 +─────┼─────────────────────────────────────────── + 1 │ 1 A 1.0 0.0 + 2 │ 2 B 1.0 0.0 + 3 │ 3 C 0.0 1.0 + 4 │ 4 D 0.0 1.0 + 5 │ 5 5 0.286021 0.713979 + 6 │ 6 6 0.319456 0.680544 + 7 │ 7 7 0.16855 0.83145 + 8 │ 8 8 0.767359 0.232641 + 9 │ 9 H1 0.782776 0.217224 + +julia> using PhyloPlots + +julia> plot(fit1.net, nodelabel = asr[!,[:nodenumber, :lo]], tipoffset=0.2); # pp for "lo" state +``` +""" +function ancestralreconstruction(obj::SSM, trait::Integer = 1) + # posterior probability of state i at node n: proportional to + # sum_{tree t, rate r} exp( ltw[t] + backwardll[i,n] given t,r + forwardll[i,n] given t,r ) / nr + trait <= obj.nsites || error("trait $trait is larger than the number of traits in the data") + nnodes = length(obj.net.node) # may be smaller than 2nd size of bkd or frd + update_logtrans(obj) + bkd = view(obj.backwardlik, :, 1:nnodes) + frd = view(obj.forwardlik, :, 1:nnodes) + ltw = obj.priorltw + res = similar(bkd) # first: hold the cumulative logsumexp of bkd + frd + ltw + fill!(res, -Inf64) + nr = length(obj.ratemodel.ratemultiplier) + lrw = obj.ratemodel.lograteweight + for t in 1:length(obj.displayedtree) + ltprior = ltw[t] + for ri in 1:nr + # update forward & directional likelihoods + discrete_corelikelihood_trait!(obj,t,trait,ri) + # update backward likelihoods + discrete_backwardlikelihood_trait!(obj,t,ri) + # P{state i at node n} ∝ bkd[i,n] * frd[i,n] given tree & rate: + # res = logaddexp(res, ltw[t] + lrw[ri] + bkd + frd) + broadcast!(logaddexp, res, res, (ltprior + lrw[ri]) .+ bkd .+ frd) + end + end + # normalize the results at each node: p_i / sum(p_j over all states j) + traitloglik = logsumexp(res[:,1]) # sum p_j at node 1 or at any node = loglikelihood + res .= exp.(res .- traitloglik) + nodestringlabels = Vector{String}(undef, nnodes) + for n in obj.net.node + nodestringlabels[n.number] = (n.name == "" ? string(n.number) : n.name) + end + dat = DataFrame(transpose(res), Symbol.(getlabels(obj.model))) + insertcols!(dat, 1, :nodenumber => collect(1:nnodes), makeunique=true) + insertcols!(dat, 2, :nodelabel => nodestringlabels, makeunique=true) + return dat +end + +""" + discrete_backwardlikelihood_trait!(obj::SSM, tree::Integer, ri::Integer) + +Update and return the backward likelihood (last argument `backwardlik`) +assuming rate category `ri` and tree index `tree`, +using current forward and backwards likelihoods in `obj`: +these depend on the trait (or site) given to the last call to +`discrete_corelikelihood_trait!`. +Used by `ancestralreconstruction`. + +**warning**: assume correct transition probabilities. +""" +function discrete_backwardlikelihood_trait!(obj::SSM, t::Integer, ri::Integer) + backwardlik = obj.backwardlik + directlik = obj.directlik + tree = obj.displayedtree[t] + k = nstates(obj.model) + fill!(backwardlik, 0.0) # re-initialize for each trait, each iteration + bkwtmp = Vector{Float64}(undef, k) # to hold bkw lik without parent edge transition + if typeof(obj.model) <: NASM + logprior = log.(stationary(obj.model)) + else #trait models + logprior = [-log(k) for i in 1:k] # uniform prior at root + end + for ni in 1:length(tree.vec_node) # pre-order traversal to calculate backwardlik + n = tree.vec_node[ni] + nnum = n.number + if ni == 1 # n is the root + backwardlik[:,nnum] = logprior + else + pe = getparentedge(n) + pn = getparent(pe) + bkwtmp[:] = backwardlik[:,pn.number] # use bktmp's original memory + for se in pn.edge + if se != pe && pn == getparent(se) # then se is sister edge to pe + bkwtmp .+= view(directlik, :,se.number) + end + end + lt = view(obj.logtrans, :,:,pe.number,ri) + for j in 1:k # state at node n + backwardlik[j,nnum] = logsumexp(bkwtmp + view(lt,:,j)) + end + end + end + return backwardlik +end diff --git a/src/fit_discrete.jl b/src/fit_discrete.jl new file mode 100644 index 0000000..734aa32 --- /dev/null +++ b/src/fit_discrete.jl @@ -0,0 +1,1036 @@ +""" + StatisticalSubstitutionModel + +Subtype of `StatsBase.StatisticalModel`, to fit discrete data to a model +of trait substitution along a network. +See [`fitdiscrete`](@ref) to fit a trait substitution model to discrete data. +It returns an object of type `StatisticalSubstitutionModel`, to which standard +functions can be applied, like `loglikelihood(object)`, `aic(object)` etc. +""" +mutable struct StatisticalSubstitutionModel <: StatsBase.StatisticalModel + model::SubstitutionModel + ratemodel::RateVariationAcrossSites + """stationary for NASM models (log(1/4)), uniform in all other cases""" + prioratroot::Vector{Float64} + net::HybridNetwork + """ data: trait[i] for leaf with n.number = i + type Int: for indices of trait labels in getlabels(model) + allows missing, but not half-ambiguous and not multi-state""" + trait::Vector{Vector{Union{Missing, Int}}} + "number of columns in the data: should be equal to `length(trait[i])` for all i" + nsites::Int + "vector of weights, one for each column, taken as 1s if not provided" + siteweight::Union{Nothing, Vector{Float64}} + "total sum of site weights" + totalsiteweight::Float64 + """ + log of transition probabilities: where e goes from X to Y + logtrans[i,j,e,r] = P{Y=j|X=i} where i=start_state, j=end_state, e=edge.number, r = rate (if using RateVariationAcrossSites) + all displayed trees use same edge numbers and same logtrans as in full network + """ + loglik::Union{Missings.Missing, Float64} + """ + log of transition probabilities. + size: k,k, net.numedges, r where k=nstates(model) + """ + logtrans::Array{Float64,4} + # type based on extracting displayed trees + displayedtree::Vector{HybridNetwork} + """ + prior log tree weight: log product of γ's. + In fit!: priorltw = `PhyloNetworks.inheritanceweight.(trees)` + (which returns missing for any negative γ and would cause an error here) + """ + priorltw::Vector{Float64} + """ + partial log-likelihoods for active trait(s) given a particular displayed tree + and a particular rate category, at indices [i, n.number or e.number]: + - forward likelihood: log P{data below node n (in tree t) given state i at n} + - direct likelihood: log P{data below edge e (in tree t) given i at parent of e} + - backward likelihood:log P{data at all non-descendants of n (in t) and state i at n} + sizes: k, net.numnodes or net.numedges. + """ + # reset for each trait and rate + forwardlik::Array{Float64,2} # size: k, net.numnodes + directlik::Array{Float64,2} # size: k, net.numedges + backwardlik::Array{Float64,2}# size: k, net.numnodes + "log-likelihood of site k" + _sitecache::Array{Float64,1} # size: nsites + "log-likelihood of ith displayed tree t & rate category j, of site k" + _loglikcache::Array{Float64, 3} # size: nsites, nrates, ntrees + + "inner (default) constructor: from model, rate model, network, trait and site weights" + function StatisticalSubstitutionModel( + model::SubstitutionModel, + ratemodel::RateVariationAcrossSites, + net::HybridNetwork, + trait::AbstractVector, + siteweight::Union{Nothing, Vector{Float64}}=nothing, + maxhybrid::Int=length(net.hybrid) + ) + length(trait) > 0 || error("no trait data!") + nsites = length(trait[1]) + siteweight === nothing || length(siteweight) == nsites || + error("siteweight must be of same length as the number of traits") + totalsiteweight = (siteweight === nothing ? float(nsites) : sum(siteweight)) + k = nstates(model) + if typeof(model) <: NASM + prioratroot = log.(stationary(model)) #refactor to save in obj + else # other trait models + prioratroot = [-log(k) for i in 1:k] # uniform prior at root + end + # T = eltype(getlabels(model)) + # extract displayed trees + trees = displayedtrees(net, 0.0; nofuse=true, keeporiginalroot=true) + for tree in trees + preorder!(tree) # no need to call directedges! before: already done on net + end + ntrees = 2^maxhybrid + ntrees >= length(trees) || + error("""maxhybrid is too low. + Call using maxhybrid >= current number of hybrids""") + # log tree weights: sum log(γ) over edges, for each displayed tree + priorltw = PN.inheritanceweight.(trees) + all(!ismissing, priorltw) || + error("one or more inheritance γ's are missing or negative. fix using setgamma!(network, edge)") + maxedges = length(net.edge) + 3*(maxhybrid-length(net.hybrid)) + maxnodes = length(net.node) + 2*(maxhybrid-length(net.hybrid)) + logtrans = zeros(Float64, k,k, maxedges, length(ratemodel.ratemultiplier)) + forwardlik = zeros(Float64, k, maxnodes) + directlik = zeros(Float64, k, maxedges) + backwardlik= zeros(Float64, k, maxnodes) + _sitecache = Vector{Float64}(undef, nsites) + _loglikcache = zeros(Float64, nsites, length(ratemodel.ratemultiplier), ntrees) + new(deepcopy(model), deepcopy(ratemodel), prioratroot, + net, trait, nsites, siteweight, totalsiteweight, missing, # missing log likelihood + logtrans, trees, + priorltw, forwardlik, directlik, backwardlik,_sitecache,_loglikcache) + end +end +const SSM = StatisticalSubstitutionModel + +# fasta constructor: from net, fasta filename, modsymbol, and maxhybrid +# Works for DNA in fasta format. Probably need different versions for +# different kinds of data (snp, amino acids). Similar to fitdiscrete() +""" + StatisticalSubstitutionModel( + model::SubstitutionModel, + ratemodel::RateVariationAcrossSites, + net::HybridNetwork, + trait::AbstractVector, + siteweight::Union{Nothing, Vector{Float64}}=nothing, + maxhybrid::Int=length(net.hybrid) + ) + +Inner constructor. Makes a deep copy of the input model, rate model. +Warning: does *not* make a deep copy of the network: +modification of the `object.net` would modify the input `net`. +Assumes that the network has valid gamma values (to extract displayed trees). + + StatisticalSubstitutionModel( + net::HybridNetwork, + fastafile::String, + modsymbol::Symbol, + rvsymbol::Symbol=:noRV, + ratecategories::Int=4; + maxhybrid::Int=length(net.hybrid) + ) + +Constructor from a network and a fasta file. +The model symbol should be one of `:JC69`, `:HKY85`, `:ERSM` or `:BTSM`. +The `rvsymbol` should be as required by [`RateVariationAcrossSites`](@ref). + +The network's gamma values are modified if they are missing. After that, +a deep copy of the network is passed to the inner constructor. +""" +function StatisticalSubstitutionModel( + net::HybridNetwork, + fastafile::AbstractString, + modsymbol::Symbol, + rvsymbol::Symbol=:noRV, + ratecategories::Int=4; + maxhybrid::Int=length(net.hybrid) +) + for e in net.edge # check for missing or inappropriate γ values + if e.hybrid + e.gamma > 0.0 && continue + setgamma!(e, (e.ismajor ? 0.6 : 0.4)) # to maintain ismajor as is + else + e.gamma == 1.0 || error("tree edge number $(e.number) has γ not 1.0") + end + end + data, siteweights = readfastatodna(fastafile, true) + model = defaultsubstitutionmodel(net, modsymbol, data, siteweights) + ratemodel = RateVariationAcrossSites(rvsymbol, ratecategories) + dat2 = traitlabels2indices(view(data, :, 2:size(data,2)), model) + # check_matchtaxonnames makes a deep copy of the network + o, net = check_matchtaxonnames!(data[:,1], dat2, net) # calls resetnodenumbers, which calls preorder! + trait = dat2[o] + obj = StatisticalSubstitutionModel(model, ratemodel, net, trait, siteweights, + maxhybrid) +end + +StatsAPI.loglikelihood(obj::SSM) = obj.loglik +StatsAPI.islinear(::SSM) = false +StatsAPI.dof(obj::SSM) = nparams(obj.model) + nparams(obj.ratemodel) +function Base.show(io::IO, obj::SSM) + disp = "$(typeof(obj)):\n" + disp *= replace(string(obj.model), r"\n" => "\n ") * "\n" + if nparams(obj.ratemodel) > 0 + disp *= replace(string(obj.ratemodel), r"\n" => "\n ") * "\n" + end + disp *= "on a network with $(obj.net.numhybrids) reticulations\n" + print(io, disp) + showdata(io, obj) + if !ismissing(obj.loglik) + print(io, "\nlog-likelihood: $(round(obj.loglik, digits=5))") + end +end +""" + showdata(io::IO, obj::SSM, fullsiteinfo::Bool=false) + +Return information about the data in an SSM object: +number of species, number or traits or sites, number of distinct patterns, +and more information if `fullsiteinfo` is true: +number sites with missing data only, +number of invariant sites, number of sites with 2 distinct states, +number of parsimony-informative sites (with 2+ states being observed in 2+ tips), +number of sites with some missing data, and +overall proportion of entries with missing data. + +Note: Missing is not considered an additional state. For example, +if a site contains some missing data, but all non-missing values take the same +state, then this site is counted in the category "invariant". +""" +function showdata(io::IO, obj::SSM, fullsiteinfo::Bool=false) + disp = "data:\n $(length(obj.trait)) species" + ns = obj.totalsiteweight + ns = (isapprox(ns, round(ns), atol=1e-5) ? Int(round(ns)) : ns) + disp *= (ns ≈ 1 ? "\n $ns trait" : "\n $ns sites") + if !isapprox(obj.nsites, ns, atol=1e-5) + disp *= "\n $(obj.nsites) distinct patterns" + end + print(io, disp) + (fullsiteinfo && obj.nsites != 1) || return nothing + # if more than 1 trait and if the user wants full information: + nsv = MVector{6,Float64}(undef) # vector to count number of + # sites with: 0, 1, 2 states, parsimony informative, with 1+ missing value, + # missing values across all sites. + fill!(nsv, 0.0) + text = ["sites with no data", "invariant sites", + "sites with 2 distinct states", "parsimony-informative sites", + "sites with 1 or more missing values", "missing values overall"] + trackstates = zeros(Int, nstates(obj.model)) # states seen at a given site + ntaxa = length(obj.trait) + for i in 1:(obj.nsites) # over sites + sweight = (isnothing(obj.siteweight) ? 1.0 : obj.siteweight[i]) + missone = false + fill!(trackstates, 0) + for j in 1:ntaxa # over taxa + data = obj.trait[j][i] + if ismissing(data) + nsv[6] += sweight # total number of missing values + missone && continue + nsv[5] += sweight # sites with 1+ missing values + missone = true + else # mark state seen + trackstates[data] += 1 # 1 more taxon + end + end + # add site's weight to appropriate nstates + nstates = sum(trackstates .> 0) + if nstates < 3 + nsv[nstates+1] += sweight + end + if nstates>1 # are there 2 states observed at 2+ taxa each? + nstates_2taxa = sum(trackstates .> 1) + if nstates_2taxa>1 + nsv[4] += sweight + end + end + end + nsv_r = map(x -> begin y=round(x); (isapprox(y,x,atol=1e-5) ? Int(y) : x); end, nsv) + for i in 1:5 + print(io, "\n $(nsv_r[i]) $(text[i]) ($(round(100*nsv[i]/ns, digits=2))%)") + end + print(io, "\n $(round(100*nsv[6]/(ns*ntaxa), digits=2))% $(text[6])") +end +# nobs: nsites * nspecies, minus any missing, but ignores correlation between species +# fixit: extend the StatsBase methods +# coef, coefnames, coeftable, confint, +# deviance (not from loglik in StatsBase), nulldeviance (from intercept only. here?) +# nullloglikelihood (from intercept only. here?) +# score (gradient of loglik) +# informationmatrix: Fisher by default, observed info matrix if expected=false +# stderror, vcov, params +# weights + +""" + fitdiscrete(net, model, tipdata) + fitdiscrete(net, model, RateVariationAcrossSites, tipdata) + fitdiscrete(net, model, species, traits) + fitdiscrete(net, model, RateVariationAcrossSites, species, traits) + fitdiscrete(net, model, dnadata, dnapatternweights) + fitdiscrete(net, model, RateVariationAcrossSites, dnadata, dnapatternweights) + fitdiscrete(net, modSymbol, species, traits) + fitdiscrete(net, modSymbol, dnadata, dnapatternweights) + +Calculate the maximum likelihood (ML) score of a network or tree given +one or more discrete characters at the tips. Along each edge, transitions +are modelled with a continous time Markov `model`, whose parameters are +estimated (by maximizing the likelihood). At each hybrid node, +the trait is assumed to be inherited from either of the two immediate +parents according to the parents' average genetic contributions +(inheritance γ). The model ignores incomplete lineage sorting. +The algorithm extracts all trees displayed in the network. + +Data can given in one of the following: +- `tipdata`: dictionary taxon => state label, for a single trait. +- `tipdata`: data frame for a single trait, in which case the taxon names + are to appear in column 1 or in a column named "taxon" or "species", and + trait *labels* are to appear in column 2 or in a column named "trait". + Here, trait labels should be as they appear in `getlabels(model)`. +- `species`: vector of strings, and `traits`: DataFrame of traits, + with rows in the order corresponding to the order of species names. + Again, trait labels should be as they appear in `getlabels(model)`. + All traits are assumed to follow the same model, with same parameters. +- `dnadata`: the first part of the output of readfastatodna, + a dataframe of BioSequence DNA sequences, with taxon in column 1 and + a column for each site. +- `dnapatternweights`: the second part of the output of readfastatodna, + an array of weights, one weights for each of the site columns. + The length of the weight is equal to nsites. + If using dnapatternweights, must provide dnadata. +- RateVariationAcrossSites: model for rate variation (optional) + +Optional arguments (default): +- `optimizeQ` (true): should model rate parameters be fixed, + or should they be optimized? +- `optimizeRVAS` (true): should the model optimize the parameters + for the variability of rates across sites (α and/or p_invariable)? +- `NLoptMethod` (`:LN_COBYLA`, derivative-free) for the optimization algorithm. + For other options, see the + [NLopt](https://nlopt.readthedocs.io/en/latest/NLopt_Algorithms/). +- tolerance values to control when the optimization is stopped: + `ftolRel` (1e-12), `ftolAbs` (1e-10) on the likelihood, and + `xtolRel` (1e-10), `xtolAbs` (1e-10) on the model parameters. +- bounds for the alpha parameter of the Gamma distribution of + rates across sites: `alphamin=0.05`, `alphamax=50`. +- `verbose` (false): if true, more information is output. + +# examples: + +```jldoctest fitDiscrete_block +julia> net = readnewick("(((A:2.0,(B:1.0)#H1:0.1::0.9):1.5,(C:0.6,#H1:1.0::0.1):1.0):0.5,D:2.0);"); + +julia> m1 = BinaryTraitSubstitutionModel([0.1, 0.1], ["lo", "hi"]); + +julia> using DataFrames + +julia> dat = DataFrame(species=["C","A","B","D"], trait=["hi","lo","lo","hi"]); + +julia> fit1 = fitdiscrete(net, m1, dat) +PhyloTraits.StatisticalSubstitutionModel: +Binary Trait Substitution Model: + rate lo→hi α=0.27222 + rate hi→lo β=0.34981 +on a network with 1 reticulations +data: + 4 species + 1 trait +log-likelihood: -2.7277 + +julia> tips = Dict("A" => "lo", "B" => "lo", "C" => "hi", "D" => "hi"); + +julia> fit2 = fitdiscrete(net, m1, tips; xtolRel=1e-16, xtolAbs=1e-16, ftolRel=1e-16) +PhyloTraits.StatisticalSubstitutionModel: +Binary Trait Substitution Model: + rate lo→hi α=0.27222 + rate hi→lo β=0.34981 +on a network with 1 reticulations +data: + 4 species + 1 trait +log-likelihood: -2.7277 +``` + +Note that a copy of the network is stored in the fitted object, +but the internal representation of the network may be different in +`fit1.net` and in the original network `net`: + +```jldoctest fitDiscrete_block +julia> net = readnewick("(sp1:3.0,(sp2:2.0,(sp3:1.0,sp4:1.0):1.0):1.0);"); + +julia> using BioSymbols + +julia> tips = Dict("sp1" => BioSymbols.DNA_A, "sp2" => BioSymbols.DNA_A, "sp3" => BioSymbols.DNA_G, "sp4" => BioSymbols.DNA_G); + +julia> mJC69 = JC69([0.25], false); + +julia> fitJC69 = fitdiscrete(net, mJC69, tips) +PhyloTraits.StatisticalSubstitutionModel: +Jukes and Cantor 69 Substitution Model, + absolute rate version + off-diagonal rates equal to 0.29233/3. + rate matrix Q: + A C G T + A * 0.0974 0.0974 0.0974 + C 0.0974 * 0.0974 0.0974 + G 0.0974 0.0974 * 0.0974 + T 0.0974 0.0974 0.0974 * +on a network with 0 reticulations +data: + 4 species + 1 trait +log-likelihood: -4.99274 + +julia> rv = RateVariationAcrossSites(alpha=1.0, ncat=4) +Rate variation across sites: discretized Gamma +alpha: 1.0 +categories for Gamma discretization: 4 +rates: [0.146, 0.513, 1.071, 2.27] + +julia> fitdiscrete(net, mJC69, rv, tips; optimizeQ=false, optimizeRVAS=false) +PhyloTraits.StatisticalSubstitutionModel: +Jukes and Cantor 69 Substitution Model, + absolute rate version + off-diagonal rates equal to 0.25/3. + rate matrix Q: + A C G T + A * 0.0833 0.0833 0.0833 + C 0.0833 * 0.0833 0.0833 + G 0.0833 0.0833 * 0.0833 + T 0.0833 0.0833 0.0833 * +Rate variation across sites: discretized Gamma + alpha: 1.0 + categories for Gamma discretization: 4 + rates: [0.146, 0.513, 1.071, 2.27] +on a network with 0 reticulations +data: + 4 species + 1 trait +log-likelihood: -5.2568 + +``` +fixit: add option to allow users to specify root prior, +using either equal frequencies or stationary frequencies for trait models. +""" +function fitdiscrete(net::HybridNetwork, model::SubstitutionModel, + tips::Dict; kwargs...) #tips::Dict no ratemodel version + ratemodel = RateVariationAcrossSites(ncat=1) + fitdiscrete(net, model, ratemodel, tips; kwargs...) +end + +#tips::Dict version with ratemodel +function fitdiscrete(net::HybridNetwork, model::SubstitutionModel, ratemodel::RateVariationAcrossSites, + tips::Dict; kwargs...) + species = String[] + dat = Vector{Int}[] # indices of trait labels + for (k,v) in tips + !ismissing(v) || continue + push!(species, k) + vi = findfirst(isequal(v), getlabels(model)) + vi !== nothing || error("trait $v not found in model") + push!(dat, [vi]) + end + o, net = check_matchtaxonnames!(species, dat, net) # dat[o] would make a shallow copy only + StatsAPI.fit(StatisticalSubstitutionModel, net, model, ratemodel, view(dat, o); kwargs...) +end + +#dat::DataFrame, no rate model version +function fitdiscrete(net::HybridNetwork, model::SubstitutionModel, + dat::DataFrame; kwargs...) + ratemodel = RateVariationAcrossSites(ncat=1) + fitdiscrete(net, model, ratemodel, dat; kwargs...) +end + +#dat::DataFrame with rate model version +function fitdiscrete(net::HybridNetwork, model::SubstitutionModel, + ratemodel::RateVariationAcrossSites, dat::DataFrame; kwargs...) + i = findfirst(isequal(:taxon), DataFrames.propertynames(dat)) + if i===nothing i = findfirst(isequal(:species), DataFrames.propertynames(dat)); end + if i===nothing i=1; end # first column if no column "taxon" or "species" + j = findfirst(isequal(:trait), DataFrames.propertynames(dat)) + if j===nothing j=2; end + if i==j + error("""expecting taxon names in column 'taxon', or 'species' or + column 1, and trait values in column 'trait' or column 2.""") + end + species = dat[:,i] # modified in place later + dat = traitlabels2indices(dat[!,j], model) # vec of vec, indices + o, net = check_matchtaxonnames!(species, dat, net) + StatsAPI.fit(StatisticalSubstitutionModel, net, model, ratemodel, view(dat, o); kwargs...) +end + +#species, dat version, no ratemodel +function fitdiscrete(net::HybridNetwork, model::SubstitutionModel, + species::Array{<:AbstractString}, dat::DataFrame; kwargs...) + ratemodel = RateVariationAcrossSites(ncat=1) + fitdiscrete(net, model, ratemodel, species, dat; kwargs...) +end + +#species, dat version with ratemodel +function fitdiscrete(net::HybridNetwork, model::SubstitutionModel, + ratemodel::RateVariationAcrossSites, species::Array{<:AbstractString}, + dat::DataFrame; kwargs...) + dat2 = traitlabels2indices(dat, model) # vec of vec, indices + o, net = check_matchtaxonnames!(copy(species), dat2, net) + StatsAPI.fit(StatisticalSubstitutionModel, net, model, ratemodel, view(dat2, o); kwargs...) +end + +#wrapper: species, dat version with model symbol +function fitdiscrete( + net::HybridNetwork, + modSymbol::Symbol, + species::Array{<:AbstractString}, + dat::DataFrame, + rvSymbol::Symbol=:noRV; + kwargs... +) + rate = startingrate(net) + labels = learnlabels(modSymbol, dat) + if modSymbol == :JC69 + model = JC69([1.0], true) # 1.0 instead of rate because relative version + elseif modSymbol == :HKY85 + model = HKY85([1.0], # transition/transversion rate ratio + empiricalDNAfrequencies(dat, repeat([1.], inner=size(dat, 2))), + true) + elseif modSymbol == :ERSM + model = EqualRatesSubstitutionModel(length(labels), rate, labels); + elseif modSymbol == :BTSM + model = BinaryTraitSubstitutionModel([rate, rate], labels) + elseif modSymbol == :TBTSM + model = TwoBinaryTraitSubstitutionModel([rate, rate, rate, rate, rate, rate, rate, rate], labels) + else + error("model $modSymbol is unknown or not implemented yet") + end + + rvas = RateVariationAcrossSites(rvSymbol) + fitdiscrete(net, model, rvas, species, dat; kwargs...) +end + +#dnadata with dnapatternweights version, no ratemodel +function fitdiscrete(net::HybridNetwork, model::SubstitutionModel, + dnadata::DataFrame, dnapatternweights::Array{Float64}; kwargs...) + ratemodel = RateVariationAcrossSites(ncat=1) + fitdiscrete(net, model, ratemodel, dnadata, dnapatternweights; kwargs...) +end + +#dnadata with dnapatternweights version with ratemodel +function fitdiscrete(net::HybridNetwork, model::SubstitutionModel, + ratemodel::RateVariationAcrossSites,dnadata::DataFrame, + dnapatternweights::Array{<:AbstractFloat}; kwargs...) + dat2 = traitlabels2indices(dnadata[!,2:end], model) + o, net = check_matchtaxonnames!(dnadata[:,1], dat2, net) + kwargs = (:siteweights => dnapatternweights, kwargs...) + StatsAPI.fit(StatisticalSubstitutionModel, net, model, ratemodel, view(dat2, o); + kwargs...) +end + +#wrapper for dna data +function fitdiscrete( + net::HybridNetwork, + modSymbol::Symbol, + dnadata::DataFrame, + dnapatternweights::Array{<:AbstractFloat}, + rvSymbol::Symbol=:noRV; + kwargs... +) + rate = startingrate(net) + if modSymbol == :JC69 + model = JC69([1.0], true) # 1.0 instead of rate because relative version + elseif modSymbol == :HKY85 + model = HKY85([1.0], # transition/transversion rate ratio + empiricalDNAfrequencies(view(dnadata, :, 2:size(dnadata,2)), dnapatternweights), + true) + elseif modSymbol == :ERSM + model = EqualRatesSubstitutionModel(4, rate, [BioSymbols.DNA_A, BioSymbols.DNA_C, BioSymbols.DNA_G, BioSymbols.DNA_T]); + elseif modSymbol == :BTSM + error("Binary Trait Substitution Model supports only two trait states, but dna data has four states.") + elseif modSymbol == :TBTSM + error("Two Binary Trait Substitution Model does not support dna data: it supports two sets of potentially correlated two trait states.") + else + error("model $modSymbol is unknown or not implemented yet") + end + + rvas = RateVariationAcrossSites(rvSymbol) + fitdiscrete(net, model, rvas, dnadata, dnapatternweights; kwargs...) +end + +""" + fit(StatisticalSubstitutionModel, net, model, traits; kwargs...) + fit!(StatisticalSubstitutionModel; kwargs...) + +Internal function called by [`fitdiscrete`](@ref): with same key word arguments `kwargs`. +But dangerous: `traits` should be a vector of vectors as for [`fitdiscrete`](@ref) +**but** here `traits` need to contain the *indices* of trait values corresponding +to the indices in `getlabels(model)`, and species should appear in `traits` in the +order corresponding to the node numbers in `net`. +See [`traitlabels2indices`](@ref) to convert trait labels to trait indices. + +**Warning**: does *not* perform checks. [`fitdiscrete`](@ref) calls this function +after doing checks, preordering nodes in the network, making sure nodes have +consecutive numbers, species are matched between data and network etc. +""" +function StatsAPI.fit(::Type{SSM}, net::HybridNetwork, model::SubstitutionModel, + ratemodel::RateVariationAcrossSites, trait::AbstractVector; kwargs...) + + sw = nothing + if haskey(kwargs, :siteweights) + sw = kwargs[:siteweights] + kwargs = filter(p -> p.first != :siteweights, kwargs) + end + obj = StatisticalSubstitutionModel(model, ratemodel, net, trait, sw) + fit!(obj; kwargs...) +end + +function fit!( + obj::SSM; + optimizeQ::Bool=true, + optimizeRVAS::Bool=true, + closeoptim::Bool=false, + verbose::Bool=false, + maxeval::Int=1000, + ftolRel::Float64=fRelTr, + ftolAbs::Float64=fAbsTr, + xtolRel::Float64=xRelTr, + xtolAbs::Float64=xAbsTr, + alphamin=alphaRASmin, + alphamax=alphaRASmax, + pinvmin=pinvRASmin, + pinvmax=pinvRASmax +) + all(x -> x >= 0.0, [e.length for e in obj.net.edge]) || error("branch lengths should be >= 0") + all(x -> x >= 0.0, [e.gamma for e in obj.net.edge]) || error("gammas should be >= 0") + if optimizeQ && nparams(obj.model) <1 + @debug "The Q matrix for this model is fixed, so there are no rate parameters to optimize. optimizeQ will be set to false." + optimizeQ = false + end + if optimizeRVAS && (nparams(obj.ratemodel) == 0) + @debug "Rate model has one rate category, so there are no parameters to optimize. optimizeRVAS will be set to false." + optimizeRVAS = false + end + if !optimizeQ && !optimizeRVAS + discrete_corelikelihood!(obj) + verbose && println("loglik = $(loglikelihood(obj)) under fixed parameters, no optimization") + return obj + end + if optimizeQ + function loglikfun(x::Vector{<:AbstractFloat}, grad::Vector{<:AbstractFloat}) # modifies obj + setrates!(obj.model, x) + res = discrete_corelikelihood!(obj) + verbose && println("loglik: $res, model rates: $x") + length(grad) == 0 || error("gradient not implemented") + return res + end + # optimize Q under fixed RVAS parameters + # set-up optimization object for Q + NLoptMethod=:LN_COBYLA # no gradient # :LN_COBYLA for (non)linear constraits, :LN_BOBYQA for bound constraints + nparQ = nparams(obj.model) + optQ = NLopt.Opt(NLoptMethod, nparQ) + NLopt.ftol_rel!(optQ,ftolRel) # relative criterion + NLopt.ftol_abs!(optQ,ftolAbs) # absolute criterion + NLopt.xtol_rel!(optQ,xtolRel) + NLopt.xtol_abs!(optQ,xtolAbs) + NLopt.maxeval!(optQ, maxeval) # max number of iterations + # NLopt.maxtime!(optQ, t::Real) + NLopt.lower_bounds!(optQ, zeros(Float64, nparQ)) + if typeof(obj.model) == HKY85 # set an upper bound on kappa values + NLopt.upper_bounds!(optQ, fill(kappamax,nparQ)) + end + NLopt.max_objective!(optQ, loglikfun) + fmax, xmax, ret = NLopt.optimize(optQ, obj.model.rate) + setrates!(obj.model, xmax) + obj.loglik = fmax + verbose && println("got $(round(fmax, digits=5)) at $(round.(xmax, digits=5)) after $(optQ.numevals) iterations (return code $(ret))") + end + if optimizeRVAS + function loglikfunRVAS(alpha::Vector{<:AbstractFloat}, grad::Vector{<:AbstractFloat}) + setparameters!(obj.ratemodel, alpha) + res = discrete_corelikelihood!(obj) + verbose && println("loglik: $res, rate variation model shape parameter alpha: $(alpha[1])") + length(grad) == 0 || error("gradient not implemented") + return res + end + # set-up optimization object for RVAS parameter + NLoptMethod=:LN_COBYLA # no gradient + # :LN_COBYLA for (non)linear constraits, :LN_BOBYQA for bound constraints + nparRVAS = nparams(obj.ratemodel) + optRVAS = NLopt.Opt(NLoptMethod, nparRVAS) + NLopt.ftol_rel!(optRVAS,ftolRel) # relative criterion + NLopt.ftol_abs!(optRVAS,ftolAbs) # absolute criterion + NLopt.xtol_rel!(optRVAS,xtolRel) + NLopt.xtol_abs!(optRVAS,xtolAbs) + NLopt.maxeval!(optRVAS,1000) # max number of iterations + # NLopt.maxtime!(optRVAS, t::Real) + rvind = getparamindex(obj.ratemodel) + NLopt.lower_bounds!(optRVAS, [pinvmin,alphamin][rvind] ) + NLopt.upper_bounds!(optRVAS, [pinvmax,alphamax][rvind] ) + NLopt.max_objective!(optRVAS, loglikfunRVAS) + fmax, xmax, ret = NLopt.optimize(optRVAS, getparameters(obj.ratemodel)) # optimization here! + setparameters!(obj.ratemodel, xmax) + obj.loglik = fmax + verbose && println("RVAS: got $(round(fmax, digits=5)) at $(round.(xmax, digits=5)) after $(optRVAS.numevals) iterations (return code $(ret))") + end + if optimizeQ && optimizeRVAS && closeoptim + # optimize Q under fixed RVAS parameters: a second time + fmax, xmax, ret = NLopt.optimize(optQ, obj.model.rate) + setrates!(obj.model, xmax) + obj.loglik = fmax + verbose && println("got $(round(fmax, digits=5)) at $(round.(xmax, digits=5)) after $(optQ.numevals) iterations (return code $(ret))") + # optimize RVAS under fixed Q: a second time + fmax, xmax, ret = NLopt.optimize(optRVAS, getparameters(obj.ratemodel)) + setparameters!(obj.ratemodel, xmax) + obj.loglik = fmax + verbose && println("RVAS: got $(round(fmax, digits=5)) at $(round.(xmax, digits=5)) after $(optRVAS.numevals) iterations (return code $(ret))") + end + return obj +end + +""" + update_logtrans(obj::SSM) + +Initialize and update `obj.logtrans`, the log transition probabilities +along each edge in the full network. +They are re-used for each displayed tree, which is why edges are not fused +around degree-2 nodes when extracting displayed trees. +""" +function update_logtrans(obj::SSM) + rates = obj.ratemodel.ratemultiplier + k = nstates(obj.model) + Ptmp = MMatrix{k,k,Float64}(undef) # memory to be re-used + for edge in obj.net.edge # update logtrans: same for all displayed trees, all traits + enum = edge.number + len = edge.length + for i = 1:length(rates) + obj.logtrans[:,:,enum, i] .= log.(P!(Ptmp, obj.model, len * rates[i])) + end + end +end + +""" + update_logtrans(obj::SSM, edge::Edge) + +Update the log-transition probabilities associates to one particular `edge` +in the network. +""" +function update_logtrans(obj::SSM, edge::Edge) + rates = obj.ratemodel.ratemultiplier + enum = edge.number + len = edge.length + for i in 1:length(rates) + pmat = view(obj.logtrans, :,:,enum,i) + @inbounds pmat .= log.(P!(pmat, obj.model, len * rates[i])) + end +end + +""" + discrete_corelikelihood!(obj::StatisticalSubstitutionModel; + whichtrait::AbstractVector{Int} = 1:obj.nsites) + +Calculate the likelihood and update `obj.loglik` for discrete characters on a network, +calling [`discrete_corelikelihood_trait!`](@ref). +The algorithm extracts all displayed trees and weighs the likelihood under all these trees. +The object's partial likelihoods are updated: +- forward and direct partial likelihoods are re-used, one trait at a time, +- overall likelihoods on each displayed tree, given each rate category and for + each given site/trait: are cached in `_loglikcache`. +""" +function discrete_corelikelihood!(obj::SSM; whichtrait::AbstractVector{Int} = 1:obj.nsites) + # fill _loglikcache + nr = length(obj.ratemodel.ratemultiplier) + nt = length(obj.displayedtree) + update_logtrans(obj) + for t in 1:nt + for ri in 1:nr + for ci in whichtrait + obj._loglikcache[ci,ri,t] = discrete_corelikelihood_trait!(obj,t,ci,ri) + # conditional: log P(site | rate & tree) + # note: -Inf expected if 2 tips have different states, but separated by path of total length 0.0 + end + end + end + # aggregate over trees and rates + lrw = obj.ratemodel.lograteweight + for ti in 1:nt + ltprior = obj.priorltw[ti] + for ri in 1:nr + obj._loglikcache[:,ri,ti] .+= ltprior + lrw[ri] + # now unconditional: log P(site & rate & tree) + end + end + for ci in whichtrait + obj._sitecache[ci] = logsumexp(view(obj._loglikcache, ci,:,1:nt)) + end + if obj.siteweight !== nothing + obj._sitecache .*= obj.siteweight + end + loglik = sum(obj._sitecache) + obj.loglik = loglik + return loglik +end + +""" + discrete_corelikelihood_trait!(obj::SSM, t::Integer, ci::Integer, ri::Integer) + +Return the likelihood for tree `t`, trait (character/site) index `ci` and rate category `ri`. +Update & modify the forward & directional log-likelihoods `obj.forwardlik` +and `obj.directlik`, which are indexed by [state, node_number or edge_number]. +Used by [`discrete_corelikelihood!`](@ref). + +**Preconditions**: `obj.logtrans` updated, edges directed, nodes/edges preordered +""" +function discrete_corelikelihood_trait!(obj::SSM, t::Integer, ci::Integer, ri::Integer) + forwardlik = obj.forwardlik + directlik = obj.directlik + tree = obj.displayedtree[t] + k = nstates(obj.model) # also = size(logtrans,1) if not RateVariationAcrossSites + fill!(forwardlik, 0.0) # re-initialize for each trait, each iteration + fill!(directlik, 0.0) + loglik = 0. + for ni in reverse(1:length(tree.vec_node)) # post-order + n = tree.vec_node[ni] + nnum = n.number # same n.number across trees for a given node + if n.leaf # need forwardlik initialized at 0: keep at 0 = log(1) if no data + state = obj.trait[nnum][ci] # here: data assumed in a row n.number + if !ismissing(state) + for i in 1:k + forwardlik[i,nnum] = -Inf64 # log(0) = -Inf if i != observed state + end + forwardlik[state, nnum] = 0. + end + else # forward likelihood = product of direct likelihood over all children edges + for e in n.edge + n == getparent(e) || continue # to next edge if n is not parent of e + forwardlik[:,nnum] .+= view(directlik, :,e.number) + end + end + if ni==1 # root is first index in nodes changed + loglik = logsumexp(obj.prioratroot + view(forwardlik, :,nnum)) # log P{data for ci | tree t, rate ri} + break # out of loop over nodes + end + # if we keep going, n is not the root + # calculate direct likelihood on the parent edge of n + for e in n.edge + if n == getchild(e) + lt = view(obj.logtrans, :,:,e.number, ri) + for i in 1:k # state at parent node + directlik[i,e.number] = logsumexp(view(lt,i,:) + view(forwardlik,:,nnum)) + end + break # we visited the parent edge: break out of for loop + end + end #loop over edges + end # of loop over nodes + return loglik +end + +""" + traitlabels2indices(data, model::SubstitutionModel) + +Check that the character states in `data` are compatible with (i.e. subset of) +the trait labels in `model`. All columns are used. +`data` can be a DataFrame or a Matrix (multiple traits), or a Vector (one trait). +Return a vector of vectors (one per species) with integer entries, +where each state (label) is replaced by its index in `model`. +For DNA data, any ambiguous site is treated as missing. +""" +function traitlabels2indices(data::AbstractVector, model::SubstitutionModel) + A = Vector{Vector{Union{Missings.Missing,Int}}}(undef, 0) # indices of trait labels + labs = getlabels(model) + for l in data + vi = missing + if !ismissing(l) + vi = findfirst(isequal(l), getlabels(model)) # value index in model labels + vi !== nothing || error("trait $l not found in model") + end + push!(A, [vi]) + end + return A +end + +function traitlabels2indices(data::Union{AbstractMatrix,AbstractDataFrame}, + model::SubstitutionModel) + A = Vector{Vector{Union{Missings.Missing,Int}}}(undef, 0) # indices of trait labels + labs = getlabels(model) + isDNA = typeof(labs) == Array{DNA,1} + ntraits = size(data,2) #starting with spcies column + for i in 1:size(data,1) # go row by row (which is species by species) + V = Vector{Union{Missings.Missing,Int}}(undef, ntraits) + for j in 1:ntraits + vi = missing # value index + @inbounds l = data[i,j] # value label + if !isDNA && ismissing(l) + vi = missing + elseif isDNA #else if DNA + if typeof(l) == String #takes string and converts to a Char so that we can convert to DNA + l = Vector{Char}(l)[1] + end + l = convert(DNA, l) + end + if !ismissing(l) + vi = findfirst(isequal(l), labs) + if vi === nothing + # ideally, handle ambiguous DNA types optimally + if isDNA #&& BioSymbols.isambiguous(l) + vi = missing + else + error("trait $l not found in model") + end + end + end + V[j] = vi + end + push!(A, V) + end + return A +end + +""" + check_matchtaxonnames!(species, data, net) + +Modify `species` and `dat` by removing the species (rows) absent from the network. +Return a new network (`net` is *not* modified) with tips matching those in species: +if some species in `net` have no data, these species are pruned from the network. +The network also has its node names reset, such that leaves have nodes have +consecutive numbers starting at 1, with leaves first. +Used by [`fitdiscrete`](@ref) to build a new [`StatisticalSubstitutionModel`](@ref). +""" +function check_matchtaxonnames!(species::AbstractVector, dat::AbstractVector, net::HybridNetwork) + # 1. basic checks for dimensions and types + eltt = eltype(dat) + @assert eltt <: AbstractVector "traits should be a vector of vectors" + @assert nonmissingtype(eltype(eltt)) <: Integer "traits should be integers (label indices)" + @assert !isempty(dat) "empty data vector!" + ntraits = length(dat[1]) + for d in dat + @assert length(d)==ntraits "all species should have the same number of traits" + end + @assert length(dat) == length(species) "need as many species as rows in trait data" + # 2. match taxon labels between data and network + netlab = tiplabels(net) + ind2notinnet = findall(x -> x ∉ netlab, species) # species not in network + deleteat!(species, ind2notinnet) + deleteat!(dat, ind2notinnet) + nvalues = [sum(.!ismissing.(d)) for d in dat] # species with completely missing data + indmissing = findall(x -> x==0, nvalues) + deleteat!(species, indmissing) + deleteat!(dat, indmissing) + indnotindat = findall(x -> x ∉ species, netlab) # species not in data + net = deepcopy(net) + if !isempty(indnotindat) + @warn "the network contains taxa with no data: those will be pruned" + for i in indnotindat + deleteleaf!(net, netlab[i]) + end + end + # 3. calculate order of rows to have species with node.number i on ith row + PN.resetnodenumbers!(net; checkpreorder=true, type=:ape) # tip species: now with numbers 1:n + PN.resetedgenumbers!(net, false) # to use edge as indices: 1:numedges + netlab = [n.name for n in sort(net.leaf, by = x -> x.number)] + nspecies = length(netlab) + o = Vector{Int}(undef, nspecies) + for i in 1:nspecies + @inbounds o[i] = something(findfirst(isequal(netlab[i]), species),0) + end + count(!iszero, o) == nspecies || # number of non-zeros should be total size + error("weird: even after pruning, species in network have no data") + return (o,net) +end + +""" + learnlabels(model::Symbol, dat::DataFrame) + +Return unique non-missing values in `dat`, and check that these labels +can be used to construct of substitution model of type `model`. + +# examples: + +```jldoctest +julia> using DataFrames + +julia> dat = DataFrame(trait1 = ["A", "C", "A", missing]); # 4×1 DataFrame + +julia> PhyloTraits.learnlabels(:BTSM, dat) +2-element Vector{String}: + "A" + "C" + +julia> PhyloTraits.learnlabels(:JC69, dat) +2-element Vector{String}: + "A" + "C" +``` +""" +function learnlabels(modSymbol::Symbol, dat::AbstractDataFrame) + labels = mapreduce(x -> unique(skipmissing(x)), union, eachcol(dat)) + if modSymbol == :BTSM + length(labels) == 2 || error("Binary Trait Substitution Model supports traits with two states. These data have do not have two states.") + elseif modSymbol == :TBTSM + unique(skipmissing(dat[!,1])) == 2 && unique(skipmissing(dat[!,2]) == 2) || + error("Two Binary Trait Substitution Model supports two traits with two states each.") + elseif modSymbol in [:HKY85, :JC69] + typeof(labels) == Array{DNA,1} || + (typeof(labels) == Array{Char,1} && all(in.(uppercase.(labels), "-ABCDGHKMNRSTVWY"))) || + (typeof(labels) == Array{String,1} && all(occursin.(uppercase.(labels), "-ABCDGHKMNRSTVWY"))) || + # "ACGT" would dissallow ambiguous sites + error("$modSymbol requires that trait data are dna bases A, C, G, and T") + end + return labels +end + +""" + startingrate(net) + +Estimate an evolutionary rate appropriate for the branch lengths in the network, +which should be a good starting value before optimization in `fitdiscrete`, +assuming approximately 1 change across the entire tree. +If all edge lengths are missing, set starting rate to 1/(number of taxa). +""" +function startingrate(net::HybridNetwork) + totaledgelength = 0.0 + for e in net.edge + if e.length > 0.0 + totaledgelength += e.length + end + end + if totaledgelength == 0.0 # as when all edge lengths are missing + totaledgelength = net.numtaxa + end + return 1.0/totaledgelength +end + +""" + defaultsubstitutionmodel(network, modsymbol::Symbol, data::DataFrame, + siteweights::Vector) + +Return a statistical substitution model (SSM) with appropriate state labels +and a rate appropriate for the branch lengths in `net` +(see [`startingrate`](@ref)). +The `data` frame must have the actual trait/site data in columns 2 and up, +as when the species names are in column 1. +For DNA data, the relative rate model is returned, with a +stationary distribution equal to the empirical frequencies. +""" +function defaultsubstitutionmodel(net::HybridNetwork, modsymbol::Symbol, data::DataFrame, + siteweights=repeat([1.], inner=size(data,2))::AbstractVector) + rate = startingrate(net) + actualdat = view(data, :, 2:size(data,2)) + labels = learnlabels(modsymbol, actualdat) + if modsymbol == :JC69 + return JC69([1.0], true) # 1.0 instead of rate because relative version + elseif modsymbol == :HKY85 # transition/transversion rate ratio + return HKY85([1.0], empiricalDNAfrequencies(actualdat, siteweights), true) + elseif modsymbol == :ERSM + return EqualRatesSubstitutionModel(length(labels), rate, labels); + elseif modsymbol == :BTSM + return BinaryTraitSubstitutionModel([rate, rate], labels) + elseif modsymbol == :TBTSM + return TwoBinaryTraitSubstitutionModel([rate, rate, rate, rate, rate, + rate, rate, rate], labels) + else + error("model $modsymbol is unknown or not implemented yet") + end +end + +# fixit: new type for two (dependent) binary traits +# need new algorithm for model at hybrid nodes: displayed trees aren't enough diff --git a/src/fit_phylolm_continuous.jl b/src/fit_phylolm_continuous.jl new file mode 100644 index 0000000..01f8adc --- /dev/null +++ b/src/fit_phylolm_continuous.jl @@ -0,0 +1,1372 @@ +############################################################################### + +#= ------ roadmap of phylolm methods -------------- + +with or without within-species variation: +- phylolm(formula, dataframe, net; model="BM",...,withinspecies_var=false,...) +- phylolm(X,Y,net, model::ContinuousTraitEM; kwargs...) + calls a function with or without within-species variation. + +1. no measurement error in species means: + - phylolm(model, X,Y,net, reml; kwargs...) dispatches based on model type + - phylolm_lambda(X,Y,V,reml, gammas,times; ...) + - phylolm_scalinghybrid(X,Y,net,reml, gammas; ...) + + helpers: + - pgls(X,Y,V; ...) for vanilla BM, but called by others with fixed V_theta + - logLik_lam(lambda, X,Y,V,gammas,times; ...) + - logLik_lam_hyb(lambda, X,Y,net,gammas; ...) + +2. with measurement error (within-species variation): + - phylolm_wsp(model, X,Y,net, reml; kwargs...) dispatch based on model + implemented for model <: BM only + + - phylolm_wsp(X,Y,V,reml, nonmissing,ind, counts,ySD, model_within) + - phylolm_wsp(Xsp,Ysp,Vsp,reml, d_inv,RSS, n,p,a, model_within) +=# +""" + phylolm(X::Matrix, Y::Vector, net::HybridNetwork, model::ContinuousTraitEM=BM(); kwargs...) + +Return a [`PhyloNetworkLinearModel`](@ref) object. +This method is called by `phylolm(formula, data, network; kwargs...)`. +""" +function phylolm( + X::Matrix, + Y::Vector, + net::HybridNetwork, + model::ContinuousTraitEM = BM(); + reml::Bool=true, + nonmissing::BitArray{1}=trues(length(Y)), + ind::Vector{Int}=[0], + ftolRel::AbstractFloat=fRelTr, + xtolRel::AbstractFloat=xRelTr, + ftolAbs::AbstractFloat=fAbsTr, + xtolAbs::AbstractFloat=xAbsTr, + startingValue::Real=0.5, + fixedValue::Union{Real,Missing}=missing, + withinspecies_var::Bool=false, + counts::Union{Nothing, Vector}=nothing, + ySD::Union{Nothing, Vector}=nothing +) + if withinspecies_var + phylolm_wsp(model, X,Y,net, reml; nonmissing=nonmissing, ind=ind, + ftolRel=ftolRel, xtolRel=xtolRel, ftolAbs=ftolAbs, xtolAbs=xtolAbs, + counts=counts, ySD=ySD) + else + phylolm(model, X,Y,net, reml; nonmissing=nonmissing, ind=ind, + ftolRel=ftolRel, xtolRel=xtolRel, ftolAbs=ftolAbs, xtolAbs=xtolAbs, + startingValue=startingValue, fixedValue=fixedValue) + end +end + +function phylolm( + ::BM, + X::Matrix, + Y::Vector, + net::HybridNetwork, + reml::Bool; + nonmissing::BitArray{1}=trues(length(Y)), + ind::Vector{Int}=[0], + kwargs... +) + # BM variance covariance: + # V_ij = expected shared time for independent genes in i & j + V = sharedpathmatrix(net) + linmod, Vy, RL, logdetVy = pgls(X,Y,V; nonmissing=nonmissing, ind=ind) + return PhyloNetworkLinearModel(linmod, V, Vy, RL, Y, X, + logdetVy, reml, ind, nonmissing, BM()) +end + +function phylolm( + ::PagelLambda, + X::Matrix, + Y::Vector, + net::HybridNetwork, + reml::Bool; + nonmissing::BitArray{1}=trues(length(Y)), + ind::Vector{Int}=[0], + ftolRel::AbstractFloat=fRelTr, + xtolRel::AbstractFloat=xRelTr, + ftolAbs::AbstractFloat=fAbsTr, + xtolAbs::AbstractFloat=xAbsTr, + startingValue::Real=0.5, + fixedValue::Union{Real,Missing}=missing +) + # BM variance covariance + V = sharedpathmatrix(net) # runs preorder!(net) by default + gammas = getGammas(net) + if istimeconsistent(net, false) # false: no need to preorder again + times = getnodeheights(net, false) + else + @warn """The network is not time consistent (node heights are not well-defined). + The network should be calibrated for this analysis, as the theory for Pagel's model + assumes a time-consistent network. + The analysis will use node heights based on the major tree, in the meantime. + """ + times = getnodeheights_majortree(net, false; warn=false) + end + phylolm_lambda(X,Y,V,reml, gammas, times; + nonmissing=nonmissing, ind=ind, + ftolRel=ftolRel, xtolRel=xtolRel, ftolAbs=ftolAbs, xtolAbs=xtolAbs, + startingValue=startingValue, fixedValue=fixedValue) +end + + +""" + setGammas!(net, γ vector) + +Set inheritance γ's of hybrid edges, using input vector for *major* edges. +Assume pre-order calculated already, with up-to-date field `vec_node`. +See [`getGammas`](@ref). + +**Warning**: very different from [`PhyloNetworks.setgamma!`](@extref), +which focuses on a single hybrid event, +updates the field `ismajor` according to the new γ, and is not used here. + +**Assumption**: each hybrid node has only 2 parents, a major and a minor parent +(according to the edges' field `ismajor`). +""" +function setGammas!(net::HybridNetwork, gammas::Vector) + for (i,nod) in enumerate(net.vec_node) + nod.hybrid || continue # skip tree nodes: nothing to do + majorhyb = getparentedge(nod) # major + minorhyb = getparentedgeminor(nod) # error if doesn't exit + majorhyb.gamma = gammas[i] + minorhyb.gamma = 1 - gammas[i] + end + return nothing +end + +""" + getGammas(net) + +Vector of inheritance γ's of all major edges (tree edges and major hybrid edges), +ordered according to the pre-order index of their child node, +assuming this pre-order is already calculated +(with up-to-date field `vec_node`). +Here, a "major" edge is an edge with field `ismajor` set to true, +regardless of its actual γ (below, at or above 0.5). + +See [`setGammas!`](@ref) +""" +function getGammas(net::HybridNetwork) + gammas = ones(length(net.vec_node)) + for (i,node) in enumerate(net.vec_node) + node.hybrid || continue # skip tree nodes: their gamma is already set to 1 + majorhybedge = getparentedge(node) # major + gammas[i] = majorhybedge.gamma + end + return gammas +end + +#= ScalingHybrid = BM but with optimized weights of hybrid edges: +minor edges have their original γ's changed to λγ. Same λ at all hybrids. +see Bastide (2017) dissertation, section 4.3.2 p.175, at +https://tel.archives-ouvertes.fr/tel-01629648 +=# +function phylolm( + ::ScalingHybrid, + X::Matrix, + Y::Vector, + net::HybridNetwork, + reml::Bool; + nonmissing::BitArray{1}=trues(length(Y)), + ind::Vector{Int}=[0], + ftolRel::AbstractFloat=fRelTr, + xtolRel::AbstractFloat=xRelTr, + ftolAbs::AbstractFloat=fAbsTr, + xtolAbs::AbstractFloat=xAbsTr, + startingValue::Real=0.5, + fixedValue::Union{Real,Missing}=missing +) + preorder!(net) + gammas = getGammas(net) + phylolm_scalinghybrid(X, Y, net, reml, gammas; + nonmissing=nonmissing, ind=ind, + ftolRel=ftolRel, xtolRel=xtolRel, ftolAbs=ftolAbs, xtolAbs=xtolAbs, + startingValue=startingValue, fixedValue=fixedValue) +end + +############################################################################### +## Fit BM + +# Vanilla BM using covariance V. used for other models: V calculated beforehand +function pgls( + X::Matrix, + Y::Vector, + V::MatrixTopologicalOrder; + nonmissing::BitArray{1}=trues(length(Y)), # which tips are not missing? + ind::Vector{Int}=[0] +) + Vy = V[:tips] # extract tips matrix + if (ind != [0]) Vy = Vy[ind, ind] end # re-order if necessary + Vy = Vy[nonmissing, nonmissing] + R = cholesky(Vy) + RL = R.L + # Fit with GLM.lm, and return quantities needed downstream + return lm(RL\X, RL\Y), Vy, RL, logdet(R) +end + +############################################################################### +## helper functions for lambda models + +function maxLambda(times::Vector, V::MatrixTopologicalOrder) + maskTips = indexin(V.tipnumbers, V.nodenumbers_toporder) + maskNodes = indexin(V.internalnodenumbers, V.nodenumbers_toporder) + return minimum(times[maskTips]) / maximum(times[maskNodes]) + # res = minimum(times[maskTips]) / maximum(times[maskNodes]) + # res = res * (1 - 1/5/maximum(times[maskTips])) +end + +function transform_matrix_lambda!( + V::MatrixTopologicalOrder, + lam::AbstractFloat, + gammas::Vector, + times::Vector +) + V.V .*= lam + maskTips = indexin(V.tipnumbers, V.nodenumbers_toporder) + for i in maskTips + V.V[i, i] += (1-lam) * (gammas[i]^2 + (1-gammas[i])^2) * times[i] + end + # V_diag = Matrix(Diagonal(diag(V.V))) + # V.V = lam * V.V .+ (1 - lam) .* V_diag +end + +function logLik_lam( + lam::AbstractFloat, + X::Matrix, + Y::Vector, + V::MatrixTopologicalOrder, + reml::Bool, + gammas::Vector, + times::Vector; + nonmissing::BitArray{1}=trues(length(Y)), # Which tips are not missing ? + ind::Vector{Int}=[0] +) + # Transform V according to lambda + Vp = deepcopy(V) + transform_matrix_lambda!(Vp, lam, gammas, times) + # Fit and take likelihood + linmod, Vy, RL, logdetVy = pgls(X,Y,Vp; nonmissing=nonmissing, ind=ind) + n = (reml ? dof_residual(linmod) : nobs(linmod)) + res = n*log(deviance(linmod)) + logdetVy + if reml res += logdet(linmod.pp.chol); end + return res +end + +function phylolm_lambda( + X::Matrix, + Y::Vector, + V::MatrixTopologicalOrder, + reml::Bool, + gammas::Vector, + times::Vector; + nonmissing::BitArray{1}=trues(length(Y)), # Which tips are not missing ? + ind::Vector{Int}=[0], + ftolRel::AbstractFloat=fRelTr, + xtolRel::AbstractFloat=xRelTr, + ftolAbs::AbstractFloat=fAbsTr, + xtolAbs::AbstractFloat=xAbsTr, + startingValue::Real=0.5, + fixedValue::Union{Real,Missing}=missing +) + if ismissing(fixedValue) + # Find Best lambda using optimize from package NLopt + opt = NLopt.Opt(:LN_BOBYQA, 1) + NLopt.ftol_rel!(opt, ftolRel) # relative criterion + NLopt.ftol_abs!(opt, ftolAbs) # absolute critetion + NLopt.xtol_rel!(opt, xtolRel) # criterion on parameter value changes + NLopt.xtol_abs!(opt, xtolAbs) # criterion on parameter value changes + NLopt.maxeval!(opt, 1000) # max number of iterations + NLopt.lower_bounds!(opt, 1e-100) # Lower bound + # Upper Bound + up = maxLambda(times, V) + up = up-up/1000 + NLopt.upper_bounds!(opt, up) + @info "Maximum lambda value to maintain positive branch lengths: " * @sprintf("%.6g", up) + count = 0 + function fun(x::Vector{Float64}, g::Vector{Float64}) + x = convert(AbstractFloat, x[1]) + res = logLik_lam(x, X,Y,V, reml, gammas, times; nonmissing=nonmissing, ind=ind) + count =+ 1 + #println("f_$count: $(round(res, digits=5)), x: $(x)") + return res + end + NLopt.min_objective!(opt, fun) + fmin, xmin, ret = NLopt.optimize(opt, [startingValue]) + # Best value dans result + res_lam = xmin[1] + else + res_lam = fixedValue + end + transform_matrix_lambda!(V, res_lam, gammas, times) + linmod, Vy, RL, logdetVy = pgls(X,Y,V; nonmissing=nonmissing, ind=ind) + res = PhyloNetworkLinearModel(linmod, V, Vy, RL, Y, X, + logdetVy, reml, ind, nonmissing, PagelLambda(res_lam)) + return res +end + +############################################################################### +## Fit scaling hybrid + +function matrix_scalinghybrid(net::HybridNetwork, lam::AbstractFloat, + gammas::Vector) + setGammas!(net, 1.0 .- lam .* (1. .- gammas)) + V = sharedpathmatrix(net) + setGammas!(net, gammas) + return V +end + +function logLik_lam_hyb( + lam::AbstractFloat, + X::Matrix, + Y::Vector, + net::HybridNetwork, + reml::Bool, + gammas::Vector; + nonmissing::BitArray{1}=trues(length(Y)), # Which tips are not missing ? + ind::Vector{Int}=[0] +) + # Transform V according to lambda + V = matrix_scalinghybrid(net, lam, gammas) + # Fit and take likelihood + linmod, Vy, RL, logdetVy = pgls(X,Y,V; nonmissing=nonmissing, ind=ind) + n = (reml ? dof_residual(linmod) : nobs(linmod)) + res = n*log(deviance(linmod)) + logdetVy + if reml res += logdet(linmod.pp.chol); end + return res +end + +function phylolm_scalinghybrid( + X::Matrix, + Y::Vector, + net::HybridNetwork, + reml::Bool, + gammas::Vector; + nonmissing::BitArray{1}=trues(length(Y)), # Which tips are not missing ? + ind::Vector{Int}=[0], + ftolRel::AbstractFloat=fRelTr, + xtolRel::AbstractFloat=xRelTr, + ftolAbs::AbstractFloat=fAbsTr, + xtolAbs::AbstractFloat=xAbsTr, + startingValue::Real=0.5, + fixedValue::Union{Real,Missing}=missing +) + if ismissing(fixedValue) + # Find Best lambda using optimize from package NLopt + opt = NLopt.Opt(:LN_BOBYQA, 1) + NLopt.ftol_rel!(opt, ftolRel) # relative criterion + NLopt.ftol_abs!(opt, ftolAbs) # absolute critetion + NLopt.xtol_rel!(opt, xtolRel) # criterion on parameter value changes + NLopt.xtol_abs!(opt, xtolAbs) # criterion on parameter value changes + NLopt.maxeval!(opt, 1000) # max number of iterations + #NLopt.lower_bounds!(opt, 1e-100) # Lower bound + #NLopt.upper_bounds!(opt, 1.0) + count = 0 + function fun(x::Vector{Float64}, g::Vector{Float64}) + x = convert(AbstractFloat, x[1]) + res = logLik_lam_hyb(x, X, Y, net, reml, gammas; nonmissing=nonmissing, ind=ind) + #count =+ 1 + #println("f_$count: $(round(res, digits=5)), x: $(x)") + return res + end + NLopt.min_objective!(opt, fun) + fmin, xmin, ret = NLopt.optimize(opt, [startingValue]) + # Best value dans result + res_lam = xmin[1] + else + res_lam = fixedValue + end + V = matrix_scalinghybrid(net, res_lam, gammas) + linmod, Vy, RL, logdetVy = pgls(X,Y,V; nonmissing=nonmissing, ind=ind) + res = PhyloNetworkLinearModel(linmod, V, Vy, RL, Y, X, + logdetVy, reml, ind, nonmissing, ScalingHybrid(res_lam)) + return res +end + +""" + phylolm(f::StatsModels.FormulaTerm, fr::AbstractDataFrame, net::HybridNetwork; kwargs...) + +Fit a phylogenetic linear regression model to data. +Return an object of type [`PhyloNetworkLinearModel`](@ref). +It contains a linear model from the GLM package, in `object.lm`, of type +[GLM.LinearModel](https://juliastats.org/GLM.jl/stable/api/#GLM.LinearModel). + +## Arguments + +* `f`: formula to use for the regression, see [StatsModels](https://juliastats.org/StatsModels.jl/stable/) +* `fr`: DataFrame containing the response values, predictor values, species/tip labels for each observation/row. +* `net`: phylogenetic network to use. Should have labelled tips. + +Keyword arguments + +* `model="BM"`: model for trait evolution (as a string) + "lambda" (Pagel's lambda), "scalinghybrid" are other possible values + (see [`ContinuousTraitEM`](@ref)) +* `tipnames=:tipnames`: column name for species/tip-labels, represented + as a symbol. For example, if the column containing the species/tip labels in + `fr` is named "Species", then do `tipnames=:Species`. +* `no_names=false`: If `true`, force the function to ignore the tips names. + The data is then assumed to be in the same order as the tips of the network. + Default is false, setting it to true is dangerous, and strongly discouraged. +* `reml=true`: if `true`, use REML criterion ("restricted maximum likelihood") + for estimating variance components, else use ML criterion. + +The following tolerance parameters control the optimization of lambda if +`model="lambda"` or `model="scalinghybrid"`, and control the optimization of the +variance components if `model="BM"` and `withinspecies_var=true`. +* `fTolRel=1e-10`: relative tolerance on the likelihood value +* `fTolAbs=1e-10`: absolute tolerance on the likelihood value +* `xTolRel=1e-10`: relative tolerance on the parameter value +* `xTolAbs=1e-10`: absolute tolerance on the parameter value + +* `startingValue=0.5`: If `model`="lambda" or "scalinghybrid", this + provides the starting value for the optimization in lambda. +* `fixedValue=missing`: If `model`="lambda" or "scalinghybrid", and + `fixedValue` is a number, then lambda is set to this number and is not optimized. +* `withinspecies_var=false`: If `true`, fits a within-species variation model. + Currently only implemented for `model`="BM". +* `y_mean_std::Bool=false`: If `true`, and `withinspecies_var=true`, then accounts for + within-species variation, using species-level statistics provided in `fr`. + +## Methods applied to fitted models + +To access the response values, do `response(object)`. +To access the model matrix, do `modelmatrix(object)`. +To access the model formula, do `formula(object)`. + +## Within-species variation + +For a high-level description, see [`PhyloNetworkLinearModel`](@ref). +To fit a model with within-species variation in the response variable, +either of the following must be provided in the data frame `fr`: + +(1) Individual-level data: There should be columns for response, predictors, and +species/tip-labels. Every row should correspond to an individual observation. +At least one species must be represented by two or more individuals. + +(2) Species-level statistics: There should be columns for mean response, predictors, +species/tip-labels, species sample-sizes (number of individuals for each species), +and species standard deviations (standard deviations of the response values +by species). Every row should correspond to a species: each species should be +represented by a unique row. The column names for species sample-sizes and +species standard deviations are expected to be "[response column name]\\_n" +and "[response column name]\\_sd". For example, if the response column name is "y", +then the column names should be "y\\_n" and "y\\_sd" for the sample-sizes and +standard deviations. + +Regardless of whether the data provided follows (1) or (2), +`withinspecies_var` should be set to true. +If the data provided follows (2), then `y_mean_std` should be set to false. + +## Within-species variation in predictors + +The model assumes *no* within-species variation in predictors, because it aims to +capture the evolutionary (historical, phylogenetic) relationship between the +predictors and the response, not the within-species (present-day, or phenotypic) +relationship. + +If a within-species variation model is fitted on individual-level data, and +if there are individuals within the same species with different values for +the same predictor, these values are all replaced by the mean predictor value +for all the individuals in that species. +For example, suppose there are 3 individuals in a given species, and that their +predictor values are (x₁=3, x₂=6), (x₁=4, x₂=8) and (x₁=2, x₂=1). Then the predictor +values for these 3 individuals are each replaced by (x₁=(3+4+2)/3, x₂=(6+8+1)/3) +before model fitting. If a fourth individual had data (x₁=10, x₂=missing), then that +individual would be ignored for any model using x₂, and would not contribute any +information to its species data for these models. + +## Missing data + +Rows with missing data for either the response or the predictors are omitted from +the model-fitting. There should minimally be columns for response, predictors, +species/tip-labels. As detailed above, additional columns may be required for fitting +within-species variation. Missing data in the columns for species names, +species standard deviation / sample sizes (if used) will throw an error. + +## See also + +[`rand`](@ref), [`ancestralreconstruction`](@ref), [`PhyloNetworks.vcv`](@extref) + +## Examples: Without within-species variation + +We first load data from the package and fit the default BM model. + +```jldoctest phylolmdoc +julia> phy = readnewick(joinpath(dirname(pathof(PhyloTraits)), "..", "examples", "caudata_tree.txt")); + +julia> using DataFrames, CSV # to read data file, next + +julia> dat = CSV.read(joinpath(dirname(pathof(PhyloTraits)), "..", "examples", "caudata_trait.txt"), DataFrame); + +julia> using StatsModels # for stat model formulas + +julia> fitBM = phylolm(@formula(trait ~ 1), dat, phy; reml=false); + +julia> fitBM # Shows a summary +PhyloNetworkLinearModel + +Formula: trait ~ 1 + +Model: Brownian motion + +Parameter Estimates, using ML: +phylogenetic variance rate: 0.00294521 + +Coefficients: +───────────────────────────────────────────────────────────────────── + Coef. Std. Error t Pr(>|t|) Lower 95% Upper 95% +───────────────────────────────────────────────────────────────────── +(Intercept) 4.679 0.330627 14.15 <1e-31 4.02696 5.33104 +───────────────────────────────────────────────────────────────────── +Log Likelihood: -78.9611507833 +AIC: 161.9223015666 +``` + +We can extra parameters, likelihood, AIC etc. +```jldoctest phylolmdoc +julia> round(sigma2_phylo(fitBM), digits=6) # rounding for jldoctest convenience +0.002945 + +julia> round(mu_phylo(fitBM), digits=4) +4.679 + +julia> using StatsBase # for aic() stderror() loglikelihood() etc. + +julia> round(loglikelihood(fitBM), digits=10) +-78.9611507833 + +julia> round(aic(fitBM), digits=10) +161.9223015666 + +julia> round(aicc(fitBM), digits=10) +161.9841572367 + +julia> round(bic(fitBM), digits=10) +168.4887090241 + +julia> round.(coef(fitBM), digits=4) +1-element Vector{Float64}: + 4.679 + +julia> confint(fitBM) # 95% (default) confidence interval for the coefficient(s) +1×2 Matrix{Float64}: + 4.02696 5.33104 + +julia> abs(round(r2(fitBM), digits=10)) # absolute value for jldoctest convenience +0.0 + +julia> abs(round(adjr2(fitBM), digits=10)) +0.0 + +julia> round.(vcov(fitBM), digits=6) # variance-covariance of estimated parameters: squared standard error +1×1 Matrix{Float64}: + 0.109314 +``` + +The residuals are the variance not explained by predictors. +The phylogenetic correlation modelled by the BM is about them. +The trait may have 2 sources of phylogenetic signal: from the predictor with +which it the response may be associated, and from the residuals. + +```jldoctest phylolmdoc +julia> round.(residuals(fitBM), digits=6) +197-element Vector{Float64}: + -0.237648 + -0.357937 + -0.159387 + -0.691868 + -0.323977 + -0.270452 + -0.673486 + -0.584654 + -0.279882 + -0.302175 + ⋮ + -0.777026 + -0.385121 + -0.443444 + -0.327303 + -0.525953 + -0.673486 + -0.603158 + -0.211712 + -0.439833 + +julia> round.(response(fitBM), digits=5) +197-element Vector{Float64}: + 4.44135 + 4.32106 + 4.51961 + 3.98713 + 4.35502 + 4.40855 + 4.00551 + 4.09434 + 4.39912 + 4.37682 + ⋮ + 3.90197 + 4.29388 + 4.23555 + 4.3517 + 4.15305 + 4.00551 + 4.07584 + 4.46729 + 4.23917 + +julia> round.(predict(fitBM), digits=5) +197-element Vector{Float64}: + 4.679 + 4.679 + 4.679 + 4.679 + 4.679 + 4.679 + 4.679 + 4.679 + 4.679 + 4.679 + ⋮ + 4.679 + 4.679 + 4.679 + 4.679 + 4.679 + 4.679 + 4.679 + 4.679 + 4.679 +``` + +## Examples: With within-species variation (two different input formats shown) + +We use a smaller network here. +We can input data as 1 row per individual, multiple rows per species: + +```jldoctest phylolmdoc +julia> net = readnewick("((((D:0.4,C:0.4):4.8,((A:0.8,B:0.8):2.2)#H1:2.2::0.7):4.0,(#H1:0::0.3,E:3.0):6.2):2.0,O:11.2);"); + +julia> df = DataFrame( # individual-level observations + species = repeat(["D","C","A","B","E","O"],inner=3), + trait1 = [4.08298,4.08298,4.08298,3.10782,3.10782,3.10782,2.17078,2.17078,2.17078,1.87333,1.87333, + 1.87333,2.8445,2.8445,2.8445,5.88204,5.88204,5.88204], + trait2 = [-7.34186,-7.34186,-7.34186,-7.45085,-7.45085,-7.45085,-3.32538,-3.32538,-3.32538,-4.26472, + -4.26472,-4.26472,-5.96857,-5.96857,-5.96857,-1.99388,-1.99388,-1.99388], + trait3 = [18.8101,18.934,18.9438,17.0687,17.0639,17.0732,14.4818,14.1112,14.2817,13.0842,12.9562, + 12.9019,15.4373,15.4075,15.4317,24.2249,24.1449,24.1302]); + +julia> m1 = phylolm(@formula(trait3 ~ trait1), df, net; + tipnames=:species, withinspecies_var=true) +PhyloNetworkLinearModel + +Formula: trait3 ~ 1 + trait1 + +Model: Brownian motion + +Parameter Estimates, using REML: +phylogenetic variance rate: 0.156188 +within-species variance: 0.0086343 + +Coefficients: +────────────────────────────────────────────────────────────────────── + Coef. Std. Error t Pr(>|t|) Lower 95% Upper 95% +────────────────────────────────────────────────────────────────────── +(Intercept) 9.65347 1.3066 7.39 0.0018 6.02577 13.2812 +trait1 2.30358 0.276163 8.34 0.0011 1.53683 3.07033 +────────────────────────────────────────────────────────────────────── +Log Likelihood: 1.9446255188 +AIC: 4.1107489623 +``` + +Alternatively, we can input the data as 1 row per species and 2 extra columns: +standard deviation of the response trait among individuals in the same species, +and number of individuals per species for which we calculated this SD. +The result is the same. + +```jldoctest phylolmdoc +julia> df_r = DataFrame( # species-level statistics (sample means, standard deviations) + species = ["D","C","A","B","E","O"], + trait1 = [4.08298,3.10782,2.17078,1.87333,2.8445,5.88204], + trait2 = [-7.34186,-7.45085,-3.32538,-4.26472,-5.96857,-1.99388], + trait3 = [18.896,17.0686,14.2916,12.9808,15.4255,24.1667], + trait3_sd = [0.074524,0.00465081,0.185497,0.0936,0.0158379,0.0509643], + trait3_n = [3, 3, 3, 3, 3, 3]); + +julia> m2 = phylolm(@formula(trait3 ~ trait1), df_r, net; + tipnames=:species, withinspecies_var=true, y_mean_std=true) +PhyloNetworkLinearModel + +Formula: trait3 ~ 1 + trait1 + +Model: Brownian motion + +Parameter Estimates, using REML: +phylogenetic variance rate: 0.15618 +within-species variance: 0.0086343 + +Coefficients: +────────────────────────────────────────────────────────────────────── + Coef. Std. Error t Pr(>|t|) Lower 95% Upper 95% +────────────────────────────────────────────────────────────────────── +(Intercept) 9.65342 1.30657 7.39 0.0018 6.02582 13.281 +trait1 2.30359 0.276156 8.34 0.0011 1.53686 3.07032 +────────────────────────────────────────────────────────────────────── +Log Likelihood: 1.9447243714 +AIC: 4.1105512573 +``` +""" +function phylolm( + f::StatsModels.FormulaTerm, + fr::AbstractDataFrame, + net::HybridNetwork; + model::AbstractString="BM", + tipnames::Symbol=:tipnames, + no_names::Bool=false, + reml::Bool=true, + ftolRel::AbstractFloat=fRelTr, + xtolRel::AbstractFloat=xRelTr, + ftolAbs::AbstractFloat=fAbsTr, + xtolAbs::AbstractFloat=xAbsTr, + startingValue::Real=0.5, + fixedValue::Union{Real,Missing}=missing, + withinspecies_var::Bool=false, + y_mean_std::Bool=false +) + # Match the tips names: make sure that the data provided by the user will + # be in the same order as the ordered tips in matrix V. + preorder!(net) + if no_names # The names should not be taken into account. + ind = [0] + @info """As requested (no_names=true), I am ignoring the tips names + in the network and in the dataframe.""" + else + nodatanames = !any(DataFrames.propertynames(fr) .== tipnames) + nodatanames && any(tiplabels(net) == "") && + error("""The network provided has no tip names, and the input dataframe has no + column "$tipnames" for species names, so I can't match the data on the network + unambiguously. If you are sure that the tips of the network are in the + same order as the values of the dataframe provided, then please re-run + this function with argument no_name=true.""") + any(tiplabels(net) == "") && + error("""The network provided has no tip names, so I can't match the data + on the network unambiguously. If you are sure that the tips of the + network are in the same order as the values of the dataframe provided, + then please re-run this function with argument no_name=true.""") + nodatanames && + error("""The input dataframe has no column "$tipnames" for species names, so I can't + match the data on the network unambiguously. If you are sure that the + tips of the network are in the same order as the values of the dataframe + provided, then please re-run this function with argument no_name=true.""") + ind = indexin(fr[!, tipnames], tiplabels(net)) + any(isnothing, ind) && + error("""Tips with data are not in the network: $(fr[isnothing.(ind), tipnames]) + please provide a larger network including these tips.""") + ind = convert(Vector{Int}, ind) # Int, not Union{Nothing, Int} + if length(unique(ind)) == length(ind) + withinspecies_var && !y_mean_std && + error("""for within-species variation, at least 1 species must have at least 2 individuals. + did you mean to use option "y_mean_std=true" perhaps?""") + else + (!withinspecies_var || y_mean_std) && + error("""Some tips have data on multiple rows.""") + end + end + # Find the regression matrix and response vector + data, nonmissing = StatsModels.missing_omit(StatsModels.columntable(fr), f) + sch = StatsModels.schema(f, data) + f = StatsModels.apply_schema(f, sch, PhyloNetworkLinearModel) + mf = ModelFrame(f, sch, data, PhyloNetworkLinearModel) + mm = StatsModels.ModelMatrix(mf) + Y = StatsModels.response(mf) + + if withinspecies_var && y_mean_std + # find columns in data frame for: # of individuals from each species + colname = Symbol(String(mf.f.lhs.sym)*"_n") + any(DataFrames.propertynames(fr) .== colname) || + error("expected # of individuals in column $colname, but no such column was found") + counts = fr[nonmissing,colname] + all(!ismissing, counts) || error("some num_individuals values are missing, column $colname") + all(x -> x>0, counts) || error("some species have 0 or <0 num_individuals, column $colname") + all(isfinite.(counts))|| error("some species have infinite num_individuals, column $colname") + # find sample SDs corresponding to the response mean in each species + colname = Symbol(String(mf.f.lhs.sym)*"_sd") + any(DataFrames.propertynames(fr) .== colname) || + error("expected the response's SD (per species) in column $colname, but no such column was found") + ySD = fr[nonmissing,colname] + all(!ismissing, ySD) || error("some SD values are missing, column $colname") + all(x -> x≥0, ySD) || error("some SD values are negative, column $colname") + all(isfinite.(ySD))|| error("some SD values are infinite, column $colname") + else + counts = nothing + ySD = nothing + end + + withinspecies_var && model != "BM" && + error("within-species variation is not implemented for non-BM models") + modeldic = Dict("BM" => BM(), + "lambda" => PagelLambda(), + "scalinghybrid" => ScalingHybrid()) + haskey(modeldic, model) || error("phylolm is not defined for model $model.") + modelobj = modeldic[model] + + res = phylolm(mm.m, Y, net, modelobj; reml=reml, nonmissing=nonmissing, ind=ind, + ftolRel=ftolRel, xtolRel=xtolRel, ftolAbs=ftolAbs, xtolAbs=xtolAbs, + startingValue=startingValue, fixedValue=fixedValue, + withinspecies_var=withinspecies_var, counts=counts, ySD=ySD) + res.formula = f + return res +end + +############################################################################### +# within-species variation (including measurement error) +############################################################################### + +function phylolm_wsp( + ::BM, + X::Matrix, + Y::Vector, + net::HybridNetwork, + reml::Bool; + nonmissing::BitArray{1}=trues(length(Y)), # which individuals have non-missing data? + ind::Vector{Int}=[0], + ftolRel::AbstractFloat=fRelTr, + xtolRel::AbstractFloat=xRelTr, + ftolAbs::AbstractFloat=fAbsTr, + xtolAbs::AbstractFloat=xAbsTr, + counts::Union{Nothing, Vector}=nothing, + ySD::Union{Nothing, Vector}=nothing +) + V = sharedpathmatrix(net) + phylolm_wsp(X,Y,V, reml, nonmissing,ind, + ftolRel, xtolRel, ftolAbs, xtolAbs, + counts,ySD) +end + +#= notes about missing data: after X and Y produced by stat formula: +- individuals with missing data (in response or any predictor) + already removed from both X and Y +- V has all species: some not listed, some listed but without any data +- nonmissing and ind correspond to the original rows in the data frame, + including those with some missing data, so: + * nonmissing has length >= length of Y + * sum(nonmissing) = length of Y +- V[:tips][ind,ind][nonmissing,nonmissing] correspond to the data rows + +extra problems: +- a species may be listed 1+ times in ind, but not in ind[nonmissing] +- ind and nonmissing need to be converted to the species level, alongside Y +=# +function phylolm_wsp( + X::Matrix, + Y::Vector, + V::MatrixTopologicalOrder, + reml::Bool, + nonmissing::BitArray{1}, + ind::Vector{Int}, + ftolRel::AbstractFloat, + xtolRel::AbstractFloat, + ftolAbs::AbstractFloat, + xtolAbs::AbstractFloat, + counts::Union{Nothing, Vector}, + ySD::Union{Nothing, Vector} +) + n_coef = size(X, 2) # no. of predictors + individualdata = isnothing(counts) + xor(individualdata, isnothing(ySD)) && + error("counts and ySD must be both nothing, or both vectors") + if individualdata + # get species means for Y and X, the within-species residual ss + ind_nm = ind[nonmissing] # same length as Y + ind_sp = unique(ind_nm) + n_sp = length(ind_sp) # number of species with data + n_tot = length(Y) # total number of individuals with data + d_inv = zeros(n_sp) + Ysp = Vector{Float64}(undef,n_sp) # species-level mean Y response + Xsp = Matrix{Float64}(undef,n_sp,n_coef) + RSS = 0.0 # residual sum-of-squares within-species + for (i0,iV) in enumerate(ind_sp) + iii = findall(isequal(iV), ind_nm) + n_i = length(iii) # number of obs for species of index iV in V + d_inv[i0] = 1/n_i + Xsp[i0, :] = mean(X[iii, :], dims=1) # ideally, all have same Xs + ymean = mean(Y[iii]) + Ysp[i0] = ymean + RSS += sum((Y[iii] .- ymean).^2) + end + Vsp = V[:tips][ind_sp,ind_sp] + # redefine "ind" and "nonmissing" at species level. ind = index of species + # in tiplabels(net), in same order in which species come in means Ysp. + # nonmissing: no need to list species with no data + ind = ind_sp + nonmissing = trues(n_sp) + else # group means and sds for response variable were passed in + n_sp = length(Y) + n_tot = sum(counts) + d_inv = 1.0 ./ counts + Ysp = Y + Xsp = X + RSS = sum((ySD .^ 2) .* (counts .- 1.0)) + ind_nm = ind[nonmissing] + Vsp = V[:tips][ind_nm,ind_nm] + end + + model_within, RL = withinsp_varianceratio(Xsp,Ysp,Vsp, reml, + ftolRel, xtolRel, ftolAbs, xtolAbs, + d_inv, RSS, n_tot, n_coef, n_sp) + η = model_within.optsum.final[1] + Vm = Vsp + η * Diagonal(d_inv) + m = PhyloNetworkLinearModel(lm(RL\Xsp, RL\Ysp), V, Vm, RL, Ysp, Xsp, + 2*logdet(RL), reml, ind, nonmissing, BM(), model_within) + return m +end + +# the method below takes in "clean" X,Y,V: species-level means, no missing data, +# matching order of species in X,Y and V, no extra species in V. +# given V & η: analytical formula for σ² estimate +# numerical optimization of η = σ²within / σ² +function withinsp_varianceratio( + X::Matrix, + Y::Vector, + V::Matrix, + reml::Bool, + ftolRel::AbstractFloat, + xtolRel::AbstractFloat, + ftolAbs::AbstractFloat, + xtolAbs::AbstractFloat, + d_inv::Vector, + RSS::Float64, + ntot::Real, + ncoef::Int64, + nsp::Int64, + model_within::Union{Nothing, WithinSpeciesCTM}=nothing +) + RL = cholesky(V).L + lm_sp = lm(RL\X, RL\Y) + if model_within === nothing + # create model_within with good starting values + s2start = GLM.dispersion(lm_sp, false) # sqr=false: deviance/dof_residual + # this is the REML, not ML estimate, which would be deviance/nobs + s2withinstart = RSS/(ntot-nsp) + ηstart = s2withinstart / s2start + optsum = OptSummary([ηstart], [1e-100], :LN_BOBYQA; initial_step=[0.01], + ftol_rel=ftolRel, ftol_abs=ftolAbs, xtol_rel=xtolRel, xtol_abs=[xtolAbs]) + optsum.maxfeval = 1000 + model_within = WithinSpeciesCTM([s2withinstart], [s2start], d_inv, RSS, optsum) + else + optsum = model_within.optsum + # fixit: I find this option dangerous (and not used). what if the + # current optsum has 2 parameters instead of 1, or innapropriate bounds, etc.? + # We could remove the option to provide a pre-built model_within + end + opt = Opt(optsum) + Ndof = (reml ? ntot - ncoef : ntot ) + wdof = ntot - nsp + Vm = similar(V) # scratch space for repeated usage + function logliksigma(η) # returns: -2loglik, estimated sigma2, and more + Vm .= V + η * Diagonal(d_inv) + Vmchol = cholesky(Vm) # LL' = Vm + RL = Vmchol.L + lm_sp = lm(RL\X, RL\Y) + σ² = (RSS/η + deviance(lm_sp))/Ndof + # n2ll = -2 loglik except for Ndof*log(2pi) + sum log(di) + Ndof + n2ll = Ndof * log(σ²) + wdof * log(η) + logdet(Vmchol) + if reml + n2ll += logdet(lm_sp.pp.chol) # log|X'Vm^{-1}X| + end + #= manual calculations without cholesky + Q = X'*(Vm\X); β = Q\(X'*(Vm\Ysp)); r = Y-X*β + val = Ndof*log(σ²) + ((RSS/η) + r'*(Vm\r))/σ² + + (ntot-ncoef)*log(η) + logabsdet(Vm)[1] + logabsdet(Q)[1] + =# + return (n2ll, σ², Vmchol) + end + obj(x, g) = logliksigma(x[1])[1] # x = [η] + NLopt.min_objective!(opt, obj) + fmin, xmin, ret = NLopt.optimize(opt, optsum.initial) + optsum.feval = opt.numevals + optsum.final = xmin + optsum.fmin = fmin + optsum.returnvalue = ret + # save the results + η = xmin[1] + (n2ll, σ², Vmchol) = logliksigma(η) + model_within.wsp_var[1] = η*σ² + model_within.bsp_var[1] = σ² + return model_within, Vmchol.L +end + +############################################################################### +#= Model comparisons + +isnested: borrowed from GLM.issubmodel (as of commit 504e5186c87) +https://github.com/JuliaStats/GLM.jl/blob/master/src/ftest.jl#L11 +To avoid comparing the coefnames and to be less restrictive, we compare the +design matrices. For example: Xsmall = [x1-x2 x1-x3] is nested in Xbig = [x1 x2 x3]. +We check that there exists B such that Xsmall = Xbig * B, or rather, that +min_B norm(Xbig*B - Xsmall) ≈ 0 . For the math of this minimization problem, +see https://github.com/JuliaStats/GLM.jl/pull/197#issuecomment-331136617 + +When isnested() exists in GLM, check to see if we should improve further. +=# +""" + isnested(m1::PhyloNetworkLinearModel, m2::PhyloNetworkLinearModel) + isnested(m1::ContinuousTraitEM, m2::ContinuousTraitEM) + +True if `m1` is nested in `m2`, false otherwise. +Models fitted with different criteria (ML and REML) are not nested. +Models with different predictors (fixed effects) must be fitted with ML to be +considered nested. +""" +function StatsModels.isnested(m1m::PhyloNetworkLinearModel, m2m::PhyloNetworkLinearModel; atol::Real=0.0) + if !(nobs(m1m) ≈ nobs(m2m)) + @error "Models must have the same number of observations" + return false + end + # exact same response? (before phylogenetic transformation) + if m1m.Y != m2m.Y + @error "Models must fit the same response" + return false + end + # same criterion? + if xor(m1m.reml, m2m.reml) + @error "Models must be fitted with same criterion (both ML or both REML)" + return false + end + # same within-species variation? e.g. same assumption of species means + # this check should be useless, because same Y so same # species, and same + # nobs so same # individuals. But 1 ind/species w/o within-species variation, + # and at least 1 species with 2+ inds/species w/ within-species variation. + xor(isnothing(m1m.model_within), isnothing(m2m.model_within)) && return false + # nesting of fixed effects: is X1 = X2*B for some B? + X1 = m1m.X + np1 = size(X1, 2) + X2 = m2m.X + np2 = size(X2, 2) + np1 > np2 && return false # if X1 has more predictors, can't be nested in X2 + # is mininum_B norm X2*B - X1 ≈ 0 ? + rtol = Base.rtoldefault(eltype(X1)) + norm(view(qr(X2).Q' * X1, np2 + 1:size(X2,1), :)) < max(atol, rtol*norm(X1)) || + return false + # ML (not REML) if different fixed effects + sameFE = (X1 == X2) # exact equality okay here + if !sameFE && (m1m.reml || m2m.reml) + @error "Models should be fitted with ML to do a likelihood ratio test with different predictors" + return false + end + # nesting of phylogenetic variance models + return isnested(m1m.evomodel, m2m.evomodel) +end + +isnested(::T,::T) where T <: ContinuousTraitEM = true +isnested(::BM,::Union{PagelLambda,ScalingHybrid}) = true +isnested(::Union{PagelLambda,ScalingHybrid}, ::BM) = false +isnested(::ScalingHybrid,::PagelLambda) = false +isnested(::PagelLambda,::ScalingHybrid) = false + +#= ANOVA using ftest from GLM - need version 0.8.1 + As of GLM v1.8, ftest throws a warning on typical BM models, one per model: + "Starting from GLM.jl 1.8, null model is defined as having no predictor at all when a model without an intercept is passed." + This is because after transforming the data to de-correlate the residuals, + the transformed intercept vector is not proportional to the constant vector 1. + The warning is from: ftest → r2(phylomodel.lm) → nulldeviance(phylomodel.lm) → warning. + R² by GLM is wrong: assume *no* intercept, and are based on the transformed data. + R² corrected them below: r2(phylomodel) reimplemented here. + But nulldeviance(phylomodel) does *not* call nulldeviance(phylomodel.lm), + instead re-implemented here to use the intercept properly. + Keep the warnings: unless they can be suppressed with specificity + Ideally: modify `ftest` here or in GLM. +=# +function GLM.ftest(objs::PhyloNetworkLinearModel...; kwargs...) + if !all( isa(o.evomodel,BM) && isnothing(o.model_within) for o in objs) + throw(ArgumentError("""F test is only valid for the vanilla BM model. + Use a likelihood ratio test instead with function `lrtest`.""")) + end + objslm = [obj.lm for obj in objs] + resGLM = ftest(objslm...; kwargs...) + resGLM.r2 = r2.(objs) + return resGLM +end +## ANOVA: old version - kept for tests purposes - do not export +""" + anova(objs::PhyloNetworkLinearModel...) + +Takes several nested fits of the same data, and computes the F statistic for each +pair of models. + +The fits must be results of function [`phylolm`](@ref) called on the same +data, for models that have more and more effects. + +Returns a DataFrame object with the anova table. +""" +function anova(objs::PhyloNetworkLinearModel...) + anovaTable = Array{Any}(undef, length(objs)-1, 6) + ## Compute binary statistics + for i in 1:(length(objs) - 1) + anovaTable[i, :] = anovaBin(objs[i], objs[i+1]) + end + ## Transform into a DataFrame + anovaTable = DataFrame(anovaTable, + [:dof_res, :RSS, :dof, :SS, :F, Symbol("Pr(>F)")]) + return(anovaTable) +end + +function anovaBin(obj1::PhyloNetworkLinearModel, obj2::PhyloNetworkLinearModel) + length(coef(obj1)) < length(coef(obj2)) || error("Models must be nested, from the smallest to the largest.") + ## residuals + dof2 = dof_residual(obj2) + dev2 = deviance(obj2, Val(true)) + ## reducted residuals + dof1 = dof_residual(obj1) - dof2 + dev1 = deviance(obj1, Val(true)) - dev2 + ## Compute statistic + F = (dev1 / dof1) / (dev2 / dof2) + pval = GLM.ccdf.(GLM.FDist(dof1, dof2), F) # ccdf and FDist from Distributions, used by GLM + return([dof2, dev2, dof1, dev1, F, pval]) +end + +############################################################################### +## Regression matrices for ANOVA / shifts + +""" + descendencedataframe(net::HybridNetwork, which=:allhybrids; checkpreorder=true) + descendencedataframe(net::HybridNetwork, node::Vector{Node}; checkpreorder=true) + descendencedataframe(net::HybridNetwork, edge::Vector{Edge}; checkpreorder=true) + +Data frame containing the genomic proportion inherited by each taxon in `net`, +from each hybrid node by default in the first method, +or from each node or edge in the input vector in the second and third methods. +The data frame has 1 row per tip (taxon) in the network +and the following columns: +- 1 column per edge or node, with columns named according to the pattern + shift_{edge_number}" where `edge_number` is the number of the edge associated + with an input edge or node (in which case the parent edge is used) +- 1 additional column labeled `tipnames`, containing the tip labels. + +The `shift_*` columns in this data frame can be used as regressor vectors +associated with shifts on input `edge`s or on edges that are above input `node`s. +With option `which=:allhybrids` in last method, each shift column is associated +with a hybrid node in `net`, to model a shift on the edge that is immediately +below the hybrid node. This can be used to test for transgressive evolution: +see examples below. + +These methods use [`PhyloNetworks.descendencematrix`](@extref), so +`net` might be modified to store a vector of its nodes sorted in a pre-order. + +# Examples + +```jldoctest descendence +julia> net = readnewick("(A:2.5,((B:1,#H1:0.5::0.4):1,(C:1,(D:0.5)#H1:0.5::0.6):1):0.5);"); + +julia> preorder!(net) + +julia> using PhyloPlots + +julia> plot(net, shownodenumber=true); # to locate nodes + +julia> nodes_shifts = indexin([1,-5], [n.number for n in net.node]) # Put a shift on edges ending at nodes 1 and -5 +2-element Vector{Union{Nothing, Int64}}: + 1 + 7 + +julia> params = ParamsBM(10, 0.1, ShiftNet(net.node[nodes_shifts], [3.0, -3.0], net)) +ParamsBM: +Parameters of a BM with fixed root: +mu: 10.0 +Sigma2: 0.1 + +There are 2 shifts on the network: +────────────────────────── + Edge Number Shift Value +────────────────────────── + 8.0 -3.0 + 1.0 3.0 +────────────────────────── + +julia> using Random; Random.seed!(2468); # sets the seed for reproducibility + +julia> sim = rand(net, params); # simulate a dataset with shifts + +julia> using DataFrames # to handle data frames + +julia> dat = DataFrame(trait = sim[:tips], tipnames = sim.M.tipnames); + +julia> dat = DataFrame(trait = [13.391976856737717, 9.55741491696386, 7.17703734817448, 7.889062527849697], + tipnames = ["A","B","C","D"]) # hard-coded, to be independent of random number generator +4×2 DataFrame + Row │ trait tipnames + │ Float64 String +─────┼──────────────────── + 1 │ 13.392 A + 2 │ 9.55741 B + 3 │ 7.17704 C + 4 │ 7.88906 D + +julia> dfr_shift = descendencedataframe(net, net.node[nodes_shifts]) # the regressors matching the shifts. +4×3 DataFrame + Row │ shift_1 shift_8 tipnames + │ Float64 Float64 String +─────┼──────────────────────────── + 1 │ 1.0 0.0 A + 2 │ 0.0 0.0 B + 3 │ 0.0 1.0 C + 4 │ 0.0 0.6 D + +julia> dfr = innerjoin(dat, dfr_shift, on=:tipnames); # join data and regressors in a single dataframe + +julia> using StatsModels # for statistical model formulas + +julia> fitBM = phylolm(@formula(trait ~ shift_1 + shift_8), dfr, net; reml=false) # actual fit +PhyloNetworkLinearModel + +Formula: trait ~ 1 + shift_1 + shift_8 + +Model: Brownian motion + +Parameter Estimates, using ML: +phylogenetic variance rate: 0.0112618 + +Coefficients: +──────────────────────────────────────────────────────────────────────── + Coef. Std. Error t Pr(>|t|) Lower 95% Upper 95% +──────────────────────────────────────────────────────────────────────── +(Intercept) 9.48238 0.327089 28.99 0.0220 5.32632 13.6384 +shift_1 3.9096 0.46862 8.34 0.0759 -2.04479 9.86399 +shift_8 -2.4179 0.422825 -5.72 0.1102 -7.7904 2.95461 +──────────────────────────────────────────────────────────────────────── +Log Likelihood: 1.8937302027 +AIC: 4.2125395947 +``` + +Next we illustrate the model with heterosis, aka transgressive evolution: with +a shift in the trait after successful hybridization. +First how to simulated according to this model: + +```jldoctest descendence +julia> nodes_hybrids = indexin([5], [n.number for n in net.node]); # Put a shift on edges below hybrids + +julia> params = ParamsBM(10, 0.1, ShiftNet(net.node[nodes_hybrids], [3.0], net)); + +julia> using Random; Random.seed!(2468); # sets the seed for reproducibility + +julia> sim = rand(net, params); # simulate a dataset with shifts + +julia> dat = DataFrame(trait = sim[:tips], tipnames = sim.M.tipnames); +``` + +and next how to analyze data under a transgressive evolution model. +Below we hard-code data values for more reproducibility. + +```jldoctest descendence +julia> dat = DataFrame(trait = [10.391976856737717, 9.55741491696386, 10.17703734817448, 12.689062527849698], + tipnames = ["A","B","C","D"]) +4×2 DataFrame + Row │ trait tipnames + │ Float64 String +─────┼──────────────────── + 1 │ 10.392 A + 2 │ 9.55741 B + 3 │ 10.177 C + 4 │ 12.6891 D + +julia> dfr_hybrid = descendencedataframe(net) # the regressors matching the hybrids (all of them) +4×3 DataFrame + Row │ shift_6 tipnames sum + │ Float64 String Float64 +─────┼──────────────────────────── + 1 │ 0.0 A 0.0 + 2 │ 0.0 B 0.0 + 3 │ 0.0 C 0.0 + 4 │ 1.0 D 1.0 + +julia> dfr = innerjoin(dat, dfr_hybrid, on=:tipnames); # join data and regressors in a single dataframe + +julia> using StatsModels + +julia> fitBM = phylolm(@formula(trait ~ shift_6), dfr, net; reml=false) # actual fit +PhyloNetworkLinearModel + +Formula: trait ~ 1 + shift_6 + +Model: Brownian motion + +Parameter Estimates, using ML: +phylogenetic variance rate: 0.041206 + +Coefficients: +──────────────────────────────────────────────────────────────────────── + Coef. Std. Error t Pr(>|t|) Lower 95% Upper 95% +──────────────────────────────────────────────────────────────────────── +(Intercept) 10.064 0.277959 36.21 0.0008 8.86805 11.26 +shift_6 2.72526 0.315456 8.64 0.0131 1.36796 4.08256 +──────────────────────────────────────────────────────────────────────── +Log Likelihood: -0.7006021946 +AIC: 7.4012043891 +``` + +# See also +[`phylolm`](@ref), [`PhyloNetworks.descendencematrix`](@extref). +""" +function descendencedataframe( + net::HybridNetwork, + node::Vector{Node}; + checkpreorder::Bool=true +) + T = PN.descendencematrix(net; checkpreorder=checkpreorder) + descendencedataframe(net, node, T) +end + +function descendencedataframe( + net::HybridNetwork, + node::Vector{Node}, + T::MatrixTopologicalOrder +) + ## Get the descendence matrix for tips + T_t = T[:tips] + ## Get the indices of the columns to keep + ind = zeros(Int, length(node)) + for (i,nod) in enumerate(node) + !nod.hybrid || error("Shifts on hybrid edges are not allowed") + ii = findfirst(n -> n===nod, net.vec_node) + isnothing(ii) && error("node number $(nod.number) (i=$i) not in preorder list") + ind[i] = ii + end + ## get column names + eNum = [getMajorParentEdgeNumber(n) for n in net.vec_node[ind]] + function tmp_fun(x::Int) + return(Symbol("shift_$(x)")) + end + df = DataFrame(T_t[:, ind], [tmp_fun(num) for num in eNum]) + df[!,:tipnames]=T.tipnames + return(df) +end + +function descendencedataframe( + net::HybridNetwork, + edge::Vector{Edge}; + checkpreorder::Bool=true +) + childs = [getchild(ee) for ee in edge] + return(descendencedataframe(net, childs; checkpreorder=checkpreorder)) +end + +descendencedataframe(net::HybridNetwork, edge::Edge; checkpreorder::Bool=true) = descendencedataframe(net, [edge]; checkpreorder=checkpreorder) +descendencedataframe(net::HybridNetwork, node::Node; checkpreorder::Bool=true) = descendencedataframe(net, [node]; checkpreorder=checkpreorder) + +function descendencedataframe( + net::HybridNetwork, + which=:allhybrids; + checkpreorder::Bool=true, +) + if which == :allhybrids + childs = [getchild(nn) for nn in net.hybrid] # checks that each hybrid node has a single child + dfr = descendencedataframe(net, childs; checkpreorder=checkpreorder) + dfr[!,:sum] = sum.(eachrow(select(dfr, Not(:tipnames), copycols=false))) + return(dfr) + end + throw(ArgumentError("""`which` must be equal to `:allhybrids` for now. + Otherwise call descendencedataframe with a vector of edges or nodes.""")) +end diff --git a/src/models_continuous.jl b/src/models_continuous.jl new file mode 100644 index 0000000..fa5b20e --- /dev/null +++ b/src/models_continuous.jl @@ -0,0 +1,963 @@ +# types for shifts. used later in types of simulation parameters +""" + ShiftNet + +Shifts mapped to tree nodes and their (unique) parent edge on a +[`PhyloNetworks.HybridNetwork`](@extref) sorted in topological order. +Its `shift` field is a vector of shift values, one for each node, +corresponding to the shift on the parent edge of the node +(which makes sense for tree nodes only: they have a single parent edge). + +Two `ShiftNet` objects on the same network can be concatened with `*`. + +`ShiftNet(node::Vector{Node}, value::AbstractVector, net::HybridNetwork; checkpreorder::Bool=true)` + +Constructor from a vector of nodes and associated values. The shifts are located +on the edges above the nodes provided. Warning, shifts on hybrid edges are not +allowed. + +`ShiftNet(edge::Vector{Edge}, value::AbstractVector, net::HybridNetwork; checkpreorder::Bool=true)` + +Constructor from a vector of edges and associated values. +Warning, shifts on hybrid edges are not allowed. + +Extractors: [`getshiftedgenumber`](@ref), [`getshiftvalue`](@ref) +""" +struct ShiftNet + shift::Matrix{Float64} + net::HybridNetwork +end + +ShiftNet(net::HybridNetwork, dim::Int) = ShiftNet(zeros(length(net.node), dim), net) +ShiftNet(net::HybridNetwork) = ShiftNet(net, 1) + +# from vector of nodes +function ShiftNet( + node::Vector{Node}, + value::AbstractMatrix, + net::HybridNetwork; + checkpreorder::Bool=true +) + n_nodes, dim = size(value) + if length(node) != n_nodes + error("The vector of nodes/edges and of values must have the same number or rows.") + end + if checkpreorder + preorder!(net) + end + obj = ShiftNet(net, dim) + for i in 1:length(node) + !node[i].hybrid || error("Shifts on hybrid edges are not allowed") + ind = findfirst(x -> x===node[i], net.vec_node) + obj.shift[ind, :] .= @view value[i, :] + end + return(obj) +end +function ShiftNet( + node::Vector{Node}, + value::AbstractVector, + net::HybridNetwork; + checkpreorder::Bool=true +) + return ShiftNet(node, reshape(value, (length(value), 1)), net, + checkpreorder = checkpreorder) +end +# from vector of edges +function ShiftNet( + edge::Vector{Edge}, + value::Union{AbstractVector, AbstractMatrix}, + net::HybridNetwork; + checkpreorder::Bool=true +) + childs = [getchild(ee) for ee in edge] + return(ShiftNet(childs, value, net; checkpreorder=checkpreorder)) +end +# from a single node or single edge +ShiftNet(edge::Edge, value::Float64, net::HybridNetwork; checkpreorder::Bool=true) = + ShiftNet([edge], [value], net; checkpreorder=checkpreorder) +ShiftNet(node::Node, value::Float64, net::HybridNetwork; checkpreorder::Bool=true) = + ShiftNet([node], [value], net; checkpreorder=checkpreorder) +function ShiftNet( + edge::Edge, + value::AbstractVector{Float64}, + net::HybridNetwork; + checkpreorder::Bool=true +) + return ShiftNet([edge], reshape(value, (1, length(value))), net, + checkpreorder = checkpreorder) +end +function ShiftNet( + node::Node, + value::AbstractVector{Float64}, + net::HybridNetwork; + checkpreorder::Bool=true +) + return ShiftNet([node], reshape(value, (1, length(value))), net, + checkpreorder = checkpreorder) +end + +""" + shiftathybrids(value::Vector{T} where T<:Real, net::HybridNetwork; checkpreorder::Bool=true) + +Construct an object [`ShiftNet`](@ref) with shifts on all the edges below +hybrid nodes, with values provided. The vector of values must have the +same length as the number of hybrids in the network. + +""" +function shiftathybrids( + value::Union{Matrix{T}, Vector{T}} where T<:Real, + net::HybridNetwork; + checkpreorder::Bool=true +) + if length(net.hybrid) != size(value, 1) + error("You must provide as many values as the number of hybrid nodes.") + end + childs = [getchild(nn) for nn in net.hybrid] # checks for single child + return(ShiftNet(childs, value, net; checkpreorder=checkpreorder)) +end +shiftathybrids(value::Real, net::HybridNetwork; checkpreorder::Bool=true) = + shiftathybrids([value], net; checkpreorder=checkpreorder) + +""" + getshiftedgenumber(shift::ShiftNet) + +Get the edge numbers where the shifts are located, for an object [`ShiftNet`](@ref). +If a shift is placed at the root node with no parent edge, the edge number +of a shift is set to -1 (as if missing). +""" +function getshiftedgenumber(shift::ShiftNet) + nodInd = getshiftrowinds(shift) + [getMajorParentEdgeNumber(n) for n in shift.net.vec_node[nodInd]] +end + +function getMajorParentEdgeNumber(n::Node) + try + getparentedge(n).number + catch + -1 + end +end + +function getshiftrowinds(shift::ShiftNet) + n, p = size(shift.shift) + inds = zeros(Int, n) + counter = 0 + for i = 1:n + use_row = !all(iszero, @view shift.shift[i, :]) + if use_row + counter += 1 + inds[counter] = i + end + end + return inds[1:counter] +end +""" + getshiftvalue(shift::ShiftNet) + +Get the values of the shifts, for an object [`ShiftNet`](@ref). +""" +function getshiftvalue(shift::ShiftNet) + rowInds = getshiftrowinds(shift) + shift.shift[rowInds, :] +end + +function shift_coeftable(shift::ShiftNet) + sv = getshiftvalue(shift) + if size(sv, 2) == 1 + shift_labels = ["Shift Value"] + else + shift_labels = ["Shift Value $i" for i = 1:size(sv, 2)] + end + CoefTable(hcat(getshiftedgenumber(shift), sv), + ["Edge Number"; shift_labels], + fill("", size(sv, 1))) +end + +function Base.show(io::IO, obj::ShiftNet) + println(io, "$(typeof(obj)):\n", + shift_coeftable(obj)) +end + +function Base.:*(sh1::ShiftNet, sh2::ShiftNet) + PN.isEqual(sh1.net, sh2.net) || + error("Shifts to be concatenated must be defined on the same network.") + size(sh1.shift) == size(sh2.shift) || + error("Shifts to be concatenated must have the same dimensions.") + shiftNew = zeros(size(sh1.shift)) + for i in 1:length(sh1.shift) + if iszero(sh1.shift[i]) + shiftNew[i] = sh2.shift[i] + elseif iszero(sh2.shift[i]) + shiftNew[i] = sh1.shift[i] + elseif sh1.shift[i] == sh2.shift[i] + shiftNew[i] = sh1.shift[i] + else + error("The two shifts matrices you provided affect the same " * + "trait for the same edge, so I cannot choose which one you want.") + end + end + return(ShiftNet(shiftNew, sh1.net)) +end + +# types used for simulation, and for ancestralreconstruction + +abstract type ParamsProcess end + +""" + ParamsBM <: ParamsProcess + +Type for a BM process on a network. Fields are `mu` (expectation), +`sigma2` (variance), `randomRoot` (whether the root is random, default to `false`), +and `varRoot` (if the root is random, the variance of the root, default to `NaN`). +""" +mutable struct ParamsBM <: ParamsProcess + "ancestral value (or mean)" + mu::Float64 + "evolutionary variance" + sigma2::Float64 + "is the root trait a random variable? false by default in many constructors" + randomRoot::Bool + "variance of the root trait. NaN by default in many constructors" + varRoot::Float64 + "shifts, if any: ShiftNet object, or missing" + shift::Union{ShiftNet, Missing} + + function ParamsBM( + mu::Real, + sigma2::Real, + randomRoot::Bool, + varRoot::Real, + shift::Union{ShiftNet, Missing} + ) + if !ismissing(shift) && size(shift.shift, 2) != 1 + error("ShiftNet must have only a single shift dimension.") + end + return new(mu, sigma2, randomRoot, varRoot, shift) + end +end +# Constructor +ParamsBM(mu::Real, sigma2::Real) = ParamsBM(mu, sigma2, false, NaN, missing) # default values +ParamsBM(mu::Real, sigma2::Real, net::HybridNetwork) = ParamsBM(mu, sigma2, false, NaN, ShiftNet(net)) # default values +ParamsBM(mu::Real, sigma2::Real, shift::ShiftNet) = ParamsBM(mu, sigma2, false, NaN, shift) # default values + +function anyShift(params::ParamsProcess) + if ismissing(params.shift) return(false) end + for v in params.shift.shift + if v != 0 return(true) end + end + return(false) +end + +process_dim(::ParamsBM) = 1 + +function Base.show(io::IO, obj::ParamsBM) + disp = "$(typeof(obj)):\n" + pt = paramstable(obj) + if obj.randomRoot + disp = disp * "Parameters of a BM with random root:\n" * pt + else + disp = disp * "Parameters of a BM with fixed root:\n" * pt + end + println(io, disp) +end + +function paramstable(obj::ParamsBM) + disp = "mu: $(obj.mu)\nSigma2: $(obj.sigma2)" + if obj.randomRoot + disp = disp * "\nvarRoot: $(obj.varRoot)" + end + if anyShift(obj) + disp = disp * "\n\nThere are $(length(getshiftvalue(obj.shift))) shifts on the network:\n" + disp = disp * "$(shift_coeftable(obj.shift))" + end + return(disp) +end + +""" + ParamsMultiBM <: ParamsProcess + +Type for a multivariate Brownian diffusion (MBD) process on a network. Fields are `mu` (expectation), +`sigma` (covariance matrix), `randomRoot` (whether the root is random, default to `false`), +`varRoot` (if the root is random, the covariance matrix of the root, default to `[NaN]`), +`shift` (a ShiftNet type, default to `missing`), +and `L` (the lower triangular of the cholesky decomposition of `sigma`, computed automatically) + +# examples and constructors + +```jldoctest +julia> ParamsMultiBM([1.0, -0.5], [2.0 0.3; 0.3 1.0]) # no shifts +ParamsMultiBM: +Parameters of a MBD with fixed root: +mu: [1.0, -0.5] +Sigma: [2.0 0.3; 0.3 1.0] + +julia> net = readnewick("((A:1,B:1):1,C:2);"); + +julia> shifts = ShiftNet(net.node[2], [-1.0, 2.0], net); + +julia> ParamsMultiBM([1.0, -0.5], [2.0 0.3; 0.3 1.0], shifts) # with shifts +ParamsMultiBM: +Parameters of a MBD with fixed root: +mu: [1.0, -0.5] +Sigma: [2.0 0.3; 0.3 1.0] + +There are 2 shifts on the network: +─────────────────────────────────────────── + Edge Number Shift Value 1 Shift Value 2 +─────────────────────────────────────────── + 2.0 -1.0 2.0 +─────────────────────────────────────────── + +``` +""" +mutable struct ParamsMultiBM <: ParamsProcess + mu::Vector{Float64} + sigma::Matrix{Float64} + randomRoot::Bool + varRoot::Matrix{Float64} + shift::Union{ShiftNet, Missing} + L::LowerTriangular{Float64} + + function ParamsMultiBM( + mu::AbstractArray{Float64, 1}, + sigma::AbstractArray{Float64, 2}, + randomRoot::Bool, + varRoot::AbstractArray{Float64, 2}, + shift::Union{ShiftNet, Missing}, + L::LowerTriangular{Float64} + ) + dim = length(mu) + if size(sigma) != (dim, dim) + error("The mean and variance do must have conforming dimensions.") + end + if randomRoot && size(sigma) != size(varRoot) + error("The root variance and process variance must have the same dimensions.") + end + if !ismissing(shift) && size(shift.shift, 2) != dim + error("The ShiftNet and diffusion process must have the same dimensions.") + end + return new(mu, sigma, randomRoot, varRoot, shift, L) + end +end + +ParamsMultiBM(mu::AbstractArray{Float64, 1}, sigma::AbstractArray{Float64, 2}) = + ParamsMultiBM(mu, sigma, false, Diagonal([NaN]), missing, cholesky(sigma).L) +function ParamsMultiBM( + mu::AbstractArray{Float64, 1}, + sigma::AbstractArray{Float64, 2}, + shift::ShiftNet +) + return ParamsMultiBM(mu, sigma, false, Diagonal([NaN]), shift, cholesky(sigma).L) +end +function ParamsMultiBM( + mu::AbstractArray{Float64, 1}, + sigma::AbstractArray{Float64, 2}, + net::HybridNetwork +) + return ParamsMultiBM(mu, sigma, ShiftNet(net, length(mu))) +end + +process_dim(params::ParamsMultiBM) = length(params.mu) + +function Base.show(io::IO, obj::ParamsMultiBM) + disp = "$(typeof(obj)):\n" + pt = paramstable(obj) + if obj.randomRoot + disp = disp * "Parameters of a MBD with random root:\n" * pt + else + disp = disp * "Parameters of a MBD with fixed root:\n" * pt + end + println(io, disp) +end + +function paramstable(obj::ParamsMultiBM) + disp = "mu: $(obj.mu)\nSigma: $(obj.sigma)" + if obj.randomRoot + disp = disp * "\nvarRoot: $(obj.varRoot)" + end + if anyShift(obj) + disp = disp * "\n\nThere are $(length(getshiftvalue(obj.shift))) shifts on the network:\n" + disp = disp * "$(shift_coeftable(obj.shift))" + end + return(disp) +end + + +""" + WithinSpeciesCTM + +Type to fit models accounting for within-species variation, including +measurement error, genetic variation between individuals, plasticity, +environmental variation etc. +CTM stands for "continuous trait model". Contains the estimated variance components +(between-species phylogenetic variance rate and within-species variance) +and output from the `NLopt` optimization used in the estimation. + +## fields + +- `wsp_var`: intra/within-species variance. +- `bsp_var`: inter/between-species variance-rate. +- `wsp_ninv`: vector of the inverse sample-sizes (e.g. [1/n₁, ..., 1/nₖ], where + data from k species was used to fit the model and nᵢ is the no. of observations + for the ith species). +- `rss`: within-species sum of squares +- `optsum`: an [`OptSummary`](@ref) object. +""" +struct WithinSpeciesCTM + "within-species variance η*σ², assumes Normal distribution" + wsp_var::Vector{Float64} # vector to make it mutable + "between-species variance rate σ², such as from Brownian motion" + bsp_var::Vector{Float64} + "inverse sample sizes (or precision): 1/(no. of individuals) within each species" + wsp_ninv::Vector{Float64} + "within-species sum of squares" + rss::Float64 + "NLopt & NLopt summary object" + optsum::OptSummary +end + +""" + ContinuousTraitEM + +Abstract type for evolutionary models for continuous traits, using a continuous-time +stochastic process on a phylogeny. + +For subtypes, see [`BM`](@ref), [`PagelLambda`](@ref), [`ScalingHybrid`](@ref). + +Each of these subtypes/models has the field `lambda`, whose default value is 1.0. +However, the interpretation of this field differs across models. +""" +abstract type ContinuousTraitEM end + +# current concrete subtypes: BM, PagelLambda, ScalingHybrid +# possible future additions: OU (Ornstein-Uhlenbeck)? +""" + BM(λ) + +Brownian Motion, subtype of [`ContinuousTraitEM`](@ref), to model the population mean +of a trait (or of the residuals from a linear model). Under the BM model, +the population (or species) means have a multivariate normal distribution with +covariance matrix = σ²λV, where σ² is the between-species +variance-rate (to be estimated), and the matrix V is obtained from +[`PhyloNetworks.sharedpathmatrix`](@extref)`(net)[:tips]`. + +λ is set to 1 by default, and is immutable. +In future versions, λ may be used to control the scale for σ². + +On a tree, V is the length of shared ancestry. +On a network, the BM model assumes that the trait at a hybrid node +is the weighted average of its immediate parents (plus possibly a fixed shift). +The weights are the proportion of genes inherited from each parent: +the γ parameters of hybrid edges. +""" +struct BM <: ContinuousTraitEM + lambda::Float64 # immutable +end +BM() = BM(1.0) +evomodelname(::BM) = "Brownian motion" + +""" + PagelLambda(λ) + +Pagel's λ model, subtype of [`ContinuousTraitEM`](@ref), with covariance matrix σ²V(λ). +σ² is the between-species variance-rate (to be estimated), and V(λ) = λV + (1-λ)T, +where V is the covariance under a Brownian motion [`BM`](@ref) and T is a diagonal +matrix containing the total branch length elapsed from the root to each leaf (if +the phylogeny is a tree, or more generally if the network is time consistent: the +time from the root to a given node does not depend on the path). + +λ ∈ [0,1] is mutable and may be optimized. It is a measure of phylogenetic +signal, that is, how important the given network is for explaining variation in +the response. When λ=1, the `PagelLambda` model reduces to the `BM` model. +""" +mutable struct PagelLambda <: ContinuousTraitEM + lambda::Float64 # mutable: can be optimized +end +PagelLambda() = PagelLambda(1.0) +evomodelname(::PagelLambda) = "Pagel's lambda" + +""" + ScalingHybrid(λ) + +Scaling Hybrid model, subtype of [`ContinuousTraitEM`](@ref), with covariance matrix +σ²V(N(λ)). σ² is the between-species variance-rate (to be estimated), +V(N) is the Brownian motion [`BM`](@ref) covariance obtained from network N, +and N(λ) is a obtained from the input network by rescaling the inheritance +parameter γ of all minor edges by the same λ: a minor edge has its original γ +changed to λγ, using the same λ at all reticulations. +Note that for a major edge with original inheritance γ, the partner minor edge +has inheritance γ_minor = 1-γ, so the major edge's inheritance is changed to +1-λγ_minor = λγ+1-λ. + +For more information: see Bastide (2017) dissertation, section 4.3.2 p.175, +available at https://tel.archives-ouvertes.fr/tel-01629648 + +λ ∈ [0,1] is mutable and may be optimized. It is a measure of how important the +reticulations are for explaining variation in the response. +When λ=1, the `ScalingHybrid` model reduces to the `BM` model. +""" +mutable struct ScalingHybrid <: ContinuousTraitEM + lambda::Float64 +end +ScalingHybrid() = ScalingHybrid(1.0) +evomodelname(::ScalingHybrid) = "Lambda's scaling hybrid" + +############################################################################### +## phylogenetic network regression +############################################################################### + +""" + PhyloNetworkLinearModel <: GLM.LinPredModel + +Phylogenetic linear model representation. + +## Fields + +`lm`, `V`, `Vy`, `RL`, `Y`, `X`, `logdetVy`, `reml`, `ind`, `nonmissing`, +`evomodel`, `model_within` and `formula`. +The following syntax pattern can be used to get more information on a specific field: +e.g. to find out about the `lm` field, do `?PhyloNetworkLinearModel.lm`. + +## Methods applied to fitted models + +The following StatsAPI / StatsBase functions can be applied: +`coef`, `nobs`, `vcov`, `stderror`, `confint`, `coeftable`, `dof_residual`, `dof`, `deviance`, +`residuals`, `response`, `predict`, `loglikelihood`, `nulldeviance`, `nullloglikelihood`, +`r2`, `adjr2`, `aic`, `aicc`, `bic`, `ftest`, `lrtest` etc. + +The estimated variance-rate and estimated mean of the species-level trait model +(see [`ContinuousTraitEM`](@ref)) can be retrieved using [`sigma2_phylo`](@ref) +and [`mu_phylo`](@ref) respectively. + +If relevant, the estimated individual-level/within-species variance can be retrieved +using [`sigma2_within`](@ref). + +The optimized λ parameter for Pagel's λ model (see [`PagelLambda`](@ref)) can +be retrieved using [`lambda_estim`](@ref). + +An ancestral state reconstruction can be performed using [`ancestralreconstruction`](@ref). + +## Within-species variation + +The true species/population means for the response trait/variable (or the residuals: +conditional on the predictors) are jointly modeled as 𝒩(·, σ²ₛV) where V depends on +the trait model (see [`ContinuousTraitEM`](@ref)) and on the species network. +σ²ₛ is the between-species variance-rate. + +Within-species variation is modeled by assuming that the individual-level +responses are iid 𝒩(0, σ²ₑ) about the true species means, so that the +species-level sample means (conditional on the predictors) are jointly modeled +as 𝒩(·, σ²ₛV + σ²ₑD⁻¹), where σ²ₑ is the within-species variance and D⁻¹ is a +diagonal matrix whose entries are the inverse sample-sizes (see [`WithinSpeciesCTM`](@ref)). + +Although the above two models can be expressed in terms of a joint distribution +for the species-level sample means (or residuals conditional on the predictors), +more data are required to fit a model accounting for within-species variation, +that is, a model recognizing that the sample means are estimates of the true +population means. To fit a model *without* within-species variation, data on the +species means are sufficient. To fit a model *with* within-species variation, +we need to have the species means and the standard deviations of the response +variable for each species. + +`phylolm` can fit a model with within-species variation either from +species-level statistics ("mean response" and "standard deviation in response") +or from individual-level data (in which case the species-level statistics are +computed internally). See [`phylolm`](@ref) for more details on these two +input choices. + +In the object, `obj.Y` and `obj.X` are the observed species means. +`predict`, `residuals` and `response` return the values at the species level. +""" +mutable struct PhyloNetworkLinearModel <: GLM.LinPredModel + "lm: a GLM.LinearModel object, fitted on the cholesky-tranformed problem" + lm::GLM.LinearModel # result of a lm on a matrix + "V: a MatrixTopologicalOrder object of the network-induced correlations" + V::MatrixTopologicalOrder + "Vy: the sub matrix corresponding to the tips and actually used for the correction" + Vy::Matrix + """RL: a LowerTriangular matrix, the lower Cholesky factor of Vy=RL*RL' + obtained with `cholesky(Vy).L`. The data stored in `lm` are RL⁻¹Y and RL⁻¹X. + """ + RL::LowerTriangular + "Y: the vector of data" + Y::Vector + "X: the matrix of regressors" + X::Matrix + "logdetVy: the log-determinant of Vy" + logdetVy::Float64 + "criterion: REML if reml is true, ML otherwise" + reml::Bool + "ind: vector matching the tips of the network against the names of the dataframe provided. 0 if the match could not be performed." + ind::Vector{Int} + "nonmissing: vector indicating which tips have non-missing data" + nonmissing::BitArray{1} + "evomodel: the model used for the fit" + evomodel::ContinuousTraitEM + # ContinuousTraitEM is abstract: not efficient. parametrize PhyloNetworkLinearModel? + # but the types for Vy, Y and X are also abstract. + "model_within: the model used for within-species variation (if needed)" + model_within::Union{Nothing, WithinSpeciesCTM} + "formula: a StatsModels.FormulaTerm formula" + formula::Union{StatsModels.FormulaTerm,Nothing} +end + +# default model_within=nothing +PhyloNetworkLinearModel(lm, V,Vy,RL,Y,X,logdetVy, reml,ind,nonmissing, model) = + PhyloNetworkLinearModel(lm,V,Vy,RL,Y,X,logdetVy, reml,ind,nonmissing, model,nothing,nothing) +# default formula=nothing +PhyloNetworkLinearModel(lm,V,Vy,RL,Y,X,logdetVy,reml,ind,nonmissing,model,model_within) = +PhyloNetworkLinearModel(lm,V,Vy,RL,Y,X,logdetVy, reml,ind,nonmissing,model,model_within,nothing) + +#= Methods for PhyloNetworkLinearModel objects +un-changed quantities: +- regression coefficients +- formula +- hasintercept +As PhyloNetworkLinearModel <: GLM.LinPredModel, these are automatically defined: +aic, aicc, bic (so long as there is a valid method for loglikelihood, nobs etc.) +=# +StatsAPI.coef(m::PhyloNetworkLinearModel) = coef(m.lm) +StatsAPI.coefnames(m::PhyloNetworkLinearModel) = + (m.formula === nothing ? ["x$i" for i in 1:length(coef(m))] : coefnames(formula(m).rhs)) +StatsModels.formula(obj::PhyloNetworkLinearModel) = obj.formula +StatsModels.hasintercept(m::PhyloNetworkLinearModel) = + any(i -> all(==(1), view(m.X , :, i)), 1:size(m.X, 2)) + +""" + StatsBase.deviance(m::PhyloNetworkLinearModel) + +-2 loglikelihood of the fitted model. See also [`loglikelihood`](@ref). + +Note: this is not the residual-sum-of-squares deviance as output by GLM, +such as one would get with `deviance(m.model)`. +""" +function StatsBase.deviance(m::PhyloNetworkLinearModel, ::Val{false}=Val(false)) + -2*loglikelihood(m) +end +""" + StatsBase.deviance(m::PhyloNetworkLinearModel, Val(true)) + +Residual sum of squares with metric V, the estimated phylogenetic covariance, +if the model is appropriate. +""" +function StatsBase.deviance(m::PhyloNetworkLinearModel, ::Val{true}) + isnothing(m.model_within) || + error("deviance measured as SSR not implemented for within-species variation") + deviance(m.lm) +end +""" + StatsBase.nobs(m::PhyloNetworkLinearModel) + +Number of observations: number of species with data, if the model assumes +known species means, and number of individuals with data, if the model +accounts for within-species variation. +""" +function StatsBase.nobs(m::PhyloNetworkLinearModel) + if isnothing(m.model_within) + return nobs(m.lm) + else + return sum(1.0 ./ m.model_within.wsp_ninv) + end +end + +# degrees of freedom for residuals: at the species level, for coefficients of +# the phylogenetic regression, assuming known co-variance between species means. +# used for F and T degrees of freedom, instead of more conservative Z +StatsAPI.dof_residual(m::PhyloNetworkLinearModel) = nobs(m.lm) - length(coef(m)) + +# degrees of freedom consumed by the species-level model +function StatsAPI.dof(m::PhyloNetworkLinearModel) + res = length(coef(m)) + 1 # +1: phylogenetic variance + if any(typeof(m.evomodel) .== [PagelLambda, ScalingHybrid]) + res += 1 # lambda is one parameter + end + if !isnothing(m.model_within) + res += 1 # within-species variance + end + return res +end + +""" + vcov(m::PhyloNetworkLinearModel) + +Return the variance-covariance matrix of the coefficient estimates. + +For the continuous trait evolutionary models currently implemented, species-level +mean response (conditional on the predictors), Y|X is modeled as: + +1. Y|X ∼ 𝒩(Xβ, σ²ₛV) for models assuming known species mean values (no within-species variation) +2. Y|X ∼ 𝒩(Xβ, σ²ₛV + σ²ₑD⁻¹) for models with information from multiple individuals + and assuming within-species variation + +The matrix V is inferred from the phylogeny, but may also depend on additional +parameters to be estimated (e.g. `lambda` for Pagel's Lambda model). See +[`ContinuousTraitEM`](@ref), [`PhyloNetworkLinearModel`](@ref) for more details. + +If (1), then return σ²ₛ(X'V⁻¹X)⁻¹, where σ²ₛ is estimated with REML, even if +the model was fitted with `reml=false`. +This follows the conventions of [`nlme::gls`](https://www.rdocumentation.org/packages/nlme/versions/3.1-152) +and [`stats::glm`](https://www.rdocumentation.org/packages/stats/versions/3.6.2) in R. + +If (2), then return σ²ₛ(X'W⁻¹X)⁻¹, where W = V+(σ²ₑ/σ²ₛ)D⁻¹ is estimated, and +σ²ₛ & σₑ are the estimates obtained with ML or REML, depending on the `reml` +option used to fit the model `m`. This follows the convention +of [`MixedModels.fit`](https://juliastats.org/MixedModels.jl/stable/) in Julia. +""" +function StatsBase.vcov(m::PhyloNetworkLinearModel) + # GLM.vcov(x::LinPredModel) = rmul!(invchol(x.pp), dispersion(x, true)) + # GLM.dispersion (sqrt=true): sqrt(sum of working residuals / dof_residual): forces "REML" + (isnothing(m.model_within) ? vcov(m.lm) : + rmul!(GLM.invchol(m.lm.pp), sigma2_phylo(m)) ) +end + +""" + stderror(m::PhyloNetworkLinearModel) + +Return the standard errors of the coefficient estimates. See [`vcov`](@ref) +for related information on how these are computed. +""" +StatsBase.stderror(m::PhyloNetworkLinearModel) = sqrt.(diag(vcov(m))) +# confidence intervals for coefficients: GLM uses normal quantiles +# Based on: https://github.com/JuliaStats/GLM.jl/blob/d1ccc9abcc9c7ca6f640c13ff535ee8383e8f808/src/lm.jl#L240-L243 + +""" + confint(m::PhyloNetworkLinearModel; level::Real=0.95) + +Return confidence intervals for coefficients, with confidence level `level`, +based on the t-distribution whose degree of freedom is determined by the +number of species (as returned by `dof_residual`) +""" +function StatsBase.confint(m::PhyloNetworkLinearModel; level::Real=0.95) + hcat(coef(m),coef(m)) + stderror(m) * + quantile(TDist(dof_residual(m)), (1. - level)/2.) * [1. -1.] +end +# Table of estimated coefficients, standard errors, t-values, p-values, CIs +# Based on: https://github.com/JuliaStats/GLM.jl/blob/d1ccc9abcc9c7ca6f640c13ff535ee8383e8f808/src/lm.jl#L193-L203 +""" + coeftable(m::PhyloNetworkLinearModel; level::Real=0.95) + +Return coefficient estimates, standard errors, t-values, p-values, and t-intervals +as a `StatsBase.CoefTable`. +""" +function StatsAPI.coeftable(m::PhyloNetworkLinearModel; level::Real=0.95) + n_coef = size(m.lm.pp.X, 2) # no. of predictors + if n_coef == 0 + return CoefTable([0], ["Fixed Value"], ["(Intercept)"]) + end + cc = coef(m) + se = stderror(m) + tt = cc ./ se + p = ccdf.(Ref(FDist(1, dof_residual(m))), abs2.(tt)) + ci = se*quantile(TDist(dof_residual(m)), (1-level)/2) + levstr = isinteger(level*100) ? string(Integer(level*100)) : string(level*100) + cn = StatsModels.vectorize(coefnames(m)) + CoefTable(hcat(cc,se,tt,p,cc+ci,cc-ci), + ["Coef.","Std. Error","t","Pr(>|t|)","Lower $levstr%","Upper $levstr%"], + cn, 4, 3) +end +#= changed quantities: those using residuals rescaled by cholesky of variance + between tips +=# +StatsAPI.residuals(m::PhyloNetworkLinearModel) = m.RL * residuals(m.lm) +# Tip data: m.Y is different from response(m.lm) +# and m.X is different from modelmatrix(m.lm) +StatsAPI.response(m::PhyloNetworkLinearModel) = m.Y +StatsAPI.modelmatrix(m::PhyloNetworkLinearModel) = m.X +# Predicted values at the tips +# (rescaled by cholesky of tips variances) +StatsAPI.predict(m::PhyloNetworkLinearModel) = m.RL * predict(m.lm) + +""" + loglikelihood(m::PhyloNetworkLinearModel) + +Log likelihood or log restricted likelihood (REML) depending on `m.reml`, +of the fitted model. + +For models with no within-species variation, the likelihood (or REML) is +calculated based on the joint density for species-level mean responses. + +For within-species variation models, the likelihood is calculated based on the joint +density for individual-level responses. This can be calculated from individual-level +data, but also by providing species-level means and standard deviations which is +accepted by [`phylolm`](@ref). + +**Warning**: many summaries are based on the species-level model, like +"dof_residual", "residuals", "predict" or "deviance". +So `deviance` is innapropriate to compare models with within-species variation. +Use `loglikelihood` to compare models based on data at the individual level. + +Reminder: do not compare ML or REML values across models fit on different data. +Do not compare REML values across models that do not have the same predictors +(fixed effects): use ML instead, for that purpose. +""" +function StatsAPI.loglikelihood(m::PhyloNetworkLinearModel) + linmod = m.lm + if isnothing(m.model_within) # not a msrerr model + n = (m.reml ? dof_residual(linmod) : nobs(linmod) ) + σ² = deviance(linmod)/n + ll = - n * (1. + log2π + log(σ²))/2 - m.logdetVy/2 + else # if msrerr model, return loglikelihood of individual-level data + modwsp = m.model_within + ntot = sum(1.0 ./ modwsp.wsp_ninv) # total number of individuals + nsp = nobs(linmod) # number of species + ncoef = length(coef(linmod)) + bdof = (m.reml ? nsp - ncoef : nsp ) + wdof = ntot - nsp + N = wdof + bdof # ntot or ntot - ncoef + σ² = modwsp.bsp_var[1] + σw² = modwsp.wsp_var[1] + ll = sum(log.(modwsp.wsp_ninv)) - + (N + N * log2π + bdof * log(σ²) + wdof * log(σw²) + m.logdetVy) + ll /= 2 + end + if m.reml + ll -= logdet(linmod.pp.chol)/2 # -1/2 log|X'Vm^{-1}X| + end + return ll +end +# remark: this is *not* just the null deviance of the cholesky regression +""" + StatsBase.nulldeviance(m::PhyloNetworkLinearModel) + +For appropriate phylogenetic linear models, the deviance of the null model +is the total sum of square with respect to the metric V, +the estimated phylogenetic covariance matrix. +""" +function StatsBase.nulldeviance(m::PhyloNetworkLinearModel) + isnothing(m.model_within) || + error("""null loglik / deviance not implemented for within-species variation (mixed model): + please fit the model with an intercept only instead.""") + ro = response(m.lm) + if hasintercept(m) + vo = ones(length(m.Y), 1) + vo = m.RL \ vo + bo = inv(vo'*vo)*vo'*ro + ro = ro - vo*bo + end + return sum(ro.^2) +end +# loglikelihood of null model (intercept-only): same remark as above +function StatsBase.nullloglikelihood(m::PhyloNetworkLinearModel) + nulldev = nulldeviance(m) # error & exit if within-species variation + m.reml && @warn "ML null loglik: do not compare with REML on model with predictors" + n = length(m.Y) + return -n/2 * (log(2*pi * nulldev/n) + 1) - 1/2 * m.logdetVy +end +# coefficient of determination (1 - SS_res/SS_null) +# copied from GLM.jl/src/lm.jl, line 139 +function StatsBase.r2(m::PhyloNetworkLinearModel) + isnothing(m.model_within) || + error("r2 and adjusted r2 not implemented for within-species variation (mixed model)") + 1 - deviance(m, Val(true))/nulldeviance(m) +end +# adjusted coefficient of determination +# in GLM.jl/src/lm.jl: p = dof-1 and dof(x::LinearModel) = length(coef(x))+1, +1 for the dispersion parameter +function StatsBase.adjr2(obj::PhyloNetworkLinearModel) + n = nobs(obj) + # dof() includes the dispersion parameter sigma2, and lambda if relevant + p = dof(obj)-1 # like in GLM + # one could argue to use this: p = length(coef(obj)), to ignore lambda or other parameters + 1 - (1 - r2(obj))*(n-1)/(n-p) +end + +# new quantities specific to *phylogenetic* linear models +""" + sigma2_phylo(m::PhyloNetworkLinearModel) + +Estimated between-species variance-rate for a fitted object. +""" +function sigma2_phylo(m::PhyloNetworkLinearModel) + linmod = m.lm + if isnothing(m.model_within) + n = (m.reml ? dof_residual(linmod) : nobs(linmod) ) + σ² = deviance(linmod)/n + else + σ² = m.model_within.bsp_var[1] + end + return σ² +end +""" + sigma2_within(m::PhyloNetworkLinearModel) + +Estimated within-species variance for a fitted object. +""" +sigma2_within(m::PhyloNetworkLinearModel) = (isnothing(m.model_within) ? nothing : m.model_within.wsp_var[1]) +# ML estimate for ancestral state of the BM +""" + mu_phylo(m::PhyloNetworkLinearModel) + +Estimated root value for a fitted object. +""" +function mu_phylo(m::PhyloNetworkLinearModel) + if m.formula === nothing + @warn """You fitted the data against a custom matrix, so I have no way + to know which column is your intercept (column of ones). + I am using the first coefficient for ancestral mean mu by convention, + but that might not be what you are looking for.""" + size(m.lm.pp.X,2) == 0 && return 0 + elseif m.formula.rhs.terms[1] != StatsModels.InterceptTerm{true}() + error("The fit was done without intercept, so I cannot estimate mu") + end + return coef(m)[1] +end + +""" + lambda(m::PhyloNetworkLinearModel) + lambda(m::ContinuousTraitEM) + +Value assigned to the lambda parameter, if appropriate. +""" +lambda(m::PhyloNetworkLinearModel) = lambda(m.evomodel) +lambda(m::Union{BM,PagelLambda,ScalingHybrid}) = m.lambda + +""" + lambda!(m::PhyloNetworkLinearModel, newlambda) + lambda!(m::ContinuousTraitEM, newlambda) + +Assign a new value to the lambda parameter. +""" +lambda!(m::PhyloNetworkLinearModel, lambda_new) = lambda!(m.evomodel, lambda_new) +lambda!(m::Union{BM,PagelLambda,ScalingHybrid}, lambda_new::Real) = (m.lambda = lambda_new) + +""" + lambda_estim(m::PhyloNetworkLinearModel) + +Estimated lambda parameter for a fitted object. +""" +lambda_estim(m::PhyloNetworkLinearModel) = lambda(m) + +# print & show results +function paramstable(m::PhyloNetworkLinearModel) + Sig = sigma2_phylo(m) + res = "phylogenetic variance rate: " * @sprintf("%.6g", Sig) + if any(typeof(m.evomodel) .== [PagelLambda, ScalingHybrid]) + Lamb = lambda_estim(m) + res = res*"\nLambda: " * @sprintf("%.6g", Lamb) + end + mw = m.model_within + if !isnothing(mw) + res = res*"\nwithin-species variance: " * @sprintf("%.6g", mw.wsp_var[1]) + end + return(res) +end +# see also Base.show in +# https://github.com/JuliaStats/StatsModels.jl/blob/master/src/statsmodel.jl +function Base.show(io::IO, obj::PhyloNetworkLinearModel) + ct = coeftable(obj) + println(io, "$(typeof(obj))") + if !(obj.formula === nothing) + print(io, "\nFormula: ") + println(io, string(obj.formula)) # formula + end + println(io) + println(io, "Model: $(evomodelname(obj.evomodel))") + println(io) + println(io,"Parameter Estimates, using ", (obj.reml ? "REML" : "ML"),":") + println(io, paramstable(obj)) + println(io) + println(io,"Coefficients:") + show(io, ct) + println(io) + println(io, "Log Likelihood: "*"$(round(loglikelihood(obj), digits=10))") + println(io, "AIC: "*"$(round(aic(obj), digits=10))") +end diff --git a/src/models_substitutions.jl b/src/models_substitutions.jl new file mode 100644 index 0000000..70066fc --- /dev/null +++ b/src/models_substitutions.jl @@ -0,0 +1,1283 @@ +""" + SubstitutionModel + +Abstract type for substitution models, +using a continous time Markov model on a phylogeny. +Adapted from [SubstitutionModels.jl](https://github.com/BioJulia/SubstitutionModels.jl/) +in BioJulia. + +For variable rates, see [`RateVariationAcrossSites`](@ref) + +For sub types, see [`NucleicAcidSubstitutionModel`](@ref), [`TraitSubstitutionModel`](@ref) + +All these models are supposed to have fields `rate` and `eigeninfo`. +""" +abstract type SubstitutionModel end #ideally, we'd like this to be SubstitutionModels.SubstitutionModel +const SM = SubstitutionModel +const Qmatrix = StaticArrays.SMatrix{4, 4, Float64} +const Pmatrix = StaticArrays.MMatrix{4, 4, Float64} +const Bmatrix = StaticArrays.MMatrix{2, 2, Float64} + +""" + TraitSubstitutionModel + +For subtypes, see [`BinaryTraitSubstitutionModel`](@ref), +[`EqualRatesSubstitutionModel`](@ref), +[`TwoBinaryTraitSubstitutionModel`](@ref) +""" +abstract type TraitSubstitutionModel{T} <: SubstitutionModel end #this accepts labels +const TSM = TraitSubstitutionModel{T} where T #T is type of labels + +""" + NucleicAcidSubstitutionModel + +Adapted from [SubstitutionModels.jl](https://github.com/BioJulia/SubstitutionModels.jl/) +in BioJulia. The same [`Q`](@ref) and [`P`](@ref) function names are used for the +transition rates and probabilities. + +For subtypes, see [`JC69`](@ref), [`HKY85`](@ref) +""" +abstract type NucleicAcidSubstitutionModel <: SubstitutionModel end +const NASM = NucleicAcidSubstitutionModel + +""" + nparams(model) + +Number of parameters for a given trait evolution model +(length of field `model.rate`). +""" +nparams(obj::SM) = error("nparams not defined for $(typeof(obj)).") + +""" + setrates!(model, rates) + +update rates then call [`seteigeninfo!`](@ref) to update a model's eigeninfo +""" +function setrates!(obj::SM, rates::AbstractVector) + obj.rate[:] = rates + seteigeninfo!(obj) +end + +""" + seteigeninfo!(obj) + +Calculate eigenvalue & eigenfector information for a substitution model (SM) object +(as needed to calculate transition rate matrices) and store this info within the object. +""" +function seteigeninfo!(obj::SM) + error("seteigeninfo! not finalized yet for generic substitution models") + # eig_vals, eig_vecs = eigen(Q(obj)) #this assumes that every SM has an eigeninfo and has + # obj.eigeninfo[:] = eig_vals, eig_vecs, inv(eig_vecs) + # then make P! use seteigeninfo! by for a generic SM +end + +""" + getlabels(model) + +State labels of a substitution model. +""" +function getlabels(obj::SM) + error("Model must be of type TraitSubstitutionModel or NucleicAcidSubstitutionModel. Got $(typeof(obj))") +end + +""" + nstates(model) + +Number of character states for a given evolution model. +""" +nstates(obj::SM) = error("nstates not defined for $(typeof(obj)).") + +""" +For example, this is 4 for a `NucleicAcidSubstitutionModel`. + +```jldoctest +julia> nstates(JC69([0.03], false)) +4 + +julia> nstates(HKY85([.5], [0.25, 0.25, 0.25, 0.25])) +4 +``` +""" +function nstates(::NASM) + return 4::Int +end + +function getlabels(obj::TSM) + return obj.label +end + +""" +for a given [`NucleicAcidSubstitutionModel`](@ref), labels are symbols +from [BioSymbols](https://github.com/BioJulia/BioSymbols.jl). +For now, only ACGTs are allowed. (When fitting data, any ambiguity code +in the data would be treated as missing value). + +# examples + +```jldoctest +julia> getlabels(JC69([0.03], false)) +4-element Vector{BioSymbols.DNA}: + DNA_A + DNA_C + DNA_G + DNA_T + +julia> getlabels(HKY85([.5], repeat([0.25], 4))) +4-element Vector{BioSymbols.DNA}: + DNA_A + DNA_C + DNA_G + DNA_T + +``` +""" +function getlabels(::NASM) + return [BioSymbols.DNA_A, BioSymbols.DNA_C, BioSymbols.DNA_G, BioSymbols.DNA_T] +end + +""" + Q(model) + +Substitution rate matrix for a given substitution model: +Q[i,j] is the rate of transitioning from state i to state j. +""" +Q(obj::SM) = error("rate matrix Q not defined for $(typeof(obj)).") + +""" + showQ(IO, model) + +Print the Q matrix to the screen, with trait states as labels on rows and columns. +adapted from prettyprint function by mcreel, found 2017/10 at +https://discourse.julialang.org/t/display-of-arrays-with-row-and-column-names/1961/6 +""" +function showQ(io::IO, obj::SM) + M = Q(obj) + pad = max(8,maximum(length(getlabels(obj))+1)) + for i = 1:size(M,2) # print the header + print(io, lpad(getlabels(obj)[i],(i==1 ? 2*pad : pad), " ")) + end + for i = 1:size(M,1) # print one row per state + print(io, "\n") + if getlabels(obj) != "" + print(io, lpad(getlabels(obj)[i],pad," ")) + end + for j = 1:size(M,2) + if j == i + print(io, lpad("*",pad," ")) + else + fmt = "%$(pad).4f" + @eval(@printf($io,$fmt,$(M[i,j]))) + end + end + end +end + +""" + P(obj, t) + +Probability transition matrix for a [`SubstitutionModel`](@ref), of the form + + P[1,1] ... P[1,k] + . . + . . + P[k,1] ... P[k,k] + +where P[i,j] is the probability of ending in state j after time t, +given that the process started in state i. +see also: [`P!`](@ref). + +HKY example: +```jldoctest +julia> m1 = HKY85([0.5], [0.20, 0.30, 0.30, 0.20]) +HKY85 Substitution Model base frequencies: [0.2, 0.3, 0.3, 0.2] +relative rate version with transition/tranversion ratio kappa = 0.5, + scaled so that there is one substitution per unit time +rate matrix Q: + A C G T + A * 0.4839 0.2419 0.3226 + C 0.3226 * 0.4839 0.1613 + G 0.1613 0.4839 * 0.3226 + T 0.3226 0.2419 0.4839 * + +julia> PhyloTraits.P(m1, 0.2) +4×4 StaticArraysCore.MMatrix{4, 4, Float64, 16} with indices SOneTo(4)×SOneTo(4): + 0.81592 0.0827167 0.0462192 0.0551445 + 0.0551445 0.831326 0.0827167 0.0308128 + 0.0308128 0.0827167 0.831326 0.0551445 + 0.0551445 0.0462192 0.0827167 0.81592 +``` + +Juke-Cantor example: +```jldoctest +julia> m1 = JC69([1.]); + +julia> PhyloTraits.P(m1, 0.2) +4×4 StaticArraysCore.MMatrix{4, 4, Float64, 16} with indices SOneTo(4)×SOneTo(4): + 0.824446 0.0585179 0.0585179 0.0585179 + 0.0585179 0.824446 0.0585179 0.0585179 + 0.0585179 0.0585179 0.824446 0.0585179 + 0.0585179 0.0585179 0.0585179 0.824446 +``` +""" +@inline function P(obj::SM, t::Float64) + t >= 0.0 || error("substitution model: >=0 branch lengths are needed") + k = nstates(obj) + Pmat = MMatrix{k,k,Float64}(undef) + return P!(Pmat, obj, t) +end + +""" + P!(Pmat::AbstractMatrix, obj::SM, t::Float64) + +Fill in the input matrix `Pmat` with the transition rates +to go from each state to another in time `t`, according to rates in `Q`. +see also: [`P`](@ref). + +```jldoctest +julia> m1 = BinaryTraitSubstitutionModel([1.0,2.0], ["low","high"]) +Binary Trait Substitution Model: +rate low→high α=1.0 +rate high→low β=2.0 + +julia> PhyloTraits.P!(Matrix{Float64}(undef,2,2), m1, 0.3) # fills an uninitialized 2x2 matrix of floats +2×2 Matrix{Float64}: + 0.80219 0.19781 + 0.39562 0.60438 + +julia> m2 = JC69([1.]); + +julia> PhyloTraits.P!(Matrix{Float64}(undef,4,4), m2, 0.2) +4×4 Matrix{Float64}: + 0.824446 0.0585179 0.0585179 0.0585179 + 0.0585179 0.824446 0.0585179 0.0585179 + 0.0585179 0.0585179 0.824446 0.0585179 + 0.0585179 0.0585179 0.0585179 0.824446 +``` +""" +@inline function P!(Pmat::AbstractMatrix, obj::SM, t::Float64) + Pmat[:] = exp(Q(obj) * t) + return Pmat +end + +""" + BinaryTraitSubstitutionModel(α, β [, label]) + +Model for binary traits, that is, with 2 states. Default labels are "0" and "1". +α is the rate of transition from "0" to "1", and β from "1" to "0". +""" +struct BinaryTraitSubstitutionModel{T} <: TraitSubstitutionModel{T} # fixit: back to mutable struct? + rate::Vector{Float64} + label::Vector{T} # most often: T = String, but could be BioSymbols.DNA + eigeninfo::Vector{Float64} + function BinaryTraitSubstitutionModel{T}(rate::Vector{Float64}, label::Vector{T}, eigeninfo::Vector{Float64}) where T + #Warning: this constructor should not be used directly. Use it with the constructors below. + @assert length(rate) == 2 "binary state: need 2 rates" + rate[1] >= 0. || error("parameter α must be non-negative") + rate[2] >= 0. || error("parameter β must be non-negative") + @assert length(label) == 2 "need 2 labels exactly" + new(rate, label, eigeninfo) + end +end +const BTSM = BinaryTraitSubstitutionModel{T} where T +function BinaryTraitSubstitutionModel(r::AbstractVector, label::AbstractVector) + obj = BinaryTraitSubstitutionModel{eltype(label)}(r::AbstractVector, label::AbstractVector, zeros(3)) # Vector{Float64}(undef,3) for julia v1.0 + seteigeninfo!(obj) + return obj +end +BinaryTraitSubstitutionModel(α::Float64, β::Float64, label::AbstractVector) = BinaryTraitSubstitutionModel([α,β], label) +BinaryTraitSubstitutionModel(α::Float64, β::Float64) = BinaryTraitSubstitutionModel(α, β, ["0", "1"]) + +""" +for a [`BinaryTraitSubstitutionModel`]: store eigenvalue (q_01+q_10) and stationary distribution +""" +function seteigeninfo!(obj::BTSM) + ab = obj.rate[1] + obj.rate[2] #eigenvalue = -(a+b) + ab > 0. || error("α+β must be positive") + p0 = obj.rate[2]/ab # asymptotic frequency of state "0" + p1 = obj.rate[1]/ab # asymptotic frequency of state "1" + obj.eigeninfo[1] = ab + obj.eigeninfo[2] = p0 + obj.eigeninfo[3] = p1 +end + +""" +for a `BinaryTraitSubstitutionModel`, this is 2: + +```jldoctest +julia> m1 = BinaryTraitSubstitutionModel([1.0,2.0], ["low","high"]) +Binary Trait Substitution Model: +rate low→high α=1.0 +rate high→low β=2.0 + +julia> nstates(m1) +2 +``` +""" +function nstates(::BTSM) + return 2::Int +end + +nparams(::BTSM) = 2::Int + +""" +For a BinaryTraitSubstitutionModel, the rate matrix Q is of the form: + + -α α + β -β +""" +@inline function Q(obj::BTSM) + return Bmatrix(-obj.rate[1], obj.rate[2], obj.rate[1], -obj.rate[2]) +end + +function Base.show(io::IO, obj::BTSM) + str = "Binary Trait Substitution Model:\n" + str *= "rate $(obj.label[1])→$(obj.label[2]) α=$(round(obj.rate[1], digits=5))\n" + str *= "rate $(obj.label[2])→$(obj.label[1]) β=$(round(obj.rate[2], digits=5))" + print(io, str) +end + +function P!(Pmat::AbstractMatrix, obj::BTSM, t::Float64) + e1 = exp(-obj.eigeninfo[1]*t) + a0= obj.eigeninfo[2]*e1 + a1= obj.eigeninfo[3]*e1 + Pmat[1,1] = obj.eigeninfo[2]+a1 + Pmat[2,1] = obj.eigeninfo[2]-a0 + Pmat[1,2] = obj.eigeninfo[3]-a1 + Pmat[2,2] = obj.eigeninfo[3]+a0 + return Pmat +end + +""" + TwoBinaryTraitSubstitutionModel(rate [, label]) + +[`TraitSubstitutionModel`](@ref) for two binary traits, possibly correlated. +Default labels are "x0", "x1" for trait 1, and "y0", "y1" for trait 2. +If provided, `label` should be a vector of size 4, listing labels for +trait 1 first then labels for trait 2. +`rate` should be a vector of substitution rates of size 8. +rate[1],...,rate[4] describe rates of changes in trait 1. +rate[5],...,rate[8] describe rates of changes in trait 2. +In the transition matrix, trait combinations are listed in the following order: +x0-y0, x0-y1, x1-y0, x1-y1. + +# example + +```julia +model = TwoBinaryTraitSubstitutionModel([2.0,1.2,1.1,2.2,1.0,3.1,2.0,1.1], + ["carnivory", "noncarnivory", "wet", "dry"]); +model +using PhyloPlots +plot(model) # to visualize states and rates. not supported with PhyloPlots v2.0.0. requires PhyloPlots v1.0.0 +``` +""" +struct TwoBinaryTraitSubstitutionModel <: TraitSubstitutionModel{String} + rate::Vector{Float64} + label::Vector{String} + function TwoBinaryTraitSubstitutionModel(α, label) + all( x -> x >= 0., α) || error("rates must be non-negative") + @assert length(α)==8 "need 8 rates" + @assert length(label)==4 "need 4 labels for all combinations of 2 binary traits" + new(α, [string(label[1], "-", label[3]), # warning: original type of 'label' lost here + string(label[1], "-", label[4]), + string(label[2], "-", label[3]), + string(label[2], "-", label[4])]) + end +end +const TBTSM = TwoBinaryTraitSubstitutionModel +TwoBinaryTraitSubstitutionModel(α::Vector{Float64}) = TwoBinaryTraitSubstitutionModel(α, ["x0", "x1", "y0", "y1"]) + +nstates(::TBTSM) = 4::Int +nparams(::TBTSM) = 8::Int + +function Q(obj::TBTSM) + M = fill(0.0,(4,4)) + a = obj.rate + M[1,3] = a[1] + M[3,1] = a[2] + M[2,4] = a[3] + M[4,2] = a[4] + M[1,2] = a[5] + M[2,1] = a[6] + M[3,4] = a[7] + M[4,3] = a[8] + M[1,1] = -M[1,2] - M[1,3] + M[2,2] = -M[2,1] - M[2,4] + M[3,3] = -M[3,4] - M[3,1] + M[4,4] = -M[4,3] - M[4,2] + return M +end + +function Base.show(io::IO, obj::TBTSM) + print(io, "Substitution model for 2 binary traits, with rate matrix:\n") + showQ(io, obj) +end + +""" + EqualRatesSubstitutionModel(numberStates, α, labels) + +[`TraitSubstitutionModel`](@ref) for traits with any number of states +and equal substitution rates α between all states. +Default labels are "1","2",... + +# example + +```jldoctest +julia> m1 = EqualRatesSubstitutionModel(2, [1.0], ["low","high"]) +Equal Rates Substitution Model with k=2, +all rates equal to α=1.0. +rate matrix Q: + low high + low * 1.0000 + high 1.0000 * +``` +""" +struct EqualRatesSubstitutionModel{T} <: TraitSubstitutionModel{T} + k::Int + rate::Vector{Float64} + label::Vector{T} + eigeninfo::Vector{Float64} + function EqualRatesSubstitutionModel{T}(k::Int, rate::Vector{Float64}, + label::Vector{T}, eigeninfo::Vector{Float64}) where T + @assert length(label)==k "incorrect number of labels: k=$k, labels: $label" + @assert k >= 2 "need k >= 2 category labels. labels: $label" + @assert length(rate)==1 "rate must be a vector of length 1" + rate[1] > 0 || error("parameter α (rate) must be positive") + new(k, rate, label, eigeninfo) + end +end +const ERSM = EqualRatesSubstitutionModel{T} where T +function EqualRatesSubstitutionModel(k::Int, rate::Vector{Float64}, label::AbstractVector) + obj = EqualRatesSubstitutionModel{eltype(label)}(k::Int, rate::Vector{Float64}, label::AbstractVector, zeros(1)) # Vector{Float64}(undef,3) for julia v1.0 + seteigeninfo!(obj) + return obj +end +EqualRatesSubstitutionModel(k::Int, α::Float64, label::AbstractVector) = EqualRatesSubstitutionModel(k,[α],label) +EqualRatesSubstitutionModel(k::Int, α::Float64) = EqualRatesSubstitutionModel(k, [α], string.(1:k)) + + +""" +for a [`EqualRatesSubstitutionModel`]: store lambda = k/(k-1), where k is the number of states +""" +function seteigeninfo!(obj::ERSM) + q = (obj.k/(obj.k-1.0)) + obj.eigeninfo[1] = q +end + +function nstates(obj::ERSM) + return obj.k +end +nparams(::ERSM) = 1::Int + +function Base.show(io::IO, obj::ERSM) + str = "Equal Rates Substitution Model with k=$(obj.k),\n" + str *= "all rates equal to α=$(round(obj.rate[1], digits=5)).\n" + str *= "rate matrix Q:\n" + print(io, str) + showQ(io, obj) +end +function Q(obj::ERSM) + #this might be wrong, doesnt match ERSM proof + α = obj.rate[1] + M = fill(α, (obj.k,obj.k)) + d = -(obj.k-1) * α + for i in 1:obj.k + M[i,i] = d + end + return M +end + +""" + JC69(rate, relative) + +Jukes Cantor (1969) nucleic acid substitution model, which has a single rate parameter. +`rate` corresponds to the absolute diagonal elements, that is, the rate of change +(to any of the other 2 states). Individual rates are `rate`/3. +If `relative` is true (default), the transition matrix [`Q`](@ref) is normalized +to an average of 1 transition per unit of time: in which case `rate` is set to 1.0. + +# examples + +```jldoctest +julia> m1 = JC69([0.25], false) +Jukes and Cantor 69 Substitution Model, +absolute rate version +off-diagonal rates equal to 0.25/3. +rate matrix Q: + A C G T + A * 0.0833 0.0833 0.0833 + C 0.0833 * 0.0833 0.0833 + G 0.0833 0.0833 * 0.0833 + T 0.0833 0.0833 0.0833 * + +julia> nstates(m1) +4 + +julia> nparams(m1) +1 + +julia> m2 = JC69([0.5]) +Jukes and Cantor 69 Substitution Model, +relative rate version +off-diagonal rates equal to 1/3 +rate matrix Q: + A C G T + A * 0.3333 0.3333 0.3333 + C 0.3333 * 0.3333 0.3333 + G 0.3333 0.3333 * 0.3333 + T 0.3333 0.3333 0.3333 * + +julia> nparams(m2) +0 +``` +""" +struct JC69 <: NucleicAcidSubstitutionModel + rate::Vector{Float64} + relative::Bool + eigeninfo::Vector{Float64} #TODO change to MVector, see if its faster + function JC69(rate::Vector{Float64}, relative::Bool, eigeninfo::Vector{Float64}) + #Warning: this constructor should not be used directly. Use the constructor below + # which will call this. + 0 <= length(rate) <= 1 || error("rate not a valid length for a JC69 model") + all(rate .> 0.0) || error("All elements of rate must be positive for a JC69 model") + new(rate, relative, eigeninfo) + end +end +function JC69(rate::AbstractVector, relative::Bool=true) + obj = JC69(rate, relative, zeros(1)) + seteigeninfo!(obj) + return obj +end +JC69(rate::Float64, relative::Bool=true) = JC69([rate], relative) + + +""" +for [`JC69`](@ref): store lambda = 4/3 (if relative) or rate * 4/3 (absolute). +""" +function seteigeninfo!(obj::JC69) + if obj.relative + lambda = (4.0/3.0) #eigen value of the Q matrix + else + lambda = (4.0/3.0)*obj.rate[1] #eigen value of the Q matrix + end + obj.eigeninfo[1] = lambda +end + +function Base.show(io::IO, obj::JC69) + str = "Jukes and Cantor 69 Substitution Model,\n" + if obj.relative == true + str *= "relative rate version\n" + str *= "off-diagonal rates equal to 1/3\n" + else + str *= "absolute rate version\n" + str *= "off-diagonal rates equal to $(round(obj.rate[1], digits=5))/3.\n" + end + str *= "rate matrix Q:\n" + print(io, str) + showQ(io, obj) +end + +""" + HKY85(rate, pi, relative) + +A nucleic acid substitution model based on Hasegawa et al. 1985 substitution model. +`rate` should be a vector of 1 or 2 rates, and `pi` a vector of 4 probabilities summing to 1. + +If `relative` is false, the 2 rates represent the transition rate and the transversion rate, +α and β. If `relative` is true (default), only the first rate is used and represents the +transition/transversion ratio: κ=α/β. The rate transition matrix Q is normalized to have +1 change / unit of time on average, i.e. the absolute version of Q is divided by +`2(piT*piC + piA*piG)α + 2(piY*piR)β`. + +`nparams` returns 1 or 2. +In other words: the stationary distribution is not counted in the number of parameters +(and `fitdiscrete` does not optimize the pi values at the moment). + +# examples + +```jldoctest +julia> m1 = HKY85([.5], [0.20, 0.30, 0.30, 0.20]) +HKY85 Substitution Model base frequencies: [0.2, 0.3, 0.3, 0.2] +relative rate version with transition/tranversion ratio kappa = 0.5, + scaled so that there is one substitution per unit time +rate matrix Q: + A C G T + A * 0.4839 0.2419 0.3226 + C 0.3226 * 0.4839 0.1613 + G 0.1613 0.4839 * 0.3226 + T 0.3226 0.2419 0.4839 * + +julia> nstates(m1) +4 + +julia> m2 = HKY85([0.5, 0.5], [0.20, 0.30, 0.30, 0.20], false) +HKY85 Substitution Model base frequencies: [0.2, 0.3, 0.3, 0.2] +absolute rate version with transition/transversion ratio kappa = a/b = 1.0 + with rates a = 0.5 and b = 0.5 +rate matrix Q: + A C G T + A * 0.1500 0.1500 0.1000 + C 0.1000 * 0.1500 0.1000 + G 0.1000 0.1500 * 0.1000 + T 0.1000 0.1500 0.1500 * + +``` +""" +struct HKY85 <: NucleicAcidSubstitutionModel + rate::Vector{Float64} + pi::Vector{Float64} + relative::Bool + eigeninfo::Vector{Float64} + function HKY85(rate::Vector{Float64}, pi::Vector{Float64}, relative::Bool, eigeninfo::Vector{Float64}) + #Warning: this constructor should not be used directly. Use the constructor below, + # which will call this. + all(rate .> 0.) || error("All elements of rate must be positive") + 1 <= length(rate) <= 2 || error("rate has invalid length for HKY85 model") + if relative length(rate) == 1 || error("the relative version of HKY85 takes a single rate") + else length(rate) == 2 || error("the absolute version of HKY85 takes 2 rates") + end + length(pi) == 4 || error("pi must be of length 4") + all(0. .< pi.< 1.) || error("All base proportions must be between 0 and 1") + isapprox(sum(pi), 1.; atol = 1e-12) || error("Base proportions must sum to 1.") + new(rate, pi, relative, eigeninfo) + end +end +function HKY85(rate::AbstractVector, pi::Vector{Float64}, relative::Bool=true) + obj = HKY85(rate, pi, relative, zeros(5)) + seteigeninfo!(obj) + return obj +end +HKY85(rate::Float64, pi::Vector{Float64}) = HKY85([rate], pi, true) + +""" +for [`HKY85`](@ref): store piR, piY, the 2 non-zero eigenvalues and a scaling factor +""" +function seteigeninfo!(obj::HKY85) + piA = obj.pi[1]; piC = obj.pi[2]; piG = obj.pi[3]; piT = obj.pi[4] + piR = piA + piG + piY = piT + piC + obj.eigeninfo[4] = piR + obj.eigeninfo[5] = piY + + a = obj.rate[1] # relative: a = kappa. absolute: a = kappa*b + if obj.relative + # b=1/lambda: scaling factor to have branch lengths in substitutions/site + b = 1.0 / (2*a*(piT*piC + piA*piG) + 2*(piY*piR)) + obj.eigeninfo[2] = - (piR * a + piY) * b # lambda_R + obj.eigeninfo[3] = - (piY * a + piR) * b # lambda_Y + else + b = obj.rate[2] + obj.eigeninfo[2] = -((piR * a) + (piY * b)) + obj.eigeninfo[3] = -((piY * a) + (piR * b)) + end + obj.eigeninfo[1] = -b +end + +function Base.show(io::IO, obj::HKY85) + str = "HKY85 Substitution Model base frequencies: $(obj.pi)\n" + if obj.relative + str *= "relative rate version with transition/tranversion ratio kappa = $(round(obj.rate[1], digits=5))," + str *= "\n scaled so that there is one substitution per unit time\n" + else + str *= "absolute rate version with transition/transversion ratio kappa = a/b = " + str *= "$(round(obj.rate[1]/obj.rate[2], digits=5))" + str *= "\n with rates a = $(round(obj.rate[1], digits=5)) and b = $(round(obj.rate[2], digits=5))\n" + end + str *= "rate matrix Q:\n" + print(io, str) + showQ(io, obj) +end + +""" +for `JC69` model: 0 if relative, 1 if absolute +""" +function nparams(obj::JC69) + return (obj.relative ? 0 : 1) +end + +""" +for `HKY85` model: 1 if relative, 2 if absolute +""" +function nparams(obj::HKY85) + return (obj.relative ? 1 : 2) +end + +@inline function Q(obj::JC69) + if obj.relative + Q0 = 1.0/3.0 + #we multiply by 1/3 to make branch lengths interpretable as avg(#substitutions) (pi-weighted avg of diagonal is -1) + else + Q0 = (1.0/3.0)*obj.rate[1] + end + + return Qmatrix(-3*Q0, Q0, Q0, Q0, + Q0, -3*Q0, Q0, Q0, + Q0, Q0, -3*Q0, Q0, + Q0, Q0, Q0, -3*Q0) +end + +@inline function Q(obj::HKY85) + piA = obj.pi[1]; piC = obj.pi[2]; piG = obj.pi[3]; piT = obj.pi[4] + piR = piA + piG + piY = piT + piC + if obj.relative + k = obj.rate[1] + lambda = (2*k*(piT*piC + piA*piG) + 2*(piY*piR)) # for sub/time interpretation. see HKY docstring + Q₁ = piA/lambda + Q₂ = k * Q₁ + Q₃ = piC/lambda + Q₄ = k * Q₃ + Q₆ = piG/lambda + Q₅ = k * Q₆ + Q₇ = piT/lambda + Q₈ = k * Q₇ + Q₉ = -(Q₃ + Q₅ + Q₇) + Q₁₀ = -(Q₁ + Q₆ + Q₈) + Q₁₁ = -(Q₂ + Q₃ + Q₇) + Q₁₂ = -(Q₁ + Q₄ + Q₆) + else #GT, AT, CG, and AC are less likely (transversions) + a = obj.rate[1]; b = obj.rate[2] + Q₁ = b * piA + Q₂ = a * piA + Q₃ = b * piC + Q₄ = a * piC + Q₅ = a * piG + Q₆ = b * piG + Q₇ = b * piT + Q₈ = a * piT + Q₉ = -(Q₃ + Q₅ + Q₇) #AA + Q₁₀ = -(Q₁ + Q₆ + Q₈) #CC + Q₁₁ = -(Q₂ + Q₃ + Q₇) #GG + Q₁₂ = -(Q₁ + Q₄ + Q₆) #TT + end + return Qmatrix(Q₉, Q₁, Q₂, Q₁, #ACGT + Q₃, Q₁₀, Q₃, Q₄, + Q₅, Q₆, Q₁₁, Q₆, + Q₇, Q₈, Q₇, Q₁₂) +end + +function P!(Pmat::AbstractMatrix, obj::JC69, t::Float64) + P0 = 0.25 + 0.75 * exp(-t * obj.eigeninfo[1]) #lambda + P1 = 0.25 - 0.25 * exp(-t * obj.eigeninfo[1]) + # P1 off-diagonal and P0 on diagonal + Pmat[1,1] = P0; Pmat[2,1] = P1; Pmat[3,1] = P1; Pmat[4,1] = P1 + Pmat[1,2] = P1; Pmat[2,2] = P0; Pmat[3,2] = P1; Pmat[4,2] = P1 + Pmat[1,3] = P1; Pmat[2,3] = P1; Pmat[3,3] = P0; Pmat[4,3] = P1 + Pmat[1,4] = P1; Pmat[2,4] = P1; Pmat[3,4] = P1; Pmat[4,4] = P0 + return Pmat +end + +function P!(Pmat::AbstractMatrix, obj::HKY85, t::Float64) + #returns ACGT + piA = obj.pi[1]; piC = obj.pi[2]; piG = obj.pi[3]; piT = obj.pi[4] + piR = obj.eigeninfo[4] + piY = obj.eigeninfo[5] + # expm1(x) = e^x-1 accurately. important when t is small + ebm1 = expm1(obj.eigeninfo[1] * t) # -b eigevalue + eRm1 = expm1(obj.eigeninfo[2] * t) # lambda_R + eYm1 = expm1(obj.eigeninfo[3] * t) # lambda_Y + # transversions + P_TA_CA = - piA * ebm1 # C or T -> A: P{A|T} = P{A|C} + P_AC_GC = - piC * ebm1 # P{C|A} = P{C|G} + P_TG_CG = - piG * ebm1 # P{G|T} = P{G|C} + P_AT_GT = - piT * ebm1 # P{T|A} = P{T|G} + # transitions: A<->G (R) or C<->T (Y) + tmp = (ebm1 * piY - eRm1) / piR + P_GA = piA * tmp # P{A|G} + P_AG = piG * tmp # P{G|A} + tmp = (ebm1 * piR - eYm1) / piY + P_TC = piC * tmp # P{C|T} + P_CT = piT * tmp # P{T|C} + # no change + transv = P_AC_GC + P_AT_GT # transversion to Y: - piY * ebm1 + P_AA = 1.0 - P_AG - transv + P_GG = 1.0 - P_GA - transv + transv = P_TA_CA + P_TG_CG # transversion to R + P_CC = 1.0 - P_CT - transv + P_TT = 1.0 - P_TC - transv + # fill in the P matrix + Pmat[1,1] = P_AA + Pmat[2,2] = P_CC + Pmat[3,3] = P_GG + Pmat[4,4] = P_TT + # to A: j=1 + Pmat[2,1] = P_TA_CA + Pmat[3,1] = P_GA + Pmat[4,1] = P_TA_CA + # to C: j=2 + Pmat[1,2] = P_AC_GC + Pmat[3,2] = P_AC_GC + Pmat[4,2] = P_TC + # to G: j=3 + Pmat[1,3] = P_AG + Pmat[2,3] = P_TG_CG + Pmat[4,3] = P_TG_CG + # to T: j=4 + Pmat[1,4] = P_AT_GT + Pmat[2,4] = P_CT + Pmat[3,4] = P_AT_GT + return Pmat +end + +abstract type RateVariationAcrossSites end + +""" + RateVariationAcrossSites(; pinv=0.0, alpha=Inf, ncat=4) + +Model for variable substitution rates across sites (or across traits) using +the discrete Gamma model (+G, Yang 1994, Journal of Molecular Evolution) or +the invariable-sites model (+I, Hasegawa, Kishino & Yano 1985 J Mol Evol). +Both types of rate variation can be combined (+G+I, Gu, Fu & Li 1995, Mol Biol Evol) +but this is discouraged (Jia, Lo & Ho 2014 PLOS One). +Using rate variation increases the number of parameters by one (+G or +I) +or by two (+G+I). + +Because the mean of the desired distribution or rates is 1, we use a Gamma +distribution with shape α and scale θ=1/α (rate β=α) if no invariable sites, +or scale θ=1/(α(1-pinv)), that is rate β=α(1-pinv) with a proportion pinv +of invariable sites. +The shape parameter is referred to as alpha here. +The Gamma distribution is discretized into `ncat` categories. +In each category, the category's rate multiplier is a normalized quantile of the gamma distribution. + +```jldoctest +julia> rv = RateVariationAcrossSites() +Rate variation across sites: discretized Gamma +categories for Gamma discretization: 1 +rates: [1.0] + +julia> nparams(rv) +0 + +julia> typeof(rv) +PhyloTraits.RVASGamma{1} + +julia> rv = RateVariationAcrossSites(alpha=1.0, ncat=4) +Rate variation across sites: discretized Gamma +alpha: 1.0 +categories for Gamma discretization: 4 +rates: [0.146, 0.513, 1.071, 2.27] + +julia> typeof(rv) +PhyloTraits.RVASGamma{4} + +julia> PhyloTraits.setalpha!(rv, 2.0) +Rate variation across sites: discretized Gamma +alpha: 2.0 +categories for Gamma discretization: 4 +rates: [0.319, 0.683, 1.109, 1.889] + +julia> nparams(rv) +1 + +julia> rv = RateVariationAcrossSites(pinv=0.3) +Rate variation across sites: +I (invariable sites) +pinv: 0.3 +rates: [0.0, 1.429] + +julia> nparams(rv) +1 + +julia> typeof(rv) +PhyloTraits.RVASInv + +julia> PhyloTraits.setpinv!(rv, 0.05) +Rate variation across sites: +I (invariable sites) +pinv: 0.05 +rates: [0.0, 1.053] + +julia> rv = RateVariationAcrossSites(pinv=0.3, alpha=2.0, ncat=4) +Rate variation across sites: discretized Gamma+I +pinv: 0.3 +alpha: 2.0 +categories for Gamma discretization: 4 +rates: [0.0, 0.456, 0.976, 1.584, 2.698] +probabilities: [0.3, 0.175, 0.175, 0.175, 0.175] + +julia> nparams(rv) +2 + +julia> typeof(rv) +PhyloTraits.RVASGammaInv{5} + +julia> PhyloTraits.setalpha!(rv, 3.0) +Rate variation across sites: discretized Gamma+I +pinv: 0.3 +alpha: 3.0 +categories for Gamma discretization: 4 +rates: [0.0, 0.6, 1.077, 1.584, 2.454] +probabilities: [0.3, 0.175, 0.175, 0.175, 0.175] + +julia> PhyloTraits.setpinv!(rv, 0.05) +Rate variation across sites: discretized Gamma+I +pinv: 0.05 +alpha: 3.0 +categories for Gamma discretization: 4 +rates: [0.0, 0.442, 0.793, 1.167, 1.808] +probabilities: [0.05, 0.238, 0.238, 0.238, 0.238] + +julia> PhyloTraits.setpinvalpha!(rv, 0.1, 5.0) +Rate variation across sites: discretized Gamma+I +pinv: 0.1 +alpha: 5.0 +categories for Gamma discretization: 4 +rates: [0.0, 0.593, 0.91, 1.221, 1.721] +probabilities: [0.1, 0.225, 0.225, 0.225, 0.225] +``` +""" +function RateVariationAcrossSites(; + pinv::Float64=0.0, + alpha::Float64=Inf64, + ncat::Int=1 +) + ncat>1 && alpha == Inf && error("please specify ncat=1 or alpha0 here + if ncat == 1 + return RVASInv(pinv) + end + # pinv>0, ncat>1 and α is finite here + return RVASGammaInv(pinv, alpha, ncat) +end +""" + RateVariationAcrossSites(rvsymbol::Symbol, ncategories::Int=4) + +Default model for rate variation across site, specified by a symbol: +- `:noRV` for no rate variation +- `:G` or `:Gamma` for gamma-distributed rates +- `:I` or `:Inv` for two categories: invariable and variable +- `:GI` or `:GI` for both. +""" +function RateVariationAcrossSites(rvsymbol::Symbol, ncategories::Int=4) + if rvsymbol == :noRV + rvas = RateVariationAcrossSites() + elseif rvsymbol == :Gamma || rvsymbol == :G + rvas = RateVariationAcrossSites(alpha=1.0, ncat=ncategories) + elseif rvsymbol == :GammaInv || rvsymbol == :GI + rvas = RateVariationAcrossSites(pinv=0.05, alpha=1.0, ncat=ncategories) + elseif rvsymbol == :Inv || rvsymbol == :I + rvas = RateVariationAcrossSites(pinv=0.05) + else + error("model $rvsymbol unknown or not implemented yet:\nrate variation model needs to be :Gamma or :Inv or :GammaInv") + end +end + +struct RVASGamma{S} <: RateVariationAcrossSites + # S = ncat, and size of vectors + alpha::StaticArrays.MVector{1,Float64} # mutable + ncat::Int + ratemultiplier::StaticArrays.MVector{S,Float64} + lograteweight::StaticArrays.SVector{S,Float64} # will be uniform: log(1/ncat) +end +function RVASGamma(alpha::Float64=1.0, ncat::Int=4) + @assert ncat > 0 "ncat must be 1 or greater" + uniflw = -log(ncat) # = log(1/ncat) + obj = RVASGamma{ncat}( + StaticArrays.MVector{1,Float64}(alpha), ncat, + StaticArrays.MVector{ncat,Float64}(undef), # rates + StaticArrays.SVector{ncat,Float64}([uniflw for i in 1:ncat])) + if ncat == 1 + obj.ratemultiplier[1] = 1.0 + else + setalpha!(obj, alpha) # checks for alpha >= 0 + end + return obj +end + +struct RVASInv <: RateVariationAcrossSites + pinv::StaticArrays.MVector{1,Float64} # mutable + ratemultiplier::StaticArrays.MVector{2,Float64} + lograteweight::StaticArrays.MVector{2,Float64} +end +function RVASInv(pinv::Float64=0.05) + r = StaticArrays.MVector{2,Float64}(undef) # rates + r[1] = 0.0 # invariable category + obj = RVASInv(StaticArrays.MVector{1,Float64}(pinv), + r, + StaticArrays.MVector{2,Float64}(undef)) # log weights + setpinv!(obj, pinv) # checks for 0 <= pinv < 1 + return obj +end + +struct RVASGammaInv{S} <: RateVariationAcrossSites + # S = ncat+1, and size of vectors + pinv::StaticArrays.MVector{1,Float64} # mutable + alpha::StaticArrays.MVector{1,Float64} # mutable + ncat::Int + ratemultiplier::StaticArrays.MVector{S,Float64} + lograteweight::StaticArrays.MVector{S,Float64} +end +function RVASGammaInv(pinv::Float64, alpha::Float64, ncat::Int) + @assert ncat > 1 "ncat must be 2 or more for the Gamma+I model" + s = 1+ncat + r = StaticArrays.MVector{s,Float64}(undef) # rates + r[1] = 0.0 # invariable category + obj = RVASGammaInv{s}( + StaticArrays.MVector{1,Float64}(pinv), + StaticArrays.MVector{1,Float64}(alpha), ncat, + r, + StaticArrays.MVector{s,Float64}(undef)) # log weights + setpinvalpha!(obj, pinv, alpha) # checks for α >= 0 and 0 <= pinv < 1 + return obj +end + +""" + setalpha!(obj, alpha) + +Set the shape parameter `alpha` in a RateVariationAcrossSites model `obj`, +and update the rate multipliers accordingly. +Return the modified object. +""" +function setalpha!(obj::RVASGamma{S}, alpha::Float64) where S + @assert alpha >= 0 "alpha must be >= 0" + obj.alpha[1] = alpha + gammadist = Distributions.Gamma(alpha, 1/alpha) + cumprob = 1/(2obj.ncat) .+ (0:(obj.ncat-1))/obj.ncat # cumulative prob to discretize Gamma + obj.ncat > 1 || return obj + rv = obj.ratemultiplier + for (i,cp) in enumerate(cumprob) + @inbounds rv[i] = quantile(gammadist, cp) + end + rv ./= mean(rv) + return obj +end +function setalpha!(obj::RVASGammaInv{S}, alpha::Float64) where S + @assert alpha >= 0 "alpha must be >= 0" + obj.alpha[1] = alpha + ncat = obj.ncat + pvar = 1.0 - obj.pinv[1] + gammadist = Distributions.Gamma(alpha, 1/alpha) + r0 = quantile.(gammadist, 1/(2ncat) .+ (0:(ncat-1))/ncat) + r0 ./= mean(r0) + for i in 2:(ncat+1) + @inbounds obj.ratemultiplier[i] = r0[i-1]/pvar + end + return obj +end + +""" + setpinv!(obj, pinv) + +Set the proportion of invariable sites `pinv` in a RateVariationAcrossSites +model `obj`, and update the rate multipliers & weights accordingly. +For `RVASInvGamma` objects, the original rate multipliers are assumed correct, +according to the original `pinv` value. +Return the modified object. +""" +function setpinv!(obj::RVASInv, pinv::Float64) + @assert 0.0 <= pinv < 1.0 "pinv must be in [0,1)" + obj.pinv[1] = pinv + pvar = 1.0-pinv # 0 not okay here: ratemultiplier would be infinite + obj.lograteweight[1] = log(pinv) # -Inf is okay + obj.lograteweight[2] = log(pvar) + obj.ratemultiplier[2] = 1.0/pvar # to get an average rate = 1 + return obj +end +function setpinv!(obj::RVASGammaInv{S}, pinv::Float64) where S + @assert 0.0 <= pinv < 1.0 "pinv must be in [0,1)" + ncat = obj.ncat + pvar = 1.0-pinv # 0 not okay here: ratemultiplier would be infinite + pvarratio = (1.0-obj.pinv[1])/pvar # old p_variable / new p_variable + obj.pinv[1] = pinv + obj.lograteweight[1] = log(pinv) # -Inf is okay + uniflw = -log(ncat)+log(pvar) + for i in 2:(ncat+1) + @inbounds obj.lograteweight[i] = uniflw + @inbounds obj.ratemultiplier[i] *= pvarratio # gamma rate / p_variable + end + return obj +end + +""" + setpinvalpha!(obj, pinv, alpha) + +Set the proportion of invariable sites `pinv` and the `alpha` parameter for +the discretized gamma distribution in a model `obj` of type `RVASGammaInv{S}`. +Update the rate multipliers & weights accordingly. +The mean of the distribution is constrained to 1. + +Return the modified object. +""" +function setpinvalpha!(obj::RVASGammaInv{S}, pinv::Float64, alpha::Float64) where S + @assert 0.0 <= pinv < 1.0 "pinv must be in [0,1)" + @assert alpha >= 0 "alpha must be >= 0" + obj.alpha[1] = alpha + obj.pinv[1] = pinv + obj.lograteweight[1] = log(pinv) # -Inf is okay + ncat = obj.ncat + gammadist = Distributions.Gamma(alpha, 1/alpha) + r0 = quantile.(gammadist, 1/(2ncat) .+ (0:(ncat-1))/ncat) + r0 ./= mean(r0) + pvar = 1.0-pinv # 0 not okay here: ratemultiplier would be infinite + uniflw = -log(ncat)+log(pvar) + for i in 2:(ncat+1) + @inbounds obj.lograteweight[i] = uniflw + @inbounds obj.ratemultiplier[i] = r0[i-1]/pvar + end + return obj +end + +function Base.show(io::IO, obj::RVASGamma{S}) where S + str = "Rate variation across sites: discretized Gamma\n" + if length(obj.ratemultiplier)>1 + str *= "alpha: $(round(obj.alpha[1], digits=5))\n" + end + str *= "categories for Gamma discretization: $(obj.ncat)\n" + str *= "rates: $(round.(obj.ratemultiplier, digits=3))" + print(io, str) +end +function Base.show(io::IO, obj::RVASInv) + str = "Rate variation across sites: +I (invariable sites)\n" + str *= "pinv: $(round(obj.pinv[1], digits=5))\n" + str *= "rates: $(round.(obj.ratemultiplier, digits=3))" + print(io, str) +end +function Base.show(io::IO, obj::RVASGammaInv{S}) where S + str = "Rate variation across sites: discretized Gamma+I\n" + str *= "pinv: $(round(obj.pinv[1], digits=5))\n" + str *= "alpha: $(round(obj.alpha[1], digits=5))\n" + str *= "categories for Gamma discretization: $(obj.ncat)\n" + str *= "rates: $(round.(obj.ratemultiplier, digits=3))\n" + str *= "probabilities: $(round.(exp.(obj.lograteweight), digits=3))" + print(io, str) +end + +function nparams(obj::RVASGamma{S}) where S + return (obj.ncat == 1 ? 0 : 1) +end +nparams(::RVASInv) = 1::Int +nparams(::RVASGammaInv{S}) where S = 2::Int # ncat must be >1 + +""" + getparameters(obj::RateVariationAcrossSites) + +Return a copy of the alpha and/or pinv parameters of model `obj`, +in a single vector. +""" +getparameters(obj::RVASInv) = copy(obj.pinv) +getparameters(obj::RVASGamma{S}) where S = copy(obj.alpha) +getparameters(obj::RVASGammaInv{S}) where S = [obj.pinv[1], obj.alpha[1]] + +""" + setparameters!(obj::RateVariationAcrossSites, par::AbstractVector) + +Set the values of the alpha and/or pinv parameters of model `obj`. +See also [`setalpha!`](@ref), [`setpinv!`](@ref) and [`setpinvalpha!`](@ref) +""" +setparameters!(obj::RVASInv, par::AbstractVector) = setpinv!(obj, par[1]) +setparameters!(obj::RVASGamma{S}, par::AbstractVector) where S = + setalpha!(obj, par[1]) +setparameters!(obj::RVASGammaInv{S}, par::AbstractVector) where S = + setpinvalpha!(obj, par[1], par[2]) + +""" + getparamindex(obj::RateVariationAcrossSites) + +Indices of parameters in (p_invariable, alpha). +""" +getparamindex(::RVASInv) = [1] +getparamindex(::RVASGamma{S}) where S = [2] +getparamindex(::RVASGammaInv{S}) where S = [1,2] + +""" + empiricalDNAfrequencies(DNAdata::AbstractDataFrame, DNAweights, + correction=true, useambiguous=true) + +Estimate base frequencies in DNA data `DNAdata`, ordered ACGT. + +- `DNAdata`: data frame. All columns are used. If the first column + gives species names, find a way to ignore it before calculating empirical + frequencies, e.g. `empiricalDNAfrequencies(view(DNAdata, :, 2:size(DNAdata, 2)))`. + Data type must be `BioSymbols.DNA` or `Char` or `String`. + WARNING: this is checked on the first column only. +- `DNAweights`: vector of weights, to weigh each column in `DNAdata`. +- `correction`: if `true`, add 1 to each count and 4 to the denominator + for a more stable estimator, similar to Bayes prior of 1/4 and + the Agresti-Coull interval in binomial estimation. +- `useambiguous`: if `true`, ambiguous bases are used (except gaps and Ns). + For example, `Y` adds 0.5 weight to `C` and 0.5 weight to `T`. +""" +function empiricalDNAfrequencies( + dnaDat::AbstractDataFrame, + dnaWeights::Vector, + correctedestimate::Bool=true, + useambiguous::Bool=true +) + # warning: checking first column and first row only + dnadat1type = eltype(dnaDat[!,1]) + dnadat1type == BioSymbols.DNA || dnadat1type == Char || + dnaDat[1,1] ∈ string.(BioSymbols.alphabet(DNA)) || + error("empiricalDNAfrequencies requires data of type String, Char, or BioSymbols.DNA") + + # initialize counts: keys same as BioSymbols.ACGT (which are ordered) + prior = correctedestimate ? 1.0 : 0.0 + dnacounts = Dict(DNA_A=>prior, DNA_C=>prior, DNA_G=>prior, DNA_T=>prior) + + convert2dna = dnadat1type != BioSymbols.DNA + for j in axes(dnaDat, 2) # for each column + col = dnaDat[!,j] + wt = dnaWeights[j] + for nuc in col # for each row + if convert2dna + nuc = convert(DNA, nuc[1]) # if nuc is a string, nuc[1] = 1st character + end + if nuc ∈ BioSymbols.ACGT + dnacounts[nuc] += wt + elseif nuc == DNA_Gap || nuc == DNA_N || !useambiguous + continue # to next row + # else: ambiguity, uses BioSequences definitions + elseif nuc == DNA_M # A or C + dnacounts[DNA_A] += 0.5*wt + dnacounts[DNA_C] += 0.5*wt + elseif nuc == DNA_R # A or G + dnacounts[DNA_A] += 0.5*wt + dnacounts[DNA_G] += 0.5*wt + elseif nuc == DNA_W # A or T/U + dnacounts[DNA_A] += 0.5*wt + dnacounts[DNA_T] += 0.5*wt + elseif nuc == DNA_S # C or G + dnacounts[DNA_C] += 0.5*wt + dnacounts[DNA_G] += 0.5*wt + elseif nuc == DNA_Y # C or T/U + dnacounts[DNA_C] += 0.5*wt + dnacounts[DNA_T] += 0.5*wt + elseif nuc == DNA_K # G or T/U + dnacounts[DNA_G] += 0.5*wt + dnacounts[DNA_T] += 0.5*wt + elseif nuc == DNA_V # A or C or G + dnacounts[DNA_A] += wt/3 + dnacounts[DNA_C] += wt/3 + dnacounts[DNA_G] += wt/3 + elseif nuc == DNA_H # A or C or T + dnacounts[DNA_A] += wt/3 + dnacounts[DNA_C] += wt/3 + dnacounts[DNA_T] += wt/3 + elseif nuc == DNA_D # A or G or T/U + dnacounts[DNA_A] += wt/3 + dnacounts[DNA_G] += wt/3 + dnacounts[DNA_T] += wt/3 + elseif nuc == DNA_B # C or G or T/U + dnacounts[DNA_C] += wt/3 + dnacounts[DNA_G] += wt/3 + dnacounts[DNA_T] += wt/3 + end + end + end + totalweight = sum(values(dnacounts)) + res = [dnacounts[key]/totalweight for key in BioSymbols.ACGT] # to control the order + all(0. .<= res .<= 1.) || error("""weird: empirical base frequency < 0 or > 1""") + return res +end + +""" + stationary(substitutionmodel) + +Stationary distribution of a Markov model +""" +stationary(mod::SM) = error("stationary not defined for $(typeof(mod)).") +stationary(::JC69) = [0.25,0.25,0.25,0.25] +stationary(mod::HKY85) = mod.pi +stationary(mod::ERSM) = [1/mod.k for i in 1:mod.k] +stationary(mod::BTSM) = [mod.eigeninfo[2], mod.eigeninfo[3]] diff --git a/src/nloptsummary.jl b/src/nloptsummary.jl new file mode 100644 index 0000000..a9d4e6e --- /dev/null +++ b/src/nloptsummary.jl @@ -0,0 +1,69 @@ +""" + OptSummary{T<:AbstractFloat} + +Summary of an `NLopt` optimization. Idea and code taken from +[`MixedModels`](https://github.com/JuliaStats/MixedModels.jl). +`T` is the type of the function argument(s) and of the function value. +""" +mutable struct OptSummary{T<:AbstractFloat} + "copy of initial param values in the optimization" + initial::Vector{T} + "lower bounds on the parameter values" + lowerbd::Vector{T} + "relative tolerance on the function value f(x), as in NLopt" + ftol_rel::T + "absolute tolerance on the function value f(x), as in NLopt" + ftol_abs::T + "relative tolerance on the argument value x, as in NLopt" + xtol_rel::T + "absolute tolerance on the argument value x" + xtol_abs::Vector{T} + "initial step sizes, as in NLopt" + initial_step::Vector{T} + "maximum number of function evaluations, as in NLopt" + maxfeval::Int + "copy of the final parameter values from the optimization" + final::Vector{T} + "final value of the objective function" + fmin::T + "number of function evaluations" + feval::Int + "name of the optimizer used, as a `Symbol`" + algorithm::Symbol + "return value, as a `Symbol`" + returnvalue::Symbol +end +function OptSummary(initial::Vector{T}, lowerbd::Vector{T}, algorithm::Symbol; + ftol_rel::T = zero(T), + ftol_abs::T = zero(T), + xtol_rel::T = zero(T), + xtol_abs::Vector{T} = fill(zero, length(initial)), + initial_step::Vector{T} = T[]) where {T<:AbstractFloat} + OptSummary(initial, lowerbd, + ftol_rel, ftol_abs, xtol_rel, xtol_abs, + initial_step, + -1, # maxeval: 0 or negative for no limit + copy(initial), # final x + T(Inf), # final value (will be finite after minimization) + -1, # number of evals + algorithm, + :FAILURE) +end + +function NLopt.Opt(optsum::OptSummary) + lb = optsum.lowerbd + np = length(lb) # number of parameters to optimize + opt = NLopt.Opt(optsum.algorithm, np) + NLopt.ftol_rel!(opt, optsum.ftol_rel) # relative criterion on objective + NLopt.ftol_abs!(opt, optsum.ftol_abs) # absolute criterion on objective + NLopt.xtol_rel!(opt, optsum.xtol_rel) # relative criterion on parameters + NLopt.xtol_abs!(opt, optsum.xtol_abs) # absolute criterion on parameters + NLopt.lower_bounds!(opt, lb) + NLopt.maxeval!(opt, optsum.maxfeval) + if isempty(optsum.initial_step) + optsum.initial_step = NLopt.initial_step(opt, similar(lb)) + else + NLopt.initial_step!(opt, optsum.initial_step) + end + return opt +end diff --git a/src/simulate_continuous.jl b/src/simulate_continuous.jl new file mode 100644 index 0000000..77e13c7 --- /dev/null +++ b/src/simulate_continuous.jl @@ -0,0 +1,402 @@ +""" + TraitSimulation + +Result of a trait simulation on an `PhyloNetworks.HybridNetwork` +with [`rand`](@ref). + +The following functions and extractors can be applied to it: +[`tiplabels`](@ref), `obj[:tips]`, `obj[:internalnodes]` +(see documentation for function [`getindex(::TraitSimulation, ::Symbol)`](@ref)). + +The `TraitSimulation` object has fields: `M`, `params`, `evomodel`. +""" +struct TraitSimulation + M::MatrixTopologicalOrder + params::ParamsProcess + evomodel::AbstractString +end + +function Base.show(io::IO, obj::TraitSimulation) + disp = "$(typeof(obj)):\n" + disp = disp * "Trait simulation results on a network with $(length(obj.M.tipnames)) tips, using a $(obj.evomodel) model, with parameters:\n" + disp = disp * paramstable(obj.params) + println(io, disp) +end + +tiplabels(obj::TraitSimulation) = tiplabels(obj.M) + +""" + rand([rng::AbstractRNG,] + net::HybridNetwork, + params::ParamsProcess, + checkpreorder::Bool=true) + +Simulate traits on `net` using the parameters `params`. For now, only +parameters of type [`ParamsBM`](@ref) (univariate Brownian Motion) and +[`ParamsMultiBM`](@ref) (multivariate Brownian motion) are accepted. + +The simulation using a recursion from the root to the tips of the network, +therefore, a pre-ordering of nodes is needed. If `checkpreorder=true` (default), +[`PhyloNetworks.preorder!`](@extref) is called on the network beforehand. +Otherwise, it is assumed that the preordering has already been calculated. + +Returns an object of type [`TraitSimulation`](@ref), +which has a matrix with the trait expectations and simulated trait values at +all the nodes. + +See examples below for accessing expectations and simulated trait values. + +# Examples + +## Univariate + +```jldoctest randdoc +julia> phy = readnewick("(A:2.5,((U:1,#H1:0.5::0.4):1,(C:1,(D:0.5)#H1:0.5::0.6):1):0.5);"); + +julia> par = ParamsBM(1, 0.1) # BM with expectation 1 and variance 0.1. +ParamsBM: +Parameters of a BM with fixed root: +mu: 1.0 +Sigma2: 0.1 + + +julia> sim = rand(phy, par) # simulate along the network +TraitSimulation: +Trait simulation results on a network with 4 tips, using a BM model, with parameters: +mu: 1.0 +Sigma2: 0.1 +``` + +Below, we re-run the same simulation but with our own fixed +random number generator for reproducibility. + +```jldoctest randdoc +julia> # using Pkg; Pkg.add("StableRNGs") # to install StableRNGs if not done earlier + +julia> using StableRNGs; rng = StableRNG(791); # for reproducibility + +julia> sim = rand(rng, phy, par); # re-simulate + +julia> traits = sim[:tips] # extract simulated values at the tips. +4-element Vector{Float64}: + 0.5991561486238962 + 0.861066346792992 + 1.367634062992289 + 1.6439310845929571 + +julia> tiplabels(sim) # name of tips, in the same order as values above +4-element Vector{String}: + "A" + "U" + "C" + "D" +``` + +So, for example, the simulated trait value for taxon U (listed second) is ~0.86. +For some purposes, we might want to access the values simulated at internal +nodes, or at all nodes at once: + +```jldoctest randdoc +julia> traits = sim[:internalnodes] # extract simulated values at internal nodes. Order: as in sim.M.internalnodenumbers +5-element Vector{Float64}: + 1.0716684901027937 + 1.6007823049044083 + 1.6756374575490327 + 1.2194286026283034 + 1.0 + +julia> traits = sim[:all] # simulated values at all nodes, ordered as in sim.M.nodenumbers_toporder +9-element Vector{Float64}: + 1.0 + 1.2194286026283034 + 1.6756374575490327 + 1.367634062992289 + 1.0716684901027937 + 1.6007823049044083 + 1.6439310845929571 + 0.861066346792992 + 0.5991561486238962 +``` + +We might also want to extract the expected mean values (without noise). +This is not very interesting under a standard BM model, but may become +interesting under more complex models (e.g. with shifts). +We can do so with an extra `:exp` index: + +```jldoctest randdoc +julia> traits = sim[:tips, :exp] # expected values at the tips (also works for sim[:all, :exp] and sim[:internalnodes, :exp]). +4-element Vector{Float64}: + 1.0 + 1.0 + 1.0 + 1.0 +``` + +## Multivariate + +```jldoctest randdoc +julia> phy = readnewick("(A:2.5,((B:1,#H1:0.5::0.4):1,(C:1,(V:0.5)#H1:0.5::0.6):1):0.5);"); + +julia> par = ParamsMultiBM([1.0, 2.0], [1.0 0.5; 0.5 1.0]) # BM with expectation [1.0, 2.0] and variance [1.0 0.5; 0.5 1.0]. +ParamsMultiBM: +Parameters of a MBD with fixed root: +mu: [1.0, 2.0] +Sigma: [1.0 0.5; 0.5 1.0] + +julia> using StableRNGs; rng = StableRNG(9851); # for reproducibility + +julia> sim = rand(rng, phy, par) # simulate on the phylogeny +TraitSimulation: +Trait simulation results on a network with 4 tips, using a MBD model, with parameters: +mu: [1.0, 2.0] +Sigma: [1.0 0.5; 0.5 1.0] + + +julia> traits = sim[:tips] # extract simulated values at the tips (each column contains the simulated traits for one node). +2×4 Matrix{Float64}: + 3.8013 0.839485 0.346092 1.91131 + 5.91725 -0.59143 0.458569 0.629048 +``` + +The 2 rows to the 2 correlated traits and the columns correspond to the 4 taxa +(tips). The order in which taxa are listed is obtained with `tiplabels`: +```jldoctest randdoc +julia> tiplabels(sim) +4-element Vector{String}: + "A" + "B" + "C" + "V" +``` + +As in the univariate case, we can also extract the values simulated at +internal nodes, or all nodes (but listed in preorder), or expected mean values. +```jldoctest randdoc +julia> sim[:internalnodes] # simulated values at internal nodes. order: same as in sim.M.internalnodenumbers +2×5 Matrix{Float64}: + -0.604224 0.755722 2.14755 0.484292 1.0 + -0.338922 0.373921 1.15174 0.695561 2.0 + +julia> traits = sim[:all]; # 2×9 Matrix: values at all nodes, ordered as in sim.M.nodenumbers_toporder + +julia> sim[:tips, :exp] # expected values (also works for sim[:all, :exp] and sim[:internalnodes, :exp]) +2×4 Matrix{Float64}: + 1.0 1.0 1.0 1.0 + 2.0 2.0 2.0 2.0 +``` +""" +function rand(net::HybridNetwork, params::ParamsProcess, checkpreorder::Bool=true) + rand(default_rng(), net, params, checkpreorder) +end +function rand( + rng::AbstractRNG, + net::HybridNetwork, + params::ParamsProcess, + checkpreorder::Bool=true +) + if isa(params, ParamsBM) + model = "BM" + elseif isa(params, ParamsMultiBM) + model = "MBD" + else + error("'rand(net, params,...)' only works for a BM process (for now).") + end + !ismissing(params.shift) || (params.shift = ShiftNet(net, process_dim(params))) + + net.isrooted || error("The net needs to be rooted for trait simulation.") + !anyShiftOnRootEdge(params.shift) || error("Shifts are not allowed above the root node. Please put all root specifications in the process parameter.") + + checkpreorder && preorder!(net) + f = preorderFunctions(params, rng) + V = PN.traversal_preorder(net.vec_node, + f[:init], f[:root], f[:tree], f[:hybrid], params) + M = MatrixTopologicalOrder(V, net, :c) # nodes in columns of V + TraitSimulation(M, params, model) +end + + +function preorderFunctions(::ParamsBM, rng::AbstractRNG) + return (init = initSimulateBM, + root = updateRootSimulateBM!(rng), + tree = updateTreeSimulateBM!(rng), + hybrid = updateHybridSimulateBM!(rng)) +end +function preorderFunctions(::ParamsMultiBM, rng::AbstractRNG) + return (init = initSimulateMBD, + root = updateRootSimulateMBD!(rng), + tree = updateTreeSimulateMBD!(rng), + hybrid = updateHybridSimulateMBD!(rng)) +end + +# used to initialize at the root +function partitionMBDMatrix(M::Matrix{Float64}, dim::Int) + means = @view M[1:dim, :] + vals = @view M[(dim + 1):(2 * dim), :] + return means, vals +end + +function anyShiftOnRootEdge(shift::ShiftNet) + nodInd = getshiftrowinds(shift) + for n in shift.net.vec_node[nodInd] + !(getMajorParentEdgeNumber(n) == -1) || return(true) + end + return false +end + +# Initialization of the structure +function initSimulateBM(nodes::Vector{Node}, ::ParamsBM) + return(zeros(2, length(nodes))) +end + +function initSimulateMBD(nodes::Vector{Node}, params::ParamsMultiBM) + p = process_dim(params) + return zeros(2 * p, length(nodes)) # [means vals] +end + +# Initialization of the root +function updateRootSimulateBM!(rng::AbstractRNG) + f = function(M::Matrix, i::Int, params::ParamsBM) + M[1, i] = params.mu # expectation + M[2, i] = params.mu + if params.randomRoot + M[2, i] += sqrt(params.varRoot) * randn(rng) # random value + end + return true + end + return f +end +function updateRootSimulateMBD!(rng::AbstractRNG) + f = function(M::Matrix{Float64}, i::Int, params::ParamsMultiBM) + p = process_dim(params) + means, vals = partitionMBDMatrix(M, p) + means[:, i] .= params.mu # expectation + vals[:, i] .= params.mu + if params.randomRoot + vals[:, i] += cholesky(params.varRoot).L * randn(rng, p) # random value + end + return true + end + return f +end + +# Going down to a tree node +function updateTreeSimulateBM!(rng::AbstractRNG) + f = function(M::Matrix, + i::Int, + parentIndex::Int, + edge::Edge, + params::ParamsBM) + M[1, i] = M[1, parentIndex] + params.shift.shift[i] # expectation + M[2, i] = M[2, parentIndex] + params.shift.shift[i] + + sqrt(params.sigma2 * edge.length) * randn(rng) # random value + return true + end + return f +end +function updateTreeSimulateMBD!(rng::AbstractRNG) + f = function(M::Matrix{Float64}, + i::Int, + parentIndex::Int, + edge::Edge, + params::ParamsMultiBM) + p = process_dim(params) + means, vals = partitionMBDMatrix(M, p) + μ = @view means[:, i] + val = @view vals[:, i] + # μ .= means[:, parentIndex] + params.shift.shift[i, :] + μ .= @view means[:, parentIndex] + μ .+= @view params.shift.shift[i, :] + # val .= sqrt(edge.length) * params.L * randn(rng, p) + vals[:, parentIndex] + params.shift.shift[i, :] + mul!(val, params.L, randn(rng, p)) + val .*= sqrt(edge.length) + val .+= @view vals[:, parentIndex] + val .+= params.shift.shift[i, :] + return true + end + return f +end + +# Going down to an hybrid node +function updateHybridSimulateBM!(rng::AbstractRNG) + f = function(M::Matrix, + i::Int, + parindx::AbstractVector{Int}, + paredge::AbstractVector{Edge}, + params::ParamsBM) + iter = zip(parindx, paredge) + M[1, i] = sum(e.gamma * M[1,j] for (j,e) in iter) # expectation + M[2, i] = sum(e.gamma * (M[2,j] + sqrt(params.sigma2 * e.length) * randn(rng)) for (j,e) in iter) + return true + end + return f +end +# assumes a bicombining network for multivariate +function updateHybridSimulateMBD!(rng::AbstractRNG) + f = function(M::Matrix{Float64}, + i::Int, + parindx::AbstractVector{Int}, + paredge::AbstractVector{Edge}, + params::ParamsMultiBM) + p = process_dim(params) + means, vals = partitionMBDMatrix(M, p) + μ = @view means[:, i] + val = @view vals[:, i] + μ1 = @view means[:, parindx[1]] + μ2 = @view means[:, parindx[2]] + v1 = @view vals[:, parindx[1]] + v2 = @view vals[:, parindx[2]] + # means[:, i] .= edge1.gamma * μ1 + edge2.gamma * μ2 + mul!(μ, μ1, paredge[1].gamma) + BLAS.axpy!(paredge[2].gamma, μ2, μ) # expectation + # val .= edge1.gamma * (v1 + sqrt(edge1.length) * params.L * r1) + + # edge2.gamma * (v2 + sqrt(edge2.length) * params.L * r2) # random value + mul!(val, params.L, randn(rng, p)) + val .*= sqrt(paredge[1].length) + val .+= v1 + buffer = params.L * randn(rng, p) + buffer .*= sqrt(paredge[2].length) + buffer .+= v2 + BLAS.axpby!(paredge[2].gamma, buffer, paredge[1].gamma, val) # random value + return true + end + return f +end + +""" + getindex(obj::TraitSimulation, d::Symbol, w::Symbol) + +Getting submatrices of an object of type [`TraitSimulation`](@ref). + +# Arguments +* `obj::TraitSimulation`: the matrix from which to extract. +* `d`: symbol specifying which sub-matrix to extract. Can be: + - `:tips` columns and/or rows corresponding to the tips + - `:internalnodes` columns and/or rows corresponding to the internal nodes +* `w`: symbol specifying whether simulated (`:sim`) or mean expected (`:exp`) + values are desired. +""" +function Base.getindex(obj::TraitSimulation, d::Symbol, w::Symbol=:sim) + inds = siminds(obj.params, w) + return getindex(obj.M, d)[inds, :] +end + +function siminds(::ParamsBM, w::Symbol) + if w == :sim + return 2 + elseif w == :exp + return 1 + else + error("The argument 'w' must be ':sim' or ':exp'. (':$w' was supplied)") + end +end + +function siminds(params::ParamsMultiBM, w::Symbol) + p = process_dim(params) + if w == :sim + return (p + 1):(2 * p) + elseif w == :exp + return 1:p + else + error("The argument 'w' must be ':sim' or ':exp'. (':$w' was supplied)") + end +end diff --git a/src/simulate_substitutions.jl b/src/simulate_substitutions.jl new file mode 100644 index 0000000..1d4f5ae --- /dev/null +++ b/src/simulate_substitutions.jl @@ -0,0 +1,201 @@ +""" + rand([rng::AbstractRNG,] + model::TraitSubstitutionModel, + t::Float64, + start::AbstractVector{Int}) + +Simulate discrete traits along one edge of length t. A random number generator +`rng` is optional. `start` must be a vector of integers, each representing the +starting value of one trait. + +# examples + +```jldoctest +julia> m1 = BinaryTraitSubstitutionModel(1.0, 2.0) +Binary Trait Substitution Model: +rate 0→1 α=1.0 +rate 1→0 β=2.0 + +julia> using StableRNGs; rng = StableRNG(135); + +julia> rand(rng, m1, 0.2, [1,2,1,2,1]) +5-element Vector{Int64}: + 2 + 2 + 1 + 2 + 1 +``` +""" +function rand(obj::SubstitutionModel, t::Float64, start::AbstractVector{Int}) + rand(default_rng(), obj, t, start) +end +function rand( + rng::AbstractRNG, + obj::SubstitutionModel, + t::Float64, + start::AbstractVector{Int} +) + res = Vector{Int}(undef, length(start)) + rand!(rng, res, obj, t, start) +end + +""" + rand!(rng::AbstractRNG, + end::AbstractVector{Int}, + model::TraitSubstitutionModel, + t::Float64, + start::AbstractVector{Int}) + +Simulate discrete traits along one edge of length `t` +like [`rand`](@ref PhyloTraits.rand), +but modifying `end` in place to store the simulated values. +""" +function rand!( + rng::AbstractRNG, + endTrait::AbstractVector{Int}, + obj::SubstitutionModel, + t::Float64, + start::AbstractVector{Int} +) + Pt = P(obj, t) + k = size(Pt, 1) # number of states + w = [aweights(Pt[i,:]) for i in 1:k] + for i in eachindex(start) + endTrait[i] = sample(rng, 1:k, w[start[i]]) + end + return endTrait +end + +""" + rand([rng::AbstractRNG,] + model::TraitSubstitutionModel, + net::HybridNetwork; + ntraits=1, + keepinternal=true, + checkpreorder=true) + +Simulate evolution of discrete traits on a rooted evolutionary network based on +the supplied evolutionary model. Trait sampling is uniform at the root. + +optional arguments: + +- `ntraits`: number of traits to be simulated (default: 1 trait). +- `keepinternal`: if true, export character states at all nodes, including + internal nodes. if false, export character states at tips only. + +output: + +- matrix of character states with one row per trait, one column per node; + these states are *indices* in `model.label`, not the trait labels themselves. +- vector of node labels (for tips) or node numbers (for internal nodes) + in the same order as columns in the character state matrix + +# examples + +```jldoctest +julia> m1 = BinaryTraitSubstitutionModel(1.0, 2.0, ["low","high"]); + +julia> net = readnewick("(((A:4.0,(B:1.0)#H1:1.1::0.9):0.5,(C:0.6,#H1:1.0::0.1):1.0):3.0,D:5.0);"); + +julia> using Random; Random.seed!(95); + +julia> trait, lab = rand(m1, net) +([1 2 … 1 1], ["-2", "D", "-3", "-6", "C", "-4", "H1", "B", "A"]) + +julia> trait +1×9 Matrix{Int64}: + 1 2 1 1 2 2 1 1 1 + +julia> lab +9-element Vector{String}: + "-2" + "D" + "-3" + "-6" + "C" + "-4" + "H1" + "B" + "A" +``` +""" +function rand(obj::SubstitutionModel, net::HybridNetwork; kwargs...) + rand(default_rng(), obj, net; kwargs...) +end +function rand( + rng::AbstractRNG, + obj::SubstitutionModel, + net::HybridNetwork; + ntraits::Int=1, + keepinternal::Bool=true, + checkpreorder::Bool=true +) + net.isrooted || error("net needs to be rooted for preorder recursion") + checkpreorder && preorder!(net) + nnodes = net.numnodes + M = Matrix{Int}(undef, ntraits, nnodes) # M[i,j]= trait i for node j + rand!(rng, M, obj, net) + if !keepinternal + M = PN.getTipSubmatrix(M, net, indexation=:cols) # subset columns only. rows=traits + nodeLabels = [n.name for n in net.vec_node if n.leaf] + else + nodeLabels = [n.name == "" ? string(n.number) : n.name for n in net.vec_node] + end + return M, nodeLabels +end + +function rand!( + rng::AbstractRNG, + M::Matrix, + obj::SubstitutionModel, + net::HybridNetwork +) + return PN.traversal_preorder!( + net.vec_node, + M, # updates M in place + updateRootRandomTrait!, + updateTreeRandomTrait!, + updateHybridRandomTrait!, + obj, + rng) +end + +function updateRootRandomTrait!(V::AbstractArray, i::Int, obj, rng) + sample!(rng, 1:nstates(obj), view(V, :, i)) # uniform at the root + return true +end + +function updateTreeRandomTrait!( + V::Matrix, + i::Int, + parentIndex::Int, + edge::Edge, + obj, + rng, +) + rand!(rng, view(V, :, i), obj, edge.length, view(V, :, parentIndex)) + return true +end + +function updateHybridRandomTrait!( + V::Matrix, + i::Int, + parindx::AbstractVector{Int}, + paredge::AbstractVector{Edge}, + obj, + rng, +) + nump = length(parindx) # 2 parents if bicombining + rand!(rng, view(V, :, i), obj, paredge[1].length, view(V, :, parindx[1])) + tmp = [rand(rng, obj, paredge[p].length, view(V, :, parindx[p])) for p in 2:nump] + cs = cumsum(e.gamma for e in paredge) # last value should be 1 = sum of γs + for j in 1:size(V,1) # loop over traits + u = rand(rng) # next: find index p such that cs[p-1] < u < cs[p] + p = findfirst(s -> u < s, cs) # inherit from parent p + if p > 1 # parent 1 was stored in V already: nothing to do if p=1 + V[j,i] = tmp[p-1][j] # switch to inherit trait of parent p + end + end + return true +end diff --git a/test/Project.toml b/test/Project.toml index b35b5ed..74ce4bb 100644 --- a/test/Project.toml +++ b/test/Project.toml @@ -1,3 +1,15 @@ [deps] Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595" +BioSymbols = "3c28c6f8-a34d-59c4-9654-267d177fcfa9" +CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" +DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" +GLM = "38e38edf-8417-5370-95a0-9cbb8c7f171a" +LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +PhyloNetworks = "33ad39ac-ed31-50eb-9b15-43d0656eaa72" +Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" +StableRNGs = "860ef19b-820b-49d6-a774-d7a799459cd3" +StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" +Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" +StatsAPI = "82ae8749-77ed-4fe6-ae5f-f523153014b0" +StatsBase = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" diff --git a/test/runtests.jl b/test/runtests.jl index 073178b..6a127bd 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -2,9 +2,34 @@ using PhyloTraits using Test using Aqua +using BioSymbols +using CSV +using DataFrames +using GLM # for coef, nobs, residuals etc. +using LinearAlgebra: norm, diag, logdet, PosDefException # LinearAlgebra.rotate! not brought into scope +using PhyloNetworks +using Random +using StableRNGs +using StaticArrays # for rate substitution matrices +using Statistics +using StatsBase # for aic etc., stderr +using StatsAPI + +const PN = PhyloNetworks + +@testset "PhyloTraits Code quality (Aqua.jl)" begin + Test.detect_ambiguities(PhyloTraits) + Aqua.test_all( + PhyloTraits; + ambiguities = (broken=false), + persistent_tasks = false, + ) +end @testset "PhyloTraits.jl" begin - @testset "Code quality (Aqua.jl)" begin - Aqua.test_all(PhyloTraits) - end - # Write your tests here. + include("test_lm.jl") + include("test_lm_tree.jl") + include("test_lm_withinspecies.jl") + include("test_traits_discrete.jl") + include("test_simulate.jl") + include("test_simulate_mbd.jl") end diff --git a/test/test_lm.jl b/test/test_lm.jl new file mode 100644 index 0000000..9e55467 --- /dev/null +++ b/test/test_lm.jl @@ -0,0 +1,734 @@ +## tests of phylolm + +@testset "phylolm on small network" begin + +tree_str= "(A:2.5,((B:1,#H1:0.5::0.1):1,(C:1,(D:0.5)#H1:0.5::0.9):1):0.5);" +net = readnewick(tree_str) +preorder!(net) + +# Rk: Is there a way to check that the branch length are coherent with +# one another (Especialy for hybrids) ? +# see QuartetNetworkGoodnessFit.ultrametrize! which can detect if the network is +# time-consistent: all paths from the root to a given node have the same length +# https://github.com/juliaphylo/QuartetNetworkGoodnessFit.jl + +# Ancestral state reconstruction with ready-made matrices +params = ParamsBM(10, 1) +Random.seed!(2468); # simulates the Y values below under julia v1.6 +sim = rand(net, params) # tests that the simulation runs, but results not used +Y = [11.239539657364706,8.600423079191044,10.559841251147608,9.965748423156297] # sim[:tips] +X = ones(4, 1) +phynetlm = phylolm(X, Y, net; reml=false) +@test_logs show(devnull, phynetlm) +# Naive version (GLS) +ntaxa = length(Y) +Vy = phynetlm.Vy +Vyinv = inv(Vy) +XtVyinv = X' * Vyinv +logdetVy = logdet(Vy) +betahat = inv(XtVyinv * X) * XtVyinv * Y +fittedValues = X * betahat +resids = Y - fittedValues +sigma2hat = 1/ntaxa * (resids' * Vyinv * resids) +# log likelihood +loglik = - 1 / 2 * (ntaxa + ntaxa * log(2 * pi) + ntaxa * log(sigma2hat) + logdetVy) +# null version +nullX = ones(ntaxa, 1) +nullXtVyinv = nullX' * Vyinv +nullresids = Y - nullX * inv(nullXtVyinv * nullX) * nullXtVyinv * Y +nullsigma2hat = 1/ntaxa * (nullresids' * Vyinv * nullresids) +nullloglik = - 1 / 2 * (ntaxa + ntaxa * log(2 * pi) + ntaxa * log(nullsigma2hat) + logdetVy) + + +@test coef(phynetlm) ≈ betahat +@test nobs(phynetlm) ≈ ntaxa +@test residuals(phynetlm) ≈ resids +@test response(phynetlm) ≈ Y +@test predict(phynetlm) ≈ fittedValues +@test dof_residual(phynetlm) ≈ ntaxa-length(betahat) +@test sigma2_phylo(phynetlm) ≈ sigma2hat +@test loglikelihood(phynetlm) ≈ loglik +@test vcov(phynetlm) ≈ sigma2hat*ntaxa/(ntaxa-length(betahat))*inv(XtVyinv * X) +@test stderror(phynetlm) ≈ sqrt.(diag(sigma2hat*ntaxa/(ntaxa-length(betahat))*inv(XtVyinv * X))) +@test dof(phynetlm) ≈ length(betahat)+1 +@test deviance(phynetlm, Val(true)) ≈ sigma2hat * ntaxa +@test nulldeviance(phynetlm) ≈ nullsigma2hat * ntaxa +@test nullloglikelihood(phynetlm) ≈ nullloglik +@test loglikelihood(phynetlm) ≈ nullloglikelihood(phynetlm) +@test deviance(phynetlm, Val(true)) ≈ nulldeviance(phynetlm) +@test r2(phynetlm) ≈ 1-sigma2hat / nullsigma2hat atol=1e-15 +@test adjr2(phynetlm) ≈ 1 - (1 - (1-sigma2hat/nullsigma2hat))*(ntaxa-1)/(ntaxa-length(betahat)) atol=1e-15 +@test aic(phynetlm) ≈ -2*loglik+2*(length(betahat)+1) +@test aicc(phynetlm) ≈ -2*loglik+2*(length(betahat)+1)+2(length(betahat)+1)*((length(betahat)+1)+1)/(ntaxa-(length(betahat)+1)-1) +@test bic(phynetlm) ≈ -2*loglik+(length(betahat)+1)*log(ntaxa) +@test hasintercept(phynetlm) + +# with data frames +dfr = DataFrame(trait = Y, tipnames = ["A","B","C","D"]) # sim.M.tipnames +fitbis = phylolm(@formula(trait ~ 1), dfr, net; reml=false) +#@show fitbis + +@test coef(phynetlm) ≈ coef(fitbis) +@test vcov(phynetlm) ≈ vcov(fitbis) +@test nobs(phynetlm) ≈ nobs(fitbis) +@test residuals(phynetlm)[fitbis.ind] ≈ residuals(fitbis) +@test response(phynetlm)[fitbis.ind] ≈ response(fitbis) +@test predict(phynetlm)[fitbis.ind] ≈ predict(fitbis) +@test dof_residual(phynetlm) ≈ dof_residual(fitbis) +@test sigma2_phylo(phynetlm) ≈ sigma2_phylo(fitbis) +@test stderror(phynetlm) ≈ stderror(fitbis) +@test confint(phynetlm) ≈ confint(fitbis) +@test loglikelihood(phynetlm) ≈ loglikelihood(fitbis) +@test dof(phynetlm) ≈ dof(fitbis) +@test deviance(phynetlm, Val(true)) ≈ deviance(fitbis, Val(true)) +@test nulldeviance(phynetlm) ≈ nulldeviance(fitbis) +@test nullloglikelihood(phynetlm) ≈ nullloglikelihood(fitbis) +@test r2(phynetlm) ≈ r2(fitbis) atol=1e-15 +@test adjr2(phynetlm) ≈ adjr2(fitbis) atol=1e-15 +@test aic(phynetlm) ≈ aic(fitbis) +@test aicc(phynetlm) ≈ aicc(fitbis) +@test bic(phynetlm) ≈ bic(fitbis) +tmp = (@test_logs (:warn, r"^You fitted the data against a custom matrix") mu_phylo(phynetlm)) +@test tmp ≈ mu_phylo(fitbis) +@test hasintercept(phynetlm) + +## fixed values parameters +fitlam = phylolm(@formula(trait ~ 1), dfr, net, model = "lambda", fixedValue=1.0, reml=false) +@test_logs show(devnull, fitlam) + +@test lambda_estim(fitlam) ≈ 1.0 +@test coef(fitlam) ≈ coef(fitbis) +@test vcov(fitlam) ≈ vcov(fitbis) +@test nobs(fitlam) ≈ nobs(fitbis) +@test residuals(fitlam)[fitbis.ind] ≈ residuals(fitbis) +@test response(fitlam)[fitbis.ind] ≈ response(fitbis) +@test predict(fitlam)[fitbis.ind] ≈ predict(fitbis) +@test dof_residual(fitlam) ≈ dof_residual(fitbis) +@test sigma2_phylo(fitlam) ≈ sigma2_phylo(fitbis) +@test stderror(fitlam) ≈ stderror(fitbis) +@test confint(fitlam) ≈ confint(fitbis) +@test loglikelihood(fitlam) ≈ loglikelihood(fitbis) +@test dof(fitlam) ≈ dof(fitbis) + 1 +@test deviance(fitlam, Val(true)) ≈ deviance(fitbis, Val(true)) +@test nulldeviance(fitlam) ≈ nulldeviance(fitbis) +@test nullloglikelihood(fitlam) ≈ nullloglikelihood(fitbis) +@test r2(fitlam) ≈ r2(fitbis) atol=1e-15 +@test adjr2(fitlam) ≈ adjr2(fitbis) - 0.5 atol=1e-15 +@test aic(fitlam) ≈ aic(fitbis) + 2 +#@test aicc(fitlam) ≈ aicc(fitbis) +@test bic(fitlam) ≈ bic(fitbis) + log(nobs(fitbis)) +@test mu_phylo(fitlam) ≈ mu_phylo(fitbis) +@test hasintercept(fitlam) + +fitSH = phylolm(@formula(trait ~ 1), dfr, net, model="scalinghybrid", fixedValue=1.0, reml=false) +@test loglikelihood(fitlam) ≈ loglikelihood(fitSH) +@test aic(fitlam) ≈ aic(fitSH) + +@test modelmatrix(fitlam) == reshape(ones(4), (4,1)) +s = IOBuffer(); show(s, formula(fitlam)) +@test String(take!(s)) == "trait ~ 1" +PhyloTraits.lambda!(fitlam, 0.5) +@test PhyloTraits.lambda(fitlam) == 0.5 + +## Pagel's Lambda +fitlam = (@test_logs (:info, r"^Maximum lambda value") match_mode=:any phylolm(@formula(trait ~ 1), dfr, net, model="lambda", reml=false)) +@test lambda_estim(fitlam) ≈ 1.24875 + +## Scaling Hybrid +fitSH = phylolm(@formula(trait ~ 1), dfr, net, model="scalinghybrid", reml=false) +@test lambda_estim(fitSH) ≈ 4.057891910001937 atol=1e-5 + +end + +############################################################################### +### With shifts +############################################################################### +@testset "Shifts and Transgressive Evolution" begin + +net = readnewick("(((Ag:5,(#H1:1::0.056,((Ak:2,(E:1,#H2:1::0.004):1):1,(M:2)#H2:1::0.996):1):1):1,(((((Az:1,Ag2:1):1,As:2):1)#H1:1::0.944,Ap:4):1,Ar:5):1):1,(P:4,20:4):3,165:7);"); +preorder!(net) + +## Simulate +params = ParamsBM(10, 0.1, shiftathybrids([3.0, -3.0], net)) +Random.seed!(2468); # sets the seed for reproducibility, to debug potential error +sim = rand(net, params) # checks for no error, but not used. +# values simulated using julia v1.6.4's RNG hardcoded below. +# Y = sim[:tips] +Y = [11.640085037749985, 9.498284887480622, 9.568813792749083, 13.036916724865296, 6.873936265709946, 6.536647349405742, 5.95771939864956, 10.517318306450647, 9.34927049737206, 10.176238483133424, 10.760099940744308, 8.955543827353837] + +## Construct regression matrix +dfr_shift = descendencedataframe(net, net.edge[[8,17]]) +dfr_shift[!,:sum] = vec(sum(Matrix(dfr_shift[:,findall(DataFrames.propertynames(dfr_shift) .!= :tipnames)]), dims=2)) +dfr_hybrid = descendencedataframe(net) +@test_throws ArgumentError descendencedataframe(net, :something) # wrong 'which' + +@test dfr_shift[!,:shift_8] ≈ dfr_hybrid[!,:shift_8] +@test dfr_shift[!,:shift_17] ≈ dfr_hybrid[!,:shift_17] +@test dfr_shift[!,:sum] ≈ dfr_hybrid[!,:sum] + +## Data +dfr = DataFrame(trait = Y, tipnames = ["Ag","Ak","E","M","Az","Ag2","As","Ap","Ar","P","20","165"]) # sim.M.tipnames +dfr = innerjoin(dfr, dfr_hybrid, on=:tipnames) + +## Simple BM +fitShift = phylolm(@formula(trait ~ shift_8 + shift_17), dfr, net; reml=false) +@test_logs show(devnull, fitShift) + +## Test against fixed values lambda models +fitlam = (@test_logs (:warn, + r"^The network is not time consistent") phylolm( + @formula(trait ~ shift_8 + shift_17), dfr, net, model="lambda", fixedValue=1.0, reml=false) +) +@test lambda_estim(fitlam) ≈ 1.0 +@test coef(fitlam) ≈ coef(fitShift) +@test vcov(fitlam) ≈ vcov(fitShift) +@test nobs(fitlam) ≈ nobs(fitShift) +@test residuals(fitlam) ≈ residuals(fitShift) +@test response(fitlam) ≈ response(fitShift) +@test predict(fitlam) ≈ predict(fitShift) +@test dof_residual(fitlam) ≈ dof_residual(fitShift) +@test sigma2_phylo(fitlam) ≈ sigma2_phylo(fitShift) +@test stderror(fitlam) ≈ stderror(fitShift) +@test confint(fitlam) ≈ confint(fitShift) +@test loglikelihood(fitlam) ≈ loglikelihood(fitShift) +@test dof(fitlam) ≈ dof(fitShift) + 1 +@test deviance(fitlam, Val(true)) ≈ deviance(fitShift, Val(true)) +@test nulldeviance(fitlam) ≈ nulldeviance(fitShift) +@test nullloglikelihood(fitlam) ≈ nullloglikelihood(fitShift) +@test r2(fitlam) ≈ r2(fitShift) atol=1e-15 +#@test adjr2(fitlam) ≈ adjr2(fitShift) - 0.5 atol=1e-15 +@test aic(fitlam) ≈ aic(fitShift) + 2 +#@test aicc(fitlam) ≈ aicc(fitShift) +@test bic(fitlam) ≈ bic(fitShift) + log(nobs(fitShift)) +@test mu_phylo(fitlam) ≈ mu_phylo(fitShift) +@test hasintercept(fitlam) + +fitSH = phylolm(@formula(trait ~ shift_8 + shift_17), dfr, net, model="scalinghybrid", fixedValue=1.0, reml=false) +@test loglikelihood(fitlam) ≈ loglikelihood(fitSH) +@test aic(fitlam) ≈ aic(fitSH) + +## ftest against own naive implementation +modnull = phylolm(@formula(trait ~ 1), dfr, net) +@test sigma2_phylo(modnull) ≈ 0.6517876326943942 atol=1e-6 # using REML +modhom = phylolm(@formula(trait ~ sum), dfr, net) +modhet = phylolm(@formula(trait ~ sum + shift_8), dfr, net) +#= 3 warnings thrown by ftest, one for each model, because after transforming the + data to de-correlate the results, the intercept vector is not ∝ 1. + Keep the warnings: because incorrect R² values in the ftest output +=# +table1 = redirect_stdio(stderr=devnull) do # to avoid seeing the warnings + ftest(modhet, modhom, modnull) +end +table2 = PhyloTraits.anova(modnull, modhom, modhet) + +@test table1.fstat[2] ≈ table2[2,:F] +@test table1.fstat[3] ≈ table2[1,:F] +@test table1.pval[2] ≈ table2[2,Symbol("Pr(>F)")] +@test table1.pval[3] ≈ table2[1,Symbol("Pr(>F)")] +@test hasintercept(modnull) && hasintercept(modhom) && hasintercept(modhet) +@test all(isapprox.(table1.r2, (0.8398130376214782, 0.006032952123011026, 0), atol=1e-15)) + +# Check that it is the same as doing shift_8 + shift_17 +modhetbis = phylolm(@formula(trait ~ shift_8 + shift_17), dfr, net) +table2bis = PhyloTraits.anova(modnull, modhom, modhetbis) +@test table2[!,:F] ≈ table2bis[!,:F] +@test table2[!,Symbol("Pr(>F)")] ≈ table2bis[!,Symbol("Pr(>F)")] +@test table2[!,:dof_res] ≈ table2bis[!,:dof_res] +@test table2[!,:RSS] ≈ table2bis[!,:RSS] +@test table2[!,:dof] ≈ table2bis[!,:dof] +@test table2[!,:SS] ≈ table2bis[!,:SS] + +# re-fit with ML to do likelihood ratio test +modnull = phylolm(@formula(trait ~ 1), dfr, net; reml=false) +modhom = phylolm(@formula(trait ~ sum), dfr, net; reml=false) +modhet = phylolm(@formula(trait ~ sum + shift_8), dfr, net; reml=false) +table3 = (@test_logs lrtest(modhet, modhom, modnull)) +@test all(isapprox.(table3.deviance, (25.10067039653046,47.00501928245542,47.0776339693065), atol=1e-6)) +@test table3.dof == (4, 3, 2) +@test all(isapprox.(table3.pval[2:end], (2.865837220526082e-6,0.7875671600772386), atol=1e-6)) + +end + +################# +### No intercept +################# +@testset "No Intercept" begin +net = readnewick("(((Ag:5,(#H1:1::0.056,((Ak:2,(E:1,#H2:1::0.004):1):1,(M:2)#H2:1::0.996):1):1):1,(((((Az:1,Ag2:1):1,As:2):1)#H1:1::0.944,Ap:4):1,Ar:5):1):1,(P:4,20:4):3,165:7);"); +preorder!(net) + +## data +Y = [11.640085037749985, 9.498284887480622, 9.568813792749083, 13.036916724865296, 6.873936265709946, 6.536647349405742, 5.95771939864956, 10.517318306450647, 9.34927049737206, 10.176238483133424, 10.760099940744308, 8.955543827353837] +X = [9.199418112245104, 8.641506886650749, 8.827105915999073, 11.198420342332025, 5.8212242346434655, 6.130520100788492, 5.846098148463377, 9.125593652542882, 10.575371612483897, 9.198463833849347, 9.090317561636194, 9.603570747653789] +dfr = DataFrame(trait = Y, reg = X, tipnames = ["Ag","Ak","E","M","Az","Ag2","As","Ap","Ar","P","20","165"]) # sim.M.tipnames +phynetlm = phylolm(@formula(trait ~ -1 + reg), dfr, net; reml=false) +# Naive version (GLS): most of it hard-coded, but code shown below +ntaxa = length(Y) +X = phynetlm.X +# Vy = phynetlm.Vy; Vyinv = inv(Vy); XtVyinv = X' * Vyinv; logdetVy = logdet(Vy) +betahat = [1.073805579608655] # inv(XtVyinv * X) * XtVyinv * Y +fittedValues = X * betahat +resids = Y - fittedValues +# sigma2hat = 1/ntaxa * (resids' * Vyinv * resids) +# loglik = - 1 / 2 * (ntaxa + ntaxa * log(2 * pi) + ntaxa * log(sigma2hat) + logdetVy) +#= null model: no X, and not even an intercept +nullX = zeros(ntaxa, 1); nullresids = Y; nullXtVyinv = nullX' * Vyinv +nullsigma2hat = 1/ntaxa * (nullresids' * Vyinv * nullresids) # 6.666261935713196 +nullloglik = - 1 / 2 * (ntaxa + ntaxa * log(2 * pi) + ntaxa * log(nullsigma2hat) + logdetVy) # -38.01145980802529 +=# +@test coef(phynetlm) ≈ betahat +@test nobs(phynetlm) ≈ 12 # ntaxa +@test residuals(phynetlm) ≈ resids +@test response(phynetlm) ≈ Y +@test predict(phynetlm) ≈ fittedValues +@test dof_residual(phynetlm) ≈ 11 # ntaxa-length(betahat) +@test sigma2_phylo(phynetlm) ≈ 0.1887449836519979 # sigma2hat +@test loglikelihood(phynetlm) ≈ -16.6249533603196 # loglik +@test vcov(phynetlm) ≈ [0.003054397019042955;;] # sigma2hat*ntaxa/(ntaxa-length(betahat))*inv(XtVyinv * X) +@test stderror(phynetlm) ≈ [0.05526659948868715] # sqrt.(diag(sigma2hat*ntaxa/(ntaxa-length(betahat))*inv(XtVyinv * X))) +@test dof(phynetlm) ≈ 2 # length(betahat)+1 +@test deviance(phynetlm, Val(true)) ≈ 2.264939803823975 # sigma2hat * ntaxa +@test nulldeviance(phynetlm) ≈ 79.99514322855836 # nullsigma2hat * ntaxa +@test nullloglikelihood(phynetlm) ≈ -38.01145980802529 # nullloglik +@test r2(phynetlm) ≈ 0.9716865335517596 # 1-sigma2hat / nullsigma2hat +@test adjr2(phynetlm) ≈ 0.9716865335517596 atol=1e-15 # 1 - (1 - (1-sigma2hat/nullsigma2hat))*(ntaxa-1)/(ntaxa-length(betahat)) +@test aic(phynetlm) ≈ 37.2499067206392 # -2*loglik+2*(length(betahat)+1) +@test aicc(phynetlm) ≈ 38.58324005397254 # -2*loglik+2*(length(betahat)+1)+2(length(betahat)+1)*((length(betahat)+1)+1)/(ntaxa-(length(betahat)+1)-1) +@test bic(phynetlm) ≈ 38.219720020215206 # -2*loglik+(length(betahat)+1)*log(ntaxa) +@test !hasintercept(phynetlm) + +end + +############################################################################### +#### Other Network +############################################################################### +@testset "phylolm and ancestralreconstruction" begin +# originally: "(((Ag,(#H1:7.159::0.056,((Ak,(E:0.08,#H2:0.0::0.004):0.023):0.078,(M:0.0)#H2:::0.996):2.49):2.214):0.026,(((((Az:0.002,Ag2:0.023):2.11,As:2.027):1.697)#H1:0.0::0.944,Ap):0.187,Ar):0.723):5.943,(P,20):1.863,165);" +# followed by changes in net.edge[?].length values to make the network ultrametric +net = readnewick("(((Ag:5,(#H1:1::0.056,((Ak:2,(E:1,#H2:1::0.004):1):1,(M:2)#H2:1::0.996):1):1):1,(((((Az:1,Ag2:1):1,As:2):1)#H1:1::0.944,Ap:4):1,Ar:5):1):1,(P:4,20:4):3,165:7);"); + +#= Simulate correlated data in data frames +b0 = 1 +b1 = 10 +Random.seed!(5678) +sim = rand(net, ParamsBM(1, 1)) +A = sim[:tips] +B = b0 .+ b1 * A .+ rand(net, ParamsBM(0, 0.1))[:tips] +tipnam = sim.M.tipnames +=# +A = [2.626609842049044,0.6334773804400937,3.0577676668430476,0.8570052897626761,3.3415290038076875,2.7038939422417467,1.8694860778492748,3.354373836136418,7.436775409527188,2.6659127435884318,3.2298992674067417,-2.2323810599565013] +B = [27.60133970558981,8.228820310098914,32.42043423853238,10.249417359958978,33.52061781961048,27.008691929589997,19.11541648307886,35.38758567184537,75.04861071222199,27.68624399802581,33.03778377357321,-20.4001107607967] +tipnam = ["Ag","Ak","E","M","Az","Ag2","As","Ap","Ar","P","20","165"] + +# With Matrices +X = hcat(ones(12), A) +fit_mat = phylolm(X, B, net; reml=false) +#@show fit_mat + +# Naive version (GLS) +ntaxa = length(B) +Vy = fit_mat.Vy +Vyinv = inv(Vy) +XtVyinv = X' * Vyinv +logdetVy = logdet(Vy) +betahat = inv(XtVyinv * X) * XtVyinv * B +fittedValues = X * betahat +resids = B - fittedValues +sigma2hat = 1/ntaxa * (resids' * Vyinv * resids) +# log likelihood +loglik = - 1 / 2 * (ntaxa + ntaxa * log(2 * pi) + ntaxa * log(sigma2hat) + logdetVy) +# null version +nullX = ones(ntaxa, 1) +nullXtVyinv = nullX' * Vyinv +nullresids = B - nullX * inv(nullXtVyinv * nullX) * nullXtVyinv * B +nullsigma2hat = 1/ntaxa * (nullresids' * Vyinv * nullresids) +nullloglik = - 1 / 2 * (ntaxa + ntaxa * log(2 * pi) + ntaxa * log(nullsigma2hat) + logdetVy) +@test coef(fit_mat) ≈ betahat +@test nobs(fit_mat) ≈ ntaxa +@test residuals(fit_mat) ≈ resids +@test response(fit_mat) ≈ B +@test predict(fit_mat) ≈ fittedValues +@test dof_residual(fit_mat) ≈ ntaxa-length(betahat) +@test sigma2_phylo(fit_mat) ≈ sigma2hat +@test loglikelihood(fit_mat) ≈ loglik +@test vcov(fit_mat) ≈ sigma2hat*ntaxa/(ntaxa-length(betahat)).*inv(XtVyinv * X) +@test stderror(fit_mat) ≈ sqrt.(diag(sigma2hat*ntaxa/(ntaxa-length(betahat)).*inv(XtVyinv * X))) +@test dof(fit_mat) ≈ length(betahat)+1 +@test deviance(fit_mat, Val(true)) ≈ sigma2hat * ntaxa +@test nulldeviance(fit_mat) ≈ nullsigma2hat * ntaxa +@test nullloglikelihood(fit_mat) ≈ nullloglik +@test r2(fit_mat) ≈ 1-sigma2hat / nullsigma2hat atol=1e-15 +@test adjr2(fit_mat) ≈ 1 - (1 - (1-sigma2hat/nullsigma2hat))*(ntaxa-1)/(ntaxa-length(betahat)) atol=1e-15 +@test aic(fit_mat) ≈ -2*loglik+2*(length(betahat)+1) +@test aicc(fit_mat) ≈ -2*loglik+2*(length(betahat)+1)+2(length(betahat)+1)*((length(betahat)+1)+1)/(ntaxa-(length(betahat)+1)-1) +@test bic(fit_mat) ≈ -2*loglik+(length(betahat)+1)*log(ntaxa) + +## perfect user using right format and formula +dfr = DataFrame(trait=B, pred=A, tipnames=tipnam) +phynetlm = phylolm(@formula(trait ~ pred), dfr, net; reml=false) +#@show phynetlm + +@test coef(phynetlm) ≈ coef(fit_mat) +@test vcov(phynetlm) ≈ vcov(fit_mat) +@test nobs(phynetlm) ≈ nobs(fit_mat) +@test residuals(phynetlm) ≈ residuals(fit_mat) +@test response(phynetlm) ≈ response(fit_mat) +@test predict(phynetlm) ≈ predict(fit_mat) +@test dof_residual(phynetlm) ≈ dof_residual(fit_mat) +@test sigma2_phylo(phynetlm) ≈ sigma2_phylo(fit_mat) +@test stderror(phynetlm) ≈ stderror(fit_mat) +@test confint(phynetlm) ≈ confint(fit_mat) +@test loglikelihood(phynetlm) ≈ loglikelihood(fit_mat) +@test dof(phynetlm) ≈ dof(fit_mat) +@test deviance(phynetlm, Val(true)) ≈ deviance(fit_mat, Val(true)) +@test nulldeviance(phynetlm) ≈ nulldeviance(fit_mat) +@test nullloglikelihood(phynetlm) ≈ nullloglikelihood(fit_mat) +@test r2(phynetlm) ≈ r2(fit_mat) +@test adjr2(phynetlm) ≈ adjr2(fit_mat) +@test aic(phynetlm) ≈ aic(fit_mat) +@test aicc(phynetlm) ≈ aicc(fit_mat) +@test bic(phynetlm) ≈ bic(fit_mat) + +# unordered data +dfr = dfr[[2,6,10,5,12,7,4,11,1,8,3,9], :] +fitbis = phylolm(@formula(trait ~ pred), dfr, net; reml=false) + +@test coef(phynetlm) ≈ coef(fitbis) +@test vcov(phynetlm) ≈ vcov(fitbis) +@test nobs(phynetlm) ≈ nobs(fitbis) +@test residuals(phynetlm)[fitbis.ind] ≈ residuals(fitbis) +@test response(phynetlm)[fitbis.ind] ≈ response(fitbis) +@test predict(phynetlm)[fitbis.ind] ≈ predict(fitbis) +@test dof_residual(phynetlm) ≈ dof_residual(fitbis) +@test sigma2_phylo(phynetlm) ≈ sigma2_phylo(fitbis) +@test stderror(phynetlm) ≈ stderror(fitbis) +@test confint(phynetlm) ≈ confint(fitbis) +@test loglikelihood(phynetlm) ≈ loglikelihood(fitbis) +@test dof(phynetlm) ≈ dof(fitbis) +@test deviance(phynetlm, Val(true)) ≈ deviance(fitbis, Val(true)) +@test nulldeviance(phynetlm) ≈ nulldeviance(fitbis) +@test nullloglikelihood(phynetlm) ≈ nullloglikelihood(fitbis) +@test r2(phynetlm) ≈ r2(fitbis) +@test adjr2(phynetlm) ≈ adjr2(fitbis) +@test aic(phynetlm) ≈ aic(fitbis) +@test aicc(phynetlm) ≈ aicc(fitbis) +@test bic(phynetlm) ≈ bic(fitbis) +@test mu_phylo(phynetlm) ≈ mu_phylo(fitbis) + +# unnamed ordered data +dfr = DataFrame(trait = B, pred = A) +fitter = (@test_logs (:info, r"^As requested \(no_names=true\)") match_mode=:any phylolm(@formula(trait ~ pred), dfr, net, no_names=true, reml=false)) + +@test coef(phynetlm) ≈ coef(fitter) +@test vcov(phynetlm) ≈ vcov(fitter) +@test nobs(phynetlm) ≈ nobs(fitter) +@test residuals(phynetlm) ≈ residuals(fitter) +@test response(phynetlm) ≈ response(fitter) +@test predict(phynetlm) ≈ predict(fitter) +@test dof_residual(phynetlm) ≈ dof_residual(fitter) +@test sigma2_phylo(phynetlm) ≈ sigma2_phylo(fitter) +@test stderror(phynetlm) ≈ stderror(fitter) +@test confint(phynetlm) ≈ confint(fitter) +@test loglikelihood(phynetlm) ≈ loglikelihood(fitter) +@test dof(phynetlm) ≈ dof(fitter) +@test deviance(phynetlm, Val(true)) ≈ deviance(fitter, Val(true)) +@test nulldeviance(phynetlm) ≈ nulldeviance(fitter) +@test nullloglikelihood(phynetlm) ≈ nullloglikelihood(fitter) +@test r2(phynetlm) ≈ r2(fitter) +@test adjr2(phynetlm) ≈ adjr2(fitter) +@test aic(phynetlm) ≈ aic(fitter) +@test aicc(phynetlm) ≈ aicc(fitter) +@test bic(phynetlm) ≈ bic(fitter) + +# unnamed un-ordered data +dfr = dfr[[9,6,5,10,1,11,12,7,2,3,8,4], :] +@test_throws ErrorException phylolm(@formula(trait ~ pred), dfr, net) # Wrong pred + +### Add NAs +dfr = DataFrame(trait=B, pred=A, tipnames=tipnam) +allowmissing!(dfr, :pred) +dfr[[2, 8, 11], :pred] .= missing +fitna = phylolm(@formula(trait ~ pred), dfr, net) +#@show fitna + +dfr = dfr[[8,2,3,4,6,10,9,1,11,12,7,5], :] +fitnabis = phylolm(@formula(trait ~ pred), dfr, net) +@test coef(fitna) ≈ coef(fitnabis) +@test vcov(fitna) ≈ vcov(fitnabis) +@test nobs(fitna) ≈ nobs(fitnabis) +@test sort(residuals(fitna)) ≈ sort(residuals(fitnabis)) +@test sort(response(fitna)) ≈ sort(response(fitnabis)) +@test sort(predict(fitna)) ≈ sort(predict(fitnabis)) +@test dof_residual(fitna) ≈ dof_residual(fitnabis) +@test sigma2_phylo(fitna) ≈ sigma2_phylo(fitnabis) +@test stderror(fitna) ≈ stderror(fitnabis) +@test confint(fitna) ≈ confint(fitnabis) +@test loglikelihood(fitna) ≈ loglikelihood(fitnabis) +@test dof(fitna) ≈ dof(fitnabis) +@test deviance(fitna, Val(true)) ≈ deviance(fitnabis, Val(true)) +@test nulldeviance(fitna) ≈ nulldeviance(fitnabis) +@test (@test_logs (:warn, r"^ML") nullloglikelihood(fitna)) ≈ (@test_logs (:warn, r"^ML") nullloglikelihood(fitnabis)) +@test r2(fitna) ≈ r2(fitnabis) +@test adjr2(fitna) ≈ adjr2(fitnabis) +@test aic(fitna) ≈ aic(fitnabis) +@test aicc(fitna) ≈ aicc(fitnabis) +@test bic(fitna) ≈ bic(fitnabis) + +## Tests against fixed values parameters +fitlam = (@test_logs (:warn, + r"^The network is not time consistent") phylolm( + @formula(trait ~ pred), dfr, net, model="lambda", fixedValue=1.0) +) +@test lambda_estim(fitlam) ≈ 1.0 +@test coef(fitlam) ≈ coef(fitnabis) +@test vcov(fitlam) ≈ vcov(fitnabis) +@test nobs(fitlam) ≈ nobs(fitnabis) +@test residuals(fitlam) ≈ residuals(fitnabis) +@test response(fitlam) ≈ response(fitnabis) +@test predict(fitlam) ≈ predict(fitnabis) +@test dof_residual(fitlam) ≈ dof_residual(fitnabis) +@test sigma2_phylo(fitlam) ≈ sigma2_phylo(fitnabis) +@test stderror(fitlam) ≈ stderror(fitnabis) +@test confint(fitlam) ≈ confint(fitnabis) +@test loglikelihood(fitlam) ≈ loglikelihood(fitnabis) +@test dof(fitlam) ≈ dof(fitnabis) + 1 +@test deviance(fitlam, Val(true)) ≈ deviance(fitnabis, Val(true)) +@test nulldeviance(fitlam) ≈ nulldeviance(fitnabis) +@test (@test_logs (:warn, r"^ML") nullloglikelihood(fitlam)) ≈ (@test_logs (:warn, r"^ML") nullloglikelihood(fitnabis)) +@test r2(fitlam) ≈ r2(fitnabis) atol=1e-15 +@test adjr2(fitlam)-1 ≈ (adjr2(fitnabis)-1)*(nobs(fitnabis)-dof(fitnabis)+1)/(nobs(fitnabis)-dof(fitlam)+1) atol=1e-15 +@test aic(fitlam) ≈ aic(fitnabis) + 2 +#@test aicc(fitlam) ≈ aicc(fitnabis) +@test bic(fitlam) ≈ bic(fitnabis) + log(nobs(fitnabis)) +@test mu_phylo(fitlam) ≈ mu_phylo(fitnabis) + +fitSH = phylolm(@formula(trait ~ pred), dfr, net, model="scalinghybrid", fixedValue=1.0) +@test loglikelihood(fitlam) ≈ loglikelihood(fitSH) +@test aic(fitlam) ≈ aic(fitSH) + +## Pagel's Lambda +fitlam = (@test_logs (:info, r"^Maximum lambda value") match_mode=:any phylolm( + @formula(trait ~ pred), dfr, net, model="lambda", reml=false)) +#@show fitlam +@test lambda_estim(fitlam) ≈ 1.1135518305 atol=1e-6 + +## scaling Hybrid +fitSH = phylolm(@formula(trait ~ pred), dfr, net, model="scalinghybrid", reml=false) +@test_logs show(devnull, fitSH) +@test lambda_estim(fitSH) ≈ -52.81305448333567 atol=1e-6 + +### Ancestral State Reconstruction +params = ParamsBM(3, 1) +# sim = rand(net, params); Y = sim[:tips]; tipnam=tiplabels(sim) +Y = [7.49814057852738,7.713232061975018,7.4314117011628795,0.9850885689559203,4.970152778471174,5.384066549416034,4.326644522544125,0.6079385242666691,4.084254785718834,5.501648315448596,3.8732700346136597,4.790127215808698] +tipnam = ["Ag","Ak","E","M","Az","Ag2","As","Ap","Ar","P","20","165"] +# From known parameters +ancestral_traits = ancestralreconstruction(net, Y, params) +# BLUP +dfr = DataFrame(trait=Y, tipnames=tipnam) +phynetlm = phylolm(@formula(trait~1), dfr, net) +# prediction intervals larger with reml=true than with reml=false +blup = (@test_logs (:warn, r"^These prediction intervals show uncertainty in ancestral values") ancestralreconstruction(phynetlm)); +# plot(net, blup) +@test_logs show(devnull, blup) + +# BLUP same, using the function directly +blup_bis = (@test_logs (:warn, r"^These prediction intervals show uncertainty in ancestral values") match_mode=:any ancestralreconstruction(dfr, net)); + +@test predict(blup)[!,:prediction] ≈ predict(blup_bis)[!,:prediction] +@test predict(blup)[!,:nodenumber] ≈ predict(blup_bis)[!,:nodenumber] +@test blup.traits_tips ≈ blup_bis.traits_tips +@test blup.tipnumbers ≈ blup_bis.tipnumbers +@test predict(blup,interval=:prediction) ≈ predict(blup_bis,interval=:prediction) +@test predict(blup,interval=:prediction,text=true)[!,:interval] == predict(blup_bis,interval=:prediction,text=true)[!,:interval] +@test predict(blup,interval=:prediction,text=true,combine=true)[!,:interval] == predict(blup_bis,interval=:prediction,text=true,combine=true)[!,:interval] +@test predict(blup,text=true)[!,:prediction] == predict(blup_bis,text=true)[!,:prediction] + +dfr = DataFrame(trait=Y, tipnames=tipnam, reg=Y) +@test_throws ErrorException ancestralreconstruction(dfr, net) # cannot handle a predictor + +# Unordered +dfr2 = dfr[[5,4,9,2,6,12,8,11,7,1,3,10], :] +phynetlm = phylolm(@formula(trait~1), dfr2, net) +blup2 = (@test_logs (:warn, r"^These prediction intervals show uncertainty in ancestral values") ancestralreconstruction(phynetlm)) + +@test predict(blup)[1:length(blup.nodenumbers),:prediction] ≈ predict(blup2)[1:length(blup.nodenumbers),:prediction] +@test blup.traits_tips[phynetlm.ind] ≈ blup2.traits_tips +@test blup.tipnumbers[phynetlm.ind] ≈ blup2.tipnumbers +@test predict(blup,interval=:prediction)[1:length(blup.nodenumbers), :] ≈ predict(blup2,interval=:prediction)[1:length(blup.nodenumbers), :] + +# With unknown tips +allowmissing!(dfr, :trait) +dfr[[2, 4], :trait] .= missing +phynetlm = phylolm(@formula(trait~1), dfr, net) +blup = (@test_logs (:warn, r"^These prediction intervals show uncertainty in ancestral values") ancestralreconstruction(phynetlm)) +# plot(net, blup) + +# Unordered +dfr2 = dfr[[1, 2, 5, 3, 4, 6, 7, 8, 9, 10, 11, 12], :] +phynetlm = phylolm(@formula(trait~1), dfr, net) +blup2 = (@test_logs (:warn, r"^These prediction intervals show uncertainty in ancestral values") ancestralreconstruction(phynetlm)) + +@test predict(blup)[!,:prediction] ≈ predict(blup2)[!,:prediction] +@test predict(blup,interval=:prediction) ≈ predict(blup2,interval=:prediction) +@test predict(blup,interval=:prediction,text=true)[!,:interval] == predict(blup2,interval=:prediction,text=true)[!,:interval] +@test predict(blup,interval=:prediction,text=true,combine=true)[!,:interval] == predict(blup2,interval=:prediction,text=true,combine=true)[!,:interval] + +# Test mark on missing +ee = predict(blup,text=true) +predMiss = ee[indexin([n.number for n in net.leaf][[2,4]], ee[!,:nodenumber]),:prediction] +for pp = predMiss + @test pp[end] == '*' +end + +end + +################# +## Data with no phylogenetic signal +################# +@testset "lambda when no signal" begin +net = readnewick("(((Ag:5,(#H1:1::0.056,((Ak:2,(E:1,#H2:1::0.004):1):1,(M:2)#H2:1::0.996):1):1):1,(((((Az:1,Ag2:1):1,As:2):1)#H1:1::0.944,Ap:4):1,Ar:5):1):1,(P:4,20:4):3,165:7);"); + +#= Simulate correlated data in data frames +b0 = 1 +b1 = 10 +Random.seed!(5678); +A = randn(size(tiplabels(net), 1)) +B = b0 .+ (b1 .* A + randn(size(tiplabels(net), 1))) +=# +A = [-1.2217252038914663, 0.8431411538631137, 0.3847679754817904, 0.10277471357263539, 1.0944221266744778, 2.053347250198844, 1.4708882134841876, 1.1056475371071361, -0.94952153892202, -0.3477162381565148, -0.2742415177451819, 0.25034046948064764] +B = [-9.849415384443805, 10.765309004952346, 4.8269904926118565, 1.7279441642635127, 11.535570136728504, 20.16670120778599, 13.971404727143286, 13.019084912634444, -8.278125099304921, -4.784290010378141, -2.537139017477904, 2.9460706727827755] +dfr = DataFrame(trait = B, pred = A, tipnames = tiplabels(net)) + +## Network +phynetlm = (@test_logs (:info, r"^Maximum lambda value") match_mode=:any phylolm( + @formula(trait ~ pred), dfr, net, model="lambda", reml=false)) +@test lambda_estim(phynetlm) ≈ 0.5894200143 atol=1e-8 +# using REML +phynetlm = (@test_logs (:warn, r"not time consistent") (:info, r"^Max") phylolm( + @formula(trait ~ pred), dfr, net, model="lambda")) +@test lambda_estim(phynetlm) ≈ 0.8356905283 atol=1e-7 + +## Major Tree +global tree +tree = majortree(net) +phynetlm = (@test_logs (:info, r"^Maximum lambda value") match_mode=:any phylolm(@formula(trait ~ pred), dfr, tree, model="lambda", reml=false)) + +@test lambda_estim(phynetlm) ≈ 0.5903394415 atol=1e-6 + +## scaling Hybrid +lmtree = phylolm(@formula(trait ~ pred), dfr, tree, model = "BM") +lmnet = phylolm(@formula(trait ~ pred), dfr, net, model = "BM") +lmSHzero = phylolm(@formula(trait ~ pred), dfr, net, model = "scalinghybrid", fixedValue = 0.0) +lmSHone = phylolm(@formula(trait ~ pred), dfr, net, model = "scalinghybrid", fixedValue = 1.0) + +@test loglikelihood(lmtree) ≈ loglikelihood(lmSHzero) +@test loglikelihood(lmnet) ≈ loglikelihood(lmSHone) + +lmSH = phylolm(@formula(trait ~ pred), dfr, net, model="scalinghybrid", reml=false) +@test lambda_estim(lmSH) ≈ 23.46668204551696 atol=1e-5 +lmSH = phylolm(@formula(trait ~ pred), dfr, net, model="scalinghybrid") +@test lambda_estim(lmSH) ≈ 24.61373831478016 atol=1e-5 +# λ so large?? largest γ = 0.056, so λγ = 1.34 is > 1... +end + +############################################################################### +### Undefined branch lengths +############################################################################### +@testset "Undefined branch length" begin + ## No branch length + net = readnewick("(A:2.5,((B,#H1:1::0.1):1,(C:1,(D:1)#H1:1::0.9):1):0.5);"); + dfr = DataFrame(trait = [11.6,8.1,10.3,9.1], tipnames = ["A","B","C","D"]); + @test_throws ErrorException("""Branch(es) number 2 have no length. + The variance-covariance matrix of the network is not defined. + A phylogenetic regression cannot be done.""") phylolm(@formula(trait ~ 1), dfr, net); + ## Negative branch length + net.edge[2].length = -0.5; + @test_throws ErrorException("""Branch(es) number 2 have negative length. + The variance-covariance matrix of the network is not defined. + A phylogenetic regression cannot be done.""") phylolm(@formula(trait ~ 1), dfr, net); + ## Zero branch length: allowed + net.edge[2].length = 0.0; + fit = phylolm(@formula(trait ~ 1), dfr, net); + @test loglikelihood(fit) ≈ -6.245746681512051 + net.edge[2].length = 0.1; # back to non-zero + ## Illicit zero length for 1st edge: from root to single "outgroup" taxon + net.edge[1].length = 0.0; + @test_throws PosDefException phylolm(@formula(trait ~ 1), dfr, net); +end + +############################ +## Against no regressor +########################### +#= fixit: passes with GML up to v1.3, fails with GLM v1.4. `lm()` has by default +# `allowrankdeficient=false` in v1.3, but `dropcollinear=true` in v1.4 +# We would need `dropcollinear=false` in this test. fixit later: pass kwargs... ? +# no predictors, so REML = ML in this case +@testset "phylolm with no regressor" begin +net = readnewick("(((Ag:5,(#H1:1::0.056,((Ak:2,(E:1,#H2:1::0.004):1):1,(M:2)#H2:1::0.996):1):1):1,(((((Az:1,Ag2:1):1,As:2):1)#H1:1::0.944,Ap:4):1,Ar:5):1):1,(P:4,20:4):3,165:7);"); + +params = ParamsBM(10, 1) +Random.seed!(2468) # sets the seed for reproducibility, to debug potential error +sim = rand(net, params) +Y = sim[:tips] +phynetlm = phylolm(zeros(length(Y),0), Y, net) +#@show phynetlm +# Naive version (GLS) +ntaxa = length(Y) +Vy = phynetlm.Vy +Vyinv = inv(Vy) +logdetVy = logdet(Vy) +fittedValues = zeros(length(Y)) +resids = Y - fittedValues +sigma2hat = 1/ntaxa * (resids' * Vyinv * resids) +# log likelihood +loglik = - 1 / 2 * (ntaxa + ntaxa * log(2 * pi) + ntaxa * log(sigma2hat) + logdetVy) +# null version +nullX = ones(ntaxa, 1) +nullXtVyinv = nullX' * Vyinv +nullresids = Y - nullX * inv(nullXtVyinv * nullX) * nullXtVyinv * Y +nullsigma2hat = 1/ntaxa * (nullresids' * Vyinv * nullresids) +nullloglik = - 1 / 2 * (ntaxa + ntaxa * log(2 * pi) + ntaxa * log(nullsigma2hat) + logdetVy) + +@test nobs(phynetlm) ≈ ntaxa +@test residuals(phynetlm) ≈ resids +@test response(phynetlm) ≈ Y +@test predict(phynetlm) ≈ fittedValues +@test dof_residual(phynetlm) ≈ ntaxa +@test sigma2_phylo(phynetlm) ≈ sigma2hat +@test loglikelihood(phynetlm) ≈ loglik +@test deviance(phynetlm, Val(true)) ≈ sigma2hat * ntaxa +@test nulldeviance(phynetlm) ≈ nullsigma2hat * ntaxa +@test nullloglikelihood(phynetlm) ≈ nullloglik +@test r2(phynetlm) ≈ 1-sigma2hat / nullsigma2hat atol=1e-14 +@test adjr2(phynetlm) ≈ 1 - (1 - (1-sigma2hat/nullsigma2hat))*(ntaxa-1)/(ntaxa) atol=1e-14 +@test aic(phynetlm) ≈ -2*loglik+2*(1) +@test aicc(phynetlm) ≈ -2*loglik+2*(1)+2(1)*((1)+1)/(ntaxa-(1)-1) +@test bic(phynetlm) ≈ -2*loglik+(1)*log(ntaxa) + +# with data frames +dfr = DataFrame(trait = Y, tipnames = sim.M.tipnames) +fitbis = phylolm(@formula(trait ~ -1), dfr, net) +@test_logs show(devnull, fitbis) +#@test coef(phynetlm) ≈ coef(fitbis) +#@test vcov(phynetlm) ≈ vcov(fitbis) +@test nobs(phynetlm) ≈ nobs(fitbis) +@test residuals(phynetlm)[fitbis.ind] ≈ residuals(fitbis) +@test response(phynetlm)[fitbis.ind] ≈ response(fitbis) +@test predict(phynetlm)[fitbis.ind] ≈ predict(fitbis) +@test dof_residual(phynetlm) ≈ dof_residual(fitbis) +@test sigma2_phylo(phynetlm) ≈ sigma2_phylo(fitbis) +#@test stderror(phynetlm) ≈ stderror(fitbis) +#@test confint(phynetlm) ≈ confint(fitbis) +@test loglikelihood(phynetlm) ≈ loglikelihood(fitbis) +#@test dof(phynetlm) ≈ dof(fitbis) +@test deviance(phynetlm, Val(true)) ≈ deviance(fitbis, Val(true)) +@test nulldeviance(phynetlm) ≈ nulldeviance(fitbis) +@test nullloglikelihood(phynetlm) ≈ nullloglikelihood(fitbis) +@test r2(phynetlm) ≈ r2(fitbis) atol=1e-15 +@test adjr2(phynetlm) ≈ adjr2(fitbis) atol=1e-15 +@test aic(phynetlm) ≈ aic(fitbis) +@test aicc(phynetlm) ≈ aicc(fitbis) +@test bic(phynetlm) ≈ bic(fitbis) +#@test mu_phylo(phynetlm) mu_phylo(fitbis) +end +=# diff --git a/test/test_lm_tree.jl b/test/test_lm_tree.jl new file mode 100644 index 0000000..cc17919 --- /dev/null +++ b/test/test_lm_tree.jl @@ -0,0 +1,467 @@ +# Test of phylolm on trees + +############################################################################### +## Caudata dataset - shared paths matrix + +@testset "phylolm: Caudata Dataset" begin +## Export "caudata" dataset (from geiger) +phy = readnewick(joinpath(@__DIR__, "..", "examples", "caudata_tree.txt")); + +V = sharedpathmatrix(phy); +VR = CSV.read(joinpath(@__DIR__,"..","examples","caudata_shared_paths.txt"), DataFrame) +VR = Matrix(VR); + +# Tips +@test V[:tips] ≈ VR[1:197, 1:197] + +# Internal nodes +intnodes_in_VR = -V.internalnodenumbers .+ 196 +@test V[:internalnodes] ≈ VR[intnodes_in_VR, intnodes_in_VR] +# tips in rows, internal nodes in columns +@test V[:tipsnodes] ≈ VR[1:197, intnodes_in_VR] + +#= R Code to get those results +library(geiger) +data("caudata") # (salamanders) +write.tree(caudata$phy, file="caudata_tree.txt", append=F, digits=10, tree.names=F) +V <- node.depth.edgelength(caudata$phy) # time shared +prac <- mrca(caudata$phy, full = TRUE) +V <- matrix(V[prac], dim(prac)) +write.table(V, file="caudata_shared_paths.txt", sep = ",", row.names=F, col.names=T) +=# + +############################################################################### +## Caudata dataset - BM + +## Export "caudata" dataset (from geiger) +phy = readnewick(joinpath(@__DIR__, "..", "examples", "caudata_tree.txt")); +dat = CSV.read(joinpath(@__DIR__,"..","examples","caudata_trait.txt"), DataFrame); + +## Fit a BM +fitBM = phylolm(@formula(trait ~ 1), dat, phy; reml=false) + +# Tests against results obtained with geiger::fitContinuous or phylolm::phylolm +@test loglikelihood(fitBM) ≈ -78.9611507833 atol=1e-10 +@test dof(fitBM) ≈ 2.0 atol=1e-10 +@test aic(fitBM) ≈ 161.9223015666 atol=1e-10 +@test aicc(fitBM) ≈ 161.9841572367 atol=1e-10 +@test coef(fitBM) ≈ [4.6789989001] atol=1e-8 +@test vcov(fitBM) ≈ [0.1093144100] atol=1e-10 +@test nobs(fitBM) ≈ 197.0 atol=1e-10 +@test sum(residuals(fitBM)) ≈ -115.5767321312 atol=1e-8 +@test dof_residual(fitBM) ≈ 196.0 atol=1e-10 +@test sigma2_phylo(fitBM) ≈ 0.0029452097 atol=1e-10 +@test stderror(fitBM) ≈ [0.3306272978] atol=1e-10 +@test confint(fitBM)[1] ≈ 4.0269551772 atol=1e-10 +@test confint(fitBM)[2] ≈ 5.3310426231 atol=1e-10 +@test predict(fitBM) ≈ [4.6789989001 for i in 1:197] atol=1e-8 + +### Ancestral state reconstruction (with Rphylopars) +anc = (@test_logs (:warn, r"^These prediction intervals show uncertainty in ancestral values") ancestralreconstruction(fitBM)); +ancR = CSV.read(joinpath(@__DIR__,"..","examples","caudata_Rphylopars.txt"), DataFrame) + +## Expectations +expe = predict(anc) +expeR = ancR[!,:trait] +# Matching tips ? +tipsR = expeR[expe[197:393, :nodenumber]] +tipsJulia = expe[197:393, :prediction] +@test tipsR ≈ tipsJulia +# Matching nodes ? +nodesR = expeR[-expe[1:196, :nodenumber] .+ 196] +nodesJulia = expe[1:196, :prediction] +# below: print for when the test was broken +#@show nodesR[1:6], nodesR[190:end] +#@show nodesJulia[1:6],nodesJulia[190:end] +@test isapprox(nodesR, nodesJulia) + +## Variances +vars = diag(anc.variances_nodes) +# Rphylopars +varsR = ancR[!,:var] +# Matching nodes ? +nodesR = varsR[-expe[1:196, :nodenumber] .+ 196] +@test nodesR ≈ vars atol=1e-3 ## RK: Small tol !! + +### Ancestral state reconstruction (with Phytools) +ancRt = CSV.read(joinpath(@__DIR__,"..","examples","caudata_Phytools.txt"), DataFrame) + +## Expectations +expe = predict(anc) +expeRt = ancRt[!,:trait] +# Matching nodes ? +nodesRt = expeRt[-expe[1:196, :nodenumber] .+ (196 - 197)] +nodesJulia = expe[1:196, :prediction] +# below: print for when the test was broken +#@show nodesRt[1:6], nodesRt[190:end] +#@show nodesJulia[1:6],nodesJulia[190:end] +@test isapprox(nodesRt, nodesJulia) + +## Variances +vars = diag(anc.variances_nodes) +# Rphylopars +varsRt = ancRt[!,:var] +# Matching nodes ? +nodesRt = varsRt[-expe[1:196, :nodenumber] .+ (196 - 197)] +@test nodesRt ≈ vars atol=2e-3 ## RK: Small tol !! + +### Comparison between Rphylopars and Phytools: +@test nodesRt ≈ nodesR atol=0.003 ## RK: Small tol !! + +#= ## R script to get the above values: +library(geiger) +data("caudata") # salamanders +write.tree(caudata$phy, file="caudata_tree.txt", append=F, digits=10, tree.names=F) +write.table(data.frame(tipsNames = names(caudata$dat), trait = unname(caudata$dat)), + file = "caudata_trait.txt", sep = ",", row.names = FALSE) +# fit using Geiger +fitgeiger <- fitContinuous(caudata$phy, caudata$dat, model = "BM") +# fit using phylolm +library(phylolm) +fitphylolm <- phylolm(trait ~ 1, data.frame(trait = caudata$dat), caudata$phy, model="BM") +# fit using Rphylopars +library(Rphylopars) +fitphylopars <- phylopars(data.frame(species = names(caudata$dat), + trait = unname(caudata$dat)), caudata$phy, pheno_error=F, pheno_correlated=F, + REML = FALSE) +# save results of Rphylopars for ancestral trait reconstruction +write.table(data.frame(trait = unname(fitphylopars$anc_recon), + var = unname(fitphylopars$anc_var)), + file = "caudata_Rphylopars.txt", + sep = ",", row.names = FALSE) +# +# ancestral State reconstruction using phytools +library(phytools) +fitphytools <- fastAnc(caudata$phy, caudata$dat, vars = TRUE) +# Save results of Rphylopars for ancestral trait reconstruction +write.table(data.frame(trait = unname(fitphytools$ace), + var = unname(fitphytools$var)), + file = "caudata_Phytools.txt", + sep = ",", row.names = FALSE) +## Quantities to compare +sprintf("%.10f", fitgeiger$opt$ln) # log likelihood +sprintf("%.10f", fitphylolm$logLik) +sprintf("%.10f", fitphylopars$logLik) +sprintf("%.10f", fitgeiger$opt$aic) # aic +sprintf("%.10f", fitphylolm$aic) +sprintf("%.10f", fitgeiger$opt$aicc) # aicc +sprintf("%.10f", fitphylolm$coefficients) # coef +sprintf("%.10f", fitgeiger$opt$z0) +sprintf("%.10f", fitphylopars$mu) +sprintf("%.10f", fitphylolm$vcov) # vcov +sprintf("%.10f", fitphylolm$n) # nobs +sprintf("%.10f", sum(fitphylolm$residuals)) # residuals (sum) +sprintf("%.10f", fitphylolm$n - fitphylolm$d) # df residuals +sprintf("%.10f", fitphylolm$sigma2) # sigma 2 +sprintf("%.10f", fitgeiger$opt$sigsq) +sprintf("%.10f", fitphylopars$pars$phylocov) +sprintf("%.10f", summary(fitphylolm)$coefficients[2]) # std error +sprintf("%.10f", summary(fitphylolm)$df) # df +sprintf("%.10f", fitgeiger$opt$k) +sprintf("%.10f", coef(fitphylolm) + summary(fitphylolm)$coefficients[2] * qt(0.025, 196)) +sprintf("%.10f", coef(fitphylolm) + summary(fitphylolm)$coefficients[2] * qt(0.975, 196)) +sprintf("%.10f", predict(fitphylolm)) # df +=# + +############################################################################### +## Caudata dataset - Pagel's lambda +############################################################################### + +## Fit Pagel's lambda +fitLambda = (@test_logs (:info, r"^Maximum lambda value") match_mode=:any phylolm(@formula(trait ~ 1), dat, phy, model = "lambda", reml=false)); + +@test lambda_estim(fitLambda) ≈ 0.9193 atol=1e-4 # Due to convergence issues, tolerance is lower. +@test loglikelihood(fitLambda) ≈ -51.684379 atol=1e-6 +@test dof(fitLambda) ≈ 3.0 atol=1e-10 +@test aic(fitLambda) ≈ 109.368759 atol=1e-6 +@test aicc(fitLambda) ≈ 109.493111 atol=1e-6 +@test coef(fitLambda) ≈ [4.66893] atol=1e-5 +@test vcov(fitLambda) ≈ [0.05111] atol=1e-5 +@test nobs(fitLambda) ≈ 197.0 atol=1e-10 +# below: print for when the test was broken +#@show sum(residuals(fitLambda)) # locally: -115.91591040367894 +#println("is this -113.594?") +@test isapprox(sum(residuals(fitLambda)), -113.594, atol=1e-2) ## Low Tolerance !! +@test dof_residual(fitLambda) ≈ 196.0 atol=1e-10 ## Correct Definition ? +@test sigma2_phylo(fitLambda) ≈ 0.0014756 atol=1e-7 +@test stderror(fitLambda) ≈ [0.22608] atol=1e-5 +@test confint(fitLambda)[1] ≈ 4.2230 atol=1e-4 +@test confint(fitLambda)[2] ≈ 5.114 atol=1e-3 +tmp = predict(fitLambda); +# below: print for when the test was broken +#@show length(tmp) +#@show tmp[1:6], tmp[190:end] # all 4.66893 except for last 5: 8.42676, 8.44585, etc. +#println("are they all 4.66893?") +# next: looks random. sometimes passes, most times fails +@test predict(fitLambda) ≈ [4.66893 for i in 1:197] atol=1e-5 norm=x->norm(x,Inf) + +#= ## R script to get the above values: +library(geiger) +data("caudata") +# fit using Geiger +fitgeiger <- fitContinuous(caudata$phy, caudata$dat, model = "lambda") +# fit using phylolm +library(phylolm) +fitphylolm <- phylolm(trait ~ 1, + data.frame(trait = caudata$dat), + caudata$phy, model = "lambda", + starting.value = 0.9) +# fit using Rphylopars +library(Rphylopars) +fitphylopars <- phylopars(data.frame(species = names(caudata$dat), + trait = unname(caudata$dat)), + caudata$phy, + model = "lambda", + model_par_start = 0.9, + pheno_error = FALSE, + pheno_correlated = FALSE, + REML = FALSE) +## Quantities to compare +sprintf("%.10f", fitgeiger$opt$ln) # log likelihood +sprintf("%.10f", fitphylolm$logLik) +sprintf("%.10f", fitphylopars$logLik) +sprintf("%.10f", fitgeiger$opt$aic) # aic +sprintf("%.10f", fitphylolm$aic) +sprintf("%.10f", fitgeiger$opt$aicc) # aicc +sprintf("%.10f", fitphylolm$coefficients) # coef +sprintf("%.10f", fitgeiger$opt$z0) +sprintf("%.10f", fitphylopars$mu) +sprintf("%.10f", fitphylolm$vcov) # vcov +sprintf("%.10f", fitphylolm$n) # nobs +sprintf("%.10f", sum(fitphylolm$residuals)) # residuals (sum) +sprintf("%.10f", fitphylolm$n - fitphylolm$d) # df residuals +sprintf("%.10f", fitphylolm$sigma2) # sigma 2 +sprintf("%.10f", fitgeiger$opt$sigsq) +sprintf("%.10f", fitphylopars$pars$phylocov) +sprintf("%.10f", summary(fitphylolm)$coefficients[2]) # std error +sprintf("%.10f", summary(fitphylolm)$df) # df +sprintf("%.10f", fitgeiger$opt$k) +sprintf("%.10f", coef(fitphylolm) + summary(fitphylolm)$coefficients[2] * qt(0.025, 196)) +sprintf("%.10f", coef(fitphylolm) + summary(fitphylolm)$coefficients[2] * qt(0.975, 196)) +sprintf("%.10f", predict(fitphylolm)) # df +=# + +############################################################################### +## Caudata dataset - BM with shifts +############################################################################### + +## Export "caudata" dataset (from geiger) +phy = readnewick(joinpath(@__DIR__, "..", "examples", "caudata_tree.txt")); +dat = CSV.read(joinpath(@__DIR__,"..","examples","caudata_trait.txt"), DataFrame) + +## Add some shifts in the model +df_shift = descendencedataframe(phy, phy.edge[[98, 326, 287]]) +dat = innerjoin(dat, df_shift, on=:tipnames) +## Fit a BM +fitBM = phylolm(@formula(trait ~ shift_98 + shift_326 + shift_287), dat, phy; reml=false) + +# Tests against results obtained with geiger::fitContinuous or phylolm::phylolm +@test loglikelihood(fitBM) ≈ -76.1541605207 atol=1e-10 +@test dof(fitBM) ≈ 5.0 atol=1e-10 +@test aic(fitBM) ≈ 162.3083210414 atol=1e-10 +@test coef(fitBM) ≈ [4.8773804547 -0.6664678924 -1.0692950215 -0.0159349201]' atol=1e-10 +vcovR = [ 0.1165148753 -0.0431446679 -0.0305707092 0.0000000000 + -0.0431446679 0.3212796435 0.0340202694 -0.0000000000 + -0.0305707092 0.0340202694 0.2472613252 -0.0236868278 + 0.0000000000 -0.0000000000 -0.0236868278 0.1263794810] +@test vcov(fitBM) ≈ vcovR atol=1e-8 +@test nobs(fitBM) ≈ 197.0 atol=1e-10 +@test sum(residuals(fitBM)) ≈ -10.1752334428 atol=1e-10 +@test dof_residual(fitBM) ≈ 193.0 atol=1e-10 +@test sigma2_phylo(fitBM) ≈ 0.0028624636 atol=1e-10 +@test stderror(fitBM) ≈ [0.3413427535 0.5668153522 0.4972537835 0.3554989184]' atol=1e-10 +@test confint(fitBM)[:,1] ≈ [4.2041393297 -1.7844157659 -2.0500444097 -0.7170966977]' atol=1e-10 +@test confint(fitBM)[:,2] ≈ [5.5506215797 0.4514799811 -0.0885456333 0.6852268574]' atol=1e-10 +predictR = [4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 4.2109125624, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.7921505131, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 3.8080854332, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547, 4.8773804547] +tmp = predict(fitBM) +tmp2 = predictR[fitBM.ind] +# below: print for when the test was broken +#@show tmp[1:6], tmp[190:end] +#@show tmp2[1:6],tmp2[190:end] # the last 5 values are different +@test isapprox(predict(fitBM), predictR[fitBM.ind], atol=1e-8) + +#= ## R code to get those results +library(geiger) +data("caudata") +# re-order with the tree +dat <- caudata$dat[match(caudata$phy$tip.label, names(caudata$dat))] +# incidence matrix +Tm = PhylogeneticEM::incidence.matrix(caudata$phy) + 0 +# fit using phylolm +library(phylolm) +fitphylolm <- phylolm(trait ~ shift_37 + shift_105 + shift_222, + data.frame(trait=dat, shift_37 = Tm[,37], shift_105 = Tm[,105], shift_222 = Tm[,222]), + caudata$phy, model = "BM") +# quantities to compare +sprintf("%.10f", fitphylolm$logLik) +sprintf("%.10f", fitphylolm$aic) +sprintf("%.10f", fitphylolm$coefficients) # coef +sprintf("%.10f", fitphylolm$vcov) # vcov +sprintf("%.10f", fitphylolm$n) # nobs +sprintf("%.10f", sum(fitphylolm$residuals)) # residuals (sum) +sprintf("%.10f", fitphylolm$n - fitphylolm$d) # df residuals +sprintf("%.10f", fitphylolm$sigma2) # sigma 2 +sprintf("%.10f", summary(fitphylolm)$coefficients[,2]) # std error +sprintf("%.10f", summary(fitphylolm)$df) # df +sprintf("%.10f", coef(fitphylolm) + summary(fitphylolm)$coefficients[,2] * qt(0.025, 193)) +sprintf("%.10f", coef(fitphylolm) + summary(fitphylolm)$coefficients[,2] * qt(0.975, 193)) +sprintf("%.10f", predict(fitphylolm)) +=# +end + +############################################################################### +## Lizard dataset - BM +############################################################################### + +@testset "phylolm: Lizard Dataset" begin + +## Export "lizard" dataset (Mahler et al 2013) +phy = readnewick(joinpath(@__DIR__, "..", "examples", "lizard_tree.txt")); +dat = CSV.read(joinpath(@__DIR__,"..","examples","lizard_trait.txt"), DataFrame) +dat[!,:region] = string.(dat[:,:region]) # avoid CategoricalArrays.categorical dependency + +## Fit a BM +fitBM = phylolm(@formula(AVG_SVL ~ AVG_ltoe_IV + AVG_lfing_IV * region), dat, phy; reml=false) + +# Tests against results obtained with geiger::fitContinuous or phylolm::phylolm +@test loglikelihood(fitBM) ≈ 105.17337853473711 atol=1e-10 +@test dof(fitBM) ≈ 10.0 atol=1e-10 +@test aic(fitBM) ≈ -190.3467570695 atol=1e-10 +# @test aicc(fitBM) +@test coef(fitBM) ≈ [2.7925712673 -0.2010704391 0.9832555589 -0.1021226296 -0.3703658712 0.1557471731 0.0374549036 0.1805667675 -0.0495767233]' atol=1e-10 +vcovR = [0.0200086273 -0.0136717540 0.0084815090 -0.0093192029 -0.0114417825 -0.0113346813 0.0041102304 0.0053787287 0.0050521693 + -0.0136717540 0.0185396965 -0.0169114682 0.0020645005 0.0036352899 0.0026227856 -0.0012281620 -0.0018838231 -0.0014800242 + 0.0084815090 -0.0169114682 0.0174647413 0.0016403871 0.0005624488 0.0015003301 -0.0005714235 -0.0003201257 -0.0005423354 + -0.0093192029 0.0020645005 0.0016403871 0.0167953394 0.0078012534 0.0086329399 -0.0080782771 -0.0037333495 -0.0039327836 + -0.0114417825 0.0036352899 0.0005624488 0.0078012534 0.0490482083 0.0092203882 -0.0033670465 -0.0191567265 -0.0040068947 + -0.0113346813 0.0026227856 0.0015003301 0.0086329399 0.0092203882 0.0331395502 -0.0037513830 -0.0041592743 -0.0146108207 + 0.0041102304 -0.0012281620 -0.0005714235 -0.0080782771 -0.0033670465 -0.0037513830 0.0045172675 0.0018165174 0.0020857846 + 0.0053787287 -0.0018838231 -0.0003201257 -0.0037333495 -0.0191567265 -0.0041592743 0.0018165174 0.0093292284 0.0020427637 + 0.0050521693 -0.0014800242 -0.0005423354 -0.0039327836 -0.0040068947 -0.0146108207 0.0020857846 0.0020427637 0.0074817942] +@test vcov(fitBM) ≈ vcovR atol=1e-8 +@test nobs(fitBM) ≈ 100.0 atol=1e-10 +# below: print for when the test was broken (with @test_skip) +#@show sum(residuals(fitBM)) # looks random, e.g. 1.6091413520064477, or 0.8338189090359597 +#println("is this equal to 0.6352899255?") # sometimes NO, yet the test passes below!! +@test sum(residuals(fitBM)) ≈ 0.6352899255 atol=1e-10 +@test dof_residual(fitBM) ≈ 91.0 atol=1e-10 +@test sigma2_phylo(fitBM) ≈ 0.0003025014 atol=1e-10 +@test stderror(fitBM) ≈ [0.1414518551,0.1361605540,0.1321542330,0.1295968341,0.2214683008,0.1820427154,0.0672106202,0.0965879311,0.0864973651] atol=1e-10 +@test confint(fitBM)[:,1] ≈ [2.5115945339,-0.4715366529,0.7207474097,-0.3595508202,-0.8102854443,-0.2058583178,-0.0960507369,-0.0112932922,-0.2213931131] atol=1e-10 norm=x->norm(x,Inf) +@test confint(fitBM)[:,2] ≈ [3.0735480006,0.0693957746,1.2457637082,0.1553055609,0.0695537019,0.5173526640,0.1709605441,0.3724268272,0.1222396666] atol=1e-10 + + +### R script to get the above values +# ## Data +# dat <- read.csv(file = "GA_Anolis_traits.csv") +# geo <- read.csv(file = "GA_Anolis_biogeography.csv") +# +# dat <- merge(dat, geo, by = "species") +# # keep only toe and hand length +# dat <- dat[, c("species", "AVG.SVL", "AVG.ltoe.IV", "AVG.lfing.IV", "region")] +# colnames(dat)[1] <- "tipsNames" +# +# write.table(dat, +# file = "lizard_trait.txt", +# sep = ",", row.names = FALSE) +# +# ## Tree +# phy <- read.tree(file = "GA_Anolis_MCC.tre") +# +# write.tree(phy, file = "lizards_tree.txt", append = FALSE, +# digits = 10, tree.names = FALSE) +# +# rownames(dat) <- dat$tipsNames +# dat <- dat[, -1] +# dat$region <- as.factor(dat$region) +# +# ## Fit +# fitphylolm <- phylolm(AVG.SVL ~ 1 + AVG.ltoe.IV + AVG.lfing.IV * region, dat, phy, model = "BM") +# ## Quantities to compare +# sprintf("%.10f", fitphylolm$logLik) +# sprintf("%.10f", summary(fitphylolm)$df) # df +# sprintf("%.10f", fitphylolm$aic) +# sprintf("%.10f", fitphylolm$coefficients) # coef +# matrix(sprintf("%.10f", fitphylolm$vcov), 9, 9) # vcov +# sprintf("%.10f", fitphylolm$n) # nobs +# sprintf("%.10f", sum(fitphylolm$residuals)) # residuals (sum) +# sprintf("%.10f", fitphylolm$n - fitphylolm$d) # df residuals +# sprintf("%.10f", fitphylolm$sigma2) # sigma 2 +# sprintf("%.10f", summary(fitphylolm)$coefficients[,2]) # std error +# sprintf("%.10f", coef(fitphylolm) + summary(fitphylolm)$coefficients[, 2] * qt(0.025, 91)) +# sprintf("%.10f", coef(fitphylolm) + summary(fitphylolm)$coefficients[, 2] * qt(0.975, 91)) + +############################################################################### +## Lizard dataset - lambda +############################################################################### + +## Fit lambda +fitLambda = (@test_logs (:info, r"^Maximum lambda value") match_mode=:any phylolm(@formula(AVG_SVL ~ AVG_ltoe_IV + AVG_lfing_IV * region), dat, phy, model = "lambda", reml=false)) + +# Tests against results obtained with geiger::fitContinuous or phylolm::phylolm +@test lambda_estim(fitLambda) ≈ 0.9982715594 atol=1e-5 +@test loglikelihood(fitLambda) ≈ 105.1769275564 atol=1e-8 +@test dof(fitLambda) ≈ 11.0 atol=1e-10 +@test aic(fitLambda) ≈ -188.3538551128 atol=1e-8 +# @test aicc(fitBM) +@test coef(fitLambda) ≈ [2.7940573420 -0.2066584606 0.9897083949 -0.1004840950 -0.3677991157 0.1576743022 0.0367633665 0.1792502383 -0.0505291142]' atol=1e-5 +vcovR = [0.0200251600 -0.0137474015 0.0085637021 -0.0092973836 -0.0114259722 -0.0113056243 0.0041037877 0.0053740100 0.0050429112 + -0.0137474015 0.0186885224 -0.0170645512 0.0020509207 0.0036334103 0.0026066694 -0.0012237488 -0.0018826836 -0.0014743137 + 0.0085637021 -0.0170645512 0.0176200143 0.0016494733 0.0005604169 0.0015116125 -0.0005735573 -0.0003192320 -0.0005457420 + -0.0092973836 0.0020509207 0.0016494733 0.0167461876 0.0077885115 0.0086173037 -0.0080563819 -0.0037287856 -0.0039275469 + -0.0114259722 0.0036334103 0.0005604169 0.0077885115 0.0490092393 0.0092036032 -0.0033631662 -0.0191657329 -0.0040017905 + -0.0113056243 0.0026066694 0.0015116125 0.0086173037 0.0092036032 0.0330248707 -0.0037465110 -0.0041543671 -0.0145663751 + 0.0041037877 -0.0012237488 -0.0005735573 -0.0080563819 -0.0033631662 -0.0037465110 0.0045042057 0.0018142470 0.0020823721 + 0.0053740100 -0.0018826836 -0.0003192320 -0.0037287856 -0.0191657329 -0.0041543671 0.0018142470 0.0093334212 0.0020404652 + 0.0050429112 -0.0014743137 -0.0005457420 -0.0039275469 -0.0040017905 -0.0145663751 0.0020823721 0.0020404652 0.0074600880] +@test vcov(fitLambda) ≈ vcovR atol=3e-7 +@test nobs(fitLambda) ≈ 100.0 atol=1e-10 +@test sum(residuals(fitLambda)) ≈ 0.6369008979 atol=1e-5 +@test dof_residual(fitLambda) ≈ 91.0 atol=1e-10 +@test sigma2_phylo(fitLambda) ≈ 0.0003009914 atol=1e-9 +@test stderror(fitLambda) ≈ [0.1415102824,0.1367059706,0.1327404019,0.1294070617,0.2213803048,0.1817274626,0.0671133793,0.0966096332,0.0863718011] atol=1e-6 +@test confint(fitLambda)[:,1] ≈ [2.5129645499,-0.4782080775,0.7260358930,-0.3575353260,-0.8075438955,-0.2033049779,-0.0965491169,-0.0126529301,-0.2220960868] atol=1e-5 +@test confint(fitLambda)[:,2] ≈ [3.0751501341,0.0648911562,1.2533808968,0.1565671360,0.0719456641,0.5186535822,0.1700758500,0.3711534067,0.1210378584] atol=1e-5 + + +### R script to get the above values +# ## Data +# dat <- read.csv(file = "GA_Anolis_traits.csv") +# geo <- read.csv(file = "GA_Anolis_biogeography.csv") +# +# dat <- merge(dat, geo, by = "species") +# # keep only toe and hand length +# dat <- dat[, c("species", "AVG.SVL", "AVG.ltoe.IV", "AVG.lfing.IV", "region")] +# colnames(dat)[1] <- "tipsNames" +# +# write.table(dat, +# file = "lizard_trait.txt", +# sep = ",", row.names = FALSE) +# +# ## Tree +# phy <- read.tree(file = "GA_Anolis_MCC.tre") +# +# write.tree(phy, file = "lizards_tree.txt", append = FALSE, +# digits = 10, tree.names = FALSE) +# +# rownames(dat) <- dat$tipsNames +# dat <- dat[, -1] +# dat$region <- as.factor(dat$region) +# +# ## Fit +# fitphylolm <- phylolm(AVG.SVL ~ 1 + AVG.ltoe.IV + AVG.lfing.IV * region, dat, phy, model = "lambda") +# ## Quantities to compare +# sprintf("%.10f", fitphylolm$logLik) +# sprintf("%.10f", summary(fitphylolm)$df) # df +# sprintf("%.10f", fitphylolm$aic) +# sprintf("%.10f", fitphylolm$coefficients) # coef +# matrix(sprintf("%.10f", fitphylolm$vcov), 9, 9) # vcov +# sprintf("%.10f", fitphylolm$n) # nobs +# sprintf("%.10f", sum(fitphylolm$residuals)) # residuals (sum) +# sprintf("%.10f", fitphylolm$n - fitphylolm$d) # df residuals +# sprintf("%.10f", fitphylolm$sigma2) # sigma 2 +# sprintf("%.10f", summary(fitphylolm)$coefficients[,2]) # std error +# sprintf("%.10f", coef(fitphylolm) + summary(fitphylolm)$coefficients[, 2] * qt(0.025, 91)) +# sprintf("%.10f", coef(fitphylolm) + summary(fitphylolm)$coefficients[, 2] * qt(0.975, 91)) + +end diff --git a/test/test_lm_withinspecies.jl b/test/test_lm_withinspecies.jl new file mode 100644 index 0000000..c0b4b9d --- /dev/null +++ b/test/test_lm_withinspecies.jl @@ -0,0 +1,616 @@ +## traits.jl : phylolm for within-species variation, continuous traits + +@testset "phylolm: within-species variation, star" begin + +#= simulation of data used below (test more reproducible when using fixed data) +# simulate traits at the species-level, then +# repeat identical trait values across m individuals +function simTraits(net, m, paramsprocess) + sim = rand(net, paramsprocess) + trait = sim[:tips] # simple vector now + return repeat(trait, inner=m) +end + +n = 4; m = 3 +starnet = readnewick(PhyloNetworks.startree_newick(n)) +Random.seed!(6591) +trait1 = simTraits(starnet, m, ParamsBM(2, 0.5)) # var: 0.5 +trait2 = simTraits(starnet, m, ParamsBM(-2, 1)) + +phylo_noise_var = 2; meas_noise_var = 1 +phylo_noise = simTraits(starnet, m, ParamsBM(0, phylo_noise_var)) +meas_noise = randn(n*m) * sqrt(meas_noise_var) +trait3 = 10 .+ 2*trait1 + phylo_noise + meas_noise +print(round.(trait1, digits=4)) # etc +labels = repeat(starnet.names, inner=m) +df = DataFrame(trait1=trait1, trait2=trait2, trait3=trait3,tipnames=labels) +=# + +n = 4; m = 3 +starnet = readnewick(PN.startree_newick(n)) +netnames = ["t1","t2","t3","t4"] # = tiplabels(starnet) # was generated to have length n +df = DataFrame( + species = repeat(netnames, inner=m), + trait1 = [2.8564, missing, 2.8564, 2.8457, 2.8457, 2.8457, 0.4197, 0.4197, 0.4197, 2.2359, 2.2359, 2.2359], + trait2 = [-2.0935, -2.0935, -2.0935, 0.4955, 0.4955, 0.4955, -2.1977, -2.1977, -2.1977, -2.618, -2.618, -2.618], + trait3 = [missing, 15.7869, 14.0615, 14.3547, 13.3721, 15.7062, 9.2764, 8.8553, 8.7627, 15.0298, 15.8258, 15.3248] + # missing replaced 14.0467 +) +Y = df[!,:trait3] # nm vector +X = fill(1.0, (n,2)); X[:,2] = df[1:m:n*m,:trait1] # nx2 matrix +#= reduced data: one row per species, extra columns for SD and n of trait 3 +gdf = groupby(df, :species) +df_r = combine(gdf, :trait1 => (x -> mean(skipmissing(x))) => :trait1, + :trait2 => (x -> mean(skipmissing(x))) => :trait2, + :trait3 => (x -> mean(skipmissing(x))) => :trait3, + :trait3 => (x -> std(skipmissing(x))) => :trait3_sd, + :trait3 => (x -> sum(.!ismissing.(x))) => :trait3_n) +=# +df_r = DataFrame( + species = ["t1","t2","t3","t4"], trait1 = [2.8564,2.8457,.4197,2.2359], + trait2 = [-2.0935,0.4955,-2.1977,-2.618], + trait3 = [14.0615, 14.477666666666666, 8.9648, 15.393466666666667], + # [14.9242,... if we include ind 2 + trait3_sd = [0,1.1718985891848046,.2737966581242371,.4024181076111425], + # [1.2200420402592675,... if we include ind 2 + trait3_n = [1,3,3,3]) # [2,3,3,3] + +#= star tree: R code to check +df = data.frame(species = rep(c("t1","t2","t3","t4"), each=3), + trait1 = c(2.8564,NA,2.8564,2.8457,2.8457,2.8457,.4197,.4197,.4197,2.2359,2.2359,2.2359), + trait2 = c(-2.0935,-2.0935,-2.0935,.4955,.4955,.4955,-2.1977,-2.1977,-2.1977, -2.618,-2.618,-2.618), + trait3 = c(NA,15.7869,14.0615,14.3547,13.3721,15.7062,9.2764,8.8553,8.7627,15.0298,15.8258,15.3248)) +mR = lmer(trait3 ~ trait1 + (1|species), df) +fixef(mR) # 8.457020 2.296978 +print(mR, digits=7, ranef.comp="Var") # variances: 2.1216068,0.5332865 +logLik(mR) # -13.37294 +logLik(mR, REML=FALSE) # -14.57265 +vcov(mR) # matrix(c(3.111307,-1.219935,-1.219935,0.5913808), nrow=2) +mR = lmer(trait3 ~ trait1 + (1|species), df, REML=FALSE) +fixef(mR) # 8.439909 2.318488 +print(mR, digits=7, ranef.comp="Var") # variances: 0.9470427,0.5299540 +logLik(mR) # -14.30235 +vcov(mR) # matrix(c(1.5237486,-0.6002803,-0.6002803,0.2941625), nrow=2) +=# + +#= Alternatively: Julia code to check +using MixedModels +mm1 = fit(MixedModel, @formula(trait3 ~ trait1 + (1|species)), df, REML=true) # compare with m1 +mm3 = fit(MixedModel, @formula(trait3 ~ trait1 + (1|species)), df) # compare with m3 +fixef(mm1) # fixed-effect param estimates: 8.45702,2.29698 +VarCorr(mm1) # estimated variance-components: species-variance=2.121607, residual-variance=0.533287 +# `objective(m)` returns -2 * (log-likelihood of model m) +objective(mm1)/(-2) # -13.3729434, `loglikelihood` not available for models fit by REML +loglikelihood(mm3) # -14.3023458 +vcov(mm1) # var-cov matrix for fixef coeffs: [3.11131 -1.21993; -1.21993 0.591381] +=# +m1 = phylolm(@formula(trait3 ~ trait1), df, starnet; reml=true, + tipnames=:species, withinspecies_var=true) +m2 = phylolm(@formula(trait3 ~ trait1), df_r, starnet; reml=true, + tipnames=:species, withinspecies_var=true, y_mean_std=true) +@test m1.reml && m2.reml +@test coef(m1) ≈ [8.457020,2.296978] rtol=1e-5 # fixef(mR) +@test coef(m2) ≈ [8.457020,2.296978] rtol=1e-5 +@test sigma2_phylo(m1) ≈ 2.1216068 rtol=1e-5 # print(mR, digits=7, ranef.comp="Var") +@test sigma2_phylo(m2) ≈ 2.1216068 rtol=1e-5 +@test sigma2_within(m1) ≈ 0.5332865 rtol=1e-5 +@test sigma2_within(m2) ≈ 0.5332865 rtol=1e-5 +@test loglikelihood(m1) ≈ -13.37294 rtol=1e-5 +@test loglikelihood(m2) ≈ -13.37294 rtol=1e-5 +@test vcov(m1) ≈ [3.111307 -1.219935; -1.219935 0.5913808] rtol=1e-5 +@test vcov(m2) ≈ [3.111307 -1.219935; -1.219935 0.5913808] rtol=1e-5 +m3 = phylolm(@formula(trait3 ~ trait1), df_r, starnet; reml=false, + tipnames=:species, withinspecies_var=true, y_mean_std=true) +@test !m3.reml +@test coef(m3) ≈ [8.439909,2.318488] rtol=1e-5 +@test sigma2_phylo(m3) ≈ 0.9470427 rtol=1e-5 +@test sigma2_within(m3) ≈ 0.5299540 rtol=1e-5 +@test loglikelihood(m3) ≈ -14.30235 rtol=1e-5 +@test vcov(m3) ≈ [1.5237486 -0.6002803; -0.6002803 0.2941625] rtol=1e-5 + +end + +@testset "phylolm: binary tree, no withinspecies var" begin + +#= Rcode to generate the newick string and dataset: +library(phytools) +set.seed(1) + +tree <- pbtree(n=5,scale=1) # topology and branch lengths +tree.newick <- write.tree(tree) # newick format +# tree.newick <- "((t1:0.8121974445,(t2:0.4806586387,t3:0.4806586387):0.3315388057):0.1878025555,(t4:0.1206907041,t5:0.1206907041):0.8793092959);" + +X <- fastBM(tree,sig2=2,nsim=2); colnames(X) <- c("x1","x2") # non-intercept predictors +# X <- matrix(c(-0.5503706,-0.7503593,-0.7599224,-0.4217977,-0.9839226,-1.3102488,0.4544195,0.2151272,1.0384023,1.3138847),nrow=5) +# colnames(X) <- c("x1","x2"); rownames(X) <- c("t1","t2","t3","t4","t5") + +bsperr <- fastBM(tree) # phylogenetic variation, true BM variance-rate is 1 +y <- cbind(rep(1,5),X)%*%(1:3)+bsperr # response, true beta vector is c(1,2,3) +# y <- matrix(c(-4.1836578,0.6258014,-0.3070109,2.6120026,2.2391044),nrow=5) +# rownames(y) <- c("t1","t2","t3","t4","t5") + +df <- data.frame(y,X,species=tree$tip.label) +=# +net = readnewick("((t1:0.8121974445,(t2:0.4806586387,t3:0.4806586387):0.3315388057):0.1878025555,(t4:0.1206907041,t5:0.1206907041):0.8793092959);") +df = DataFrame( + y = [-4.18366,0.625801,-0.307011,2.612,2.2391], + x1 = [-0.550371,-0.750359,-0.759922,-0.421798,-0.983923], + x2 = [-1.31025,0.45442,0.215127,1.0384,1.31388], + species = net.names # ["t1","t2","t3","t4","t5"] +) + +#= Rcode to check model fit: +library(nlme) +m1 <- gls(y~x1+x2,data=df, + correlation=corBrownian(1,tree,form=~species),method="REML") +coef(m1) # coefficients estimates: c(0.6469652,2.0420889,2.8285257) +sigma(m1)^2 # reml BM variance-rate estimate: 0.0438973 +logLik(m1) # restricted log-likelihood: -0.07529961 +vcov(m1) # cov mat for coef estimates +# matrix(c(0.030948901,0.024782246,0.003569513,0.024782246,0.039001092,0.009137043,0.003569513,0.009137043,0.013366014),nrow=3) +summary(m1)$tTable[,"t-value"] # t-values for coef estimates: c(3.677548,10.340374,24.465786) +summary(m1)$tTable[,"p-value"] # p-values for coef estimates: c(0.066635016,0.009223303,0.001666460) +coef(m1) + qt(p=0.025,df=5-3)*sqrt(diag(vcov(m1))) # lower limit 95%-CI: c(-0.1099703,1.1923712,2.3310897) +coef(m1) + qt(p=0.975,df=5-3)*sqrt(diag(vcov(m1))) # upper limit 95%-CI: c(1.403901,2.891807,3.325962) + +m2 <- gls(y~x1+x2,data=df, + correlation=corBrownian(1,tree,form=~species),method="ML") +coef(m2) # coefficients estimates: c(0.6469652,2.0420889,2.8285257) +sigma(m2)^2 # ml BM variance-rate estimate: 0.01755892 +logLik(m2) # log-likelihood: 3.933531 +vcov(m2) # cov mat for coef estimates, this evaluates to the same value as vcov(m1) +# Note: vcov(gls(...,method="REML)) == vcov(gls(...,method="ML")) +# The same holds for t/p-values and CIs for the coef estimates +summary(m2)$tTable[,"t-value"] # t-values for coef estimates: c(3.677548,10.340374,24.465786) +summary(m2)$tTable[,"p-value"] # p-values for coef estimates: c(0.066635016,0.009223303,0.001666460) +coef(m2) + qt(p=0.025,df=5-3)*sqrt(diag(vcov(m2))) # lower limit 95%-CI: c(-0.1099703,1.1923712,2.3310897) +coef(m2) + qt(p=0.975,df=5-3)*sqrt(diag(vcov(m2))) # upper limit 95%-CI: c(1.403901,2.891807,3.325962) +=# +m1 = phylolm(@formula(y~x1+x2),df,net; tipnames=:species, reml=true) +m2 = phylolm(@formula(y~x1+x2),df,net; tipnames=:species, reml=false) +@test m1.reml +@test coef(m1) ≈ [0.6469652,2.0420889,2.8285257] rtol=1e-5 +@test sigma2_phylo(m1) ≈ 0.0438973 rtol=1e-4 +@test isnothing(sigma2_within(m1)) +@test loglikelihood(m1) ≈ -0.07529961 rtol=1e-3 +@test vcov(m1) ≈ [0.030948901 0.024782246 0.003569513;0.024782246 0.039001092 0.009137043;0.003569513 0.009137043 0.013366014] rtol=1e-4 +@test coeftable(m1).cols[coeftable(m1).teststatcol] ≈ [3.677548,10.340374,24.465786] rtol=1e-4 +@test coeftable(m1).cols[coeftable(m1).pvalcol] ≈ [0.066635016,0.009223303,0.001666460] rtol=1e-4 +@test coeftable(m1).cols[findall(coeftable(m1).colnms .== "Lower 95%")[1]] ≈ [-0.1099703,1.1923712,2.3310897] rtol=1e-5 +@test coeftable(m1).cols[findall(coeftable(m1).colnms .== "Upper 95%")[1]] ≈ [1.403901,2.891807,3.325962] rtol=1e-5 +@test !m2.reml +@test coef(m2) ≈ [0.6469652,2.0420889,2.8285257] rtol=1e-5 +@test sigma2_phylo(m2) ≈ 0.01755892 rtol=1e-4 +@test isnothing(sigma2_within(m2)) +@test loglikelihood(m2) ≈ 3.933531 rtol=1e-4 +@test vcov(m2) ≈ [0.030948901 0.024782246 0.003569513;0.024782246 0.039001092 0.009137043;0.003569513 0.009137043 0.013366014] rtol=1e-4 +@test coeftable(m2).cols[coeftable(m2).teststatcol] ≈ [3.677548,10.340374,24.465786] rtol=1e-4 +@test coeftable(m2).cols[coeftable(m2).pvalcol] ≈ [0.066635016,0.009223303,0.001666460] rtol=1e-4 +@test coeftable(m2).cols[findall(coeftable(m2).colnms .== "Lower 95%")[1]] ≈ [-0.1099703,1.1923712,2.3310897] rtol=1e-5 +@test coeftable(m2).cols[findall(coeftable(m2).colnms .== "Upper 95%")[1]] ≈ [1.403901,2.891807,3.325962] rtol=1e-5 + +end + +@testset "phylolm: binary tree, withinspecies var" begin + +#= NOTE: +This testset DOES NOT check for similarity of the variance-components estimates +from 'pgls.SEy' (phytools) and 'phylolm' (PhyloNetworks). In fact, +'pgls.SEy' and 'phylolm' solve different problems! +ML/REML variance-component estimates are obtained by running 'phylolm'. +The code for 'pgls.SEy' is adapted to calculate coef estimates, cov matrix for +coef estimates, t/p-values for coef estimates, and full/restricted-loglikelihood, +given these variance-components estimates. These values are then compared against +those extracted from the output of 'phylolm'. +=# + +#= Rcode to generate the newick string and dataset: +library(phytools) +set.seed(2) +m <- 5 # sample-size per taxa +n <- 5 # no. of taxa +p <- 3 # no. of predictors (including intercept) + +tree <- pbtree(n=n,scale=1) # topology and branch lengths +tree.newick <- write.tree(tree) # newick format +# tree.newick <- "(((t4:0.2537636499,t5:0.2537636499):0.2103870459,t3:0.4641506959):0.5358493041,(t1:0.4807642475,t2:0.4807642475):0.5192357525);" + +X <- fastBM(tree,sig2=2,nsim=2); colnames(X) <- c("x1","x2") # non-intercept predictors +# X <- matrix(c(0.7894387,0.3285286,2.1495131,-1.4935665,-2.3199935,2.8184268,0.4740687,2.5801004,1.9967379,-0.4121874),nrow=5) +# colnames(X) <- c("x1","x2"); rownames(X) <- c("t4","t5","t3","t1","t2") + +bsperr <- fastBM(tree) # phylogenetic variation, true BM variance-rate is 1 +wspvar <- 0.1 # within-species variance is 0.1 +msrerr <- rnorm(n=n,sd=sqrt(wspvar/m)) # msr error in species-level mean responses +y_sd <- sqrt(wspvar*rchisq(n=n,df=m-1)/(m-1)) # sd in individual responses per species +# y_sd <- c(0.2463003,0.3236629,0.2458547,0.4866844,0.3434582); +y <- cbind(rep(1,5),X)%*%(1:3)+bsperr+msrerr # response, true beta vector is c(1,2,3) +# y <- matrix(c(11.399108,3.216645,13.648011,4.851454,-4.922803),nrow=5); rownames(y) <- c("t4","t5","t3","t1","t2") + +df <- data.frame(y,y_sd,X,species=tree$tip.label) +=# +net = readnewick("(((t4:0.2537636499,t5:0.2537636499):0.2103870459,t3:0.4641506959):0.5358493041,(t1:0.4807642475,t2:0.4807642475):0.5192357525);") +df = DataFrame( + y=[11.399108,3.216645,13.648011,4.851454,-4.922803], + y_sd=[0.2463003,0.3236629,0.2458547,0.4866844,0.3434582], + y_n=fill(5,5), + x1=[0.7894387,0.3285286,2.1495131,-1.4935665,-2.3199935], + x2=[2.8184268,0.4740687,2.5801004,1.9967379,-0.4121874], + species=net.names +) + +#= R/Julia code to check model fit: +(1) Julia code: +## To extract reml/ml msrerr variance estimates fitted by phylolm +m1 |> sigma2_within |> x -> round(x,sigdigits=6) # reml est msrerr var: 0.116721 +m2 |> sigma2_within |> x -> round(x,sigdigits=6) # ml est msrerr var: 0.125628 +m1 |> sigma2_phylo |> x -> round(x,sigdigits=6) # reml est BM var: 0.120746 +m2 |> sigma2_phylo |> x -> round(x,sigdigits=6) # ml est BM var: 0.000399783 + +(2) R code: +## To check phylolm REML fit +library(nlme) +T1 <- tree +wspvar1 <- 0.116721 # reml est msrerr var of indiv-lvl rsps +bspvar1 <- 0.120746 # reml est BM var +se1 <- setNames(rep(sqrt(wspvar1/m),n),T1$tip.label) # msrerr sd of species-lvl mean rsp +T1$edge.length <- T1$edge.length*bspvar1 # scale all edges by est BM var +ii <- sapply(1:Ntip(T1),function(x,e) which(e==x),e=T1$edge[,2]) # indices of pendant edges +# extend pendant edges by msrerr sd +T1$edge.length[ii] <- T1$edge.length[ii]+se1[T1$tip.label]^2 +covmat1 <- vcv(T1) # extract est vars of species-lvl mean rsp +m1 <- gls(y~x1+x2,data=cbind(df,vf=diag(covmat1)), + correlation=corBrownian(1,T1,form=~species), + method="REML", + weights=varFixed(~vf)) + +coef(m1) # reml coefficient estimates: c(1.079839,1.976719,3.217391) + +Xp <- model.matrix(m1,df) # predictor matrix +vcov1 <- solve(t(Xp)%*%solve(covmat1)%*%Xp) # cov mat for coef estimates +# matrix(c(0.09386431,0.02273458,-0.02602937,0.02273458,0.02172123,-0.01133032,-0.02602937,-0.01133032,0.01584198),nrow=3) + +teststat1 <- coef(m1)/sqrt(diag(vcov1)) # test stat for coef estimates: c(3.524591,13.412285,25.562252) +pval1 <- sapply(X=pt(teststat1,n-p),FUN=function(p) 2*min(p,1-p)) # pval for coef est: +# c(0.071921276,0.005513044,0.001526885) +lowerci1 <- coef(m1) + qt(p=0.025,df=n-p)*sqrt(diag(vcov1)) # lower limit 95%-CI: c(-0.2383769,1.3425890,2.6758379) +upperci1 <- coef(m1) + qt(p=0.975,df=n-p)*sqrt(diag(vcov1)) # upper limit 95%-CI: c(2.398055,2.610850,3.758944) + +RSS <- sum((m-1)*(df$y_sd^2)) # residual sum-of-squares wrt to the species means +logLik(m1) # species-lvl cond restricted-ll: -3.26788 +sigm1 <- sigma(m1) # this is not bspvar1!, but rather the best "scaling" for covmat1 +# indiv-lvl cond restricted ll +# "+ (n-p)*(2*log(sigm1)-sigm1^2+1)/2" un-scales the species-lvl rll returned by logLik +# "- n*(m-1)*(log(wspvar1)+log(2*pi))/2 - (n*log(m)+RSS/wspvar1)/2" corrects to indiv-lvl rll +rll.species <- logLik(m1) +rll.indiv <- (rll.species + + (n-p)*(2*log(sigm1)-sigm1^2+1)/2 + - n*(m-1)*(log(wspvar1)+log(2*pi))/2 - (n*log(m)+RSS/wspvar1)/2 + ) +round(rll.indiv,digits=6) # indiv-lvl rll of remles: -14.14184 + +## To check phylolm ML fit +T2 <- tree +wspvar2 <- 0.125628 # ml est msrerr var of indiv-lvl rsps +bspvar2 <- 0.000399783 # ml est BM var +se2 <- setNames(rep(sqrt(wspvar2/m),n),T2$tip.label) +T2$edge.length <- T2$edge.length*bspvar2 +ii <- sapply(1:Ntip(T2),function(x,e) which(e==x),e=T2$edge[,2]) +T2$edge.length[ii] <- T2$edge.length[ii]+se2[T2$tip.label]^2 +covmat2 <- vcv(T2) +m2 <- gls(y~x1+x2,data=cbind(df,vf=diag(covmat2)), + correlation=corBrownian(1,T2,form=~species), + method="ML", + weights=varFixed(~vf)) + +coef(m2) # ml coefficient estimates: c(0.9767352,1.9155142,3.2661862) + +Xp <- model.matrix(m2,df) # predictor matrix +vcov2 <- solve(t(Xp)%*%solve(covmat2)%*%Xp) # cov mat for coef estimates +# matrix(c(0.019118171,0.004924625,-0.008977541,0.004924625,0.003577654,-0.003028413,-0.008977541,-0.003028413,0.005793475),nrow=3) + +teststat2 <- coef(m2)/sqrt(diag(vcov2)) # test stat for coef est: c(7.064049,32.024784,42.911270) +pval2 <- sapply(X=pt(teststat2,n-p),FUN=function(p) 2*min(p,1-p)) # pval for coef est: +# c(0.0194568147,0.0009736278,0.0005426298) +lowerci2 <- coef(m2) + qt(p=0.025,df=n-p)*sqrt(diag(vcov2)) # lower limit 95%-CI: c(0.381814,1.658158,2.938690) +upperci2 <- coef(m2) + qt(p=0.975,df=n-p)*sqrt(diag(vcov2)) # upper limit 95%-CI: c(1.571656,2.172871,3.593682) + +ll.species <- logLik(m2) # species-lvl cond ll: 1.415653 +sigm2 <- sigma(m2) # this is not bspvar2!, but rather the best "scaling" for covmat2 +RSS <- sum((m-1)*(df$y_sd^2)) # residual sum-of-squares wrt to the species means +# indiv-lvl cond ll +# "+ n*(2*log(sigm2)-sigm2^2+1)/2" un-scales the species-lvl ll returned by logLik +# "- n*(m-1)*(log(wspvar2)+log(2*pi))/2 - (n*log(m)+RSS/wspvar2)/2" corrects to indiv-lvl ll +ll.indiv <- (ll.species + + n*(2*log(sigm2)-sigm2^2+1)/2 + - n*(m-1)*(log(wspvar2)+log(2*pi))/2 - (n*log(m)+RSS/wspvar2)/2 + ) +round(ll.indiv,digits=6) # indiv-lvl ll of mles: -9.582357 +=# +m1 = phylolm(@formula(y~x1+x2),df,net; + tipnames=:species, reml=true, withinspecies_var=true, y_mean_std=true) +m2 = phylolm(@formula(y~x1+x2),df,net; + tipnames=:species, reml=false, withinspecies_var=true, y_mean_std=true) + +@test coef(m1) ≈ [1.079839,1.976719,3.217391] rtol=1e-4 +@test coef(m2) ≈ [0.9767352,1.9155142,3.2661862] rtol=1e-4 +@test loglikelihood(m1) ≈ -14.14184 rtol=1e-4 +@test loglikelihood(m2) ≈ -9.582357 rtol=1e-4 +@test vcov(m1) ≈ [0.09386431 0.02273458 -0.02602937;0.02273458 0.02172123 -0.01133032;-0.02602937 -0.01133032 0.01584198] rtol=1e-3 +@test vcov(m2) ≈ [0.019118171 0.004924625 -0.008977541;0.004924625 0.003577654 -0.003028413;-0.008977541 -0.003028413 0.005793475] rtol=1e-3 +@test coeftable(m1).cols[coeftable(m1).teststatcol] ≈ [3.524591,13.412285,25.562252] rtol=1e-4 +@test coeftable(m2).cols[coeftable(m2).teststatcol] ≈ [7.064049,32.024784,42.911270] rtol=1e-4 +@test coeftable(m1).cols[coeftable(m1).pvalcol] ≈ [0.071921276,0.005513044,0.001526885] rtol=1e-3 +@test coeftable(m2).cols[coeftable(m2).pvalcol] ≈ [0.0194568147,0.0009736278,0.0005426298] rtol=1e-3 +@test coeftable(m1).cols[findall(coeftable(m1).colnms .== "Lower 95%")[1]] ≈ [-0.2383769,1.3425890,2.6758379] rtol=1e-4 +@test coeftable(m2).cols[findall(coeftable(m2).colnms .== "Lower 95%")[1]] ≈ [0.381814,1.658158,2.938690] rtol=1e-4 +@test coeftable(m1).cols[findall(coeftable(m1).colnms .== "Upper 95%")[1]] ≈ [2.398055,2.610850,3.758944] rtol=1e-4 +@test coeftable(m2).cols[findall(coeftable(m2).colnms .== "Upper 95%")[1]] ≈ [1.571656,2.172871,3.593682] rtol=1e-4 + +# missing y (but y_n/SD present); missing/infinite sample size; missing/infinite y_SD +df = df[[1,2,3,4],:] # delete t2 +allowmissing!(df, [:y,:y_n,:y_sd]) +# m0 = phylolm(@formula(y~1),df,net; tipnames=:species, withinspecies_var=true, y_mean_std=true) +df1 = DataFrame(df) # makes a copy +push!(df1, (missing,0.,0,0.,0.,"t2")) +m1 = phylolm(@formula(y~1),df1,net; tipnames=:species, withinspecies_var=true, y_mean_std=true) +@test coef(m1) ≈ [7.8116494901242195] atol=1e-6 # same as m0 +@test sigma2_within(m1) ≈ 0.11568962074173368 atol=1e-6 +@test nobs(m1) == 20 # 4 species x 5 indiv/species +@test dof_residual(m1) == 3 +# sample sizes y_n: 1, 0, infinite +@test dof(m1) == 3 # intercept, s2phylo, s2within +df1[5,:] .= (0.,0.,1,0.,0.,"t2") # then almost same within-sp variation +m1 = phylolm(@formula(y~1),df1,net; tipnames=:species, withinspecies_var=true, y_mean_std=true) +@test sigma2_within(m1) ≈ 0.11569 atol=1e-4 +@test nobs(m1) == 21 +@test dof_residual(m1) == 4 +df1[5,:] .= (0.,0.,0,0.,0.,"t2") # some species have 0 or <0 num_individuals, column y_n +@test_throws ErrorException phylolm(@formula(y~1),df1,net; tipnames=:species, withinspecies_var=true, y_mean_std=true) +df1[!,:y_n] = Float64.(df1[!,:y_n]) +df1[5,:] .= (0.,0.,Inf,0.,0.,"t2")#some species have infinite num_individuals, column y_n +@test_throws ErrorException phylolm(@formula(y~1),df1,net; tipnames=:species, withinspecies_var=true, y_mean_std=true) +df1[5,:] .= (0.,missing,1,0.,0.,"t2") # some SD values are missing, column y_sd +@test_throws ErrorException phylolm(@formula(y~1),df1,net; tipnames=:species, withinspecies_var=true, y_mean_std=true) +df1[5,:] .= (0.0,Inf,1,0.,0.,"t2") # some SD values are infinite, column y_sd +@test_throws ErrorException phylolm(@formula(y~1),df1,net; tipnames=:species, withinspecies_var=true, y_mean_std=true) + +end + +@testset "phylolm: within-species var, network h=1" begin + +#= Simulation of data used below: +(1) Individual-level data +function simTraits(net, m, paramsprocess) + sim = rand(net, paramsprocess) + trait = sim[:tips] + return repeat(trait, inner=m) +end +n = 6; m = 3 # 6 species, 3 individuals per species +net = readnewick("((((D:0.4,C:0.4):4.8,((A:0.8,B:0.8):2.2)#H1:2.2::0.7):4.0,(#H1:0::0.3,E:3.0):6.2):2.0,O:11.2);"); +Random.seed!(18480224); +trait1 = simTraits(net, m, ParamsBM(2, 0.5)) # simulate a BM with mean 2 and variance 0.5 on net +trait2 = simTraits(net, m, ParamsBM(-2, 1.0)) # simulate a BM with mean -2 and variance 1.0 on net +phylo_noise_var = 0.1 # BM variance-rate +meas_noise_var = 0.01 # individual-level msrerr variance +phylo_noise = simTraits(net, m, ParamsBM(0, phylo_noise_var)) +meas_noise = randn(n*m)*sqrt(meas_noise_var) +trait3 = 10 .+ 2 * trait1 + phylo_noise + meas_noise +labels = repeat(names(vcv(net)), inner=m) +df = DataFrame(trait1=trait1, trait2=trait2, trait3=trait3, tipnames=labels) + +(2) Species-level data (extra columns for SD and n of trait3) +gdf = groupby(df, :species) +df_r = combine(gdf, :trait1 => (x -> mean(x)) => :trait1, + :trait2 => (x -> mean(x)) => :trait2, + :trait3 => (x -> mean(x)) => :trait3, + :trait3 => (x -> std(x)) => :trait3_sd, + :trait3 => (x -> length(x)) => :trait3_n) +=# +n = 6; m = 3 +net = readnewick("((((D:0.4,C:0.4):4.8,((A:0.8,B:0.8):2.2)#H1:2.2::0.7):4.0,(#H1:0::0.3,E:3.0):6.2):2.0,O:11.2);"); +df = DataFrame( + species = repeat(["D","C","A","B","E","O"],inner=m), + trait1 = [4.08298,4.08298,4.08298,3.10782,3.10782,3.10782,2.17078,2.17078,2.17078,1.87333,1.87333,1.87333,2.8445, + 2.8445,2.8445,5.88204,5.88204,5.88204], + trait2 = [-7.34186,-7.34186,-7.34186,-7.45085,-7.45085,-7.45085,-3.32538,-3.32538,-3.32538,-4.26472,-4.26472, + -4.26472,-5.96857,-5.96857,-5.96857,-1.99388,-1.99388,-1.99388], + trait3 = [18.8101,18.934,18.9438,17.0687,17.0639,17.0732,14.4818,14.1112,14.2817,13.0842,12.9562,12.9019,15.4373, + 15.4075,15.4317,24.2249,24.1449,24.1302] +) +df_r = DataFrame( + species = ["D","C","A","B","E","O"], + trait1 = [4.08298,3.10782,2.17078,1.87333,2.8445,5.88204], + trait2 = [-7.34186,-7.45085,-3.32538,-4.26472,-5.96857,-1.99388], + trait3 = [18.895966666666666,17.0686,14.291566666666668,12.980766666666666,15.4255,24.166666666666668], + trait3_sd = [0.07452397824414288,0.004650806381693211,0.18549690922851855,0.09360001780626576,0.01583792915756317,0.05096433393397276], + trait3_n = [3, 3, 3, 3, 3, 3] +) + +m1 = phylolm(@formula(trait3 ~ trait1), df, net; reml=true, + tipnames=:species, withinspecies_var=true) +m2 = phylolm(@formula(trait3 ~ trait1), df_r, net; reml=true, + tipnames=:species, withinspecies_var=true, y_mean_std=true) +m3 = phylolm(@formula(trait3 ~ trait1), df, net; reml=false, + tipnames=:species, withinspecies_var=true) +m4 = phylolm(@formula(trait3 ~ trait1), df_r, net; reml=false, + tipnames=:species, withinspecies_var=true, y_mean_std=true) + +@testset "agreement across data input" begin # nested test set +#= - individual-level data vs when the species-level data: see m1, m2, m3, m4 +- permuted data rows: see m1permute, m2permute +- w/o withinspecies var: when a species has missing entries vs when the species + is completely absent from the data (see m3missingentry, m4missingrow). =# +m1permute = phylolm(@formula(trait3 ~ trait1), df[[1,6,11,17,16,18,8,5,9,3,12,7,13,10,2,14,4,15],:], # permute predictor rows + net; reml=true,tipnames=:species, withinspecies_var=true) +m2permute = phylolm(@formula(trait3 ~ trait1), df_r[[5,2,3,1,6,4],:], net; reml=true, # permute predictor rows + tipnames=:species, withinspecies_var=true, y_mean_std=true) +@test coef(m1) ≈ [9.65347,2.30357] rtol=1e-4 +@test coef(m1permute) ≈ [9.65347,2.30357] rtol=1e-4 +@test coef(m2) ≈ [9.65347,2.30357] rtol=1e-4 +@test coef(m2permute) ≈ [9.65347,2.30357] rtol=1e-4 +@test sigma2_phylo(m1) ≈ 0.156188 rtol=1e-4 +@test sigma2_phylo(m1permute) ≈ 0.156188 rtol=1e-4 +@test sigma2_phylo(m2) ≈ 0.156188 rtol=1e-4 +@test sigma2_phylo(m2permute) ≈ 0.156188 rtol=1e-4 +@test sigma2_within(m1) ≈ 0.008634 rtol=1e-4 +@test sigma2_within(m1permute) ≈ 0.008634 rtol=1e-4 +@test sigma2_within(m2) ≈ 0.008634 rtol=1e-4 +@test sigma2_within(m2permute) ≈ 0.008634 rtol=1e-4 +@test loglikelihood(m1) ≈ 1.944626 rtol=1e-4 +@test loglikelihood(m1permute) ≈ 1.944626 rtol=1e-4 +@test loglikelihood(m2) ≈ 1.944626 rtol=1e-4 +@test loglikelihood(m2permute) ≈ 1.944626 rtol=1e-4 +@test stderror(m1) ≈ [1.3065987324433421,0.27616258597477233] atol=1e-6 +@test stderror(m1permute) ≈ [1.3065987324433421,0.27616258597477233] atol=1e-6 +@test stderror(m2) ≈ [1.3065987324433421,0.27616258597477233] atol=1e-6 +@test stderror(m2permute) ≈ [1.3065987324433421,0.27616258597477233] atol=1e-6 +@test nobs(m1) == 18 # 6 species, 18 ind +@test nobs(m1permute) == 18 +@test residuals(m1) ≈ [-0.16295769587309603,0.2560302141911026,-0.36246083625543507,-0.9880623366773218,-0.78049231427113,0.9634719640663754] atol=1e-6 +# indexin(df[[1,6,11,17,16,18,8,5,9,3,12,7,13,10,2,14,4,15],:].species |> unique, df.species |> unique) == [1,2,4,6,3,5] +@test residuals(m1permute) ≈ [-0.16295769587309603,0.2560302141911026,-0.36246083625543507, + -0.9880623366773218,-0.78049231427113,0.9634719640663754][[1,2,4,6,3,5]] atol=1e-6 +@test residuals(m2) ≈ [-0.16295769587309603,0.2560302141911026,-0.36246083625543507,-0.9880623366773218,-0.78049231427113,0.9634719640663754] atol=1e-6 +@test residuals(m2permute) ≈ [-0.16295769587309603,0.2560302141911026,-0.36246083625543507, + -0.9880623366773218,-0.78049231427113,0.9634719640663754][[5,2,3,1,6,4]] atol=1e-6 +@test dof_residual(m1) == 4 +@test dof_residual(m1permute) == 4 +@test dof(m1) == 4 + +dfmissingentry = allowmissing(df); dfmissingentry.trait1[1:3] .= missing # remove entire trait1 col for species D +m3missingentry = phylolm(@formula(trait3 ~ trait1), dfmissingentry, net; reml=false, # not using data from species D + tipnames=:species, withinspecies_var=true) +df_rmissingrow = copy(df_r); df_rmissingrow = df_rmissingrow[2:6,:] # remove entire row for species D +m4missingrow = phylolm(@formula(trait3 ~ trait1), df_rmissingrow, net; reml=false, # not using data from species D + tipnames=:species, withinspecies_var=true, y_mean_std=true) +@test coef(m3) ≈ [9.63523,2.30832] rtol=1e-4 +@test coef(m4) ≈ [9.63523,2.30832] rtol=1e-4 +@test coef(m3missingentry) ≈ coef(m4missingrow) rtol=1e-4 +@test sigma2_phylo(m3) ≈ 0.102255 rtol=1e-4 +@test sigma2_phylo(m4) ≈ 0.102255 rtol=1e-4 +@test sigma2_phylo(m3missingentry) ≈ sigma2_phylo(m4missingrow) rtol=1e-4 +@test sigma2_within(m3) ≈ 0.008677 rtol=1e-4 +@test sigma2_within(m4) ≈ 0.008677 rtol=1e-4 +@test sigma2_within(m3missingentry) ≈ sigma2_within(m4missingrow) rtol=1e-4 +@test loglikelihood(m3) ≈ 1.876606 rtol=1e-4 +@test loglikelihood(m4) ≈ 1.876606 rtol=1e-4 +@test loglikelihood(m3missingentry) ≈ loglikelihood(m4missingrow) rtol=1e-4 +@test stderror(m3) ≈ [1.0619360781577734, 0.22496955609230126] atol=1e-6 +@test stderror(m4) ≈ [1.0619360781577734, 0.22496955609230126] atol=1e-6 +@test stderror(m3missingentry) ≈ stderror(m4missingrow) atol=1e-6 +@test residuals(m3missingentry) ≈ residuals(m4missingrow) atol=1e-6 +end # agreement test subset + +@testset "model comparison & likelihood ratio test" begin +m3null = phylolm(@formula(trait3 ~ 1), df, net; reml=false, tipnames=:species, withinspecies_var=true) +m3full = phylolm(@formula(trait3 ~ trait1 + trait2), df, net; reml=false, tipnames=:species, withinspecies_var=true) +@test StatsModels.isnested(m3null, m3full) +tab = (@test_logs lrtest(m3null, m3, m3full)) +@test all(isapprox.(tab.deviance, (13.720216379785523,-3.75321128763398,-4.243488375445074), atol=1e-6)) +@test tab.dof == (3, 4, 5) +@test all(isapprox.(tab.pval[2:end], (2.9135155795020905e-5,0.4838037279625203), atol=1e-6)) +m1null = phylolm(@formula(trait3 ~ 1), df, net; tipnames=:species, withinspecies_var=true) # REML +@test !(@test_logs (:error, r"fitted with ML") StatsModels.isnested(m1null, m1)) # REML, different FEs +@test_logs (:error, r"same criterion") (@test_throws ArgumentError lrtest(m3null, m1)) # ML and REML +m2w = phylolm(@formula(trait3 ~ trait1), df_r, net; tipnames=:species) +m5w = phylolm(@formula(trait3 ~ trait1), df[[1,2,4,7,13,18],:], net; tipnames=:species, withinspecies_var=true) +@test !(@test_logs (:error, r"same number of obs") StatsModels.isnested(m2, m2w)) +@test !(@test_logs (:error, r"same response") StatsModels.isnested(m5w,m2w)) +m6w = (@test_logs (:info,r"^Maximum lambda") phylolm(@formula(trait3 ~ trait1), df_r, net; tipnames=:species, model="lambda")) +tab = lrtest(m2w, m6w) # both REML, but same predictors +@test tab.pval[2] ≈ 0.03928341265297505 atol=1e-6 +@test !PhyloTraits.isnested(PhyloTraits.PagelLambda(0.1),PhyloTraits.BM()) +@test !PhyloTraits.isnested(PhyloTraits.PagelLambda(),PhyloTraits.ScalingHybrid()) +@test !PhyloTraits.isnested(PhyloTraits.ScalingHybrid(2.0),PhyloTraits.PagelLambda()) +@test_throws ArgumentError ftest(m3null, m3, m3full) # not the same Y after transformation +end # lrt test subset + +@testset "equivalence with Pagel's lambda on expanded net" begin +# find a given named tip or node +function getNode(name::String, net::HybridNetwork) + i = findfirst(n -> n.name == name, net.node) + isnothing(i) && error("Node $(name) was not found in the network.") + return net.node[i] +end +# new column with tip ids, initialized to species names +dfbig = deepcopy(df) +insertcols!(dfbig, 1, :speciesIds => dfbig[!,:species]) +# add tips with zero length branches on the network +netbig = deepcopy(net) +for i in 1:nrow(dfbig) + sp_name = dfbig[i, :species]; tip_name = sp_name * string(i) + PN.addleaf!(netbig, getNode(sp_name, netbig), tip_name, 0.0) + dfbig[i, :speciesIds] = tip_name +end +# (((((D1:0.0,D2:0.0,D3:0.0)D:0.4,(C4:0.0,C5:0.0,C6:0.0)C:0.4):4.8,(((A7:0.0,A8:0.0,A9:0.0)A:0.8,(B10:0.0,B11:0.0,B12:0.0)B:0.8):2.2)#H1:2.2::0.7):4.0,(#H1:0.0::0.3,(E13:0.0,E14:0.0,E15:0.0)E:3.0):6.2):2.0,(O16:0.0,O17:0.0,O18:0.0)O:11.2); +# fit lambda on bigger network +m1big = (@test_logs (:info, r"^M") phylolm(@formula(trait3 ~ trait1), dfbig, netbig, model="lambda"; tipnames=:speciesIds)) +# equivalent phylo and within variances +net_height = maximum(getnodeheights(net)); +sig_phy_2 = sigma2_phylo(m1big) * lambda_estim(m1big); +sig_err_2 = sigma2_phylo(m1big) * (1 - lambda_estim(m1big)) * net_height; +@test sigma2_phylo(m1) ≈ sig_phy_2 atol=1e-7 +@test sigma2_within(m1) ≈ sig_err_2 atol=1e-9 +# equivalent lambda value; equivalent coefficients and other +w_var_lambda = sigma2_phylo(m1) / (sigma2_within(m1) / net_height + sigma2_phylo(m1)); +@test w_var_lambda ≈ lambda_estim(m1big) atol=1e-8 +@test coef(m1) ≈ coef(m1big) atol=1e-7 +@test mu_phylo(m1) ≈ mu_phylo(m1big) atol=1e-7 +@test vcov(m1) ≈ vcov(m1big) atol=1e-6 +@test stderror(m1) ≈ stderror(m1big) atol=1e-6 +@test nobs(m1) ≈ nobs(m1big) atol=1e-10 +@test dof(m1) ≈ dof(m1big) atol=1e-10 +@test deviance(m1) ≈ deviance(m1big) atol=1e-10 +@test loglikelihood(m1) ≈ loglikelihood(m1big) atol=1e-10 +# what differs: residuals, response, predict (not same length) +# also differs: dof_residuals (18-2=16 vs 6-2=4), and so predint +end + +allowmissing!(df, [:trait3]); df[4:6,:trait3] .= missing # species C missing +allowmissing!(df_r,[:trait3]); df_r[2,:trait3] = missing # to check imputation + +@testset "ancestral state prediction, intercept only" begin +m1 = phylolm(@formula(trait3 ~ 1), df_r, net; tipnames=:species, withinspecies_var=true, y_mean_std=true) +ar1 = (@test_logs (:warn, r"^T") ancestralreconstruction(m1)) +# ar.nodenumbers[8] == 2 (looking at node #2), m1.V.tipnames[indexin([2],m1.V.tipnumbers)[1]] == "C" (looking at tip "C") +@test ar1.traits_nodes[8] ≈ 18.74416393519304 rtol=1e-5 # masked sampled C_bar was 17.0686 +@test collect(predict(ar1, interval=:prediction)[8,[:lower,:upper]]) ≈ [15.24005506417728,22.2482728062088] rtol=1e-5 +# on dataframe with model passed as keyword args. must be individual data. +ar2 = (@test_logs (:warn, r"^T") ancestralreconstruction(df[!,[:species,:trait3]], net; tipnames=:species, withinspecies_var=true)) +@test ar2.traits_nodes ≈ ar1.traits_nodes rtol=1e-5 +@test predict(ar2, interval=:prediction) ≈predict(ar1, interval=:prediction) rtol=1e-5 +# When withinspecies_var=true, predicted values at the tips are part of +# "traits_nodes", not "traits_tips", and differ from the observed sample means. +@test length(ar1.traits_tips) == 0 +@test length(ar2.traits_tips) == 0 +@test length(ar1.traits_nodes) == 13 +@test length(ar2.traits_nodes) == 13 +@test ar1.traits_nodes[9] ≈ 18.895327175656757 # for tip D: observed 18.896 +@test collect(predict(ar1,interval=:prediction)[9,[:lower,:upper]]) ≈ [18.73255168713768,19.058102664175834] # narrow +end + +@testset "ancestral state prediction, more than intercept" begin +m3 = phylolm(@formula(trait3 ~ trait1 + trait2), df[[1,6,11,17,16,18,8,5,9,3,12,7,13,10,2,14,4,15],:], net; tipnames=:species, withinspecies_var=true) +X_n = [m3.X;m3.X[1:3,:]] # 8x3 Array +ar3 = (@test_logs (:warn, r"^T") ancestralreconstruction(m3, X_n)) +m4 = phylolm(@formula(trait3 ~ trait1 + trait2), df_r[[1,4,6,3,2,5],:], net; tipnames=:species, withinspecies_var=true, y_mean_std=true) +ar4 = (@test_logs (:warn, r"^T") ancestralreconstruction(m4, X_n)) +@test ar3.nodenumbers == ar4.nodenumbers +@test ar3.traits_nodes ≈ ar4.traits_nodes rtol=1e-5 +@test ar3.variances_nodes ≈ ar4.variances_nodes rtol=1e-5 +@test size(predict(ar4)) == (13, 2) +@test predict(ar4,text=true)[8,2] == "24.84*" +@test predict(ar3,text=true)[8,2] == "24.84*" +@test collect(predict(ar3,interval=:prediction)[13,[:lower,:upper]]) ≈ [15.173280800793783,15.677786825808212] rtol=1e-5 # narrow at tip with data +@test collect(predict(ar3,interval=:prediction)[7,[:lower,:upper]]) ≈ [10.668220499837211,15.322037065478693] rtol=1e-5 # wide at a root +p3 = predict(ar3, interval=:prediction,text=true) +p4 = predict(ar4, interval=:prediction,text=true) +@test p3[!,:nodenumber] == p4[!,:nodenumber] +@test p3[13,:interval] == "[15.17, 15.68]" +@test p4[13,:interval] == "[15.17, 15.68]" +@test p3[7,:interval] == "[10.67, 15.32]" +@test p4[7,:interval] == "[10.67, 15.32]" +end # test subset + +end # test set: withinspecies_var on network h=1 diff --git a/test/test_simulate.jl b/test/test_simulate.jl new file mode 100644 index 0000000..f3c1ea6 --- /dev/null +++ b/test/test_simulate.jl @@ -0,0 +1,153 @@ +# Tests to simulate traits + +## Get a network and make it ultrametric +net = readnewick("(((Ag:5,(#H1:1::0.056,((Ak:2,(E:1,#H2:1::0.004):1):1,(M:2)#H2:1::0.996):1):1):1,(((((Az:1,Ag2:1):1,As:2):1)#H1:1::0.944,Ap:4):1,Ar:5):1):1,(P:4,20:4):3,165:7);"); + +@testset "Simulate function against fixed values" begin + +## Simulate a BM +Random.seed!(17920921); # fix the seed +pars = ParamsBM(1, 0.1); # params of a BM +@test_logs show(devnull, pars) + +sim = rand(net, pars); # simulate according to a BM +@test_logs show(devnull, sim) +@test_throws ErrorException sim[:tips, :Broken] + +# Extract simulated values +traitsTips = sim[:tips] +traitsNodes = sim[:internalnodes] +# values simulated under julia v1.6.4 +#traitsTipsExp = [0.6455995230091043,-0.22588106270381064,0.05703904710270408,-0.692650796714688,1.578622599565194,1.4106438068675058,1.9166557600811194,1.0579005662214953,1.2340762902144904,1.4130757789427886,0.7115737497673081,2.201943319276716]; +#traitsNodesExp = [-0.3481603206484607,-0.6698437934551933,-0.018135478212541654,-0.33844527112230455,-0.0717742134084467,0.19417331380691694,1.3919535151447147,1.5106942025265466,1.2526948727806593,1.1552248152172964,1.224823113083187,1.0617270280846993,1.0436547766241817,1.0]; +@test length(traitsTips) == 12 +@test length(traitsNodes) == 14 +@test traitsNodes[end] == 1.0 # ancestral state +@test 0 < sum(traitsNodes)/14 < 2 +@test 0 < sum(traitsTips)/14 < 2 + +end + +############################################################################### +## Test of distibution +############################################################################### +@testset "Simulate test distribution" begin + +## Generate some values +Random.seed!(18480224); # fix the seed +pars = ParamsBM(1, 0.1); # params of a BM +N = 50000 +S = length(tiplabels(net)); +values = zeros(Float64, (S, N)); +for i = 1:N + values[:,i] = rand(net, pars)[:tips] +end + +## Check that each tip has same mean (1) +for s in 1:S + @test mean(values[s, :]) ≈ pars.mu atol=0.01 +end + +## Check for variances +V = sharedpathmatrix(net); +Sig = V[:tips] * pars.sigma2; +for s in 1:S + for t in s:S + @test cov(values[s, :], values[t, :]) ≈ Sig[s, t] atol=0.01 + end +end + +end +############################################################################### +## With Shifts +############################################################################### +@testset "Simulate with Shifts" begin +net = readnewick("(A:2.5,((B:1,#H1:0.5::0.4):1,(C:1,(D:0.5)#H1:0.5::0.6):1):0.5);") + +## Test construction function +@test_throws ErrorException ShiftNet(net.edge[7], 3.0, net) # can't put a shift on hybrid branch +@test_throws ErrorException ShiftNet(net.node[6], 3.0, net) # can't put a shift on hybrid branch +@test ShiftNet(net).shift ≈ zeros(length(net.node)) +@test ShiftNet(net.edge[8], 3.0, net).shift ≈ ShiftNet([net.edge[8]], [3.0], net).shift +@test ShiftNet(net.edge[8], 3.0, net).shift ≈ ShiftNet(net.node[7], 3.0, net).shift +@test ShiftNet(net.node[7], 3.0, net).shift ≈ ShiftNet([net.node[7]], [3.0], net).shift + +## Concatenate function +sh1 = ShiftNet(net.node[7], 3.0, net)*ShiftNet(net.node[9], -2.1, net) +@test sh1.shift ≈ ShiftNet([net.node[7], net.node[9]], [3.0, -2.1], net).shift +@test_throws ErrorException sh1*ShiftNet(net.edge[7], 2.0, net) # can't concatenate if the two affect the same edges +@test sh1.shift ≈ (sh1*ShiftNet([net.node[7]], [3.0], net)).shift + +## Values and edge numbers functions +sh = ShiftNet(net.node[7], 3.0, net) +@test getshiftedgenumber(sh) == [8] +@test all(getshiftvalue(sh) .== [3.0]) + +## Hybrid shifts +@test shiftathybrids([2.0], net).shift ≈ ShiftNet(net.edge[6], 2.0, net).shift +@test shiftathybrids(2.0, net).shift ≈ shiftathybrids([2.0], net).shift + +## Test rand(net, ::ParamsProcess) + +# No shift on root +@test_throws ErrorException rand(net, ParamsBM(1.0, 0.1, ShiftNet(net.node[9], 3.0, net))) + +@test ParamsBM(1.0, 1.0, net).shift.shift ≈ ParamsBM(1.0, 1.0, ShiftNet(net)).shift.shift + +pars = ParamsBM(1, 0.1, ShiftNet(net.edge[8], 3.0, net)); # params of a BM +@test_logs show(devnull, pars) +@test_logs show(devnull, pars.shift) + +Random.seed!(17920921); # fix the seed +sim = rand(net, pars); # simulate according to a BM +@test_logs show(devnull, sim) + +traitsTips = sim[:tips]; +traitsNodes = sim[:internalnodes]; +meansTips = sim[:tips, :exp]; +meansNodes = sim[:internalnodes, :exp]; +@test meansTips == [1.,1.,1.0+3,1.0+3.0*0.6] +@test meansNodes == [1., 1.0+3.0*0.6, 1.0+3, 1., 1.] +@test length(traitsTips) == 4 +@test length(traitsNodes) == 5 +@test traitsNodes[end] == 1.0 # ancestral state +@test all(-1.0 .< traitsNodes-meansNodes .< 1.0) +@test all(-1.0 .< traitsTips-meansTips .< 1.0) + +# Test same as MultiBM +pars = ParamsMultiBM([1.0], 0.1*ones(1,1), ShiftNet(net.edge[8], 3.0, net)); +simMulti = rand(net, pars); +@test simMulti[:tips, :exp] ≈ sim[:tips, :exp]' +@test simMulti[:internalnodes, :exp] ≈ sim[:internalnodes, :exp]' + +############################################################################### +## Test of distibution - with shifts +############################################################################### + +## Generate some values +Random.seed!(18480224); # fix the seed +@test_throws ErrorException ParamsBM(1, 0.1, ShiftNet(net.edge[8], [3.0, 1.0], net)) +pars = ParamsBM(1, 0.1, ShiftNet(net.edge[8], 3.0, net)); # params of a BM +N = 50000 +S = length(tiplabels(net)); +values = zeros(Float64, (S, N)); +for i = 1:N + values[:,i] = rand(net, pars)[:tips] +end + +## Check that each tip has same mean (1) +expectations = rand(net, pars)[:tips,:exp] +for s in 1:S + @test mean(values[s, :]) ≈ expectations[s] atol=1e-2 +end + +## Check for variances +V = sharedpathmatrix(net); +Sig = V[:tips] * pars.sigma2; +for s in 1:S + for t in s:S + @test cov(values[s, :], values[t,:]) ≈ Sig[s, t] atol=1e-2 + end +end + +end diff --git a/test/test_simulate_mbd.jl b/test/test_simulate_mbd.jl new file mode 100644 index 0000000..33bbbb7 --- /dev/null +++ b/test/test_simulate_mbd.jl @@ -0,0 +1,207 @@ +# Tests to simulate multivariate traits + +## Get an ultrametric network ('net' already in global scope) +net = readnewick("(((Ag:5,(#H1:1::0.056,((Ak:2,(E:1,#H2:1::0.004):1):1,(M:2)#H2:1::0.996):1):1):1,(((((Az:1,Ag2:1):1,As:2):1)#H1:1::0.944,Ap:4):1,Ar:5):1):1,(P:4,20:4):3,165:7);"); + +@testset "Simulate data and check means and dimensions" begin + +# one single trait +pars = ParamsMultiBM([5.0], ones(1,1)) +sim = rand(net, pars) +@test sim[:tips, :exp] == [5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0] + +trait_dim = 3 + +## Simulate a MBD +Random.seed!(17920921); # fix the seed + +μ = randn(trait_dim) +Σ = randn(trait_dim, trait_dim) +Σ = Σ * Σ' # needs to be positive definite + +@test_throws ErrorException ParamsMultiBM(μ[1:2], Σ) + +pars = ParamsMultiBM(μ, Σ); # params of a MBD +@test_logs show(devnull, pars) + +sim = rand(net, pars); # simulate according to a BM +@test_logs show(devnull, sim) +@test_throws ErrorException sim[:tips, :Broken] + +# Extract simulated values +traitsTips = sim[:tips]; +traitsNodes = sim[:internalnodes]; + +# Check dimensions +@test size(traitsTips) == (trait_dim, net.numtaxa) +@test size(traitsNodes) == (trait_dim, net.numnodes - net.numtaxa) + +# Check means (no shifts) +@test sim[:all, :exp] ≈ μ * ones(net.numnodes)' + +end + +############################################################################### +## Test of distibution (fixed root) +############################################################################### +@testset "Simulate test distribution (fixed root)" begin +trait_dim = 3 + +## Generate some values +Random.seed!(18480224); # fix the seed +μ = randn(trait_dim) +Σ = randn(trait_dim, trait_dim) +Σ = Σ * Σ' # needs to be positive definite +pars = ParamsMultiBM(μ, Σ); # params of a MBD + +N = 10000 +S = length(tiplabels(net)); +μ_sim = zeros(trait_dim, S) +Σ_sim = zeros(trait_dim * S, trait_dim * S) +for i = 1:N + tips = rand(net, pars)[:tips] + μ_sim .+= tips + v_sim = vec(tips) + Σ_sim .+= v_sim * v_sim' +end +μ_sim ./= N +Σ_sim ./= N +Σ_sim = Σ_sim - vec(μ_sim) * vec(μ_sim)' + +## Check means +μ_true = μ * ones(S)' +@test isapprox(μ_sim, μ_true, atol=0.3) + +## Check covariance +Ψ = Matrix(vcv(net)) +Σ_true = kron(Ψ, Σ) # 36x36 matrix +@test isapprox(Σ_sim, Σ_true, atol=0.5, norm= x -> maximum(abs.(x))) + +end + +############################################################################### +## Test of distibution (random root) +############################################################################### +@testset "Simulate test distribution (random root)" begin +trait_dim = 3 + +## Generate some values +rng = StableRNG(24542) +μ = randn(rng, trait_dim) +Σ = randn(rng, trait_dim, trait_dim) +Σ = Σ * Σ' # needs to be positive definite +pars = ParamsMultiBM(μ, Σ); # params of a MBD + +Σ_root = randn(trait_dim, trait_dim) +Σ_root = Σ_root * Σ_root' / 10.0 # needs to be positive definite (and not too big to reduce variance in test) +pars.varRoot = Σ_root +pars.randomRoot = true + +@test_logs show(devnull, pars) +show(devnull, pars) + +N = 10000 +S = length(tiplabels(net)); +μ_sim = zeros(trait_dim, S) +Σ_sim = zeros(trait_dim * S, trait_dim * S) +for i = 1:N + tips = rand(rng, net, pars)[:tips] + μ_sim .+= tips + v_sim = vec(tips) + Σ_sim .+= v_sim * v_sim' +end +μ_sim ./= N +Σ_sim ./= N +Σ_sim = Σ_sim - vec(μ_sim) * vec(μ_sim)' + +## Check means +@test all(isapprox.(μ_sim, μ * ones(S)', atol=0.08)) + +## Check covariance +Ψ = Matrix(vcv(net)) +Σ_true = kron(Ψ, Σ) + kron(ones(S, S), pars.varRoot) +@test isapprox(Σ_sim, Σ_true, atol=12) # norm L2 of 36x36 matrix + +end + + +################################################################################ +## With shifts +################################################################################ + +net = readnewick("(A:2.5,((B:1,#H1:0.5::0.4):1,(C:1,(D:0.5)#H1:0.5::0.6):1):0.5);") + +@testset "Simulate with Shifts" begin +trait_dim = 3 + +Random.seed!(275698234545); # fix the seed + +## Test construction function +@test_throws ErrorException ShiftNet(net.edge[7], [1.0, 2.0], net) # can't put a shift on hybrid branch +@test_throws ErrorException ShiftNet(net.node[6], [1.0, 2.0], net) # can't put a shift on hybrid branch +@test_throws ErrorException ShiftNet([net.node[7], net.node[6]], [1.0 2.0], net) # dimensions don't match +@test ShiftNet(net.edge[8], [1.0, 2.0], net).shift ≈ ShiftNet([net.edge[8]], [1.0 2.0], net).shift +@test ShiftNet(net.edge[8], [1.0, 2.0], net).shift ≈ ShiftNet(net.node[7], [1.0, 2.0], net).shift +@test ShiftNet(net.node[7], [1.0, 2.0], net).shift ≈ ShiftNet([net.node[7]], [1.0 2.0], net).shift + +## Concatenate function +sh1 = ShiftNet(net.node[7], [1.0, 2.0], net)*ShiftNet(net.node[9], [3.0, -1.5], net) +@test_logs show(devnull, sh1) +@test sh1.shift ≈ ShiftNet([net.node[7], net.node[9]], [1.0 2.0; 3.0 -1.5], net).shift +@test_throws ErrorException sh1*ShiftNet(net.edge[7], [4.0, 3.5], net) # can't concatenate if the two affect the same edges +@test sh1.shift ≈ (sh1*ShiftNet([net.node[7]], [1.0 2.0], net)).shift +@test_throws ErrorException sh1*ShiftNet(net.edge[8], [4.0, 3.5, 5.0], net) # can't concatenate if the two affect the same edges + +## Values and edge numbers functions +@test getshiftedgenumber(sh1) == [-1, 8] +@test getshiftvalue(sh1) == [3.0 -1.5; 1.0 2.0] + +## Hybrid shifts +@test shiftathybrids([4.5 2.0], net).shift ≈ ShiftNet(net.edge[6], [4.5, 2.0], net).shift +@test_throws ErrorException shiftathybrids([4.5 2.0; 3.0 5.0], net) # dimension mismatch + +## Distributions +μ = randn(trait_dim) +Σ = randn(trait_dim, trait_dim) +Σ = Σ * Σ' # needs to be positive definite + +@test ParamsMultiBM(μ, Σ, net).shift.shift ≈ ParamsMultiBM(μ, Σ, ShiftNet(net, trait_dim)).shift.shift +@test_throws ErrorException ParamsMultiBM(μ, Σ, ShiftNet(net, 1)) + +# Shift at root causes an error. +sh = ShiftNet(net.node[7], [1.0, 2.0, -1.0], net)*ShiftNet(net.node[9], [3.0, -1.5, 4.2], net) +pars = ParamsMultiBM(μ, Σ, sh) +@test_throws ErrorException rand(net, pars) + +# One shift, not at the root +sh = ShiftNet(net.node[7], [1.0, 2.0, -1.0], net) +pars = ParamsMultiBM(μ, Σ, sh) + +@test_logs show(devnull, pars) +show(devnull, pars) + +N = 10000 +S = length(tiplabels(net)); +μ_sim = zeros(trait_dim, S) +Σ_sim = zeros(trait_dim * S, trait_dim * S) +for i = 1:N + tips = rand(net, pars)[:tips] + μ_sim .+= tips + v_sim = vec(tips) + Σ_sim .+= v_sim * v_sim' +end +μ_sim ./= N +Σ_sim ./= N +Σ_sim = Σ_sim - vec(μ_sim) * vec(μ_sim)' + +## Check means +sim = rand(net, pars) +μ_true = sim[:tips, :exp] +@test μ_true ≈ μ .+ [0 0 1 0.6; 0 0 2 1.2; 0 0 -1 -.6] # from shift on edge 8 only +@test isapprox(μ_sim, μ_true, atol=0.2) + +## Check covariance +Ψ = Matrix(vcv(net)) +Σ_true = kron(Ψ, Σ) +@test isapprox(Σ_sim, Σ_true, norm = x -> maximum(abs.(x)), atol=0.5) # 12x12 matrix +end diff --git a/test/test_traits_discrete.jl b/test/test_traits_discrete.jl new file mode 100644 index 0000000..d6eb4f9 --- /dev/null +++ b/test/test_traits_discrete.jl @@ -0,0 +1,781 @@ +runall = false; +@testset "discrete" begin + +net_caudata_47taxa_string = "((((((((((((((Ae_caudata_Tr275,Ae_caudata_Tr276),Ae_caudata_Tr139))#H1,#H2),(((Ae_umbellulata_Tr266,Ae_umbellulata_Tr257),Ae_umbellulata_Tr268),#H1)),((Ae_comosa_Tr271,Ae_comosa_Tr272),(((Ae_uniaristata_Tr403,Ae_uniaristata_Tr357),Ae_uniaristata_Tr402),Ae_uniaristata_Tr404))),(((Ae_tauschii_Tr352,Ae_tauschii_Tr351),(Ae_tauschii_Tr180,Ae_tauschii_Tr125)),(((((((Ae_longissima_Tr241,Ae_longissima_Tr242),Ae_longissima_Tr355),(Ae_sharonensis_Tr265,Ae_sharonensis_Tr264)),((Ae_bicornis_Tr408,Ae_bicornis_Tr407),Ae_bicornis_Tr406)),((Ae_searsii_Tr164,Ae_searsii_Tr165),Ae_searsii_Tr161)))#H2,#H4))),(((T_boeoticum_TS8,(T_boeoticum_TS10,T_boeoticum_TS3)),T_boeoticum_TS4),((T_urartu_Tr315,T_urartu_Tr232),(T_urartu_Tr317,T_urartu_Tr309)))),(((((Ae_speltoides_Tr320,Ae_speltoides_Tr323),Ae_speltoides_Tr223),Ae_speltoides_Tr251))H3,((((Ae_mutica_Tr237,Ae_mutica_Tr329),Ae_mutica_Tr244),Ae_mutica_Tr332))#H4))),Ta_caputMedusae_TB2),S_vavilovii_Tr279),Er_bonaepartis_TB1),H_vulgare_HVens23);" + +@testset "substitution Models, P and Q matrices" begin + +m1 = BinaryTraitSubstitutionModel(1.0, 2.0); +@test_logs show(devnull, m1) +m1 = BinaryTraitSubstitutionModel(1.0,2.0, ["carnivory", "non-carnivory"]); +@test nstates(m1)==2 +@test nparams(m1)==2 +@test_logs show(devnull, m1) +@test_throws ErrorException BinaryTraitSubstitutionModel(-1.0,2.0) +m2 = EqualRatesSubstitutionModel(4, 3.0); +@test nstates(m2)==4 +@test nparams(m2)==1 +m2 = EqualRatesSubstitutionModel(4, 3.0, ["S1","S2","S3","S4"]); +@test_logs show(devnull, m2) +@test_throws AssertionError EqualRatesSubstitutionModel(2, 0.001, ["abs"]); +@test_throws AssertionError EqualRatesSubstitutionModel(1, 0.001, ["abs"]); +m3 = TwoBinaryTraitSubstitutionModel([2.0,1.2,1.1,2.2,1.0,3.1,2.0,1.1], +["carnivory", "noncarnivory", "wet", "dry"]); +@test_logs show(devnull, m3) +@test nstates(m3)==4 +@test nparams(m3)==8 + +@test Q(m1) == StaticArrays.SMatrix{2,2}(-1.0, 2.0, 1.0, -2.0) +@test Q(m2) == StaticArrays.SMatrix{4,4}(-9.0, 3, 3, 3, 3, -9, 3, 3, 3, 3, -9, 3, 3, 3, 3, -9) +@test Q(m3) ≈ StaticArrays.SMatrix{4,4}(-3.0, 3.1, 1.2, 0.0, 1.0, -4.2, 0.0, 2.2, 2.0, 0.0, -3.2, 1.1, 0.0, 1.1, 2.0, -3.3) atol=1e-4 +@test PhyloTraits.P(m1, 0.5) ≈ StaticArrays.SMatrix{2,2}(0.7410433867161432,0.5179132265677134,0.2589566132838567,0.4820867734322865) atol=1e-15 +@test PhyloTraits.P(m2, 0.1) ≈ StaticArrays.SMatrix{4,4}(0.4758956589341516,0.17470144702194956,0.17470144702194962,0.17470144702194945,0.17470144702194956,0.47589565893415153,0.17470144702194967,0.17470144702194945,0.17470144702194962,0.17470144702194967,0.4758956589341516,0.17470144702194945,0.17470144702194945,0.17470144702194945,0.17470144702194945,0.4758956589341518) atol=1e-15 +@test PhyloTraits.P(m3, 0.5) ≈ StaticArrays.SMatrix{4,4}(0.39839916380463375,0.36847565707393248,0.23055614536582461,0.22576141081414305,0.1545971371424259,0.25768553619230444,0.14816051303688715,0.24300762748855972,0.29194735222005136,0.20198250750421617,0.35349416558860958,0.20267178083856716,0.15505634683288913,0.17185629922954704,0.26778917600867863,0.32855918085873009) atol=1e-15 +#@test P(m3, 0.5) ≈ [0.22313 1.64872 2.71828 1.0; 4.71147 0.122456 1.0 1.73325; 1.82212 1.0 0.201897 2.71828; 1.0 3.00417 1.73325 0.19205] atol=1e-4 +#@test P(m1, [0.02,0.01]) ≈ Array{Float64,2}[[0.980588 0.0194118; 0.0388236 0.961176], [0.990149 0.00985149; 0.019703 0.980297]] atol=1e-6 +#@test P(m2, [0.02,0.01]) ≈ Array{Float64,2}[[0.839971 0.053343 0.053343 0.053343; 0.053343 0.839971 0.053343 0.053343; 0.053343 0.053343 0.839971 0.053343; 0.053343 0.053343 0.053343 0.839971], [0.91519 0.0282699 0.0282699 0.0282699; 0.0282699 0.91519 0.0282699 0.0282699; 0.0282699 0.0282699 0.91519 0.0282699; 0.0282699 0.0282699 0.0282699 0.91519]] atol=1e-6 + +end + +@testset "types of RVAS" begin +# no rate variation +rv = RateVariationAcrossSites() +@test nparams(rv) == 0 +@test_logs show(devnull, rv) +@test rv.ratemultiplier == [1.0] +# +G model +rv = RateVariationAcrossSites(alpha=1.0, ncat=4) +@test nparams(rv) == 1 +@test_logs show(devnull, rv) +@test rv.ratemultiplier ≈ [0.146, 0.513, 1.071, 2.27] atol=.002 +PhyloTraits.setalpha!(rv, 2.0) +@test rv.ratemultiplier ≈ [0.319, 0.683, 1.109, 1.889] atol=.002 +@test all(rv.lograteweight .≈ -1.3862943611198906) +@test_logs PhyloTraits.setparameters!(rv, [10.]) +@test PhyloTraits.getparameters(rv) == [10] +@test PhyloTraits.getparamindex(rv) == [2] +# +I model +rv = RateVariationAcrossSites(pinv=0.3) +@test nparams(rv) == 1 +@test_logs show(devnull, rv) +@test rv.ratemultiplier ≈ [0, 1.429] atol=.002 +@test rv.lograteweight ≈ [-1.2039728043259361,-0.35667494393873245] +PhyloTraits.setpinv!(rv, 0.05) +@test rv.ratemultiplier ≈ [0, 1.053] atol=.002 +@test rv.lograteweight ≈ [-2.995732273553991,-0.05129329438755058] +@test_logs PhyloTraits.setparameters!(rv, [0.1]) +@test PhyloTraits.getparameters(rv) == [0.1] +@test PhyloTraits.getparamindex(rv) == [1] +# +G+I model +rv = RateVariationAcrossSites(pinv=0.3, alpha=2.0, ncat=4) +@test nparams(rv) == 2 +@test_logs show(devnull, rv) +@test rv.ratemultiplier ≈ [0.0, 0.456, 0.976, 1.584, 2.698] atol=.002 +@test rv.lograteweight ≈ [-1.204, -1.743, -1.743, -1.743, -1.743] atol=.002 +PhyloTraits.setalpha!(rv, 3.0) +@test rv.ratemultiplier ≈ [0.0, 0.6, 1.077, 1.584, 2.454] atol=.002 +PhyloTraits.setpinv!(rv, 0.05) +@test rv.ratemultiplier ≈ [0.0, 0.442, 0.793, 1.167, 1.808] atol=.002 +@test rv.lograteweight ≈ [-2.996, -1.438, -1.438, -1.438, -1.438] atol=.002 +@test_logs PhyloTraits.setparameters!(rv, [0.1,2.0]) +@test PhyloTraits.getparameters(rv) == [0.1,2.0] +@test PhyloTraits.getparamindex(rv) == [1,2] +# test for errors +@test_throws AssertionError PhyloTraits.setalpha!(rv, -0.05) +@test_throws AssertionError PhyloTraits.setpinv!(rv, -0.05) +@test_throws ErrorException RateVariationAcrossSites(ncat=4) +@test_throws AssertionError RateVariationAcrossSites(alpha=-2.0, ncat=4) +@test_throws AssertionError RateVariationAcrossSites(pinv=1.5) +@test_throws AssertionError RateVariationAcrossSites(pinv=-0.01) +@test_throws AssertionError RateVariationAcrossSites(pinv=0.5, alpha=-2., ncat=2) +@test_throws AssertionError RateVariationAcrossSites(pinv=-0.1, alpha=2., ncat=2) +# default object from symbol +@test typeof(RateVariationAcrossSites(:noRV)) == PhyloTraits.RVASGamma{1} +@test typeof(RateVariationAcrossSites(:G)) == PhyloTraits.RVASGamma{4} +@test typeof(RateVariationAcrossSites(:I)) == PhyloTraits.RVASInv +@test typeof(RateVariationAcrossSites(:GI)) == PhyloTraits.RVASGammaInv{5} +@test_throws ErrorException RateVariationAcrossSites(:unknown) +end + +@testset "random discrete trait simulation" begin + +m1 = BinaryTraitSubstitutionModel(1.0,2.0, ["carnivory", "non-carnivory"]); +m2 = EqualRatesSubstitutionModel(4, [3.0], ["S1","S2","S3","S4"]); +# on a single branch +rng = StableRNG(1234) +anc = [1,2,1,2,2] +@test sum(rand(rng, m1, 0.1, anc) .== anc) >= 4 +rng = StableRNG(12345) +anc = [1,3,4,2,1] +@test sum(rand(rng, m2, 0.05, anc) .== anc) >= 4 +# on a network +net = readnewick("(A:1.0,(B:1.0,(C:1.0,D:1.0):1.0):1.0);") +rng = StableRNG(21) +a,b = rand(rng,m1, net) +@test size(a) == (1, 7) +@test all(x in [1,2] for x in a) +@test sum(a .== 1) >=2 && sum(a .== 2) >= 2 +@test b == ["-2", "-3", "-4", "D", "C", "B", "A"] +if runall + for e in net.edge e.length = 10.0; end + @time a,b = rand(m1, net; ntraits=100000) # ~ 0.014 seconds + sum(a[:,1])/100000 # expect 1.5 at root + sum(a[:,2])/100000 # expect 1.333 at other nodes + @time a,b = rand(m2, net; ntraits=100000) # ~ 0.02 seconds + length([x for x in a[:,1] if x==4])/length(a[:,1]) # expect 0.25 + length([x for x in a[:,2] if x==4])/length(a[:,2]) + length([x for x in a[:,3] if x==4])/length(a[:,3]) + length([x for x in a[:,4] if x==4])/length(a[:,4]) + length([x for x in a[:,5] if x==4])/length(a[:,5]) + length([x for x in a[:,6] if x==4])/length(a[:,6]) + length([x for x in a[:,7] if x==4])/length(a[:,7]) # expect 0.25 +end + +net2 = readnewick("(((A:4.0,(B:1.0)#H1:1.1::0.9):0.5,(C:0.6,#H1:1.0):1.0):3.0,D:5.0);") +a,b = rand(StableRNG(49), m1, net2; keepinternal=false) +@test a == [1 2 1 1] +@test b == ["D", "C", "B", "A"] +a,b = rand(StableRNG(49), m1, net2; keepinternal=true) +@test size(a) == (1, 9) +@test all(x in [1,2] for x in a) +@test b == ["-2", "D", "-3", "-6", "C", "-4", "H1", "B", "A"] +if runall + for e in net2.edge + if e.hybrid + e.length = 0.0 + end + end + a,b = rand(m1, net2; ntraits=100000) + # plot(net2, shownodenumber=true) shows: H1 listed 7th, parents listed 4th and 6th + c = map( != , a[:, 4],a[:, 6] ); # traits when parents have different traits + n1 = sum(map( ==, a[c,7],a[c,6] )) # 39644 traits: hybrid ≠ major parent + n2 = sum(map( ==, a[c,7],a[c,4] )) # 4401 traits: hybrid ≠ minor parent + n1/sum(c) # expected 0.9 + n2/sum(c) # expected 0.1 + for e in net2.edge + e.length = 0.0 + end + net2.edge[4].length = 10.0 + a,b = rand(m1, net2; ntraits=100000); + a[:, 1] == a[:, 2] # true: root = leaf D, as expected + a[:, 1] == a[:, 5] # true: root = leaf C + sum(a[:, 6])/100000 # expected 1.3333 + a[:, 6] == a[:, 9] # true: major hybrid parent node = leaf A +end + +end + +@testset "discrete likelihood, fixed topology" begin + +# test on a tree +#= +likelihood calculated in R using a fixed Q matrix, first with ace() then +with fitdiscrete(), then with fitMK(). problem: they give different results, +see http://blog.phytools.org/2015/09/the-difference-between-different.html +- ace: misses log(#states) in its log-likelihood +- fitdiscrete in geiger: uses empirical prior at root, not stationary dist, + but "lik" object is very flexible +- fitMk is correct. also great for 2 correlated binary traits +library(ape) +mytree = read.tree(text = "(A:3.0,(B:2.0,(C:1.0,D:1.0):1.0):1.0);") +states = c(1,1,2,2) +names(states) = mytree$tip.label +fitER = ace(states, mytree, model="ER", type="discrete") +print(fitER$loglik, digits=17) # log-likelihood = -1.9706530878326345 +print(fitER$loglik - log(2), digits=17) # -2.6638002683925799 +print(fitER$rates, digits=17) # rates = 0.3743971742794559 +print(fitER$lik.anc, digits=17)# posterior probs of states at nodes: 3x2 matrix (3 internal nodes, 2 states) +library(geiger) +fitER = fitdiscrete(mytree, states, model="ER") +print(fitER$opt$q12, digits=17) # rates = 0.36836216513047726 +print(fitER$opt$lnL, digits=17) # log-likelihood = -2.6626566310743804 +lik = fitER$lik +lik(0.3743971742794559, root="given",root.p=c(.5,.5)) # -2.6638002630818232: same as ace + log(2) +library(phytools) +Q2 = matrix(c(-1,1,1,-1),2,2)*fitER$opt$q12 +fit2 = fitMk(mytree, states, model="ER", fixedQ=Q2) +print(fit2$logLik, digits=17) # log-likelihood = -2.6638637960257574 +fitER = fitdiscrete(mytree, states, model="ARD") +lik = fitER$lik +Q = c(0.29885191850718751, 0.38944304456937912) # q12, q21 +lik(Q, root="given", root.p=Q[2:1]/sum(Q)) # -2.6457428692377234 +lik(Q, root="flat") # -2.6447321523303113 +Q = c(0.2, 0.3) # q12, q21 +lik(Q, root="flat") # -2.6754091090953693 .1,.7: -3.3291679800706073 +optim(Q, lik, lower=1e-8, control=list(fnscale=-1), root="flat") +# rates = 0.29993140042699212 0.38882902905265493 loglik=-2.6447247349802496 +states=c(1,2,1); names(states)=c("A","B","D") +fitER = fitdiscrete(mytree, states, model="ARD"); lik = fitER$lik +lik(Q, root="flat") # -2.1207856874033491 +=# + +net = readnewick("(A:3.0,(B:2.0,(C:1.0,D:1.0):1.0):1.0);"); +tips = Dict("A" => "lo", "B" => "lo", "C" => "hi", "D" => "hi"); #? this is supposed to be an AbstractVector, is a Dict{String,String} +m1 = EqualRatesSubstitutionModel(2,[0.36836216513047726], ["lo", "hi"]); +fit1 = (@test_logs fitdiscrete(net, m1, tips; optimizeQ=false, optimizeRVAS=false)); +@test_logs show(devnull, fit1) +@test StatsAPI.loglikelihood(fit1) ≈ -2.6638637960257574 atol=2e-4 +@test StatsAPI.dof(fit1) == 1 +species = ["G","C","A","B","D"] +dat1 = DataFrame(trait = ["hi","hi","lo","lo","hi"], species = species) +m2 = BinaryTraitSubstitutionModel(0.2, 0.3, ["lo", "hi"]) +fit2 = (@test_logs fitdiscrete(net, m2, dat1; optimizeQ=false, optimizeRVAS=false)) +@test fit2.trait == [[1],[1],[2],[2]] +@test StatsAPI.loglikelihood(fit2) ≈ -2.6754091090953693 atol=2e-4 +originalstdout = stdout +redirect_stdout(devnull) +#OPTIMIZES RATES +fit2 = @test_logs fitdiscrete(net, m2, dat1; optimizeQ=true, optimizeRVAS=false, verbose=true) # 65 iterations +redirect_stdout(originalstdout) +@test fit2.model.rate ≈ [0.29993140042699212, 0.38882902905265493] atol=2e-4 +@test StatsAPI.loglikelihood(fit2) ≈ -2.6447247349802496 atol=2e-4 +m2.rate[:] = [0.2, 0.3]; +dat2 = DataFrame(trait1= ["hi","hi","lo","lo","hi"], trait2=["hi",missing,"lo","hi","lo"]); +fit3 = (@test_logs fitdiscrete(net, m2, String7.(species), dat2; optimizeQ=false, optimizeRVAS=false)) + +@test fit3.loglik ≈ (-2.6754091090953693 - 2.1207856874033491) +fit!(fit3; optimizeQ=true, optimizeRVAS=false) +@test fit3.model.rate ≈ [0.3245645980184735, 0.5079500171263976] atol=1e-4 +fit!(fit3; optimizeQ=true, optimizeRVAS=true) +fit3.net = readnewick("(A,(B,(C,D):1.0):1.0);"); # no branch lengths +@test_throws ErrorException fit!(fit3; optimizeQ=true, optimizeRVAS=true) +# fit() catches the error (due to negative branch lengths) + +# test on a network, 1 hybridization +net = readnewick("(((A:4.0,(B:1.0)#H1:1.1::0.9):0.5,(C:0.6,#H1:1.0::0.1):1.0):3.0,D:5.0);") +# function below used to check that simulation proportions == likelihood +m1 = BinaryTraitSubstitutionModel([1.0, 2.0], [1,2]) # model.label = model.index +function traitprobabilities(model, net, ntraits=10) + res, lab = rand(model, net; ntraits=ntraits) + tips = findall(in(tiplabels(net)), lab) # indices of tips: columns in res + dat = DataFrame(species = lab[tips]) + tmp = StatsBase.countmap([res[i,tips] for i in 1:ntraits]) + i = 0 + prop = Float64[] + for (k,v) in tmp + i += 1 + dat[Symbol("x",i)] = k + push!(prop, v/ntraits) + end + npatterns = i + lik = Float64[] + for i in 1:npatterns + fit = fitdiscrete(net, model, dat[[:species, Symbol("x",i)]]; optimizeQ=false, optimizeRVAS=false) + push!(lik, fit.loglik) + end + return dat, prop, lik +end +#= +using PhyloNetworks, StatsBase, DataFrames +d, p, ll = traitprobabilities(m1, net, 100000000); +all(isapprox.(log.(p), ll, atol=1e-3)) # true +hcat(log.(p), ll) + -1.62173 -1.62184 + -3.00805 -3.00807 + -4.39506 -4.39436 + -3.00747 -3.0082 + -3.70119 -3.70121 + -3.00759 -3.0082 + -2.31516 -2.31505 + -2.31554 -2.31499 + -3.0083 -3.0082 + -3.008 -3.0082 + -2.31475 -2.31505 + -3.702 -3.70135 + -3.00836 -3.00813 + -3.70033 -3.70121 + -2.31546 -2.31499 + -3.70124 -3.70135 +=# +d = DataFrame(species=["D","C","B","A"], x1=[1,1,1,1], x2=[1,2,2,1], x3=[2,2,2,2], x4=[1,1,2,2], + x5=[2,2,2,1], x6=[2,2,1,1], x7=[1,1,2,1], x8=[2,1,1,1], x9=[2,1,2,1], x10=[1,2,1,2], + x11=[1,2,1,1], x12=[2,2,1,2], x13=[2,1,1,2], x14=[1,2,2,2], x15=[1,1,1,2], x16=[2,1,2,2]) +lik = Float64[] +for i in 1:16 + fit = fitdiscrete(net, m1, d[!,[:species, Symbol("x",i)]]; optimizeQ=false, optimizeRVAS=false) + push!(lik, fit.loglik) +end +traitloglik_all16 = [-1.6218387598967712, -3.008066347196894, -4.3943604143403245, -3.008199100743402, + -3.70121329832901, -3.0081981601869483, -2.315051933868397, -2.314985711030534, + -3.0081988850020873, -3.0081983709272504, -2.3150512090547584, -3.70134532205944, + -3.008132923628349, -3.7012134632082083, -2.3149859724945876, -3.7013460518770915] +@test lik ≈ traitloglik_all16 +fit1 = fitdiscrete(net, m1, d[!,:species], d[!,2:17]; optimizeQ=false, optimizeRVAS=false) +@test fit1.loglik ≈ sum(traitloglik_all16) # log of product = sum of logs + +# with parameter estimation +net = readnewick("(((A:2.0,(B:1.0)#H1:0.1::0.9):1.5,(C:0.6,#H1:1.0::0.1):1.0):0.5,D:2.0);") +m1 = BinaryTraitSubstitutionModel([1.0, 1.0], ["lo", "hi"]) +dat = DataFrame(species=["C","A","B","D"], trait=["hi","lo","lo","hi"]) +fit1 = fitdiscrete(net, m1, dat; optimizeQ=false, optimizeRVAS=false) +@test fit1.loglik ≈ -2.77132013004859 +fit!(fit1; optimizeQ=true, optimizeRVAS=false) +@test fit1.model.rate ≈ [0.2722263130324768, 0.34981109618902395] atol=1e-4 +@test fit1.loglik ≈ -2.727701700695741 +# for information only: function used locally to check for correct parameter estimation +function simulateManyTraits_estimate(ntraits) + m1 = BinaryTraitSubstitutionModel([1.0, 0.5], [1,2]) + res, lab = rand(m1, net; ntraits=ntraits) + tips = findall(in(tiplabels(net)), lab) # indices of tips: columns in res + dat = DataFrame(transpose(res[:,tips])); species = lab[tips] + return fitdiscrete(net, m1, species, dat; optimizeRVAS = false) +end +# simulateManyTraits_estimate(100000) +# α=1.1124637623451075, β=0.5604529225895175, loglik=-25587.1 with ntraits=10000 +# α=0.9801472136310236, β=0.4891696992781437, loglik=-255755.6 with ntraits=100000 +# time with ntraits=100000: 907.2s = 15min 7s (one single processor, no binning of traits with same pattern) + +# ancestral state reconstruction - fixit!! +fit1.model.rate[1] = 0.2722263130324768; +fit1.model.rate[2] = 0.34981109618902395; +@test_throws ErrorException ancestralreconstruction(fit1, 4) # 1 trait, not 4: error +asr = ancestralreconstruction(fit1) +@test DataFrames.propertynames(asr) == [:nodenumber, :nodelabel, :lo, :hi] +@test asr[!,:nodenumber] == collect(1:9) +@test asr[!,:nodelabel] == ["A","B","C","D","5","6","7","8","H1"] +@test asr[!,:lo] ≈ [1.,1.,0.,0., 0.28602239466671175, 0.31945742289603263, + 0.16855042517785512, 0.7673588716207436, 0.7827758475866091] atol=1e-5 +@test asr[!,:hi] ≈ [0.,0.,1.,1.,0.713977605333288, 0.6805425771039674, + 0.8314495748221447, 0.23264112837925616, 0.21722415241339132] atol=1e-5 +pltw = [-0.08356534477069566, -2.5236181051014333] +@test PhyloTraits.posterior_logtreeweight(fit1) ≈ pltw atol=1e-5 +@test PhyloTraits.posterior_logtreeweight(fit1, 1:1) ≈ reshape(pltw, (2,1)) atol=1e-5 +@test PhyloTraits.posterior_loghybridweight(fit1, "H1") ≈ -2.5236227134322293 + +end # end of testset, fixed topology + +@testset "readfastatodna" begin +fastafile = joinpath(@__DIR__, "..", "examples", "test_8_withrepeatingsites.aln") +#fastafile = abspath(joinpath(dirname(Base.find_package("PhyloTraits")), "..", "examples", "test_8_withrepeatingsites.aln")) +dat, weights = readfastatodna(fastafile, true); +@test weights == [3.0, 1.0, 1.0, 2.0, 1.0] +@test size(dat,2) == 6 # 3 (repeated) columns removed + +# test on data with no repeated site patterns +fastafile = joinpath(@__DIR__, "..", "examples", "Ae_bicornis_8sites.aln") +#fastafile = abspath(joinpath(dirname(Base.find_package("PhyloTraits")), "..", "examples", "Ae_bicornis_8sites.aln")) +dat, weights = readfastatodna(fastafile, true); +@test weights == ones(Float64, 8) +@test size(dat,2) == 9 +end # testing readfastatodna + +@testset "data to SSM pruning: complex network" begin +fastafile = joinpath(@__DIR__, "..", "examples", "Ae_bicornis_8sites.aln") +#fastafile = abspath(joinpath(dirname(Base.find_package("PhyloTraits")), "..", "examples", "Ae_bicornis_8sites.aln")) + +net = readnewick(net_caudata_47taxa_string); +PN.fuseedgesat!(93, net) +# assign non-missing edges lengths and gammas +for e in net.edge e.length = 1.0; end +for h in net.hybrid setgamma!(getparentedge(h),0.6); end +obj = (@test_logs (:warn, r"pruned") PhyloTraits.StatisticalSubstitutionModel(net, fastafile, :JC69)) +@test length(obj.net.leaf) == 22 +@test length(obj.net.edge) == 52 +@test length(obj.net.hybrid) == 3 +@test !PN.hashybridladder(obj.net) + +# network with 47 taxa, but data on 22 taxa +net = readnewick(net_caudata_47taxa_string); +PN.fuseedgesat!(93, net) +obj = (@test_logs (:warn, r"taxa with no data") PhyloTraits.StatisticalSubstitutionModel(net, fastafile, :JC69)) +@test length(obj.net.leaf) == 22 +io = IOBuffer(); +PhyloTraits.showdata(io, obj) +@test String(take!(io)) == "data:\n 22 species\n 8 sites" +PhyloTraits.showdata(io, obj, true) +@test String(take!(io)) == +"data: + 22 species + 8 sites + 0 sites with no data (0.0%) + 2 invariant sites (25.0%) + 6 sites with 2 distinct states (75.0%) + 6 parsimony-informative sites (75.0%) + 6 sites with 1 or more missing values (75.0%) + 3.41% missing values overall" +close(io) +end # testing data to SSM pruning + +@testset "NucleicAcidSubsitutionModels" begin + +#test NASM models basics +mJC69 = JC69(0.5, false); +@test Q(mJC69) ≈ [-0.5 0.166667 0.166667 0.166667; + 0.166667 -0.5 0.166667 0.166667; + 0.166667 0.166667 -0.5 0.166667; + 0.166667 0.166667 0.166667 -0.5] atol=1e-5 +@test PhyloTraits.P(mJC69, 1.0) ≈ [0.635063 0.121646 0.121646 0.121646; + 0.121646 0.635063 0.121646 0.121646; + 0.121646 0.121646 0.635063 0.121646; + 0.121646 0.121646 0.121646 0.635063] atol=1e-5 + +@test_throws ErrorException HKY85([0.5, 0.5], [0.25, 0.25, 0.25, 0.25], true) +@test_throws ErrorException HKY85([.1,.1,.1], [0.25, 0.25, 0.25, 0.25], false) +@test_throws ErrorException HKY85([0.5], [0.25, 0.25, 0.25, 0.25], false) +#= HKY matrix from simulations with seq-gen +echo '(t1:0,t2:0.1);' > twotaxon.phy +seq-gen -m HKY -l 10000 -t 1.1145320197044333 -f 0.37 0.40 0.05 0.18 -of < twotaxon.phy > twotaxon_10000.fas +seq-gen -m HKY -l 100000000 -t 1.1145320197044333 -f 0.37 0.40 0.05 0.18 -of < twotaxon.phy > twotaxon.fas +# transition/transversion ratio = 1.11453 (K=3) +# tstv = kappa (here we want 3) * (pa*pg + pc*pt)/(py*pr) = 1.1145320197044333 +system.time(dat <- phyDat(read.dna("twotaxon.fas", format="fasta"))) # 99 seconds +bf = baseFreq(dat) # 0.36996372 0.40000796 0.04997551 0.18005282 +w = attr(dat, "weight") +acgt = attr(dat, "levels") +mat = matrix(NA,4,4, dimnames=list(acgt, acgt)) +for (pattern in 1:16){ + i = dat[[1]][pattern] + j = dat[[2]][pattern] + mat[i,j] = w[pattern] +} +mat/sum(w) # joint probabilities + a c g t +a 0.34529570 0.01368654 0.00483382 0.00615715 +c 0.01366887 0.36582571 0.00185338 0.01864593 +g 0.00483558 0.00185214 0.04245549 0.00083627 +t 0.00615407 0.01865763 0.00082884 0.15441288 +m = (mat/sum(w) + t(mat/sum(w)))/2 # symmetric: we know it should be bc reversible + a c g t +a 0.34529570 0.01367771 0.004834700 0.006155610 +c 0.01367771 0.36582571 0.001852760 0.018651780 +g 0.00483470 0.00185276 0.042455490 0.000832555 +t 0.00615561 0.01865178 0.000832555 0.154412880 +m/bf # transition probabilities + a c g t +a 0.93332315 0.03697040 0.013068038 0.01663842 +c 0.03419358 0.91454609 0.004631808 0.04662852 +g 0.09674139 0.03707336 0.849525983 0.01665926 +t 0.03418780 0.10359060 0.004623949 0.85759765 +@time dna_dat, dna_weights = readfastatodna("twotaxon_10000.fas", true); +# 1000 sites: 0.009950 seconds. 10_000 sites: 0.272987 seconds +# takes forever with 100_000_000 sites: far from linear +=# +mHKY85 = HKY85([0.5, 0.5], [0.25, 0.25, 0.25, 0.25], false) +@test Q(mHKY85) ≈ [ -0.375 0.125 0.125 0.125; + 0.125 -0.375 0.125 0.125; + 0.125 0.125 -0.375 0.125; + 0.125 0.125 0.125 -0.375] atol=1e-5 +@test PhyloTraits.P(mHKY85, 1.0) ≈ [0.704898 0.0983673 0.0983673 0.0983673; + 0.0983673 0.704898 0.0983673 0.0983673; + 0.0983673 0.0983673 0.704898 0.0983673; + 0.0983673 0.0983673 0.0983673 0.704898] atol=1e-5 + +@test PhyloTraits.P!(PhyloTraits.P(mHKY85, 1.0), mHKY85, 3.0) ≈ [0.417348 0.194217 0.194217 0.194217; + 0.194217 0.417348 0.194217 0.194217; + 0.194217 0.194217 0.417348 0.194217; + 0.194217 0.194217 0.194217 0.417348] atol=1e-5 + +mHKY85rel = HKY85(3.0, [.37,.40,.05,.18]) +@test Q(mHKY85rel) ≈ [-.7086 .388274 .145603 .174723; + .359154 -.931858 .0485343 .52417; + 1.07746 .388274 -1.64046 .174723; + .359154 1.16482 .0485343 -1.57251] atol=1e-3 +@test PhyloTraits.P(HKY85([3.0], [.37,.40,.05,.18]), 0.1) ≈ + [.93332315 .03697040 .013068038 .01663842; # values: from seq-gen simulations + .03419358 .91454609 .004631808 .04662852; + .09674139 .03707336 .849525983 .01665926; + .03418780 .10359060 .004623949 .85759765] atol=1e-3 + +@test PhyloTraits.P!(PhyloTraits.P(mJC69, 1.0), mJC69, 3.5) ≈ [0.322729 0.225757 0.225757 0.225757; + 0.225757 0.322729 0.225757 0.225757; + 0.225757 0.225757 0.322729 0.225757; + 0.225757 0.225757 0.225757 0.322729] atol=1e-5 + +@test_logs show(devnull, mJC69) +@test_logs show(devnull, mHKY85) +end # end of testing NASMs + +@testset "fitdiscrete for NucleicAcidSubsitutionModels & RateVariationAcrossSites" begin +# test fitdiscrete with NASM # + # based on 3 alignments in PhyloNetworks/examples +net = readnewick("(A:3.0,(B:2.0,(C:1.0,D:1.0):1.0):1.0);"); +tips = Dict("A" => BioSymbols.DNA_A, "B" => BioSymbols.DNA_A, "C" => BioSymbols.DNA_G, "D" => BioSymbols.DNA_G); + +# JC without optimization (confirmed with ape ace() function and phangorn) +mJC69 = JC69(0.2923350741254221, false) #ace() gives Q matrix cell, not rate. lambda = (1.0/3.0)*obj.rate[1] so rate = 3*0.097445024708474035 = 0.2923350741254221 + #phangorn gives rate = 0.292336 +fitJC69 = fitdiscrete(net, mJC69, tips; optimizeQ=false); +@test loglikelihood(fitJC69) ≈ -4.9927386890207304 atol=2e-6 #ace() from ape pkg and our method agree here. + #from ace() + log(4) + +# JC without optimize at 0.25 +mJC69 = JC69([0.25], false) +fitJC69 = fitdiscrete(net, mJC69, tips; optimizeQ=false); +@test loglikelihood(fitJC69) ≈ -4.99997 atol=2e-3 #from phangorn + +# JC with optimization (confirmed with ape ace() function and phangorn) +mJC69 = JC69([0.25], false) +fitJC69 = fitdiscrete(net, mJC69, tips; optimizeQ=true) +@test Q(fitJC69.model)[1,2] ≈ 0.097445024708474035 atol = 2e-3 #confirmed with ace() in ape pkg (ace calls Q matrix rate) +@test loglikelihood(fitJC69) ≈ -4.9927386890207304 atol=2e-6 #confirmed with ape pkg ace() + log(4) and phangorn optim.pml + +#= HKY without optimization, confirmed with phangorn R code: +library(phangorn) +mytree = read.tree(text = "(A:3.0,(B:2.0,(C:1.0,D:1.0):1.0):1.0);") +states = factor(c(1,1,3,3), levels=c("1","2","3","4")) +names(states) = mytree$tip.label +mydata <- as.phyDat(states) +# likelihood without optimization +fitHKY_phan <- pml(mytree, mydata, model = "HKY") #this is equivalent to rate = [4/3, 4/3] +print(fitHKY_phan$logLik, digits = 10) # -5.365777014 +fitHKY_phan$rate # 1 +=# +mHKY85 = HKY85([4.0/3, 4.0/3], [0.25, 0.25, 0.25, 0.25], false); # absolute +fitHKY85 = fitdiscrete(net, mHKY85, tips; optimizeQ=false); +@test loglikelihood(fitHKY85) ≈ -5.365777014 atol = 2e-8 # equivalent to phangorn $logLik +mHKY85 = HKY85([1.0], [0.25, 0.25, 0.25, 0.25], true); # relative +fitHKY85 = fitdiscrete(net, mHKY85, tips; optimizeQ=false); +@test loglikelihood(fitHKY85) ≈ -5.365777014 atol = 2e-8 # equivalent to above b/c transversion/transition rates equal + +#= HKY85 with optimization, confirmed with ape ace() in R +# NOTE: ace does not include log(#states) in its log-likelihood +library(ape) +mytree = read.tree(text = "(A:3.0,(B:2.0,(C:1.0,D:1.0):1.0):1.0);") +states = factor(c(1,1,3,3), levels=c("1","2","3","4")) +names(states) = mytree$tip.label +HKYQ <- matrix(c(0,2,1,2, 2,0,2,1, 1,2,0,2, 2,1,2,0), 4) +fitHKY = ace(states, mytree, type = "discrete", model=HKYQ) +print(fitHKY$loglik - log(4), digits=17) # -3.3569474489525244 +print(fitHKY$rates*4, digits=17) # 1.4975887229148119 0.0 +=# +mHKY85 = HKY85([0.5, 0.1], [0.25, 0.25, 0.25, 0.25], false); # absolute +fitHKY85 = fitdiscrete(net, mHKY85, tips; optimizeQ=true) +@test fitHKY85.model.rate[1] ≈ 1.4975887229148119 atol = 2e-4 # equivalent to ape ace() rate * 4 +@test loglikelihood(fitHKY85) ≈ -3.3569474489525244 atol = 2e-8 # equivalent to ape ace() fitHKY$loglik - log(4) + +# test RateVariationAcrossSites with NASM +rv = RateVariationAcrossSites(alpha=1.0, ncat=4) +rv.ratemultiplier[:] = [0.1369538, 0.4767519, 1.0000000, 2.3862944] # NOTE: phangorn calculates gamma quantiles differently, so I assign them for testing +mJC69 = JC69([1.0], true) +fitJC69rv = fitdiscrete(net, mJC69, rv, tips; optimizeQ=false, optimizeRVAS=false, ftolRel=1e-20); +@test loglikelihood(fitJC69rv) ≈ -5.26390008 atol = 2e-8 +@test dof(fitJC69rv) == 1 # relative JC: 0, rate variation: 1 + +fitJC69rvOpt = fitdiscrete(net, mJC69, rv, tips, optimizeQ=false, optimizeRVAS=true); + +mHKY85 = HKY85([4.0/3, 4.0/3], [0.25, 0.25, 0.25, 0.25], false); +fitHKY85rv = fitdiscrete(net, mHKY85, rv, tips; optimizeQ=false, optimizeRVAS=false); +@test loglikelihood(fitHKY85rv) ≈ -5.2639000803742979 atol = 2e-5 #from phangorn +@test dof(fitHKY85rv) == 3 # absolute HKY (fixed base freqs.): 2, rate variation: 1 + +fitHKY85rvOpt = fitdiscrete(net, mHKY85, rv, tips; optimizeQ=false, optimizeRVAS=true); + +## TEST WRAPPERS ## +#for species, trait data +net_dat = readnewick("(((A:2.0,(B:1.0)#H1:0.1::0.9):1.5,(C:0.6,#H1:1.0::0.1):1.0):0.5,D:2.0);") +dat = DataFrame(species=["C","A","B","D"], trait=["hi","lo","lo","hi"]) +species_alone = ["C","A","B","D"] +dat_alone = DataFrame(trait=["hi","lo","lo","hi"]) +net_tips = readnewick("(A:3.0,(B:2.0,(C:1.0,D:1.0):1.0):1.0);"); +@test_throws ErrorException fitdiscrete(net_dat, :bogus, species_alone, dat_alone); +@test_throws ErrorException fitdiscrete(net_dat, BinaryTraitSubstitutionModel([1.,1.], ["lo","hi"]), dat_alone); +s1 = fitdiscrete(net_dat, :ERSM, species_alone, dat_alone; optimizeQ=false) +@test_logs show(devnull, s1) +s1 = fitdiscrete(net_dat, :ERSM, species_alone, dat_alone, :G; optimizeQ=false, optimizeRVAS=false) +@test_logs show(devnull, s1) +s2 = fitdiscrete(net_dat, :BTSM, species_alone, dat_alone; optimizeQ=false, optimizeRVAS=false) +@test_logs show(devnull, s2) +@test_throws ErrorException fitdiscrete(net_dat, :TBTSM, species_alone, dat_alone; optimizeQ=false, optimizeRVAS=false) +dna_alone = DataFrame(trait=['A','C','C','A']) +s3 = fitdiscrete(net_dat, :JC69, species_alone, dna_alone, :G; optimizeRVAS=false, ftolRel=.1,ftolAbs=.2,xtolRel=.1,xtolAbs=.2) # 1 site: no info to optimize RVAS +@test s3.model.relative +@test s3.ratemodel.alpha == [1.0] +@test_logs show(devnull, s3) +s4 = fitdiscrete(net_dat, :HKY85, species_alone, dna_alone, :G; optimizeRVAS=false, ftolRel=.1,ftolAbs=.2,xtolRel=.1,xtolAbs=.2) +@test s4.model.relative +@test s4.model.pi == [3,3,1,1]/8 +@test s4.ratemodel.alpha == [1.0] +@test_logs show(devnull, s4) + +#for dna data (output of fastatodna) +fastafile = joinpath(@__DIR__, "..", "examples", "Ae_bicornis_Tr406_Contig10132.aln") +#fastafile = abspath(joinpath(dirname(Base.find_package("PhyloNetworks")), "..", "examples", "Ae_bicornis_Tr406_Contig10132.aln")) +dna_dat, dna_weights = readfastatodna(fastafile, true); +net_dna = readnewick(net_caudata_47taxa_string); +@test PhyloTraits.startingrate(net_dna) ≈ 0.02127659574468085 # 1/length(net_dna.leaf) +for edge in net_dna.edge # adds branch lengths + edge.length = 1.0 + if edge.gamma < 0 + setgamma!(edge, 0.5) + end +end + +d1 = (@test_logs (:warn, r"^the network contains taxa with no data") fitdiscrete(net_dna, + :ERSM, dna_dat, dna_weights; optimizeQ=false, optimizeRVAS=false)) +@test_logs show(devnull, d1) +@test_throws ErrorException fitdiscrete(net_dna, :BTSM, dna_dat, dna_weights; optimizeQ=false, optimizeRVAS=false); +@test_throws ErrorException fitdiscrete(net_dna, :TBTSM, dna_dat, dna_weights; optimizeQ=false, optimizeRVAS=false); +@test_throws ErrorException fitdiscrete(net_dna, :bogus, dna_dat, dna_weights; optimizeQ=false, optimizeRVAS=false); +d2 = (@test_logs (:warn, r"^the network contains taxa with no data") fitdiscrete(net_dna, + :JC69, dna_dat, dna_weights; optimizeQ=false, optimizeRVAS=false)) +@test_logs show(devnull, d2) +d2 = (@test_logs (:warn, r"^the network contains taxa with no data") fitdiscrete(net_dna, + :JC69, dna_dat, dna_weights, :GI; optimizeQ=false, optimizeRVAS=false)) +@test_logs show(devnull, d2) +d3 = (@test_logs (:warn, r"^the network contains taxa with no data") fitdiscrete(net_dna, + :HKY85, dna_dat, dna_weights; optimizeQ=false, optimizeRVAS=false)) +@test_logs show(devnull, d3) + +end #testing fitdiscrete for NucleicAcidSubsitutionModels & RateVariationAcrossSites + +@testset "readfastatodna with NASM and RateVariationAcrossSites" begin +fastafile = joinpath(@__DIR__, "..", "examples", "Ae_bicornis_Tr406_Contig10132.aln") +#fastafile = abspath(joinpath(dirname(Base.find_package("PhyloNetworks")), "..", "examples", "Ae_bicornis_Tr406_Contig10132.aln")) +dna_dat, dna_weights = readfastatodna(fastafile, true); + +dna_net_top = readnewick(net_caudata_47taxa_string); +(x-> x.length = 1).(dna_net_top.edge) # add branch lengths of 1 + +nasm_model = JC69([0.3], false); # relative=false: absolute version +rv = RateVariationAcrossSites(alpha=1.0, ncat=2); # 2 rates to go faster +# below: error because missing gammas, after warning for extra taxa +(@test_logs (:warn, r"pruned") @test_throws ErrorException fitdiscrete(dna_net_top, nasm_model, dna_dat, dna_weights; optimizeQ=false, optimizeRVAS=false)) +# set gamma at the 3 reticulations, to fix error above +setgamma!(dna_net_top.edge[6],0.6) +setgamma!(dna_net_top.edge[7],0.6) +setgamma!(dna_net_top.edge[58],0.6) + +dna_net = (@test_logs (:warn, r"^the network contains taxa with no data") fitdiscrete(dna_net_top, + nasm_model, dna_dat, dna_weights; optimizeQ=false)) +@test dna_net.model.rate == nasm_model.rate +@test dna_net.ratemodel.ratemultiplier == [1.0] +dna_net_optQ = (@test_logs (:warn, r"^the network contains taxa with no data") fitdiscrete(dna_net_top, + nasm_model, rv, dna_dat, dna_weights; optimizeQ=true, optimizeRVAS=false, ftolRel=.1, ftolAbs=.2, xtolRel=.1, xtolAbs=.2)) +@test dna_net_optQ.model.rate != nasm_model.rate +@test dna_net_optQ.ratemodel.alpha[1] == 1.0 +dna_net_optRVAS = (@test_logs (:warn, r"^the network contains taxa with no data") fitdiscrete(dna_net_top, + nasm_model, rv, dna_dat, dna_weights; optimizeQ=false, optimizeRVAS=true, ftolRel=.1, ftolAbs=.2, xtolRel=.1, xtolAbs=.2)) +@test dna_net_optRVAS.model.rate == nasm_model.rate +@test dna_net_optRVAS.ratemodel.alpha[1] != 1.0 +@test dna_net_optRVAS.ratemodel.ratemultiplier ≈ [0.02, 1.98] atol=0.05 +originalstdout = stdout +redirect_stdout(devnull) +dna_net_opt_both = (@test_logs (:warn, r"^the network contains taxa with no data") fitdiscrete(dna_net_top, + nasm_model, rv, dna_dat, dna_weights; optimizeQ=true, optimizeRVAS=true, closeoptim=true, ftolRel=.1, ftolAbs=.2, xtolRel=.1, xtolAbs=.2, verbose=true)) +redirect_stdout(originalstdout) +@test dna_net_opt_both.model.rate != nasm_model.rate +@test dna_net_opt_both.ratemodel.alpha[1] != 1.0 +# for this example: all NaN values if no lower bound on RVAS's alpha, because it goes to 0 +@test dna_net_opt_both.ratemodel.ratemultiplier ≈ [1e-4, 2.0] atol=0.02 +@test dna_net_opt_both.loglik > -3800. +# should be ~ -3708.1 -- but low tolerance: just check it's not horrible. +# with default tol: alpha=0.05, JC rate=0.00288, loglik=-3337.413 +# under wrong model where all traits have evolved under same (unknown) displayed tree: +# should be ~ -2901.3 -- but low tolerance: just check it's > -3100. +# with default strict tolerance values: takes *much* longer, alpha=0.05, JC rate = 0.00293, loglik = -2535.618 +end # of testing readfastatodna with NASM and RateVariationAcrossSites + +@testset "stationary and empiricalDNAfrequencies" begin + +BTSM_1 = BinaryTraitSubstitutionModel(1.0, 2.0); +ERSM_1 = EqualRatesSubstitutionModel(4, 3.0, ["S1","S2","S3","S4"]); +@test stationary(BTSM_1) ≈ [0.6666666666666666, 0.3333333333333333] atol=1e-6 +@test stationary(ERSM_1) == [0.25, 0.25, 0.25, 0.25] + +JC69_1 = JC69(0.5, false); +@test stationary(JC69_1) == [0.25, 0.25, 0.25, 0.25] +HKY85_1 = HKY85([0.5, 0.5], [0.2, 0.3, 0.25, 0.25], false) +@test stationary(HKY85_1) == [0.2, 0.3, 0.25, 0.25] + +# test empiricalDNAfrequencies with string type +# Bayesian correction by default: more stable and avoids zeros +dna_String = view(DataFrame(A = ["s1", "s2"], site1 = ["A", "A"], site2 = ["G", "T"]), :, 2:3) +@test empiricalDNAfrequencies(dna_String, [1, 1]) ≈ [3,1,2,2]/(4+4) +# with char type +dna_Char = view(DataFrame(A = ["s1", "s2"], site1 = ['A', 'A'], site2 = ['G', 'T']), :, 2:3) +@test empiricalDNAfrequencies(dna_Char, [1, 1]) ≈ [3,1,2,2]/(4+4) +# uncorrected estimate +@test empiricalDNAfrequencies(dna_Char, [1, 1], false) ≈ [2,0,1,1]/4 +# with ambiguous sites +dna_Char = DataFrame(site1 = ['A','A','Y'], site2 = ['G','T','V']) +@test empiricalDNAfrequencies(dna_Char, [1, 1], false, false) ≈ [2,0,1,1]/4 +@test empiricalDNAfrequencies(dna_Char, [1, 1], false) ≈ [2+1/3,1/2+1/3,1+1/3,1+1/2]/6 +# with DNA type and weights +#fastafile = abspath(joinpath(dirname(Base.find_package("PhyloNetworks")), "..", "examples", "test_8_withrepeatingsites.aln")) +fastafile = joinpath(@__DIR__, "..", "examples", "test_8_withrepeatingsites.aln") +dat, weights = readfastatodna(fastafile, true); +@test empiricalDNAfrequencies(view(dat, :, 2:6), weights) ≈ [0.21153846153846154, 0.3076923076923077, 0.40384615384615385, 0.07692307692307693] atol=1e-9 + +#test empiricalDNAfrequencies with bad type +dna_bad = view(DataFrame(A = ["s1", "s2"], trait1 = ["hi", "lo"], trait2 = ["lo", "hi"]), :, 2:3) +@test_throws ErrorException empiricalDNAfrequencies(dna_bad, [1, 1]) + +end #testing stationary and empiricalDNAfrequencies functions + +@testset "traitlabels2indices" begin +fastafile = joinpath(@__DIR__, "..", "examples", "Ae_bicornis_8sites.aln") # 8 sites only +# locally: fastafile = joinpath(@__DIR__, "../../dev/PhyloNetworks/", "examples", "Ae_bicornis_8sites.aln") #small data +dna_dat, dna_weights = readfastatodna(fastafile, true); +# 22 species, 3 hybrid nodes, 103 edges +dna_net = readnewick(net_caudata_47taxa_string); +# create trait object +dat2 = PhyloTraits.traitlabels2indices(dna_dat[!,2:end], JC69([0.5])) +o, dna_net = @test_logs (:warn, "the network contains taxa with no data: those will be pruned") match_mode=:any PhyloTraits.check_matchtaxonnames!(dna_dat[:,1], dat2, dna_net) +@test isa(o,Vector{Int}) +@test isa(dat2,Vector{Vector{Union{Missing, Int}}}) +@test length(o) == 22 +@test size(dat2) == (22,) + +dna_dat, dna_weights = readfastatodna(fastafile, true); +dna_net = readnewick(net_caudata_47taxa_string); +dat2 = PhyloTraits.traitlabels2indices(dna_dat[!,2:end], HKY85([0.5], [0.25, 0.25, 0.25, 0.25], true)) +o, dna_net = @test_logs (:warn, "the network contains taxa with no data: those will be pruned") match_mode=:any PhyloTraits.check_matchtaxonnames!(dna_dat[:,1], dat2, dna_net) +@test isa(o,Vector{Int}) +@test isa(dat2,Vector{Vector{Union{Missing, Int}}}) +@test length(o) == 22 +@test size(dat2) == (22,) +end # of traitlabels2indices + +@testset "prep and wrappers" begin +# read in data +#at home: fastafile = joinpath(@__DIR__, "../../dev/PhyloNetworks/", "examples", "Ae_bicornis_Tr406_Contig10132.aln") #small data +fastafile = joinpath(@__DIR__, "..", "examples", "Ae_bicornis_Tr406_Contig10132.aln") +dna_dat, dna_weights = readfastatodna(fastafile, true); + +dna_net_top = readnewick(net_caudata_47taxa_string); +(x-> x.length = 1).(dna_net_top.edge) # add branch lengths of 1 +#Fixes the gamma error (creates a network) +setgamma!(dna_net_top.edge[6],0.6) +setgamma!(dna_net_top.edge[7],0.6) +setgamma!(dna_net_top.edge[58],0.6) + +# tests # +net_dat = readnewick("(((A:2.0,(B:1.0)#H1:0.1::0.9):1.5,(C:0.6,#H1:1.0::0.1):1.0):0.5,D:2.0);") +dat = DataFrame(species=["C","A","B","D"], trait=["hi","lo","lo","hi"]) + +jmod = PhyloTraits.defaultsubstitutionmodel(dna_net_top, :JC69, dna_dat, dna_weights) +@test jmod.rate == [1.0] +emod = PhyloTraits.defaultsubstitutionmodel(dna_net_top, :ERSM, dna_dat, dna_weights) +@test emod.rate[1] ≈ 0.009708737864077669 +@test typeof(emod) == EqualRatesSubstitutionModel{DNA} +hmod = PhyloTraits.defaultsubstitutionmodel(dna_net_top, :HKY85, dna_dat, dna_weights) +@test typeof(hmod) == HKY85 +bmod = PhyloTraits.defaultsubstitutionmodel(dna_net_top, :BTSM, dat, [1.0, 1.0, 1.0, 1.0]) +@test typeof(bmod) == BinaryTraitSubstitutionModel{String} +@test_throws ErrorException PhyloTraits.defaultsubstitutionmodel(dna_net_top, :QR, dat, [1.0, 1.0, 1.0, 1.0]) + + +test_SSM = (@test_logs (:warn, r"pruned") match_mode=:any PhyloTraits.StatisticalSubstitutionModel(dna_net_top, fastafile, :JC69)) +@test typeof(test_SSM.model) == JC69 +@test test_SSM.nsites == 209 +@test test_SSM.siteweight[1:5] == [23.0, 18.0, 13.0, 16.0, 1.0] + +end #of testing prep and wrapper functions + +@testset "fit! for full network optimization" begin +# read in data # +#test +#fastafile = joinpath(@__DIR__, "../../dev/PhyloNetworks/", "examples", "Ae_bicornis_Tr406_Contig10132.aln") #small data +fastafile = joinpath(@__DIR__, "..", "examples", "Ae_bicornis_Tr406_Contig10132.aln") +dna_dat, dna_weights = readfastatodna(fastafile, true); + +dna_net_top = readnewick(net_caudata_47taxa_string); +(x-> x.length = 1).(dna_net_top.edge) # add branch lengths of 1 +#Fixes the gamma error (creates a network) +setgamma!(dna_net_top.edge[6],0.6) +setgamma!(dna_net_top.edge[7],0.6) +setgamma!(dna_net_top.edge[58],0.6) +@test_logs (:warn, r"pruned") match_mode=:any PhyloTraits.StatisticalSubstitutionModel(dna_net_top, fastafile, :JC69) +end #of testing fit! functions for full network optimization + +end # of nested testsets