diff --git a/demo/changepoint.js b/demo/changepoint.js new file mode 100644 index 0000000..5181325 --- /dev/null +++ b/demo/changepoint.js @@ -0,0 +1,973 @@ +import uPlot from "./dist/uPlot/uPlot.esm.js"; + +import { getSize } from "./helpers.js"; +import { legendAsTooltipPlugin } from "./plugins.js"; + +const df = { + ds: [ + 1731057600, 1731057900, 1731058200, 1731058500, 1731058800, 1731059100, + 1731059400, 1731059700, 1731060000, 1731060300, 1731060600, 1731060900, + 1731061200, 1731061500, 1731061800, 1731062100, 1731062400, 1731062700, + 1731063000, 1731063300, 1731063600, 1731063900, 1731064200, 1731064500, + 1731064800, 1731065100, 1731065400, 1731065700, 1731066000, 1731066300, + 1731066600, 1731066900, 1731067200, 1731067500, 1731067800, 1731068100, + 1731068400, 1731068700, 1731069000, 1731069300, 1731069600, 1731069900, + 1731070200, 1731070500, 1731070800, 1731071100, 1731071400, 1731071700, + 1731072000, 1731072300, 1731072600, 1731072900, 1731073200, 1731073500, + 1731073800, 1731074100, 1731074400, 1731074700, 1731075000, 1731075300, + 1731075600, 1731075900, 1731076200, 1731076500, 1731076800, 1731077100, + 1731077400, 1731077700, 1731078000, 1731078300, 1731078600, 1731078900, + 1731079200, 1731079500, 1731079800, 1731080100, 1731080400, 1731080700, + 1731081000, 1731081300, 1731081600, 1731081900, 1731082200, 1731082500, + 1731082800, 1731083100, 1731083400, 1731083700, 1731084000, 1731084300, + 1731084600, 1731084900, 1731085200, 1731085500, 1731085800, 1731086100, + 1731086400, 1731086700, 1731087000, 1731087300, 1731087600, 1731087900, + 1731088200, 1731088500, 1731088800, 1731089100, 1731089400, 1731089700, + 1731090000, 1731090300, 1731090600, 1731090900, 1731091200, 1731091500, + 1731091800, 1731092100, 1731092400, 1731092700, 1731093000, 1731093300, + 1731093600, 1731093900, 1731094200, 1731094500, 1731094800, 1731095100, + 1731095400, 1731095700, 1731096000, 1731096300, 1731096600, 1731096900, + 1731097200, 1731097500, 1731097800, 1731098100, 1731098400, 1731098700, + 1731099000, 1731099300, 1731099600, 1731099900, 1731100200, 1731100500, + 1731100800, 1731101100, 1731101400, 1731101700, 1731102000, 1731102300, + 1731102600, 1731102900, 1731103200, 1731103500, 1731103800, 1731104100, + 1731104400, 1731104700, 1731105000, 1731105300, 1731105600, 1731105900, + 1731106200, 1731106500, 1731106800, 1731107100, 1731107400, 1731107700, + 1731108000, 1731108300, 1731108600, 1731108900, 1731109200, 1731109500, + 1731109800, 1731110100, 1731110400, 1731110700, 1731111000, 1731111300, + 1731111600, 1731111900, 1731112200, 1731112500, 1731112800, 1731113100, + 1731113400, 1731113700, 1731114000, 1731114300, 1731114600, 1731114900, + 1731115200, 1731115500, 1731115800, 1731116100, 1731116400, 1731116700, + 1731117000, 1731117300, 1731117600, 1731117900, 1731118200, 1731118500, + 1731118800, 1731119100, 1731119400, 1731119700, 1731120000, 1731120300, + 1731120600, 1731120900, 1731121200, 1731121500, 1731121800, 1731122100, + 1731122400, 1731122700, 1731123000, 1731123300, 1731123600, 1731123900, + 1731124200, 1731124500, 1731124800, 1731125100, 1731125400, 1731125700, + 1731126000, 1731126300, 1731126600, 1731126900, 1731127200, 1731127500, + 1731127800, 1731128100, 1731128400, 1731128700, 1731129000, 1731129300, + 1731129600, 1731129900, 1731130200, 1731130500, 1731130800, 1731131100, + 1731131400, 1731131700, 1731132000, 1731132300, 1731132600, 1731132900, + 1731133200, 1731133500, 1731133800, 1731134100, 1731134400, 1731134700, + 1731135000, 1731135300, 1731135600, 1731135900, 1731136200, 1731136500, + 1731136800, 1731137100, 1731137400, 1731137700, 1731138000, 1731138300, + 1731138600, 1731138900, 1731139200, 1731139500, 1731139800, 1731140100, + 1731140400, 1731140700, 1731141000, 1731141300, 1731141600, 1731141900, + 1731142200, 1731142500, 1731142800, 1731143100, 1731143400, 1731143700, + 1731144000, 1731144300, 1731144600, 1731144900, 1731145200, 1731145500, + 1731145800, 1731146100, 1731146400, 1731146700, 1731147000, 1731147300, + 1731147600, 1731147900, 1731148200, 1731148500, 1731148800, 1731149100, + 1731149400, 1731149700, 1731150000, 1731150300, 1731150600, 1731150900, + 1731151200, 1731151500, 1731151800, 1731152100, 1731152400, 1731152700, + 1731153000, 1731153300, 1731153600, 1731153900, 1731154200, 1731154500, + 1731154800, 1731155100, 1731155400, 1731155700, 1731156000, 1731156300, + 1731156600, 1731156900, 1731157200, 1731157500, 1731157800, 1731158100, + 1731158400, 1731158700, 1731159000, 1731159300, 1731159600, 1731159900, + 1731160200, 1731160500, 1731160800, 1731161100, 1731161400, 1731161700, + 1731162000, 1731162300, 1731162600, 1731162900, 1731163200, 1731163500, + 1731163800, 1731164100, 1731164400, 1731164700, 1731165000, 1731165300, + 1731165600, 1731165900, 1731166200, 1731166500, 1731166800, 1731167100, + 1731167400, 1731167700, 1731168000, 1731168300, 1731168600, 1731168900, + 1731169200, 1731169500, 1731169800, 1731170100, 1731170400, 1731170700, + 1731171000, 1731171300, 1731171600, 1731171900, 1731172200, 1731172500, + 1731172800, 1731173100, 1731173400, 1731173700, 1731174000, 1731174300, + 1731174600, 1731174900, 1731175200, 1731175500, 1731175800, 1731176100, + 1731176400, 1731176700, 1731177000, 1731177300, 1731177600, 1731177900, + 1731178200, 1731178500, 1731178800, 1731179100, 1731179400, 1731179700, + 1731180000, 1731180300, 1731180600, 1731180900, 1731181200, 1731181500, + 1731181800, 1731182100, 1731182400, 1731182700, 1731183000, 1731183300, + 1731183600, 1731183900, 1731184200, 1731184500, 1731184800, 1731185100, + 1731185400, 1731185700, 1731186000, 1731186300, 1731186600, 1731186900, + 1731187200, 1731187500, 1731187800, 1731188100, 1731188400, 1731188700, + 1731189000, 1731189300, 1731189600, 1731189900, 1731190200, 1731190500, + 1731190800, 1731191100, 1731191400, 1731191700, 1731192000, 1731192300, + 1731192600, 1731192900, 1731193200, 1731193500, 1731193800, 1731194100, + 1731194400, 1731194700, 1731195000, 1731195300, 1731195600, 1731195900, + 1731196200, 1731196500, 1731196800, 1731197100, 1731197400, 1731197700, + 1731198000, 1731198300, 1731198600, 1731198900, 1731199200, 1731199500, + 1731199800, 1731200100, 1731200400, 1731200700, 1731201000, 1731201300, + 1731201600, 1731201900, 1731202200, 1731202500, 1731202800, 1731203100, + 1731203400, 1731203700, 1731204000, 1731204300, 1731204600, 1731204900, + 1731205200, 1731205500, 1731205800, 1731206100, 1731206400, 1731206700, + 1731207000, 1731207300, 1731207600, 1731207900, 1731208200, 1731208500, + 1731208800, 1731209100, 1731209400, 1731209700, 1731210000, 1731210300, + 1731210600, 1731210900, 1731211200, 1731211500, 1731211800, 1731212100, + 1731212400, 1731212700, 1731213000, 1731213300, 1731213600, 1731213900, + 1731214200, 1731214500, 1731214800, 1731215100, 1731215400, 1731215700, + 1731216000, 1731216300, 1731216600, 1731216900, 1731217200, 1731217500, + 1731217800, 1731218100, 1731218400, 1731218700, 1731219000, 1731219300, + 1731219600, 1731219900, 1731220200, 1731220500, 1731220800, 1731221100, + 1731221400, 1731221700, 1731222000, 1731222300, 1731222600, 1731222900, + 1731223200, 1731223500, 1731223800, 1731224100, 1731224400, 1731224700, + 1731225000, 1731225300, 1731225600, 1731225900, 1731226200, 1731226500, + 1731226800, 1731227100, 1731227400, 1731227700, 1731228000, 1731228300, + 1731228600, 1731228900, 1731229200, 1731229500, 1731229800, 1731230100, + 1731230400, 1731230700, 1731231000, 1731231300, 1731231600, 1731231900, + 1731232200, 1731232500, 1731232800, 1731233100, 1731233400, 1731233700, + 1731234000, 1731234300, 1731234600, 1731234900, 1731235200, 1731235500, + 1731235800, 1731236100, 1731236400, 1731236700, 1731237000, 1731237300, + 1731237600, 1731237900, 1731238200, 1731238500, 1731238800, 1731239100, + 1731239400, 1731239700, 1731240000, 1731240300, 1731240600, 1731240900, + 1731241200, 1731241500, 1731241800, 1731242100, 1731242400, 1731242700, + 1731243000, 1731243300, 1731243600, 1731243900, 1731244200, 1731244500, + 1731244800, 1731245100, 1731245400, 1731245700, 1731246000, 1731246300, + 1731246600, 1731246900, 1731247200, 1731247500, 1731247800, 1731248100, + 1731248400, 1731248700, 1731249000, 1731249300, 1731249600, 1731249900, + 1731250200, 1731250500, 1731250800, 1731251100, 1731251400, 1731251700, + 1731252000, 1731252300, 1731252600, 1731252900, 1731253200, 1731253500, + 1731253800, 1731254100, 1731254400, 1731254700, 1731255000, 1731255300, + 1731255600, 1731255900, 1731256200, 1731256500, 1731256800, 1731257100, + 1731257400, 1731257700, 1731258000, 1731258300, 1731258600, 1731258900, + 1731259200, 1731259500, 1731259800, 1731260100, 1731260400, 1731260700, + 1731261000, 1731261300, 1731261600, 1731261900, 1731262200, 1731262500, + 1731262800, 1731263100, 1731263400, 1731263700, 1731264000, 1731264300, + 1731264600, 1731264900, 1731265200, 1731265500, 1731265800, 1731266100, + 1731266400, 1731266700, 1731267000, 1731267300, 1731267600, 1731267900, + 1731268200, 1731268500, 1731268800, 1731269100, 1731269400, 1731269700, + 1731270000, 1731270300, 1731270600, 1731270900, 1731271200, 1731271500, + 1731271800, 1731272100, 1731272400, 1731272700, 1731273000, 1731273300, + 1731273600, 1731273900, 1731274200, 1731274500, 1731274800, 1731275100, + 1731275400, 1731275700, 1731276000, 1731276300, 1731276600, 1731276900, + 1731277200, 1731277500, 1731277800, 1731278100, 1731278400, 1731278700, + 1731279000, 1731279300, 1731279600, 1731279900, 1731280200, 1731280500, + 1731280800, 1731281100, 1731281400, 1731281700, 1731282000, 1731282300, + 1731282600, 1731282900, 1731283200, 1731283500, 1731283800, 1731284100, + 1731284400, 1731284700, 1731285000, 1731285300, 1731285600, 1731285900, + 1731286200, 1731286500, 1731286800, 1731287100, 1731287400, 1731287700, + 1731288000, 1731288300, 1731288600, 1731288900, 1731289200, 1731289500, + 1731289800, 1731290100, 1731290400, 1731290700, 1731291000, 1731291300, + 1731291600, 1731291900, 1731292200, 1731292500, 1731292800, 1731293100, + 1731293400, 1731293700, 1731294000, 1731294300, 1731294600, 1731294900, + 1731295200, 1731295500, 1731295800, 1731296100, 1731296400, 1731296700, + 1731297000, 1731297300, 1731297600, 1731297900, 1731298200, 1731298500, + 1731298800, 1731299100, 1731299400, 1731299700, 1731300000, 1731300300, + 1731300600, 1731300900, 1731301200, 1731301500, 1731301800, 1731302100, + 1731302400, 1731302700, 1731303000, 1731303300, 1731303600, 1731303900, + 1731304200, 1731304500, 1731304800, 1731305100, 1731305400, 1731305700, + 1731306000, 1731306300, 1731306600, 1731306900, 1731307200, 1731307500, + 1731307800, 1731308100, 1731308400, 1731308700, 1731309000, 1731309300, + 1731309600, 1731309900, 1731310200, 1731310500, 1731310800, 1731311100, + 1731311400, 1731311700, 1731312000, 1731312300, 1731312600, 1731312900, + 1731313200, 1731313500, 1731313800, 1731314100, 1731314400, 1731314700, + 1731315000, 1731315300, 1731315600, 1731315900, 1731316200, 1731316500, + 1731316800, 1731317100, 1731317400, 1731317700, 1731318000, 1731318300, + 1731318600, 1731318900, 1731319200, 1731319500, 1731319800, 1731320100, + 1731320400, 1731320700, 1731321000, 1731321300, 1731321600, 1731321900, + 1731322200, 1731322500, 1731322800, 1731323100, 1731323400, 1731323700, + 1731324000, 1731324300, 1731324600, 1731324900, 1731325200, 1731325500, + 1731325800, 1731326100, 1731326400, 1731326700, 1731327000, 1731327300, + 1731327600, 1731327900, 1731328200, 1731328500, 1731328800, 1731329100, + 1731329400, 1731329700, 1731330000, 1731330300, 1731330600, 1731330900, + 1731331200, 1731331500, 1731331800, 1731332100, 1731332400, 1731332700, + 1731333000, 1731333300, 1731333600, 1731333900, 1731334200, 1731334500, + 1731334800, 1731335100, 1731335400, 1731335700, 1731336000, 1731336300, + 1731336600, 1731336900, 1731337200, 1731337500, 1731337800, 1731338100, + 1731338400, 1731338700, 1731339000, 1731339300, 1731339600, 1731339900, + 1731340200, 1731340500, 1731340800, 1731341100, 1731341400, 1731341700, + 1731342000, 1731342300, 1731342600, 1731342900, 1731343200, 1731343500, + 1731343800, 1731344100, 1731344400, 1731344700, 1731345000, 1731345300, + 1731345600, 1731345900, 1731346200, 1731346500, 1731346800, 1731347100, + 1731347400, 1731347700, 1731348000, 1731348300, 1731348600, 1731348900, + 1731349200, 1731349500, 1731349800, 1731350100, 1731350400, 1731350700, + 1731351000, 1731351300, 1731351600, 1731351900, 1731352200, 1731352500, + 1731352800, 1731353100, 1731353400, 1731353700, 1731354000, 1731354300, + 1731354600, 1731354900, 1731355200, 1731355500, 1731355800, 1731356100, + 1731356400, 1731356700, 1731357000, 1731357300, 1731357600, 1731357900, + 1731358200, 1731358500, 1731358800, 1731359100, 1731359400, 1731359700, + 1731360000, 1731360300, 1731360600, 1731360900, 1731361200, 1731361500, + 1731361800, 1731362100, 1731362400, 1731362700, 1731363000, 1731363300, + 1731363600, 1731363900, 1731364200, 1731364500, 1731364800, 1731365100, + 1731365400, 1731365700, 1731366000, 1731366300, 1731366600, 1731366900, + 1731367200, 1731367500, 1731367800, 1731368100, 1731368400, 1731368700, + 1731369000, 1731369300, 1731369600, 1731369900, 1731370200, 1731370500, + 1731370800, 1731371100, 1731371400, 1731371700, 1731372000, 1731372300, + 1731372600, 1731372900, 1731373200, 1731373500, 1731373800, 1731374100, + 1731374400, 1731374700, 1731375000, 1731375300, 1731375600, 1731375900, + 1731376200, 1731376500, 1731376800, 1731377100, 1731377400, 1731377700, + 1731378000, 1731378300, 1731378600, 1731378900, 1731379200, 1731379500, + 1731379800, 1731380100, 1731380400, 1731380700, 1731381000, 1731381300, + 1731381600, 1731381900, 1731382200, 1731382500, 1731382800, 1731383100, + 1731383400, 1731383700, 1731384000, 1731384300, 1731384600, 1731384900, + 1731385200, 1731385500, 1731385800, 1731386100, 1731386400, 1731386700, + 1731387000, 1731387300, 1731387600, 1731387900, 1731388200, 1731388500, + 1731388800, 1731389100, 1731389400, 1731389700, 1731390000, 1731390300, + 1731390600, 1731390900, 1731391200, 1731391500, 1731391800, 1731392100, + 1731392400, 1731392700, 1731393000, 1731393300, 1731393600, 1731393900, + 1731394200, 1731394500, 1731394800, 1731395100, 1731395400, 1731395700, + 1731396000, 1731396300, 1731396600, 1731396900, 1731397200, 1731397500, + 1731397800, 1731398100, 1731398400, 1731398700, 1731399000, 1731399300, + 1731399600, 1731399900, 1731400200, 1731400500, 1731400800, 1731401100, + 1731401400, 1731401700, 1731402000, 1731402300, 1731402600, 1731402900, + 1731403200, 1731403500, 1731403800, 1731404100, 1731404400, 1731404700, + 1731405000, 1731405300, 1731405600, 1731405900, 1731406200, 1731406500, + 1731406800, 1731407100, 1731407400, 1731407700, 1731408000, 1731408300, + 1731408600, 1731408900, 1731409200, 1731409500, 1731409800, 1731410100, + 1731410400, 1731410700, 1731411000, 1731411300, 1731411600, 1731411900, + 1731412200, 1731412500, 1731412800, 1731413100, 1731413400, 1731413700, + 1731414000, 1731414300, 1731414600, 1731414900, 1731415200, 1731415500, + 1731415800, 1731416100, 1731416400, 1731416700, 1731417000, 1731417300, + 1731417600, 1731417900, 1731418200, 1731418500, 1731418800, 1731419100, + 1731419400, 1731419700, 1731420000, 1731420300, 1731420600, 1731420900, + 1731421200, 1731421500, 1731421800, 1731422100, 1731422400, 1731422700, + 1731423000, 1731423300, 1731423600, 1731423900, 1731424200, 1731424500, + 1731424800, 1731425100, 1731425400, 1731425700, 1731426000, 1731426300, + 1731426600, 1731426900, 1731427200, 1731427500, 1731427800, 1731428100, + 1731428400, 1731428700, 1731429000, 1731429300, 1731429600, 1731429900, + 1731430200, 1731430500, 1731430800, 1731431100, 1731431400, 1731431700, + 1731432000, 1731432300, 1731432600, 1731432900, 1731433200, 1731433500, + 1731433800, 1731434100, 1731434400, 1731434700, 1731435000, 1731435300, + 1731435600, 1731435900, 1731436200, 1731436500, 1731436800, 1731437100, + 1731437400, 1731437700, 1731438000, 1731438300, 1731438600, 1731438900, + 1731439200, 1731439500, 1731439800, 1731440100, 1731440400, 1731440700, + 1731441000, 1731441300, 1731441600, 1731441900, 1731442200, 1731442500, + 1731442800, 1731443100, 1731443400, 1731443700, 1731444000, 1731444300, + 1731444600, 1731444900, 1731445200, 1731445500, 1731445800, 1731446100, + 1731446400, 1731446700, 1731447000, 1731447300, 1731447600, 1731447900, + 1731448200, 1731448500, 1731448800, 1731449100, 1731449400, 1731449700, + 1731450000, 1731450300, 1731450600, 1731450900, 1731451200, 1731451500, + 1731451800, 1731452100, 1731452400, 1731452700, 1731453000, 1731453300, + 1731453600, 1731453900, 1731454200, 1731454500, 1731454800, 1731455100, + 1731455400, 1731455700, 1731456000, 1731456300, 1731456600, 1731456900, + 1731457200, 1731457500, 1731457800, 1731458100, 1731458400, 1731458700, + 1731459000, 1731459300, 1731459600, 1731459900, 1731460200, 1731460500, + 1731460800, 1731461100, 1731461400, 1731461700, 1731462000, 1731462300, + 1731462600, 1731462900, 1731463200, 1731463500, 1731463800, 1731464100, + 1731464400, 1731464700, 1731465000, 1731465300, 1731465600, 1731465900, + 1731466200, 1731466500, 1731466800, 1731467100, 1731467400, 1731467700, + 1731468000, 1731468300, 1731468600, 1731468900, 1731469200, 1731469500, + 1731469800, 1731470100, 1731470400, 1731470700, 1731471000, 1731471300, + 1731471600, 1731471900, 1731472200, 1731472500, 1731472800, 1731473100, + 1731473400, 1731473700, 1731474000, 1731474300, 1731474600, 1731474900, + 1731475200, 1731475500, 1731475800, 1731476100, 1731476400, 1731476700, + 1731477000, 1731477300, 1731477600, 1731477900, 1731478200, 1731478500, + 1731478800, 1731479100, 1731479400, 1731479700, 1731480000, 1731480300, + 1731480600, 1731480900, 1731481200, 1731481500, 1731481800, 1731482100, + 1731482400, 1731482700, 1731483000, 1731483300, 1731483600, 1731483900, + 1731484200, 1731484500, 1731484800, 1731485100, 1731485400, 1731485700, + 1731486000, 1731486300, 1731486600, 1731486900, 1731487200, 1731487500, + 1731487800, 1731488100, 1731488400, 1731488700, 1731489000, 1731489300, + 1731489600, 1731489900, 1731490200, 1731490500, 1731490800, 1731491100, + 1731491400, 1731491700, 1731492000, 1731492300, 1731492600, 1731492900, + 1731493200, 1731493500, 1731493800, 1731494100, 1731494400, 1731494700, + 1731495000, 1731495300, 1731495600, 1731495900, 1731496200, 1731496500, + 1731496800, 1731497100, 1731497400, 1731497700, 1731498000, 1731498300, + 1731498600, 1731498900, 1731499200, 1731499500, 1731499800, 1731500100, + 1731500400, 1731500700, 1731501000, 1731501300, 1731501600, 1731501900, + 1731502200, 1731502500, 1731502800, 1731503100, 1731503400, 1731503700, + 1731504000, 1731504300, 1731504600, 1731504900, 1731505200, 1731505500, + 1731505800, 1731506100, 1731506400, 1731506700, 1731507000, 1731507300, + 1731507600, 1731507900, 1731508200, 1731508500, 1731508800, 1731509100, + 1731509400, 1731509700, 1731510000, 1731510300, 1731510600, 1731510900, + 1731511200, 1731511500, 1731511800, 1731512100, 1731512400, 1731512700, + 1731513000, 1731513300, 1731513600, 1731513900, 1731514200, 1731514500, + 1731514800, 1731515100, 1731515400, 1731515700, 1731516000, 1731516300, + 1731516600, 1731516900, 1731517200, 1731517500, 1731517800, 1731518100, + 1731518400, 1731518700, 1731519000, 1731519300, 1731519600, 1731519900, + 1731520200, 1731520500, 1731520800, 1731521100, 1731521400, 1731521700, + 1731522000, 1731522300, 1731522600, 1731522900, 1731523200, 1731523500, + 1731523800, 1731524100, 1731524400, 1731524700, 1731525000, 1731525300, + 1731525600, 1731525900, 1731526200, 1731526500, 1731526800, 1731527100, + 1731527400, 1731527700, 1731528000, 1731528300, 1731528600, 1731528900, + 1731529200, 1731529500, 1731529800, 1731530100, 1731530400, 1731530700, + 1731531000, 1731531300, 1731531600, 1731531900, 1731532200, 1731532500, + 1731532800, 1731533100, 1731533400, 1731533700, 1731534000, 1731534300, + 1731534600, 1731534900, 1731535200, 1731535500, 1731535800, 1731536100, + 1731536400, 1731536700, 1731537000, 1731537300, 1731537600, 1731537900, + 1731538200, 1731538500, 1731538800, 1731539100, 1731539400, 1731539700, + 1731540000, 1731540300, 1731540600, 1731540900, 1731541200, 1731541500, + 1731541800, 1731542100, 1731542400, 1731542700, 1731543000, 1731543300, + 1731543600, 1731543900, 1731544200, 1731544500, 1731544800, 1731545100, + 1731545400, 1731545700, 1731546000, 1731546300, 1731546600, 1731546900, + 1731547200, 1731547500, 1731547800, 1731548100, 1731548400, 1731548700, + 1731549000, 1731549300, 1731549600, 1731549900, 1731550200, 1731550500, + 1731550800, 1731551100, 1731551400, 1731551700, 1731552000, 1731552300, + 1731552600, 1731552900, 1731553200, 1731553500, 1731553800, 1731554100, + 1731554400, 1731554700, 1731555000, 1731555300, 1731555600, 1731555900, + 1731556200, 1731556500, 1731556800, 1731557100, 1731557400, 1731557700, + 1731558000, 1731558300, 1731558600, 1731558900, 1731559200, 1731559500, + 1731559800, 1731560100, 1731560400, 1731560700, 1731561000, 1731561300, + 1731561600, 1731561900, 1731562200, 1731562500, 1731562800, 1731563100, + 1731563400, 1731563700, 1731564000, 1731564300, 1731564600, 1731564900, + 1731565200, 1731565500, 1731565800, 1731566100, 1731566400, 1731566700, + 1731567000, 1731567300, 1731567600, 1731567900, 1731568200, 1731568500, + 1731568800, 1731569100, 1731569400, 1731569700, 1731570000, 1731570300, + 1731570600, 1731570900, 1731571200, 1731571500, 1731571800, 1731572100, + 1731572400, 1731572700, 1731573000, 1731573300, 1731573600, 1731573900, + 1731574200, 1731574500, 1731574800, 1731575100, 1731575400, 1731575700, + 1731576000, 1731576300, 1731576600, 1731576900, 1731577200, 1731577500, + 1731577800, 1731578100, 1731578400, 1731578700, 1731579000, 1731579300, + 1731579600, 1731579900, 1731580200, 1731580500, 1731580800, 1731581100, + 1731581400, 1731581700, 1731582000, 1731582300, 1731582600, 1731582900, + 1731583200, 1731583500, 1731583800, 1731584100, 1731584400, 1731584700, + 1731585000, 1731585300, 1731585600, 1731585900, 1731586200, 1731586500, + 1731586800, 1731587100, 1731587400, 1731587700, 1731588000, 1731588300, + 1731588600, 1731588900, 1731589200, 1731589500, 1731589800, 1731590100, + 1731590400, 1731590700, 1731591000, 1731591300, 1731591600, 1731591900, + 1731592200, 1731592500, 1731592800, 1731593100, 1731593400, 1731593700, + 1731594000, 1731594300, 1731594600, 1731594900, 1731595200, 1731595500, + 1731595800, 1731596100, 1731596400, 1731596700, 1731597000, 1731597300, + 1731597600, 1731597900, 1731598200, 1731598500, 1731598800, 1731599100, + 1731599400, 1731599700, 1731600000, 1731600300, 1731600600, 1731600900, + 1731601200, 1731601500, 1731601800, 1731602100, 1731602400, 1731602700, + 1731603000, 1731603300, 1731603600, 1731603900, 1731604200, 1731604500, + 1731604800, 1731605100, 1731605400, 1731605700, 1731606000, 1731606300, + 1731606600, 1731606900, 1731607200, 1731607500, 1731607800, 1731608100, + 1731608400, 1731608700, 1731609000, 1731609300, 1731609600, 1731609900, + 1731610200, 1731610500, 1731610800, 1731611100, 1731611400, 1731611700, + 1731612000, 1731612300, 1731612600, 1731612900, 1731613200, 1731613500, + 1731613800, 1731614100, 1731614400, 1731614700, 1731615000, 1731615300, + 1731615600, 1731615900, 1731616200, 1731616500, 1731616800, 1731617100, + 1731617400, 1731617700, 1731618000, 1731618300, 1731618600, 1731618900, + 1731619200, 1731619500, 1731619800, 1731620100, 1731620400, 1731620700, + 1731621000, 1731621300, 1731621600, 1731621900, 1731622200, 1731622500, + 1731622800, 1731623100, 1731623400, 1731623700, 1731624000, 1731624300, + 1731624600, 1731624900, 1731625200, 1731625500, 1731625800, 1731626100, + 1731626400, 1731626700, 1731627000, 1731627300, 1731627600, 1731627900, + 1731628200, 1731628500, 1731628800, 1731629100, 1731629400, 1731629700, + 1731630000, 1731630300, 1731630600, 1731630900, 1731631200, 1731631500, + 1731631800, 1731632100, 1731632400, 1731632700, 1731633000, 1731633300, + 1731633600, 1731633900, 1731634200, 1731634500, 1731634800, 1731635100, + 1731635400, 1731635700, 1731636000, 1731636300, 1731636600, 1731636900, + 1731637200, 1731637500, 1731637800, 1731638100, 1731638400, 1731638700, + 1731639000, 1731639300, 1731639600, 1731639900, 1731640200, 1731640500, + 1731640800, 1731641100, 1731641400, 1731641700, 1731642000, 1731642300, + 1731642600, 1731642900, 1731643200, 1731643500, 1731643800, 1731644100, + 1731644400, 1731644700, 1731645000, 1731645300, 1731645600, 1731645900, + 1731646200, 1731646500, 1731646800, 1731647100, 1731647400, 1731647700, + 1731648000, 1731648300, 1731648600, 1731648900, 1731649200, 1731649500, + 1731649800, 1731650100, 1731650400, 1731650700, 1731651000, 1731651300, + 1731651600, 1731651900, 1731652200, 1731652500, 1731652800, 1731653100, + 1731653400, 1731653700, 1731654000, 1731654300, 1731654600, 1731654900, + 1731655200, 1731655500, 1731655800, 1731656100, 1731656400, 1731656700, + 1731657000, 1731657300, 1731657600, 1731657900, 1731658200, 1731658500, + 1731658800, 1731659100, 1731659400, 1731659700, 1731660000, 1731660300, + 1731660600, 1731660900, 1731661200, 1731661500, 1731661800, 1731662100, + 1731662400, + ], + y: [ + 58.941782641384606, 61.4012143492051, 64.873267278089, 65.00210737484994, + 65.45264151171712, 65.95495003021648, 64.50182501073763, 63.882343294117646, + 63.35379262947401, 61.10174886256031, 62.33368565110488, 62.81942437278245, + 60.51315838911392, 61.86667579723, 59.47005002246009, 62.40167144230211, + 61.03067032232143, 59.72082284134765, 60.2309294058039, 59.87017553797074, + 59.962049886015855, 59.263034078942695, 56.581702482648616, + 56.99978450816994, 57.52460710676874, 56.0642122839526, 57.04255095182851, + 58.38604873537193, 59.3028743077342, 59.81398787643947, 58.955899503812645, + 58.90034904870837, 58.57096632241609, 57.08670075531496, 57.45938183800187, + 57.85651183838962, 57.52529584010272, 57.06728987192655, 54.85784424552341, + 52.1290941896981, 50.38587553446936, 49.13251369794585, 49.52425281769374, + 49.844140817436326, 50.478618557889824, 51.04947698232064, + 51.846377864845934, 52.31363111041083, 53.7106364490877, 54.06179975630252, + 55.04609467950514, 55.635898895035794, 56.62295803773732, 57.55407281318084, + 58.11654846864302, 58.46487092766949, 60.751287518207285, 63.78229713702147, + 63.23825402445537, 62.88819820684719, 61.59939389430316, 60.92628317631497, + 60.34115069089664, 60.05453519946765, 62.127677625583566, 62.4654545235761, + 62.319671088624354, 61.15315320687896, 58.96870392561468, 56.7969475576564, + 56.6496331817616, 57.428756181267325, 57.902740807967625, 58.92673030718954, + 61.533561579118064, 61.75793354754124, 59.44487224533147, + 59.783141046374105, 60.4136151669779, 61.61639820618841, 61.39149354691877, + 62.343261569148126, 62.01404486502297, 61.04555340925346, 59.96724454357298, + 60.16648421708683, 57.400585066837856, 56.48477477661064, 56.71954919553378, + 56.1365464631964, 55.5970516966231, 54.40000096153194, 53.5464077107065, + 52.291696279956426, 51.70017640296517, 52.1621735177975, 53.117925032679736, + 51.304607045440406, 55.20102524369749, 57.18021346802056, 56.34889145222533, + 55.67545528018986, 55.10494177673255, 54.60595656956116, 57.78139942654839, + 61.15953102567694, 60.83242289775911, 60.24887366627763, 59.26642137215998, + 59.22428027349828, 56.81394618518518, 55.1748913610333, 54.72275758264168, + 56.31140458047778, 56.11255035406293, 55.07212611912543, 52.17565964588909, + 49.7171657796452, 49.03744240087146, 48.10591636756925, 47.93863257002802, + 46.12724882640834, 44.63836630182073, 44.26280591845627, 46.2228575765724, + 44.469537465997504, 44.33645224867725, 44.33251566853408, 42.20986595510427, + 41.92028944817928, 41.71831199665422, 41.7245861916349, 41.68877414799253, + 41.92460673319327, 42.24897181266907, 42.57344658146592, 41.28835529310613, + 41.582987494553386, 42.25618099891067, 43.86711691254279, 44.13454203369126, + 44.00098323288204, 43.96459825412388, 44.55543687648202, 46.22909288422037, + 46.06792572673515, 45.6231615762722, 45.39435046061961, 46.75218159687208, + 46.09182814145658, 44.46027019662309, 44.734803646358536, 44.23228959134766, + 43.85736023762839, 43.43984543399991, 41.95431058467813, 39.82435362413179, + 40.09908481170246, 39.2734482587146, 38.24451729925303, 35.27130575124494, + 34.573867623404915, 33.311464150171176, 32.1726791004273, 31.7337923600996, + 31.91568549080753, 31.84123112122627, 31.293490678710874, 33.07102675225646, + 31.685143460335787, 31.42055436048864, 32.74303876353876, 32.77405659975101, + 32.656750203843764, 32.37605881596642, 32.46261340452848, 32.11419520136425, + 31.970244375817, 33.00588622362279, 32.74630922318405, 30.316382420698464, + 30.349688515974837, 30.163864263460944, 28.420098673561185, + 28.082364815515096, 29.58655469801847, 29.366358731888685, + 30.238912492608154, 31.88830473716153, 30.31194028129799, + 30.132353911375667, 30.046600303882663, 34.19058097401184, + 37.28513394211018, 39.308624286803614, 43.04854361142235, 46.83960833048293, + 49.23149115336134, 53.09301431637098, 54.14730465266041, 53.69743973148149, + 57.48921678563647, 61.29143597032499, 62.86515233263305, 61.17298063545104, + 61.001700220651365, 61.74420187636166, 61.64219491153128, 61.8789153199502, + 62.726039725412384, 61.02416944965764, 61.08837585029568, 63.03740768930907, + 61.47598801587302, 61.43897610037348, 63.43473046421379, 64.92388822642391, + 65.08749472281941, 65.57815759640525, 63.01281398358232, 62.79659043596327, + 63.24136217421415, 62.551454640765385, 62.47728622257889, 63.04916960549331, + 67.49155650832556, 67.51796149470898, 69.68678351604163, 67.15411694624389, + 68.83769404162777, 69.52321213828473, 70.2898584441332, 70.36659194841269, + 70.34035553820416, 70.38473470424837, 70.4468026346094, 68.91012422563868, + 67.15092879785247, 66.95857087269621, 65.0285352491441, 65.43687355967879, + 63.6378514475568, 63.46421211311405, 63.31453394475568, 61.700878574618734, + 61.67495609103641, 61.87275967413632, 61.90503801385, 61.66065225894802, + 61.34794371405228, 62.1125241739807, 62.930295262662106, 62.84202956621537, + 63.17740966791162, 63.40084145230316, 63.06957849836602, 62.98815693362901, + 63.265295348316094, 63.275573142779336, 63.29825752287517, + 62.58717837270399, 61.92108601859632, 61.42413990234983, 61.04363783972015, + 61.20577782438531, 63.048192007936514, 63.10653011111111, 63.51685925420168, + 63.73387133068718, 63.579571219651285, 63.43564065624028, 63.24858606590414, + 63.15467904411764, 65.5451224572051, 65.45765017740429, 65.3193098596736, + 65.02181468152038, 66.19215736562403, 65.98091553882664, 66.67564758411142, + 66.6261610280112, 67.01699049081856, 67.77609020004668, 68.34553946916239, + 67.17997545111267, 72.45056753867102, 72.67931500766029, 74.28928530541552, + 74.47013189130097, 72.51628476291629, 72.81711342724091, 70.70095021458788, + 67.25578770580454, 64.550383674681, 62.099298550381256, 57.82816177170868, + 52.06853534126984, 48.28216973731715, 43.4808154248178, 38.60710436647992, + 35.478523425807914, 31.221674822362274, 27.37024860714285, + 28.108737625001947, 28.15131223107413, 27.21785993043884, 27.54928801727357, + 27.639918421335206, 27.727377474658294, 26.571519298552754, + 26.87344268261749, 26.890840829365075, 27.526952129551823, + 27.643341046885052, 26.96369181781889, 27.24477171615313, + 27.217402740070938, 26.79509592259453, 26.69168979752633, 29.87445278050109, + 29.768193690775757, 31.061691631963896, 31.24848130991285, + 31.56483308504513, 32.914695821817624, 33.06320423957361, 35.06238596560004, + 34.788468908263305, 35.25857857692058, 36.04501005845135, 36.40289348727679, + 33.66671082985513, 34.012964513406914, 32.615855917274914, + 32.745286923460895, 33.041953259526835, 31.89669102291933, + 32.32069525926445, 30.64644831143196, 30.30902072544256, 29.74721316666667, + 28.933836104173157, 28.573007201680674, 28.37276618063988, + 31.330456589327216, 31.66487717351385, 31.11896007541056, 31.16670996490819, + 30.81271378423592, 30.35539786423397, 30.22235192117961, 30.49643936172256, + 30.42073140701837, 30.56692719747445, 30.498835840490457, 30.13394829139434, + 25.871422598117025, 25.90165456404451, 25.91566239855665, 25.56779571449192, + 25.683696867335826, 25.59668704604733, 25.83967787177093, 25.62249248327109, + 25.753680543183943, 25.603078182928733, 25.518090556722697, + 25.482917173568968, 25.80812322626829, 26.046633642001247, + 26.14773526065982, 25.953896126828518, 25.46639586834734, + 25.562229350038265, 25.219301350529104, 25.92858950954456, + 26.121874461251167, 26.58341310597573, 27.11876501812948, + 27.430628458216617, 27.39240479240585, 27.54977591153128, 27.85640113569873, + 28.222402416163856, 28.969297804866976, 28.986252159897298, + 28.84136411204482, 28.128688149859947, 27.59490699745889, 26.96680459936197, + 28.090740671879864, 27.73263125138177, 27.324517317217165, + 27.365420190087143, 26.80050885301899, 26.283981945338603, + 25.432035400404608, 25.142107771188225, 25.480606893580777, + 26.394661709305947, 26.69638206940554, 26.99278514018636, + 25.751659767507004, 25.823896095721167, 25.98248146654217, + 25.38329604474012, 25.484708286181142, 25.713321698490503, + 26.083896173280426, 27.89615609723649, 27.813041698334885, + 26.948890917444757, 26.855702646943413, 26.787259345411965, + 26.536811101774045, 28.59014737192655, 28.78242863997821, 32.55982410620915, + 33.52181993899783, 34.224967363289764, 34.85724112340492, 33.5429106919818, + 33.54010462994086, 34.417329553373015, 34.82579095774977, 34.89051613058165, + 34.735184703587635, 33.79302936391223, 33.61412690460629, + 30.469615774647146, 29.41954305943368, 28.47523403516962, + 28.034691821106247, 28.096342958605668, 28.096548434173677, + 27.02558324115961, 26.545660061780268, 26.478144335366093, + 25.491050910986612, 26.58176742896047, 26.434493132741984, + 25.96409675088837, 25.990739329909744, 26.30730127233116, + 25.765286494678563, 25.276043285091816, 25.080518100918148, + 25.44396353051731, 25.654559058391044, 25.55643483378273, 25.26157594800874, + 24.67854260451305, 24.871254083800185, 25.38868303754735, 25.44963918069108, + 25.370991600150568, 25.79778496739807, 25.610606928026765, + 25.222127567693743, 24.96679018502892, 25.01590537208216, + 24.969871468291583, 24.484130486461247, 24.099513990411356, + 23.950029901055405, 24.814266879772937, 24.44624820122942, + 24.30254866643454, 23.840878894855532, 23.966818009726115, 25.8136181853408, + 26.19399873763033, 27.87766064589169, 28.10267066522296, 28.28611419584633, + 28.518158680283225, 28.208373767305936, 27.066216697089946, + 27.188340318938685, 27.22513779450669, 29.32667485389175, 29.23906664954871, + 27.523340993832434, 27.446801943123745, 26.068879401960785, + 26.189269175975856, 26.28474070996553, 26.3169867106287, 26.40077252264239, + 26.584643179582947, 26.63628580544014, 26.71617864690321, 24.6257514038282, + 24.805840258092125, 24.837229134765018, 24.67836042930876, + 24.31674294607843, 24.075902948801744, 24.418895667833805, + 24.59512529302832, 24.42147927787656, 24.504897010037347, + 24.655155270061083, 25.99206281535948, 26.54313218198335, + 26.353730218565204, 26.43389848054778, 26.48195167203548, + 27.819831842359168, 27.746073584171725, 27.127150239722745, + 28.371557758558986, 28.5651643524523, 35.64853879326175, 35.359286039524335, + 33.72550182896956, 33.141992913943355, 33.300564859521884, + 33.28472432955601, 33.34242750051486, 31.752449816370987, 31.82015593804856, + 31.910781530656703, 30.282363692851003, 30.163639932935325, + 24.66858756053532, 24.843062490433404, 24.93753184053066, 25.69361826929661, + 25.59489462885154, 25.517461993056205, 25.69866719148771, + 25.587189380940064, 25.535254479380644, 25.54687680625584, + 25.63473862916019, 27.002334803324384, 26.74647285978836, + 27.138632092903837, 27.80075896724245, 27.880479243213127, + 29.67188730827887, 31.29827850134616, 30.959448352217557, + 31.365305126283847, 31.283064286570184, 31.282307984827263, + 31.139530158263305, 28.694760504435106, 29.78311285776533, + 29.54640398879552, 29.49088577482104, 31.06879184430439, 29.64389716588858, + 28.205278112122627, 28.850369743619677, 28.694526801665116, + 29.00195253734827, 29.36584153057889, 29.7022303793184, 29.900588909686167, + 32.75584869786804, 33.044837205096485, 32.56056845642701, + 30.446684071106347, 31.516420630252103, 31.75506227038593, + 31.236530449502023, 31.083985961015145, 30.9813856171024, 30.72017601929661, + 30.592821195580484, 30.614213678260192, 32.17687531408093, + 32.24136498058863, 34.15946756216932, 33.92335319328185, 33.95195382920946, + 33.74520058263305, 33.77473164822596, 34.97284503874883, 36.5087513015095, + 36.55936346890194, 36.752788040917125, 36.61503265406602, + 167.97568359555754, 371.0068673414255, 369.7306167499494, + 368.75140300951546, 368.6183893338992, 368.9123254821818, 368.9947586052755, + 368.70504684671647, 368.94933989737007, 368.9703622191852, 368.887628218643, + 368.887360381108, 196.52521276316676, 28.93426535558668, 28.81139691849908, + 29.703833988207958, 29.64537687423567, 29.070201984901843, + 29.12411096025652, 28.87276699976657, 27.298809912075946, + 27.345683642770258, 27.435840973544977, 27.07700823918456, + 26.50357338671024, 26.271750729737267, 26.16740367110178, + 25.416600582295235, 25.47549882454093, 25.409440321291264, + 25.406752160130715, 25.17676685122938, 25.220370390211027, + 25.262359780257945, 25.087683763633425, 24.9263572447868, 24.82480837375016, + 24.671575401805168, 24.727373729400096, 25.159994431372542, + 25.12436251329689, 24.778072215011928, 24.753405420479304, + 25.13280539651416, 25.30410765283808, 25.29311151019296, 25.356244022564585, + 25.56376974320831, 28.47632658928313, 28.8919935427949, 30.699627437441645, + 30.394361725254186, 30.2806682872549, 30.326807255835664, + 30.576670391612204, 30.3988712237784, 30.182143482337377, + 30.153859754046067, 30.24181509342324, 30.184643256597337, + 27.635013786647995, 27.468744495331467, 25.709681902038596, + 26.098090057537743, 26.05084059190269, 26.265890401882974, + 26.173225952830947, 26.33285182617492, 26.396674022071156, + 26.39595943140243, 26.21256024828821, 26.02893681656617, 26.42799034484905, + 26.633905344382203, 26.868695515717395, 26.740567479916955, + 27.138289368036105, 27.1556690996732, 27.243268240974167, + 27.507997676937443, 27.94917445634921, 28.43161846559685, 29.03478375832556, + 30.1154276437902, 31.454790713663243, 31.23585759819484, 31.105841986616877, + 31.259715965764084, 31.00187127577765, 30.984767894646748, + 31.59195324004046, 31.4748730497977, 31.497402663149717, 31.484175445689388, + 31.79037021971229, 30.314308131574847, 30.427513049253037, + 30.81913788293781, 31.17379631403673, 31.46375984965181, 32.21376881108913, + 32.690425853018986, 32.57557332064725, 32.63087862916278, 32.68514822478992, + 32.61578767312481, 34.056495578197946, 33.879748598661685, + 33.51848457648615, 33.47539377373172, 33.42298264565827, 33.40316006932773, + 32.70932013608777, 32.38632018806411, 32.268620090024896, + 32.262813763735224, 31.819996736903292, 31.584889548996912, + 29.421305180276097, 28.746681103641453, 28.64263852723312, + 28.357950381263617, 28.01927860885465, 27.303457547230007, + 27.29029619981326, 26.831261789682536, 27.75222993930906, 27.55956858667912, + 27.58546177698089, 27.36105321374105, 29.89353984163993, 29.90290177816682, + 29.57416321512477, 29.53462468962029, 29.605486192888268, 30.53702460006225, + 30.15039301237161, 30.10056392545908, 28.676396878695925, 28.60265225357921, + 28.36623315336267, 27.394695204444183, 27.508514238741707, + 27.49194504606549, 28.722227190631813, 28.807437802365392, + 28.837752904450667, 27.919386835200747, 28.31346485675381, + 28.339559991830065, 28.91414176758481, 30.718182950746964, 30.96288670277, + 31.39987927349829, 31.041675205960164, 30.861627597805786, + 30.842963165576705, 30.733896699502026, 30.880657490351695, + 31.278509913943356, 31.094989897292248, 30.73628421442966, + 30.945704128229067, 28.84843930049797, 28.74032308364457, + 26.827305060379704, 26.530809777814117, 25.96745433769848, + 26.70902694436664, 26.595332123327108, 27.19955648451603, 27.40241477665997, + 27.243182092813708, 28.80407916728914, 28.09172298124805, + 28.850278599641435, 29.45933590834112, 29.60213473786181, 29.69968093294235, + 29.763285440525475, 30.40091395136944, 30.46298858053222, + 29.656473900560226, 35.7123254387644, 39.41904684959539, 38.91112194358855, + 37.780734158330745, 36.60510631671014, 36.55645897774666, + 36.477248157018366, 36.40950530431061, 37.792433290449615, + 34.87130448093682, 34.53407791923436, 33.26566389972364, 27.17912069421101, + 23.291100150093367, 25.235788378462495, 26.844747855023865, + 26.66167162146554, 26.45897317056555, 26.36598999073556, 26.45640035262994, + 26.011657498988484, 27.54453843464053, 27.63932139851774, 27.90914813689311, + 28.655600268129472, 28.862732023253187, 26.99278530890134, + 25.623890753267972, 25.52224758520075, 25.62527082492997, 25.76278495841828, + 25.743342223622783, 25.73690716806723, 32.13709991989379, + 32.090933199813264, 33.56757172953626, 34.71236485523204, 34.81032715507314, + 35.1649374381622, 35.181312239028955, 35.17573788741574, 35.12961727889304, + 35.036676448412706, 35.02687943230625, 33.55015249439776, 27.25423674791732, + 27.311532173124807, 25.67164091469422, 24.742856865157176, + 24.620622900560225, 26.21423230078587, 26.24000731753813, + 26.437973901571738, 26.675366786849004, 26.92306304754124, + 27.01919970860566, 27.297687830932283, 28.63369135955493, + 29.355476949521474, 30.140518654139434, 30.243248319950208, + 30.534434136771843, 29.116119235449737, 29.62016206185808, + 29.81691216269841, 30.10360221817616, 30.361658778039093, + 30.784104211328977, 30.975762430205418, 36.77112135836836, + 37.172732087768445, 38.76485314612513, 41.311528521864304, + 42.42473405852592, 44.65787876688453, 44.87982789028945, 45.50969743674137, + 46.51529072331154, 49.09481759765018, 50.87345243637617, 50.04842169826681, + 48.79592027552132, 48.78814322391311, 47.373435681449735, + 45.639956220757504, 46.902850085434174, 46.67259827661065, + 47.84420538600996, 48.42607746840959, 48.61189698368089, 47.92942267545908, + 47.93824611854965, 49.286505282757545, 56.10636960971055, 58.40124851726775, + 63.50846260087667, 64.60198887430036, 68.84760323552754, 70.70140847338936, + 71.28034889192344, 72.52377323923838, 75.0899715707283, 76.92661562822909, + 78.0363755140056, 77.91390364184562, 74.1105224606287, 73.93911394257702, + 71.87279778369125, 71.59699245541549, 70.46469318502956, 69.94974169469346, + 71.77123990343915, 72.92394358730158, 72.02950223350452, 70.81346959150326, + 70.51726972139444, 69.93821540662931, 69.7244313582322, 69.1584404818634, + 70.60772882850918, 68.25284785939931, 67.85498596699865, 67.10423107679738, + 65.09833801890757, 64.49970013289955, 64.47577398070341, 64.31248988436366, + 64.70736840444549, 62.21282998786181, 62.59501112558356, 64.77233134889512, + 62.43943597938064, 61.80706415834112, 62.94140341876752, 63.84176193360178, + 63.527693292639285, 64.43611785768752, 63.60927580757858, 63.55337024704326, + 62.770209502567695, 62.63836668160598, 62.10324386150017, 60.74766335580783, + 61.40302063414255, 61.70102791861189, 61.15667755736981, 60.55677202987862, + 60.95071886562402, 60.79940258624015, 62.55398988001867, 62.64043487885154, + 62.513895134142544, 62.94156452334268, 64.20246616160908, 63.73434094779023, + 63.5041789186897, 63.68215981823842, 63.081352581842005, 62.21168594771242, + 61.91578327777778, 62.22479744942162, 60.76577123848428, 60.189609401255325, + 60.442192638792925, 59.15886466192032, 58.1713403916122, 57.67674780368814, + 57.30455199144103, 57.66981233551198, 58.03333615958606, 58.66582123373794, + 58.70814725871459, 58.95698943938687, 59.25381329349518, 60.992397859866166, + 60.34303437223779, 59.00214022661065, 58.97391081676004, 59.282932891300966, + 59.30779942794897, 58.20297464036725, 57.185346162309365, 61.16065467779333, + 59.0160093881108, 59.1997780250266, 58.67915318664132, 57.54848831146905, + 58.521388471677575, 60.47850626023451, 62.78413240740742, 62.18300929053845, + 62.330743322477055, 63.13634000526278, 63.34266642717086, + 57.460404865157166, 58.15287767637204, 60.18254189962652, 59.67558345011283, + 58.851053555399936, 57.75813170569044, 55.74531827217553, 53.59450696584189, + 53.05560967608154, 52.03829812776222, 50.47595399958957, 49.88282322058824, + 50.31065788562091, 48.92396737005913, 46.03938439822596, 45.52425748926237, + 44.656687294506696, 43.77058376299409, 42.95362337387177, 42.38142063313103, + 43.11967918744164, 42.5542412219888, 42.71610327303079, 42.35654511411459, + 45.29705173389356, 45.19644239647992, 45.0319983889883, 44.8439058278089, + 44.78376576081544, 44.457033635465294, 45.130506187752886, 44.783461494709, + 43.52356669094304, 43.45794568783069, 43.32931773560536, 43.21553838593216, + 41.47638313702148, 41.5162273219084, 41.57160974338625, 41.66498943004979, + 41.42564631784936, 42.44019368228228, 40.828677462962965, 39.91583180088702, + 41.17843555897915, 40.855561723242175, 40.76047030812325, 38.93587633652349, + 37.7464689335924, 37.28775453004928, 37.04429753258897, 36.85626763390912, + 35.8706244274244, 37.11990762581699, 37.1863524798475, 37.638247766106446, + 36.25430491985684, 36.637866438608775, 36.35067290320573, 36.28472742047673, + 36.276860259741085, 36.489197031451006, 36.48600939698101, + 36.54901096187364, 35.638294388851946, 35.734743032368506, + 35.40631950081144, 35.94980904692275, 35.46680773502609, 35.510734755368816, + 35.95400621093993, 36.02994218028322, 35.5734647858699, 35.22393296634472, + 35.225793847105514, 35.22902017810458, 36.43711631777155, + 36.265380652661065, 38.02749138636274, 37.62971323295337, 37.42714121776961, + 36.95039002240896, 36.31661667506678, 36.0037728418145, 37.40167867849362, + 37.02681000169368, 36.31722928446611, 35.26668413694367, 33.25957250778089, + 32.782263221397315, 30.39656745066916, 30.02428459228201, + 29.808934232251165, 29.567904900871465, 29.517057490118276, + 29.230555831974872, 27.45702673941799, 29.05700840811612, + 29.236244849408656, 29.20064219179894, 29.138752161064428, + 30.55835784529452, 30.565500675039317, 33.54320870417056, 33.51730989534703, + 33.635564918067224, 33.004995154450675, 34.915940982337375, + 34.8645192404295, 34.962203594104686, 34.69690704855276, 34.74498398177004, + 34.892509737550576, 33.568477973070344, 31.96602754477452, + 30.38308253337743, 30.25826683945106, 31.729319230443384, 32.42589775023671, + 30.713313286570187, 31.00019012240058, 29.35558868495176, + 29.330642955493307, 29.366665381535302, 29.27969271257392, + 30.64566654684096, 30.65363044592281, 39.37223321623095, 39.28191009414877, + 38.753450656215634, 39.75796137597261, 39.79561021078431, + 39.678051907563024, 39.577788802754434, 39.58092119654594, 39.4433955567227, + 39.436668274743234, 38.81424196817616, 39.86047494429992, + 31.426467238717716, 34.84665992717088, 33.525482491129786, + 32.92565040461926, 34.15261885869904, 34.488853953859326, 34.53786150140056, + 34.362719461251174, 34.41639849393091, 34.43380485776533, + 34.623252674369745, 33.655528133262656, 36.13845576322751, + 33.802046939153435, 34.89278748630045, 35.413480934951764, + 34.954698636009965, 35.625287723467174, 36.51973239729225, + 37.450948705401885, 38.15702267880097, 38.81035162729536, 37.81278832454093, + 38.92543132937419, 37.371204515795206, 37.57897065985545, 37.5870592175336, + 37.909553840578106, 38.13556618074749, 38.30226780475931, 38.52199178742609, + 38.90891580446623, 42.505845184796144, 42.78081238779957, 43.12959857388215, + 44.12439770197246, 47.65035948605859, 49.19885042156863, 50.38835815336135, + 50.44726838511912, 51.9128476215375, 53.77740473965141, 57.88696059803921, + 58.28408677824463, 56.1891823251634, 58.838405519792005, 60.59668358099908, + 59.749744590570856, 67.96977563499844, 68.4754641506964, 72.7640670121382, + 73.84499798910674, 77.94533183673296, 79.95454370261439, 80.2316089782135, + 81.43727749883288, 84.3028777342048, 83.64266997378787, 84.22314380166446, + 83.60827409671646, 77.94086393572985, 77.80224571778712, 77.51650341492895, + 76.08414368464052, 73.88129486301938, 70.6678930357921, 70.66055579944887, + 70.70454495596016, 73.05540970032096, 73.10487307589875, 73.38420832965149, + 74.77042171646437, 84.89224811056647, 84.41051367320262, 82.90167784049174, + 84.00019356092437, 83.80854574719886, 85.27219799299719, 83.38851990071583, + 83.86115079077187, 80.41423783208838, 80.70107812542602, 80.10656297681884, + 75.80064022704637, 67.24896396349013, 66.77399559897293, 66.97918531131342, + 65.4202743683493, 66.70486418922995, 67.21564541121748, 69.06087762978525, + 68.09926675521321, 69.12133685941293, 70.44380782819795, 72.39286813881108, + 73.71551038725491, 78.3382525890912, 80.52514818043885, 80.5624145053688, + 81.96690939464675, 82.28206573225054, 83.05897434466924, 91.95171362200436, + 95.1384200506536, 93.80487738390912, 92.0733422263461, 90.26234991919613, + 89.49557513475723, 88.74779996055089, 85.54380739160443, 85.22927167662621, + 84.46578751268284, 83.64410646506381, 82.41546343734049, 71.95527575706764, + 69.84468479388423, 70.19614451929661, 70.47914236150017, 70.07942907290695, + 68.09042342408121, 65.67059008169934, 66.48682310414917, 66.28897753485839, + 65.93564506348238, 65.54596158761284, 65.37046544677871, 65.41060497743543, + 65.36542293487396, 65.2823720484555, 66.71116757057268, 66.95735758224401, + 67.35772266573296, 66.74329906945937, 65.79714311266729, 65.89994935294118, + 65.63666966985684, 67.67334157049487, 67.836301411637, 67.20812611865858, + 67.46182863554311, 67.55566999175227, 65.60759811266729, 65.14141364130096, + 65.42029407376285, 65.92727871747589, 65.76574962114846, 65.75693996264978, + 65.89704954933086, 63.01588652155635, 63.2164553084345, 62.25522925507515, + 61.36306977116403, 61.112000663709935, 60.03933099937753, + 59.525393220070825, 58.47132296226268, 60.8824291346094, 60.69227316721133, + 59.97555997361363, 59.60740559718331, 59.14059838148992, 60.51111946840959, + 63.26800193798631, 62.444801999766575, 60.98960054256148, 60.89585142873807, + 61.13580467359166, 60.32196394117646, 57.94389530523912, 57.498850768351545, + 56.65123618892263, 57.466516641067535, 57.59612670972482, 53.52083653913788, + 49.92162164791472, 50.59517709866169, 51.45122667094134, 52.44057019024277, + 52.02298722743543, 51.49452014096055, 50.16482355880475, 50.27219635729848, + 52.23875164321771, 52.72057024929972, 52.186335688337095, 53.85078983255525, + 57.95230559679428, 56.58441200932478, 55.543840993597, 54.604034451136016, + 55.26226071663199, 55.88339294615624, 59.51149885294117, 59.445994397992536, + 57.54360589891069, 55.4084502980859, 54.20425149361967, 55.44909533442266, + 52.63800145992841, 53.14527025249119, 52.82843435916589, 51.903411534547146, + 53.329149975648455, 53.14904358970199, 50.2158097787893, 49.91541920732499, + 49.76502442966076, 49.25195724429856, 49.20558479217242, 47.09368758605664, + 50.2836940274024, 51.38318088857766, 51.852124594460015, 51.29033809579726, + 50.29197352521009, 49.35292301368399, 50.58611101037884, 50.78043721186394, + 50.2892250182113, 50.18209551271658, 49.77714393846742, 50.06783223615001, + 45.475963166062655, 43.501753086991016, 42.32951829435108, + 41.12116830399937, 41.952854809860106, 41.37924966728914, 41.11679179715219, + 40.221658253267975, 40.033264176121634, 39.29786039534703, + 39.150173641366464, 37.880376916822286, 38.10787700248988, + 38.069986997055686, 38.03616762608673, 37.74939185898628, 35.67170326518265, + 35.67166010776533, 34.215697417600374, 33.863293564425774, 33.8710783300913, + 34.47444615164955, 34.19627132889823, 31.93123144154736, 31.51503614433551, + 31.430533554407884, 31.52292545677716, 31.72270481314452, 31.68434308986997, + 30.643492731451012, 31.422503403904717, 31.54364519537815, + 32.97945351626206, 32.09106557850918, 32.51509766192032, 32.78662126691695, + 34.88690979820846, 34.89524456022409, 34.86384637119126, 34.83103647307812, + 36.60204773008092, 35.78238173154956, 35.58713857275132, 35.89494914184563, + 34.22695137968738, 34.817709462029256, 34.22913031528562, 34.08001404147215, + 31.81090739130423, 33.28998705687831, 33.56757137892935, 34.43609170232276, + 32.650412622648965, 33.50914697481477, 40.68146275925927, 40.23946413235294, + 40.189848912392456, 43.018025688898256, 44.83088308955805, + 45.39123737807347, 45.65184970269219, 44.202353398615, 42.95948439712345, + 42.77080997134234, 42.81834528797335, 42.53432603804856, 37.14875908839091, + 37.07144507796452, 38.66145624876745, 36.6166178488173, 35.05683016728914, + 35.17504472983071, 35.5577409020386, 35.65395198693111, 35.728732114067846, + 35.64664281437368, 35.18249199486461, 32.553500385299955, + 33.791290649626525, 36.37205868464053, 35.59034294732337, + 35.375952764705886, 36.359304614997605, 36.408508261360105, + 36.56257547936833, 36.79242104387385, 37.07023584889511, 37.477788241508456, + 37.64635425645814, 37.37077195652468, 37.08751032741986, 40.48640016657202, + 40.45368728586213, 40.684695831621546, 41.95768085239652, 42.44710521560846, + 42.54586578594903, 44.05936949943703, 44.77768222300031, 51.61930856318084, + 52.30349483971367, 54.2194923752974, 59.30951685185187, 56.8852512412854, + 56.91785076307896, 56.32245909188836, 56.389188469654535, 57.29546919930157, + 57.924161637632274, 60.02964748057662, 61.37193277288966, 57.69562169273265, + 60.53251689301276, 59.464692957019146, 63.12458329388423, 63.36229811267508, + 66.16742958169937, 67.0129253036433, 68.01126403485839, 69.81377594063183, + 71.92926783545363, 72.86965780539994, 75.709011511399, 74.35899236951447, + 73.64436570217654, 72.72050026416122, 70.29158438328665, 70.30066427998675, + 70.26333816230937, 70.64851840999111, 72.07432751216943, 73.94300101813403, + 75.24438390587086, 80.94983536313156, 79.47396430112045, 81.40107309133876, + 84.60480214683133, 85.92885203042329, 87.75917896615312, 88.7043711887644, + 90.92541296595212, 94.21867188109438, 94.89253788019197, 98.03532039114532, + 97.20335816931218, 90.57957583761348, 89.63833870852784, 89.42519494042257, + 87.9220975834316, 88.04421799304582, 87.9305035979614, 88.96270391059758, + 87.42257991024711, 85.81284543020541, 82.2672105540377, 76.52946124995267, + 77.37542551517275, 76.52923633566371, 75.96934396536261, 76.41080541011063, + 74.48588791651105, 72.98796894940152, 68.94490498861315, 64.57534028727046, + 62.83434032089363, 62.49756141962341, 65.24541220345884, 65.84552778709215, + 63.37053850096537, 62.914075454782655, 61.8861722303708, 60.27545054209461, + 59.94496026633987, 60.10339412955183, 65.8332240710123, 66.12245925389045, + 66.4947896573296, 65.57055588527207, 63.05949800280112, 60.72874770113601, + 63.38846142970097, 65.33207502938039, 66.35951396280734, 67.33058442110178, + 68.25886793207285, 67.39284609824416, 63.97401929243114, 65.1474684362185, + 66.39107808544975, 68.16461503183403, 68.24979246276774, 71.47740031765295, + 69.72238956907563, 68.77372398911847, 67.95070637567402, 67.56619200057578, + 68.28761648981127, 69.31030824000933, 69.34294309391537, 68.76732993416395, + 66.9572571888422, 66.03408723004138, 65.41371861904761, 63.59659814371304, + 62.3381917567655, 63.21724207948439, 62.87676603131008, 62.69375574836601, + 61.02520361476227, 62.13759892971002, 61.818684573918446, 63.05171037301587, + 63.92025435511982, 63.52840257485216, 64.26932764752569, 63.54378167958294, + 63.62177406987239, 62.1276899545596, 61.53537786358868, 60.105693186507935, + 58.85247740021469, 54.59344062620604, 51.81005909991644, 49.46050815140186, + 48.09565175824774, 46.58321739845938, 45.557014720354815, 44.15489430228759, + 43.44893412603356, 42.153459738951135, 41.20027848373794, 40.383662881108, + 39.80972071125117, 40.44132491051976, 40.94475606620112, 40.92368033893557, + 40.19507129396202, 41.00824337141989, 41.95370813725491, 41.7258462981514, + 41.22401867794896, 41.600697784391535, 41.87053676766262, + 42.308606485371925, 42.86273525560224, 42.62560773588676, 42.04721893211991, + 41.99055057461874, 42.70473409259259, 41.82934616073894, 39.86715138173047, + 40.01469590740806, 39.933404875194526, 41.73471642516664, 42.15094059159212, + 41.74715187488329, 42.48585353112357, 41.11295175267923, 41.41937420323816, + 41.586291549330845, 40.82558263320884, 41.15513645759482, 41.38137685740742, + 41.44751150879241, 41.182540448490506, 38.98132392094615, 38.55056628765952, + 38.1563098304544, 40.466936740740735, 42.12426137208217, 41.800500895500704, + 41.628062295555175, 41.83972824144102, 41.024184906184566, + 40.56802455174292, 39.97173523051796, 39.825902613601, 39.638428010280506, + 39.25890658423916, 37.49532800809212, 35.40822237905515, 33.77938201027077, + 34.07153581224712, 32.98805669319691, 32.33313402497666, 33.90932074431995, + 33.461484364845944, 33.14846937176444, 32.57558046926549, + 32.033502467086834, 31.585608652738877, 31.379728202370572, + 30.595623699857068, 29.583789674525367, 29.141038856297428, + 28.906070043572985, 29.33166817412011, 28.65713721204692, 28.83918572938064, + 31.542676217320263, 35.6824375070028, 35.63835173902894, 35.55564637924837, + 35.18754695339247, 35.099817366701686, 36.47387542669748, 39.34646677850335, + 39.2476882630719, 42.251757193161545, 44.77343211698505, 47.75746887153751, + 47.30174245860567, 46.64911654061625, 50.42361017561471, 53.750401697012144, + 57.26681321607533, 61.11423897743541, 62.23654784764239, 63.17392446498599, + 67.02292871973235, 67.31418536509692, 66.45253171164022, 67.07112974976658, + 67.08110396394012, 68.63709511531279, 68.73164804325138, 70.4117538225957, + 70.77863080182073, 71.68205008815748, 71.93089939853719, 71.56719910792096, + 71.42924412324932, 71.53372387542795, 72.04722060045128, 72.12096745908482, + 71.84575986122329, 71.00621946234048, 69.3275538058668, 69.36908263826643, + 69.33878674284158, 67.78862996364964, 69.6290785883131, 74.74669202555697, + 78.4419233594726, 78.1319776974855, 78.12244398731715, 79.12803252894491, + 79.71831571493043, 79.88780449875506, 79.90000948731716, 83.07104673454262, + 85.55520300038906, 88.51229336749145, 88.03467910963273, 86.72255432659861, + 83.4889352221444, 83.46879530184343, 84.11216387480547, 82.55285606084657, + 82.78167455385609, 83.65337458815749, 86.17937478854653, 85.77316770214753, + 82.75080186083127, 80.75408159867662, 77.28260874009996, 76.778130477202, + 78.7020968504513, 80.74978418751945, 81.30041404232803, 82.28961432346134, + 82.16950690141611, 80.86113363130123, 78.94828889230729, 75.57485663166305, + 76.1405767454884, 75.77443419786803, 75.93137310257504, 75.16312302556737, + 72.05518293378462, 71.79132955274342, 71.65290237324282, 72.0775570790532, + 71.79884099789916, 74.27480590017117, 75.82510005539996, 77.48215899198568, + 79.9555778191721, 80.88613351558317, 81.63009184490937, 88.39443389355742, + 89.85239164013385, 90.2449214545596, 89.75592318338066, 92.07241951704016, + 92.42585906733972, 89.84932014814814, 91.59030327372912, 92.24589612721758, + 92.26519351805167, 94.69319383869632, 93.45785409396656, 94.34298702863369, + 95.00588737820247, 99.09234054917523, 102.1099292877373, 101.29584735628696, + 101.4650841003735, 98.9565703846872, 97.84666118785924, 100.03411527303145, + 99.71810167429194, 98.58181522490922, 97.26160856551508, 94.58582210281732, + 95.96039505016016, 95.67660684014, 93.08480004628268, 94.0523651154684, + 94.94608922642392, 98.77257121620828, 100.14045546142172, 98.18673863390912, + 97.83362865974166, 98.24863557446312, 99.24458833108864, 99.76630156778648, + 103.36313139386868, 102.76135364189946, 104.78213266160908, + 105.6462991265069, 108.40881220331464, 109.5156007946623, 110.0605955017118, + 110.8951857722378, 111.54045595274148, 112.2054114720666, + 112.07847618594514, 111.384385265873, 108.00586338764396, + 106.13334230166512, 104.63891643923124, 104.12346435060692, + 102.6052051004902, 102.36271676758416, 98.42468922061308, 94.07094486819172, + 89.91012335636476, 85.3427096014628, 80.49777434586056, 76.31430633986928, + 72.96930617451758, 68.99549531154683, 65.25759172634609, 62.015357591425456, + 57.74361547976968, 54.28972953501401, 57.463993460452976, 57.66665648777104, + 59.36208722782447, 59.820028324229696, 60.04673916736696, 61.61811523592308, + 65.27785400451292, 71.28195219016494, 71.73486542397228, 71.45578071209398, + 71.54414195105821, 70.80141558652349, 71.78331107796451, 74.0996245096483, + 73.42858544032057, 74.53617187013694, 73.89247280213196, 72.69917398576096, + 71.47718137047023, 70.76499726034858, 70.90185466993464, 69.75498708060678, + 68.85446331621537, 68.56731058302209, 67.6082359671627, 66.09136096910986, + 64.95564390157175, 64.11129178623106, 64.40140520809993, 64.57831236686896, + 63.67520080283224, 60.40030193474104, 61.81779499073945, 62.78418401844071, + 63.09509561212264, 64.1338688784625, 62.95450522728434, 65.13940054338369, + 67.7046758005758, 68.11130878205728, 67.80915445681605, 68.41966301259531, + 69.00077427801122, 68.53229764505677, 67.3744322489885, 66.63894223016786, + 66.31748833761282, 66.84987036770869, 68.22550531808278, 67.90387261057293, + 67.10079870090257, 65.72669948160208, 64.87088270276811, 62.90964166111501, + 62.66474011780269, 64.28728267112584, 62.53005224385311, 61.81442400820431, + 60.8892435515108, 58.26320971366324, 56.66705199112978, 56.44600652046374, + 54.01330040234982, 52.77628593098351, 52.09951400303456, 50.906674452614375, + 50.74788118502956, 49.3047146678338, 49.28551040943045, 49.03071368098351, + 50.14675467429195, 52.12894355197634, 49.9237270995552, 46.21712937916018, + 45.48083349290063, 45.14146651136011, 44.76715720074697, 44.09508905096482, + 41.30538147564582, 40.391059152661065, 39.33920542071274, 37.54287406862745, + 36.54360948731715, 34.4834902867258, 33.953342767896046, 35.493810059134766, + 35.67961765841892, 37.10730947891378, 37.047075980547774, 36.87042633846872, + 37.95535782436651, 38.3372187425382, 39.33187104177041, 38.87567552233115, + 39.89612223342671, 39.25738163235294, 39.81165674664451, 38.20584080625584, + 36.82361148979277, 37.75863226361656, 37.63058887729537, 39.28845601719577, + 39.41264287752879, 39.49306161147033, 39.22030942538126, 39.4232572653215, + 38.13154584530488, 38.30870127115559, 38.26777612317149, 38.197741048630576, + 37.42221340916825, 37.08795553112356, 37.11733502069716, 35.58944113071895, + 33.21115506198158, 32.71018058537794, 32.71126606981339, 32.27677209194291, + 31.37684332547463, 30.47793979162776, 30.231008690631807, + 31.519063041975965, 31.08995375516133, 30.688337014039327, + 30.19535742281357, 29.748684731346412, 33.49681074489181, 33.11470567842132, + 32.360823065904135, 32.3717101887644, 32.376120132703086, + 32.067723218176155, 32.64748978711485, 30.848150442032374, + 30.895090073451605, 30.67191927147526, 30.28397113095238, 29.62509886203574, + 27.04580800194523, 28.573882694211022, 28.75442877380952, 28.53420904614068, + 28.581396868269533, 28.60005727567693, 28.98785046847184, + 28.972493470821664, 28.793840506069092, 28.71008912090725, + 29.469697687518806, 29.533434946908397, 30.132508398070343, + 28.811620310535325, 30.041922412464984, 29.913341684018057, + 33.077050821468774, 32.650952968720816, 32.12160525416278, + 32.243195058198175, 33.85710746774101, 33.85154251655141, 34.41782409136447, + 35.547615383521375, 34.89337270062882, 34.49490404522942, 33.21781021631557, + 33.29528707889823, 29.959086236461253, 29.471326982415185, + 29.50602077067121, 29.661144270481905, 29.722472580205423, + 29.814704644646746, 28.24768315499533, 32.18652016713352, 31.90653717065762, + 36.76875862511672, 37.97012723171491, 37.96046090821558, 38.02652311336757, + 39.60658159648303, 39.92862221367111, 41.33936914359571, 39.61579750824775, + 39.70889278657019, 41.23625718164446, 36.022337141300966, 37.42948003408031, + 33.099742921879866, 31.872254375116714, 31.78061327537933, + 31.88511384362709, 30.193049749455337, 30.48629381849518, + 28.956020887254905, 29.23615399921219, 29.104818136579198, + 27.475442283989857, 29.829900534562974, 29.99795566920277, + 30.779723704407147, 31.925564469977093, 32.872247076059395, + 33.32356896851442, 32.93503223401768, 33.22877910152219, 33.20909647437265, + 33.13862035434174, 33.13556479618023, 32.579469712807345, + 30.317214934860218, 29.70873584796141, 28.958531960002983, + 28.73607674159664, 28.854713778555865, 29.590038155384374, + 30.964432111500155, 32.35751750621953, 32.962270371381884, + 33.67005804614068, 34.2775095392131, 36.551716396514166, 44.0275391004902, + 45.54029454022721, 46.29541601330533, 46.10413422191099, 47.22068951649549, + 48.65907166160909, 47.27789647407264, 47.77737888655463, 48.6661289221911, + 49.09561334352631, 50.93133009230407, 48.32997531207233, 48.545629514044506, + 51.37972874606872, 58.06008107415189, 59.07194619950202, + ], +}; + +const worker = new Worker("./changepoint.worker.js", { + type: "module", +}); + +function highlightChangepointsPlugin(ds, cps) { + return { + hooks: { + drawClear: [ + (u) => { + const { ctx } = u; + const { height, top } = u.bbox; + u.ctx.save(); + let color = "white"; + u.ctx.fillStyle = color; + + function highlightAt(from, to) { + u.ctx.fillRect(from, top, to - from, height); + } + + let left = u.valToPos(ds[0], "x", true); + for (const cp of cps.indices.slice(1)) { + const right = ds[cp]; + const rightPos = u.valToPos(right, "x", true); + highlightAt(left, rightPos); + left = rightPos; + color = color === "lightgrey" ? "white" : "lightgrey"; + u.ctx.fillStyle = color; + } + u.ctx.restore(); + }, + ], + }, + }; +} + +function run() { + let start; + + worker.onmessage = (e) => { + if (e.data === "ready") { + start = performance.now(); + worker.postMessage(df); + } else { + const changepoints = e.data; + const elapsed = (performance.now() - start).toFixed(0); + const uPlotOpts = { + series: [ + {}, + { + label: "y", + stroke: "red", + width: 1, + }, + ], + plugins: [ + highlightChangepointsPlugin(df.ds, changepoints), + legendAsTooltipPlugin(), + ], + ...getSize(), + }; + + const data = [df.ds, df.y]; + const u = new uPlot( + uPlotOpts, + data, + document.getElementById("changepoint-plot"), + ); + window.addEventListener("resize", () => { + u.setSize(getSize()); + }); + document.getElementById("changepoint-title").innerText = + `Changepoint detection with a Bayesian Normal Gamma - done in ${elapsed}ms`; + } + }; +} + +export default run; diff --git a/demo/changepoint.worker.js b/demo/changepoint.worker.js new file mode 100644 index 0000000..6b38ceb --- /dev/null +++ b/demo/changepoint.worker.js @@ -0,0 +1,13 @@ +import initChangepoint, { + ChangepointDetector, +} from "./dist/@bsull/augurs/changepoint.js"; + +await initChangepoint(); + +self.onmessage = (e) => { + const { y } = e.data; + const cpd = new ChangepointDetector("normal-gamma"); + const cps = cpd.detectChangepoints(y); + self.postMessage(cps); +}; +self.postMessage("ready"); diff --git a/demo/clustering.js b/demo/clustering.js new file mode 100644 index 0000000..4f3e060 --- /dev/null +++ b/demo/clustering.js @@ -0,0 +1,102 @@ +import uPlot from "./dist/uPlot/uPlot.esm.js"; + +import { getSize } from "./helpers.js"; +import { legendAsTooltipPlugin } from "./plugins.js"; + +function setUpPlot(data) { + const opts = { + ...getSize(), + series: [ + {}, + ...data.slice(1).map((_, i) => { + return { + label: `${i + 1}`, + stroke: "black", + width: 1, + }; + }), + ], + plugins: [legendAsTooltipPlugin()], + }; + const u = uPlot(opts, data, document.getElementById("clustering-plot")); + window.addEventListener("resize", () => { + u.setSize(getSize()); + }); + return u; +} + +class ClusteringWorker { + constructor() { + this.worker = new Worker("./clustering.worker.js", { type: "module" }); + this.dataPromise = fetch("./outlier.data.json").then((res) => res.json()); + this.dataPromise.then((data) => { + this.data = data.data; + }); + } + + static create = () => { + return new Promise((resolve, reject) => { + const worker = new ClusteringWorker(); + worker.worker.onmessage = (e) => { + if (e.data === "ready") { + worker.dataPromise.then(() => resolve(worker)); + } else { + reject(); + } + } + }) + } + + cluster = async (dtwOpts, dbscanOpts) => { + return new Promise((resolve, reject) => { + const start = performance.now(); + this.worker.postMessage({ + dtwOpts, + dbscanOpts, + data: this.data.slice(1).map(arr => new Float64Array(arr)), + }); + this.worker.onmessage = (e) => { + const elapsed = (performance.now() - start).toFixed(0); + resolve({ clusterLabels: e.data, elapsed }); + }; + }); + } +} + +async function main() { + const worker = await ClusteringWorker.create(); + + const u = setUpPlot(worker.data); + async function runClustering(dtwOpts, dbscanOpts) { + const { clusterLabels, elapsed } = await worker.cluster(dtwOpts, dbscanOpts); + clusterLabels.forEach((cluster, i) => { + const seriesIdx = i + 1; + u.delSeries(seriesIdx); + u.addSeries({ + label: `${i} (cluster ${cluster})`, + stroke: cluster === -1 ? "black" : cluster === 0 ? "blue" : cluster === 1 ? "red" : "yellow", + width: 1, + }, seriesIdx); + }); + u.redraw() + document.getElementById("clustering-title").innerText = `Clustering with DBSCAN - done in ${elapsed}ms`; + } + const dtwOpts = { window: 2 }; + const dbscanOpts = { epsilon: 5000, minClusterSize: 2 }; + runClustering(dtwOpts, dbscanOpts); + + document.getElementById("clustering-dtw-window").addEventListener("change", function() { + dtwOpts.window = parseFloat(this.value); + runClustering(dtwOpts, dbscanOpts); + }); + document.getElementById("clustering-dbscan-epsilon").addEventListener("change", function() { + dbscanOpts.epsilon = parseFloat(this.value); + runClustering(dtwOpts, dbscanOpts); + }); + document.getElementById("clustering-dbscan-min-cluster-size").addEventListener("change", function() { + dbscanOpts.minClusterSize = parseInt(this.value); + runClustering(dtwOpts, dbscanOpts); + }); +} + +export default main; diff --git a/demo/clustering.worker.js b/demo/clustering.worker.js new file mode 100644 index 0000000..c85c0bb --- /dev/null +++ b/demo/clustering.worker.js @@ -0,0 +1,16 @@ +import initDtw, { Dtw } from "./dist/@bsull/augurs/dtw.js"; +import initClustering, { + DbscanClusterer, +} from "./dist/@bsull/augurs/clustering.js"; + +await Promise.all([initDtw(), initClustering()]); + +self.onmessage = (e) => { + const { dtwOpts, dbscanOpts, data } = e.data; + const dtw = Dtw.euclidean(dtwOpts); + const distanceMatrix = dtw.distanceMatrix(data); + const clusterer = new DbscanClusterer(dbscanOpts); + const labels = clusterer.fit(distanceMatrix); + self.postMessage(labels); +}; +self.postMessage("ready"); diff --git a/demo/dist/@bsull/augurs-prophet-wasmstan/README.md b/demo/dist/@bsull/augurs-prophet-wasmstan/README.md new file mode 100644 index 0000000..8418145 --- /dev/null +++ b/demo/dist/@bsull/augurs-prophet-wasmstan/README.md @@ -0,0 +1,49 @@ +# Prophet Stan model, compiled to WASM + +This is a WASM-compiled version of the [Prophet](https://facebook.github.io/prophet/) Stan model, for use with the [@bsull/augurs](https://github.com/grafana/augurs) library. + +## Usage + +```js +import { Prophet } from '@bsull/augurs'; +import { optimizer } from '@bsull/augurs-prophet-wasmstan'; + +// Create some fake data. +// `ds` must be timestamps since the epoch, in seconds. +const ds = [1704067200, 1704871384, 1705675569, 1706479753, 1707283938, 1708088123, + 1708892307, 1709696492, 1710500676, 1711304861, 1712109046, 1712913230, +]; +const y = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0]; +const trainingData = { ds, y }; + +// Create a Prophet model and fit it to the training data. +const prophet = new Prophet(); +prophet.fit(trainingdata); +// Predict for the training set. +prophet.predict(); +// Predict for a new time point. +prophet.predict({ ds: [ 1713717414 ]}) +``` + +See the documentation for `@bsull/augurs` for more details. + +## Troubleshooting + +### Webpack + +The generated Javascript bindings in this package may require some additional Webpack configuration to work. +Adding this to your `webpack.config.js` should be enough: + +```javascript +{ + experiments: { + // Required to load WASM modules. + asyncWebAssembly: true, + }, + resolve: { + fallback: { + fs: false, + }, + }, +} +``` diff --git a/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/augurs-prophet-wasmstan-optimizer.d.ts b/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/augurs-prophet-wasmstan-optimizer.d.ts new file mode 100644 index 0000000..491988d --- /dev/null +++ b/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/augurs-prophet-wasmstan-optimizer.d.ts @@ -0,0 +1,15 @@ +export namespace AugursProphetWasmstanOptimizer { + /** + * Optimize the initial parameters given the data, returning the + * optimal values under maximum likelihood estimation. + */ + export function optimize(init: Inits, data: DataJson, opts: OptimizeOpts): OptimizeOutput; +} +import type { Inits } from './augurs-prophet-wasmstan-types.js'; +export { Inits }; +import type { DataJson } from './augurs-prophet-wasmstan-types.js'; +export { DataJson }; +import type { OptimizeOpts } from './augurs-prophet-wasmstan-types.js'; +export { OptimizeOpts }; +import type { OptimizeOutput } from './augurs-prophet-wasmstan-types.js'; +export { OptimizeOutput }; diff --git a/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/augurs-prophet-wasmstan-types.d.ts b/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/augurs-prophet-wasmstan-types.d.ts new file mode 100644 index 0000000..dad006d --- /dev/null +++ b/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/augurs-prophet-wasmstan-types.d.ts @@ -0,0 +1,268 @@ +export namespace AugursProphetWasmstanTypes { +} +/** + * The initial parameters for the optimization. + */ +export interface Inits { + /** + * Base trend growth rate. + */ + k: number, + /** + * Trend offset. + */ + m: number, + /** + * Trend rate adjustments, length s in data. + */ + delta: Float64Array, + /** + * Regressor coefficients, length k in data. + */ + beta: Float64Array, + /** + * Observation noise. + */ + sigmaObs: number, +} +/** + * The type of trend to use. + * # Variants + * + * ## `"linear"` + * + * Linear trend (default). + * ## `"logistic"` + * + * 0 + * Logistic trend. + * ## `"flat"` + * + * 1 + * Flat trend. + */ +export type TrendIndicator = 'linear' | 'logistic' | 'flat'; +/** + * Data for the Prophet model. + */ +export interface Data { + /** + * Number of time periods. + * This is `T` in the Prophet STAN model definition, + * but WIT identifiers must be lower kebab-case. + */ + n: number, + /** + * Time series, length n. + */ + y: Float64Array, + /** + * Time, length n. + */ + t: Float64Array, + /** + * Capacities for logistic trend, length n. + */ + cap: Float64Array, + /** + * Number of changepoints. + * This is 'S' in the Prophet STAN model definition, + * but WIT identifiers must be lower kebab-case. + */ + s: number, + /** + * Times of trend changepoints, length s. + */ + tChange: Float64Array, + /** + * The type of trend to use. + */ + trendIndicator: TrendIndicator, + /** + * Number of regressors. + * Must be greater than or equal to 1. + * This is `K` in the Prophet STAN model definition, + * but WIT identifiers must be lower kebab-case. + */ + k: number, + /** + * Indicator of additive features, length k. + * This is `s_a` in the Prophet STAN model definition, + * but WIT identifiers must be lower kebab-case. + */ + sA: Int32Array, + /** + * Indicator of multiplicative features, length k. + * This is `s_m` in the Prophet STAN model definition, + * but WIT identifiers must be lower kebab-case. + */ + sM: Int32Array, + /** + * Regressors. + * This is `X` in the Prophet STAN model definition, + * but WIT identifiers must be lower kebab-case. + * This is passed as a flat array but should be treated as + * a matrix with shape (n, k) (i.e. strides of length n). + */ + x: Float64Array, + /** + * Scale on seasonality prior. + */ + sigmas: Float64Array, + /** + * Scale on changepoints prior. + * Must be greater than 0. + */ + tau: number, +} +/** + * JSON representation of the Prophet data to pass to Stan. + * + * This should be a string containing a JSONified `Data`. + */ +export type DataJson = string; +/** + * The algorithm to use for optimization. One of: 'BFGS', 'LBFGS', 'Newton'. + * # Variants + * + * ## `"newton"` + * + * Use the Newton algorithm. + * ## `"bfgs"` + * + * Use the Broyden-Fletcher-Goldfarb-Shanno (BFGS) algorithm. + * ## `"lbfgs"` + * + * Use the Limited-memory BFGS (L-BFGS) algorithm. + */ +export type Algorithm = 'newton' | 'bfgs' | 'lbfgs'; +/** + * Arguments for optimization. + */ +export interface OptimizeOpts { + /** + * Algorithm to use. + */ + algorithm?: Algorithm, + /** + * The random seed to use for the optimization. + */ + seed?: number, + /** + * The chain id to advance the PRNG. + */ + chain?: number, + /** + * Line search step size for first iteration. + */ + initAlpha?: number, + /** + * Convergence tolerance on changes in objective function value. + */ + tolObj?: number, + /** + * Convergence tolerance on relative changes in objective function value. + */ + tolRelObj?: number, + /** + * Convergence tolerance on the norm of the gradient. + */ + tolGrad?: number, + /** + * Convergence tolerance on the relative norm of the gradient. + */ + tolRelGrad?: number, + /** + * Convergence tolerance on changes in parameter value. + */ + tolParam?: number, + /** + * Size of the history for LBFGS Hessian approximation. The value should + * be less than the dimensionality of the parameter space. 5-10 usually + * sufficient. + */ + historySize?: number, + /** + * Total number of iterations. + */ + iter?: number, + /** + * When `true`, use the Jacobian matrix to approximate the Hessian. + * Default is `false`. + */ + jacobian?: boolean, + /** + * How frequently to update the log message, in number of iterations. + */ + refresh?: number, +} +/** + * Log lines produced during optimization. + */ +export interface Logs { + /** + * Debug log lines. + */ + debug: string, + /** + * Info log lines. + */ + info: string, + /** + * Warning log lines. + */ + warn: string, + /** + * Error log lines. + */ + error: string, + /** + * Fatal log lines. + */ + fatal: string, +} +/** + * The optimal parameter values found by optimization. + */ +export interface OptimizedParams { + /** + * Base trend growth rate. + */ + k: number, + /** + * Trend offset. + */ + m: number, + /** + * Trend rate adjustments, length s in data. + */ + delta: Float64Array, + /** + * Regressor coefficients, length k in data. + */ + beta: Float64Array, + /** + * Observation noise. + */ + sigmaObs: number, + /** + * Transformed trend. + */ + trend: Float64Array, +} +/** + * The result of optimization. + * + * This includes both the parameters and any logs produced by the + * process. + */ +export interface OptimizeOutput { + /** + * Logs produced by the optimization process. + */ + logs: Logs, + /** + * The optimized parameters. + */ + params: OptimizedParams, +} diff --git a/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/wasi-cli-environment.d.ts b/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/wasi-cli-environment.d.ts new file mode 100644 index 0000000..d2798ab --- /dev/null +++ b/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/wasi-cli-environment.d.ts @@ -0,0 +1,3 @@ +export namespace WasiCliEnvironment { + export function getEnvironment(): Array<[string, string]>; +} diff --git a/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/wasi-cli-exit.d.ts b/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/wasi-cli-exit.d.ts new file mode 100644 index 0000000..9833aa4 --- /dev/null +++ b/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/wasi-cli-exit.d.ts @@ -0,0 +1,4 @@ +export namespace WasiCliExit { + export function exit(status: Result): void; +} +export type Result = { tag: 'ok', val: T } | { tag: 'err', val: E }; diff --git a/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/wasi-cli-stderr.d.ts b/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/wasi-cli-stderr.d.ts new file mode 100644 index 0000000..8b2c03a --- /dev/null +++ b/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/wasi-cli-stderr.d.ts @@ -0,0 +1,5 @@ +export namespace WasiCliStderr { + export function getStderr(): OutputStream; +} +import type { OutputStream } from './wasi-io-streams.js'; +export { OutputStream }; diff --git a/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/wasi-cli-stdin.d.ts b/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/wasi-cli-stdin.d.ts new file mode 100644 index 0000000..4da24cd --- /dev/null +++ b/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/wasi-cli-stdin.d.ts @@ -0,0 +1,5 @@ +export namespace WasiCliStdin { + export function getStdin(): InputStream; +} +import type { InputStream } from './wasi-io-streams.js'; +export { InputStream }; diff --git a/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/wasi-cli-stdout.d.ts b/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/wasi-cli-stdout.d.ts new file mode 100644 index 0000000..17aa5a7 --- /dev/null +++ b/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/wasi-cli-stdout.d.ts @@ -0,0 +1,5 @@ +export namespace WasiCliStdout { + export function getStdout(): OutputStream; +} +import type { OutputStream } from './wasi-io-streams.js'; +export { OutputStream }; diff --git a/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/wasi-cli-terminal-input.d.ts b/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/wasi-cli-terminal-input.d.ts new file mode 100644 index 0000000..3944c2e --- /dev/null +++ b/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/wasi-cli-terminal-input.d.ts @@ -0,0 +1,6 @@ +export namespace WasiCliTerminalInput { + export { TerminalInput }; +} + +export class TerminalInput { +} diff --git a/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/wasi-cli-terminal-output.d.ts b/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/wasi-cli-terminal-output.d.ts new file mode 100644 index 0000000..cb1055f --- /dev/null +++ b/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/wasi-cli-terminal-output.d.ts @@ -0,0 +1,6 @@ +export namespace WasiCliTerminalOutput { + export { TerminalOutput }; +} + +export class TerminalOutput { +} diff --git a/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/wasi-cli-terminal-stderr.d.ts b/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/wasi-cli-terminal-stderr.d.ts new file mode 100644 index 0000000..df6c1e2 --- /dev/null +++ b/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/wasi-cli-terminal-stderr.d.ts @@ -0,0 +1,5 @@ +export namespace WasiCliTerminalStderr { + export function getTerminalStderr(): TerminalOutput | undefined; +} +import type { TerminalOutput } from './wasi-cli-terminal-output.js'; +export { TerminalOutput }; diff --git a/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/wasi-cli-terminal-stdin.d.ts b/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/wasi-cli-terminal-stdin.d.ts new file mode 100644 index 0000000..0dcbbe9 --- /dev/null +++ b/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/wasi-cli-terminal-stdin.d.ts @@ -0,0 +1,5 @@ +export namespace WasiCliTerminalStdin { + export function getTerminalStdin(): TerminalInput | undefined; +} +import type { TerminalInput } from './wasi-cli-terminal-input.js'; +export { TerminalInput }; diff --git a/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/wasi-cli-terminal-stdout.d.ts b/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/wasi-cli-terminal-stdout.d.ts new file mode 100644 index 0000000..c0d6058 --- /dev/null +++ b/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/wasi-cli-terminal-stdout.d.ts @@ -0,0 +1,5 @@ +export namespace WasiCliTerminalStdout { + export function getTerminalStdout(): TerminalOutput | undefined; +} +import type { TerminalOutput } from './wasi-cli-terminal-output.js'; +export { TerminalOutput }; diff --git a/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/wasi-clocks-monotonic-clock.d.ts b/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/wasi-clocks-monotonic-clock.d.ts new file mode 100644 index 0000000..3b148d0 --- /dev/null +++ b/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/wasi-clocks-monotonic-clock.d.ts @@ -0,0 +1,4 @@ +export namespace WasiClocksMonotonicClock { + export function now(): Instant; +} +export type Instant = bigint; diff --git a/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/wasi-clocks-wall-clock.d.ts b/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/wasi-clocks-wall-clock.d.ts new file mode 100644 index 0000000..37a41e4 --- /dev/null +++ b/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/wasi-clocks-wall-clock.d.ts @@ -0,0 +1,7 @@ +export namespace WasiClocksWallClock { + export function now(): Datetime; +} +export interface Datetime { + seconds: bigint, + nanoseconds: number, +} diff --git a/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/wasi-filesystem-preopens.d.ts b/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/wasi-filesystem-preopens.d.ts new file mode 100644 index 0000000..b225c10 --- /dev/null +++ b/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/wasi-filesystem-preopens.d.ts @@ -0,0 +1,5 @@ +export namespace WasiFilesystemPreopens { + export function getDirectories(): Array<[Descriptor, string]>; +} +import type { Descriptor } from './wasi-filesystem-types.js'; +export { Descriptor }; diff --git a/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/wasi-filesystem-types.d.ts b/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/wasi-filesystem-types.d.ts new file mode 100644 index 0000000..1022851 --- /dev/null +++ b/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/wasi-filesystem-types.d.ts @@ -0,0 +1,141 @@ +export namespace WasiFilesystemTypes { + export { Descriptor }; + export function filesystemErrorCode(err: Error): ErrorCode | undefined; + export { DirectoryEntryStream }; +} +export type Filesize = bigint; +import type { InputStream } from './wasi-io-streams.js'; +export { InputStream }; +/** + * # Variants + * + * ## `"access"` + * + * ## `"would-block"` + * + * ## `"already"` + * + * ## `"bad-descriptor"` + * + * ## `"busy"` + * + * ## `"deadlock"` + * + * ## `"quota"` + * + * ## `"exist"` + * + * ## `"file-too-large"` + * + * ## `"illegal-byte-sequence"` + * + * ## `"in-progress"` + * + * ## `"interrupted"` + * + * ## `"invalid"` + * + * ## `"io"` + * + * ## `"is-directory"` + * + * ## `"loop"` + * + * ## `"too-many-links"` + * + * ## `"message-size"` + * + * ## `"name-too-long"` + * + * ## `"no-device"` + * + * ## `"no-entry"` + * + * ## `"no-lock"` + * + * ## `"insufficient-memory"` + * + * ## `"insufficient-space"` + * + * ## `"not-directory"` + * + * ## `"not-empty"` + * + * ## `"not-recoverable"` + * + * ## `"unsupported"` + * + * ## `"no-tty"` + * + * ## `"no-such-device"` + * + * ## `"overflow"` + * + * ## `"not-permitted"` + * + * ## `"pipe"` + * + * ## `"read-only"` + * + * ## `"invalid-seek"` + * + * ## `"text-file-busy"` + * + * ## `"cross-device"` + */ +export type ErrorCode = 'access' | 'would-block' | 'already' | 'bad-descriptor' | 'busy' | 'deadlock' | 'quota' | 'exist' | 'file-too-large' | 'illegal-byte-sequence' | 'in-progress' | 'interrupted' | 'invalid' | 'io' | 'is-directory' | 'loop' | 'too-many-links' | 'message-size' | 'name-too-long' | 'no-device' | 'no-entry' | 'no-lock' | 'insufficient-memory' | 'insufficient-space' | 'not-directory' | 'not-empty' | 'not-recoverable' | 'unsupported' | 'no-tty' | 'no-such-device' | 'overflow' | 'not-permitted' | 'pipe' | 'read-only' | 'invalid-seek' | 'text-file-busy' | 'cross-device'; +import type { OutputStream } from './wasi-io-streams.js'; +export { OutputStream }; +export interface DescriptorFlags { + read?: boolean, + write?: boolean, + fileIntegritySync?: boolean, + dataIntegritySync?: boolean, + requestedWriteSync?: boolean, + mutateDirectory?: boolean, +} +/** + * # Variants + * + * ## `"unknown"` + * + * ## `"block-device"` + * + * ## `"character-device"` + * + * ## `"directory"` + * + * ## `"fifo"` + * + * ## `"symbolic-link"` + * + * ## `"regular-file"` + * + * ## `"socket"` + */ +export type DescriptorType = 'unknown' | 'block-device' | 'character-device' | 'directory' | 'fifo' | 'symbolic-link' | 'regular-file' | 'socket'; +export type LinkCount = bigint; +import type { Datetime } from './wasi-clocks-wall-clock.js'; +export { Datetime }; +export interface DescriptorStat { + type: DescriptorType, + linkCount: LinkCount, + size: Filesize, + dataAccessTimestamp?: Datetime, + dataModificationTimestamp?: Datetime, + statusChangeTimestamp?: Datetime, +} +import type { Error } from './wasi-io-streams.js'; +export { Error }; + +export class Descriptor { + readViaStream(offset: Filesize): InputStream; + writeViaStream(offset: Filesize): OutputStream; + appendViaStream(): OutputStream; + getFlags(): DescriptorFlags; + getType(): DescriptorType; + stat(): DescriptorStat; +} + +export class DirectoryEntryStream { +} diff --git a/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/wasi-io-error.d.ts b/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/wasi-io-error.d.ts new file mode 100644 index 0000000..9989ca4 --- /dev/null +++ b/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/wasi-io-error.d.ts @@ -0,0 +1,6 @@ +export namespace WasiIoError { + export { Error }; +} + +export class Error { +} diff --git a/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/wasi-io-streams.d.ts b/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/wasi-io-streams.d.ts new file mode 100644 index 0000000..77f27e9 --- /dev/null +++ b/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/wasi-io-streams.d.ts @@ -0,0 +1,26 @@ +export namespace WasiIoStreams { + export { InputStream }; + export { OutputStream }; +} +import type { Error } from './wasi-io-error.js'; +export { Error }; +export type StreamError = StreamErrorLastOperationFailed | StreamErrorClosed; +export interface StreamErrorLastOperationFailed { + tag: 'last-operation-failed', + val: Error, +} +export interface StreamErrorClosed { + tag: 'closed', +} + +export class InputStream { + read(len: bigint): Uint8Array; + blockingRead(len: bigint): Uint8Array; +} + +export class OutputStream { + checkWrite(): bigint; + write(contents: Uint8Array): void; + blockingWriteAndFlush(contents: Uint8Array): void; + blockingFlush(): void; +} diff --git a/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/wasi-random-random.d.ts b/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/wasi-random-random.d.ts new file mode 100644 index 0000000..bf7c09a --- /dev/null +++ b/demo/dist/@bsull/augurs-prophet-wasmstan/interfaces/wasi-random-random.d.ts @@ -0,0 +1,3 @@ +export namespace WasiRandomRandom { + export function getRandomBytes(len: bigint): Uint8Array; +} diff --git a/demo/dist/@bsull/augurs-prophet-wasmstan/package.json b/demo/dist/@bsull/augurs-prophet-wasmstan/package.json new file mode 100644 index 0000000..826d7fd --- /dev/null +++ b/demo/dist/@bsull/augurs-prophet-wasmstan/package.json @@ -0,0 +1,40 @@ +{ + "name": "@bsull/augurs-prophet-wasmstan", + "type": "module", + "collaborators": [ + "Ben Sully " + ], + "description": "Prophet's Stan model, compiled to WASM, for use with the @bsull/augurs library.", + "version": "0.2.0", + "license": "(MIT OR Apache-2.0)", + "repository": { + "type": "git", + "url": "git+https://github.com/grafana/augurs.git" + }, + "readme": "README.md", + "files": [ + "interfaces/*", + "prophet-wasmstan.core*.wasm", + "prophet-wasmstan.d.ts", + "prophet-wasmstan.js", + "README.md" + ], + "main": "prophet-wasmstan.js", + "types": "prophet-wasmstan.d.ts", + "keywords": [ + "augurs", + "forecasting", + "prophet", + "stan" + ], + "dependencies": { + "@bytecodealliance/preview2-shim": "^0.17.0" + }, + "devDependencies": { + "vitest": "^2.1.3" + }, + "scripts": { + "test": "vitest", + "test:ci": "vitest run" + } +} diff --git a/demo/dist/@bsull/augurs-prophet-wasmstan/prophet-wasmstan.core.wasm b/demo/dist/@bsull/augurs-prophet-wasmstan/prophet-wasmstan.core.wasm new file mode 100644 index 0000000..977ba73 Binary files /dev/null and b/demo/dist/@bsull/augurs-prophet-wasmstan/prophet-wasmstan.core.wasm differ diff --git a/demo/dist/@bsull/augurs-prophet-wasmstan/prophet-wasmstan.core2.wasm b/demo/dist/@bsull/augurs-prophet-wasmstan/prophet-wasmstan.core2.wasm new file mode 100644 index 0000000..2ec1e3e Binary files /dev/null and b/demo/dist/@bsull/augurs-prophet-wasmstan/prophet-wasmstan.core2.wasm differ diff --git a/demo/dist/@bsull/augurs-prophet-wasmstan/prophet-wasmstan.d.ts b/demo/dist/@bsull/augurs-prophet-wasmstan/prophet-wasmstan.d.ts new file mode 100644 index 0000000..7e77229 --- /dev/null +++ b/demo/dist/@bsull/augurs-prophet-wasmstan/prophet-wasmstan.d.ts @@ -0,0 +1,3 @@ +declare const AugursProphetWasmstanTypes: {}; +import { AugursProphetWasmstanOptimizer } from './interfaces/augurs-prophet-wasmstan-optimizer.js'; +export const optimizer: typeof AugursProphetWasmstanOptimizer; diff --git a/demo/dist/@bsull/augurs-prophet-wasmstan/prophet-wasmstan.js b/demo/dist/@bsull/augurs-prophet-wasmstan/prophet-wasmstan.js new file mode 100644 index 0000000..8d0f1c1 --- /dev/null +++ b/demo/dist/@bsull/augurs-prophet-wasmstan/prophet-wasmstan.js @@ -0,0 +1,2760 @@ +import { environment, exit as exit$1, stderr, stdin, stdout, terminalInput, terminalOutput, terminalStderr, terminalStdin, terminalStdout } from '@bytecodealliance/preview2-shim/cli'; +import { monotonicClock, wallClock } from '@bytecodealliance/preview2-shim/clocks'; +import { preopens, types } from '@bytecodealliance/preview2-shim/filesystem'; +import { error, streams } from '@bytecodealliance/preview2-shim/io'; +import { random } from '@bytecodealliance/preview2-shim/random'; +const { getEnvironment } = environment; +const { exit } = exit$1; +const { getStderr } = stderr; +const { getStdin } = stdin; +const { getStdout } = stdout; +const { TerminalInput } = terminalInput; +const { TerminalOutput } = terminalOutput; +const { getTerminalStderr } = terminalStderr; +const { getTerminalStdin } = terminalStdin; +const { getTerminalStdout } = terminalStdout; +const { now } = monotonicClock; +const { now: now$1 } = wallClock; +const { getDirectories } = preopens; +const { Descriptor, + filesystemErrorCode } = types; +const { Error: Error$1 } = error; +const { InputStream, + OutputStream } = streams; +const { getRandomBytes } = random; + +const base64Compile = str => WebAssembly.compile(typeof Buffer !== 'undefined' ? Buffer.from(str, 'base64') : Uint8Array.from(atob(str), b => b.charCodeAt(0))); + +class ComponentError extends Error { + constructor (value) { + const enumerable = typeof value !== 'string'; + super(enumerable ? `${String(value)} (see error.payload)` : value); + Object.defineProperty(this, 'payload', { value, enumerable }); + } +} + +let curResourceBorrows = []; + +let dv = new DataView(new ArrayBuffer()); +const dataView = mem => dv.buffer === mem.buffer ? dv : dv = new DataView(mem.buffer); + +const isNode = typeof process !== 'undefined' && process.versions && process.versions.node; +let _fs; +async function fetchCompile (url) { + if (isNode) { + _fs = _fs || await import('fs/promises'); + return WebAssembly.compile(await _fs.readFile(url)); + } + return fetch(url).then(WebAssembly.compileStreaming); +} + +function getErrorPayload(e) { + if (e && hasOwnProperty.call(e, 'payload')) return e.payload; + if (e instanceof Error) throw e; + return e; +} + +const handleTables = []; + +const hasOwnProperty = Object.prototype.hasOwnProperty; + +const instantiateCore = WebAssembly.instantiate; + +const T_FLAG = 1 << 30; + +function rscTableCreateOwn (table, rep) { + const free = table[0] & ~T_FLAG; + if (free === 0) { + table.push(0); + table.push(rep | T_FLAG); + return (table.length >> 1) - 1; + } + table[0] = table[free << 1]; + table[free << 1] = 0; + table[(free << 1) + 1] = rep | T_FLAG; + return free; +} + +function rscTableRemove (table, handle) { + const scope = table[handle << 1]; + const val = table[(handle << 1) + 1]; + const own = (val & T_FLAG) !== 0; + const rep = val & ~T_FLAG; + if (val === 0 || (scope & T_FLAG) !== 0) throw new TypeError('Invalid handle'); + table[handle << 1] = table[0] | T_FLAG; + table[0] = handle | T_FLAG; + return { rep, scope, own }; +} + +const symbolCabiDispose = Symbol.for('cabiDispose'); + +const symbolRscHandle = Symbol('handle'); + +const symbolRscRep = Symbol.for('cabiRep'); + +const symbolDispose = Symbol.dispose || Symbol.for('dispose'); + +const toUint64 = val => BigInt.asUintN(64, BigInt(val)); + +function toUint32(val) { + return val >>> 0; +} + +const utf8Decoder = new TextDecoder(); + +const utf8Encoder = new TextEncoder(); + +let utf8EncodedLen = 0; +function utf8Encode(s, realloc, memory) { + if (typeof s !== 'string') throw new TypeError('expected a string'); + if (s.length === 0) { + utf8EncodedLen = 0; + return 1; + } + let buf = utf8Encoder.encode(s); + let ptr = realloc(0, 0, 1, buf.length); + new Uint8Array(memory.buffer).set(buf, ptr); + utf8EncodedLen = buf.length; + return ptr; +} + + +let exports0; +let exports1; + +function trampoline0() { + const ret = now(); + return toUint64(ret); +} +const handleTable2 = [T_FLAG, 0]; +const captureTable2= new Map(); +let captureCnt2 = 0; +handleTables[2] = handleTable2; + +function trampoline8() { + const ret = getStderr(); + if (!(ret instanceof OutputStream)) { + throw new TypeError('Resource error: Not a valid "OutputStream" resource.'); + } + var handle0 = ret[symbolRscHandle]; + if (!handle0) { + const rep = ret[symbolRscRep] || ++captureCnt2; + captureTable2.set(rep, ret); + handle0 = rscTableCreateOwn(handleTable2, rep); + } + return handle0; +} + +function trampoline9(arg0) { + let variant0; + switch (arg0) { + case 0: { + variant0= { + tag: 'ok', + val: undefined + }; + break; + } + case 1: { + variant0= { + tag: 'err', + val: undefined + }; + break; + } + default: { + throw new TypeError('invalid variant discriminant for expected'); + } + } + exit(variant0); +} +const handleTable1 = [T_FLAG, 0]; +const captureTable1= new Map(); +let captureCnt1 = 0; +handleTables[1] = handleTable1; + +function trampoline10() { + const ret = getStdin(); + if (!(ret instanceof InputStream)) { + throw new TypeError('Resource error: Not a valid "InputStream" resource.'); + } + var handle0 = ret[symbolRscHandle]; + if (!handle0) { + const rep = ret[symbolRscRep] || ++captureCnt1; + captureTable1.set(rep, ret); + handle0 = rscTableCreateOwn(handleTable1, rep); + } + return handle0; +} + +function trampoline11() { + const ret = getStdout(); + if (!(ret instanceof OutputStream)) { + throw new TypeError('Resource error: Not a valid "OutputStream" resource.'); + } + var handle0 = ret[symbolRscHandle]; + if (!handle0) { + const rep = ret[symbolRscRep] || ++captureCnt2; + captureTable2.set(rep, ret); + handle0 = rscTableCreateOwn(handleTable2, rep); + } + return handle0; +} +let exports2; +let memory0; +let realloc0; +const handleTable5 = [T_FLAG, 0]; +const captureTable5= new Map(); +let captureCnt5 = 0; +handleTables[5] = handleTable5; + +function trampoline12(arg0) { + const ret = getDirectories(); + var vec3 = ret; + var len3 = vec3.length; + var result3 = realloc0(0, 0, 4, len3 * 12); + for (let i = 0; i < vec3.length; i++) { + const e = vec3[i]; + const base = result3 + i * 12;var [tuple0_0, tuple0_1] = e; + if (!(tuple0_0 instanceof Descriptor)) { + throw new TypeError('Resource error: Not a valid "Descriptor" resource.'); + } + var handle1 = tuple0_0[symbolRscHandle]; + if (!handle1) { + const rep = tuple0_0[symbolRscRep] || ++captureCnt5; + captureTable5.set(rep, tuple0_0); + handle1 = rscTableCreateOwn(handleTable5, rep); + } + dataView(memory0).setInt32(base + 0, handle1, true); + var ptr2 = utf8Encode(tuple0_1, realloc0, memory0); + var len2 = utf8EncodedLen; + dataView(memory0).setInt32(base + 8, len2, true); + dataView(memory0).setInt32(base + 4, ptr2, true); + } + dataView(memory0).setInt32(arg0 + 4, len3, true); + dataView(memory0).setInt32(arg0 + 0, result3, true); +} + +function trampoline13(arg0) { + const ret = now$1(); + var {seconds: v0_0, nanoseconds: v0_1 } = ret; + dataView(memory0).setBigInt64(arg0 + 0, toUint64(v0_0), true); + dataView(memory0).setInt32(arg0 + 8, toUint32(v0_1), true); +} + +function trampoline14(arg0, arg1) { + var handle1 = arg0; + var rep2 = handleTable5[(handle1 << 1) + 1] & ~T_FLAG; + var rsc0 = captureTable5.get(rep2); + if (!rsc0) { + rsc0 = Object.create(Descriptor.prototype); + Object.defineProperty(rsc0, symbolRscHandle, { writable: true, value: handle1}); + Object.defineProperty(rsc0, symbolRscRep, { writable: true, value: rep2}); + } + curResourceBorrows.push(rsc0); + let ret; + try { + ret = { tag: 'ok', val: rsc0.getType()}; + } catch (e) { + ret = { tag: 'err', val: getErrorPayload(e) }; + } + for (const rsc of curResourceBorrows) { + rsc[symbolRscHandle] = null; + } + curResourceBorrows = []; + var variant5 = ret; + switch (variant5.tag) { + case 'ok': { + const e = variant5.val; + dataView(memory0).setInt8(arg1 + 0, 0, true); + var val3 = e; + let enum3; + switch (val3) { + case 'unknown': { + enum3 = 0; + break; + } + case 'block-device': { + enum3 = 1; + break; + } + case 'character-device': { + enum3 = 2; + break; + } + case 'directory': { + enum3 = 3; + break; + } + case 'fifo': { + enum3 = 4; + break; + } + case 'symbolic-link': { + enum3 = 5; + break; + } + case 'regular-file': { + enum3 = 6; + break; + } + case 'socket': { + enum3 = 7; + break; + } + default: { + if ((e) instanceof Error) { + console.error(e); + } + + throw new TypeError(`"${val3}" is not one of the cases of descriptor-type`); + } + } + dataView(memory0).setInt8(arg1 + 1, enum3, true); + break; + } + case 'err': { + const e = variant5.val; + dataView(memory0).setInt8(arg1 + 0, 1, true); + var val4 = e; + let enum4; + switch (val4) { + case 'access': { + enum4 = 0; + break; + } + case 'would-block': { + enum4 = 1; + break; + } + case 'already': { + enum4 = 2; + break; + } + case 'bad-descriptor': { + enum4 = 3; + break; + } + case 'busy': { + enum4 = 4; + break; + } + case 'deadlock': { + enum4 = 5; + break; + } + case 'quota': { + enum4 = 6; + break; + } + case 'exist': { + enum4 = 7; + break; + } + case 'file-too-large': { + enum4 = 8; + break; + } + case 'illegal-byte-sequence': { + enum4 = 9; + break; + } + case 'in-progress': { + enum4 = 10; + break; + } + case 'interrupted': { + enum4 = 11; + break; + } + case 'invalid': { + enum4 = 12; + break; + } + case 'io': { + enum4 = 13; + break; + } + case 'is-directory': { + enum4 = 14; + break; + } + case 'loop': { + enum4 = 15; + break; + } + case 'too-many-links': { + enum4 = 16; + break; + } + case 'message-size': { + enum4 = 17; + break; + } + case 'name-too-long': { + enum4 = 18; + break; + } + case 'no-device': { + enum4 = 19; + break; + } + case 'no-entry': { + enum4 = 20; + break; + } + case 'no-lock': { + enum4 = 21; + break; + } + case 'insufficient-memory': { + enum4 = 22; + break; + } + case 'insufficient-space': { + enum4 = 23; + break; + } + case 'not-directory': { + enum4 = 24; + break; + } + case 'not-empty': { + enum4 = 25; + break; + } + case 'not-recoverable': { + enum4 = 26; + break; + } + case 'unsupported': { + enum4 = 27; + break; + } + case 'no-tty': { + enum4 = 28; + break; + } + case 'no-such-device': { + enum4 = 29; + break; + } + case 'overflow': { + enum4 = 30; + break; + } + case 'not-permitted': { + enum4 = 31; + break; + } + case 'pipe': { + enum4 = 32; + break; + } + case 'read-only': { + enum4 = 33; + break; + } + case 'invalid-seek': { + enum4 = 34; + break; + } + case 'text-file-busy': { + enum4 = 35; + break; + } + case 'cross-device': { + enum4 = 36; + break; + } + default: { + if ((e) instanceof Error) { + console.error(e); + } + + throw new TypeError(`"${val4}" is not one of the cases of error-code`); + } + } + dataView(memory0).setInt8(arg1 + 1, enum4, true); + break; + } + default: { + throw new TypeError('invalid variant specified for result'); + } + } +} +const handleTable0 = [T_FLAG, 0]; +const captureTable0= new Map(); +let captureCnt0 = 0; +handleTables[0] = handleTable0; + +function trampoline15(arg0, arg1) { + var handle1 = arg0; + var rep2 = handleTable0[(handle1 << 1) + 1] & ~T_FLAG; + var rsc0 = captureTable0.get(rep2); + if (!rsc0) { + rsc0 = Object.create(Error$1.prototype); + Object.defineProperty(rsc0, symbolRscHandle, { writable: true, value: handle1}); + Object.defineProperty(rsc0, symbolRscRep, { writable: true, value: rep2}); + } + curResourceBorrows.push(rsc0); + const ret = filesystemErrorCode(rsc0); + for (const rsc of curResourceBorrows) { + rsc[symbolRscHandle] = null; + } + curResourceBorrows = []; + var variant4 = ret; + if (variant4 === null || variant4=== undefined) { + dataView(memory0).setInt8(arg1 + 0, 0, true); + } else { + const e = variant4; + dataView(memory0).setInt8(arg1 + 0, 1, true); + var val3 = e; + let enum3; + switch (val3) { + case 'access': { + enum3 = 0; + break; + } + case 'would-block': { + enum3 = 1; + break; + } + case 'already': { + enum3 = 2; + break; + } + case 'bad-descriptor': { + enum3 = 3; + break; + } + case 'busy': { + enum3 = 4; + break; + } + case 'deadlock': { + enum3 = 5; + break; + } + case 'quota': { + enum3 = 6; + break; + } + case 'exist': { + enum3 = 7; + break; + } + case 'file-too-large': { + enum3 = 8; + break; + } + case 'illegal-byte-sequence': { + enum3 = 9; + break; + } + case 'in-progress': { + enum3 = 10; + break; + } + case 'interrupted': { + enum3 = 11; + break; + } + case 'invalid': { + enum3 = 12; + break; + } + case 'io': { + enum3 = 13; + break; + } + case 'is-directory': { + enum3 = 14; + break; + } + case 'loop': { + enum3 = 15; + break; + } + case 'too-many-links': { + enum3 = 16; + break; + } + case 'message-size': { + enum3 = 17; + break; + } + case 'name-too-long': { + enum3 = 18; + break; + } + case 'no-device': { + enum3 = 19; + break; + } + case 'no-entry': { + enum3 = 20; + break; + } + case 'no-lock': { + enum3 = 21; + break; + } + case 'insufficient-memory': { + enum3 = 22; + break; + } + case 'insufficient-space': { + enum3 = 23; + break; + } + case 'not-directory': { + enum3 = 24; + break; + } + case 'not-empty': { + enum3 = 25; + break; + } + case 'not-recoverable': { + enum3 = 26; + break; + } + case 'unsupported': { + enum3 = 27; + break; + } + case 'no-tty': { + enum3 = 28; + break; + } + case 'no-such-device': { + enum3 = 29; + break; + } + case 'overflow': { + enum3 = 30; + break; + } + case 'not-permitted': { + enum3 = 31; + break; + } + case 'pipe': { + enum3 = 32; + break; + } + case 'read-only': { + enum3 = 33; + break; + } + case 'invalid-seek': { + enum3 = 34; + break; + } + case 'text-file-busy': { + enum3 = 35; + break; + } + case 'cross-device': { + enum3 = 36; + break; + } + default: { + if ((e) instanceof Error) { + console.error(e); + } + + throw new TypeError(`"${val3}" is not one of the cases of error-code`); + } + } + dataView(memory0).setInt8(arg1 + 1, enum3, true); + } +} + +function trampoline16(arg0, arg1, arg2) { + var handle1 = arg0; + var rep2 = handleTable5[(handle1 << 1) + 1] & ~T_FLAG; + var rsc0 = captureTable5.get(rep2); + if (!rsc0) { + rsc0 = Object.create(Descriptor.prototype); + Object.defineProperty(rsc0, symbolRscHandle, { writable: true, value: handle1}); + Object.defineProperty(rsc0, symbolRscRep, { writable: true, value: rep2}); + } + curResourceBorrows.push(rsc0); + let ret; + try { + ret = { tag: 'ok', val: rsc0.readViaStream(BigInt.asUintN(64, arg1))}; + } catch (e) { + ret = { tag: 'err', val: getErrorPayload(e) }; + } + for (const rsc of curResourceBorrows) { + rsc[symbolRscHandle] = null; + } + curResourceBorrows = []; + var variant5 = ret; + switch (variant5.tag) { + case 'ok': { + const e = variant5.val; + dataView(memory0).setInt8(arg2 + 0, 0, true); + if (!(e instanceof InputStream)) { + throw new TypeError('Resource error: Not a valid "InputStream" resource.'); + } + var handle3 = e[symbolRscHandle]; + if (!handle3) { + const rep = e[symbolRscRep] || ++captureCnt1; + captureTable1.set(rep, e); + handle3 = rscTableCreateOwn(handleTable1, rep); + } + dataView(memory0).setInt32(arg2 + 4, handle3, true); + break; + } + case 'err': { + const e = variant5.val; + dataView(memory0).setInt8(arg2 + 0, 1, true); + var val4 = e; + let enum4; + switch (val4) { + case 'access': { + enum4 = 0; + break; + } + case 'would-block': { + enum4 = 1; + break; + } + case 'already': { + enum4 = 2; + break; + } + case 'bad-descriptor': { + enum4 = 3; + break; + } + case 'busy': { + enum4 = 4; + break; + } + case 'deadlock': { + enum4 = 5; + break; + } + case 'quota': { + enum4 = 6; + break; + } + case 'exist': { + enum4 = 7; + break; + } + case 'file-too-large': { + enum4 = 8; + break; + } + case 'illegal-byte-sequence': { + enum4 = 9; + break; + } + case 'in-progress': { + enum4 = 10; + break; + } + case 'interrupted': { + enum4 = 11; + break; + } + case 'invalid': { + enum4 = 12; + break; + } + case 'io': { + enum4 = 13; + break; + } + case 'is-directory': { + enum4 = 14; + break; + } + case 'loop': { + enum4 = 15; + break; + } + case 'too-many-links': { + enum4 = 16; + break; + } + case 'message-size': { + enum4 = 17; + break; + } + case 'name-too-long': { + enum4 = 18; + break; + } + case 'no-device': { + enum4 = 19; + break; + } + case 'no-entry': { + enum4 = 20; + break; + } + case 'no-lock': { + enum4 = 21; + break; + } + case 'insufficient-memory': { + enum4 = 22; + break; + } + case 'insufficient-space': { + enum4 = 23; + break; + } + case 'not-directory': { + enum4 = 24; + break; + } + case 'not-empty': { + enum4 = 25; + break; + } + case 'not-recoverable': { + enum4 = 26; + break; + } + case 'unsupported': { + enum4 = 27; + break; + } + case 'no-tty': { + enum4 = 28; + break; + } + case 'no-such-device': { + enum4 = 29; + break; + } + case 'overflow': { + enum4 = 30; + break; + } + case 'not-permitted': { + enum4 = 31; + break; + } + case 'pipe': { + enum4 = 32; + break; + } + case 'read-only': { + enum4 = 33; + break; + } + case 'invalid-seek': { + enum4 = 34; + break; + } + case 'text-file-busy': { + enum4 = 35; + break; + } + case 'cross-device': { + enum4 = 36; + break; + } + default: { + if ((e) instanceof Error) { + console.error(e); + } + + throw new TypeError(`"${val4}" is not one of the cases of error-code`); + } + } + dataView(memory0).setInt8(arg2 + 4, enum4, true); + break; + } + default: { + throw new TypeError('invalid variant specified for result'); + } + } +} + +function trampoline17(arg0, arg1, arg2) { + var handle1 = arg0; + var rep2 = handleTable5[(handle1 << 1) + 1] & ~T_FLAG; + var rsc0 = captureTable5.get(rep2); + if (!rsc0) { + rsc0 = Object.create(Descriptor.prototype); + Object.defineProperty(rsc0, symbolRscHandle, { writable: true, value: handle1}); + Object.defineProperty(rsc0, symbolRscRep, { writable: true, value: rep2}); + } + curResourceBorrows.push(rsc0); + let ret; + try { + ret = { tag: 'ok', val: rsc0.writeViaStream(BigInt.asUintN(64, arg1))}; + } catch (e) { + ret = { tag: 'err', val: getErrorPayload(e) }; + } + for (const rsc of curResourceBorrows) { + rsc[symbolRscHandle] = null; + } + curResourceBorrows = []; + var variant5 = ret; + switch (variant5.tag) { + case 'ok': { + const e = variant5.val; + dataView(memory0).setInt8(arg2 + 0, 0, true); + if (!(e instanceof OutputStream)) { + throw new TypeError('Resource error: Not a valid "OutputStream" resource.'); + } + var handle3 = e[symbolRscHandle]; + if (!handle3) { + const rep = e[symbolRscRep] || ++captureCnt2; + captureTable2.set(rep, e); + handle3 = rscTableCreateOwn(handleTable2, rep); + } + dataView(memory0).setInt32(arg2 + 4, handle3, true); + break; + } + case 'err': { + const e = variant5.val; + dataView(memory0).setInt8(arg2 + 0, 1, true); + var val4 = e; + let enum4; + switch (val4) { + case 'access': { + enum4 = 0; + break; + } + case 'would-block': { + enum4 = 1; + break; + } + case 'already': { + enum4 = 2; + break; + } + case 'bad-descriptor': { + enum4 = 3; + break; + } + case 'busy': { + enum4 = 4; + break; + } + case 'deadlock': { + enum4 = 5; + break; + } + case 'quota': { + enum4 = 6; + break; + } + case 'exist': { + enum4 = 7; + break; + } + case 'file-too-large': { + enum4 = 8; + break; + } + case 'illegal-byte-sequence': { + enum4 = 9; + break; + } + case 'in-progress': { + enum4 = 10; + break; + } + case 'interrupted': { + enum4 = 11; + break; + } + case 'invalid': { + enum4 = 12; + break; + } + case 'io': { + enum4 = 13; + break; + } + case 'is-directory': { + enum4 = 14; + break; + } + case 'loop': { + enum4 = 15; + break; + } + case 'too-many-links': { + enum4 = 16; + break; + } + case 'message-size': { + enum4 = 17; + break; + } + case 'name-too-long': { + enum4 = 18; + break; + } + case 'no-device': { + enum4 = 19; + break; + } + case 'no-entry': { + enum4 = 20; + break; + } + case 'no-lock': { + enum4 = 21; + break; + } + case 'insufficient-memory': { + enum4 = 22; + break; + } + case 'insufficient-space': { + enum4 = 23; + break; + } + case 'not-directory': { + enum4 = 24; + break; + } + case 'not-empty': { + enum4 = 25; + break; + } + case 'not-recoverable': { + enum4 = 26; + break; + } + case 'unsupported': { + enum4 = 27; + break; + } + case 'no-tty': { + enum4 = 28; + break; + } + case 'no-such-device': { + enum4 = 29; + break; + } + case 'overflow': { + enum4 = 30; + break; + } + case 'not-permitted': { + enum4 = 31; + break; + } + case 'pipe': { + enum4 = 32; + break; + } + case 'read-only': { + enum4 = 33; + break; + } + case 'invalid-seek': { + enum4 = 34; + break; + } + case 'text-file-busy': { + enum4 = 35; + break; + } + case 'cross-device': { + enum4 = 36; + break; + } + default: { + if ((e) instanceof Error) { + console.error(e); + } + + throw new TypeError(`"${val4}" is not one of the cases of error-code`); + } + } + dataView(memory0).setInt8(arg2 + 4, enum4, true); + break; + } + default: { + throw new TypeError('invalid variant specified for result'); + } + } +} + +function trampoline18(arg0, arg1) { + var handle1 = arg0; + var rep2 = handleTable5[(handle1 << 1) + 1] & ~T_FLAG; + var rsc0 = captureTable5.get(rep2); + if (!rsc0) { + rsc0 = Object.create(Descriptor.prototype); + Object.defineProperty(rsc0, symbolRscHandle, { writable: true, value: handle1}); + Object.defineProperty(rsc0, symbolRscRep, { writable: true, value: rep2}); + } + curResourceBorrows.push(rsc0); + let ret; + try { + ret = { tag: 'ok', val: rsc0.appendViaStream()}; + } catch (e) { + ret = { tag: 'err', val: getErrorPayload(e) }; + } + for (const rsc of curResourceBorrows) { + rsc[symbolRscHandle] = null; + } + curResourceBorrows = []; + var variant5 = ret; + switch (variant5.tag) { + case 'ok': { + const e = variant5.val; + dataView(memory0).setInt8(arg1 + 0, 0, true); + if (!(e instanceof OutputStream)) { + throw new TypeError('Resource error: Not a valid "OutputStream" resource.'); + } + var handle3 = e[symbolRscHandle]; + if (!handle3) { + const rep = e[symbolRscRep] || ++captureCnt2; + captureTable2.set(rep, e); + handle3 = rscTableCreateOwn(handleTable2, rep); + } + dataView(memory0).setInt32(arg1 + 4, handle3, true); + break; + } + case 'err': { + const e = variant5.val; + dataView(memory0).setInt8(arg1 + 0, 1, true); + var val4 = e; + let enum4; + switch (val4) { + case 'access': { + enum4 = 0; + break; + } + case 'would-block': { + enum4 = 1; + break; + } + case 'already': { + enum4 = 2; + break; + } + case 'bad-descriptor': { + enum4 = 3; + break; + } + case 'busy': { + enum4 = 4; + break; + } + case 'deadlock': { + enum4 = 5; + break; + } + case 'quota': { + enum4 = 6; + break; + } + case 'exist': { + enum4 = 7; + break; + } + case 'file-too-large': { + enum4 = 8; + break; + } + case 'illegal-byte-sequence': { + enum4 = 9; + break; + } + case 'in-progress': { + enum4 = 10; + break; + } + case 'interrupted': { + enum4 = 11; + break; + } + case 'invalid': { + enum4 = 12; + break; + } + case 'io': { + enum4 = 13; + break; + } + case 'is-directory': { + enum4 = 14; + break; + } + case 'loop': { + enum4 = 15; + break; + } + case 'too-many-links': { + enum4 = 16; + break; + } + case 'message-size': { + enum4 = 17; + break; + } + case 'name-too-long': { + enum4 = 18; + break; + } + case 'no-device': { + enum4 = 19; + break; + } + case 'no-entry': { + enum4 = 20; + break; + } + case 'no-lock': { + enum4 = 21; + break; + } + case 'insufficient-memory': { + enum4 = 22; + break; + } + case 'insufficient-space': { + enum4 = 23; + break; + } + case 'not-directory': { + enum4 = 24; + break; + } + case 'not-empty': { + enum4 = 25; + break; + } + case 'not-recoverable': { + enum4 = 26; + break; + } + case 'unsupported': { + enum4 = 27; + break; + } + case 'no-tty': { + enum4 = 28; + break; + } + case 'no-such-device': { + enum4 = 29; + break; + } + case 'overflow': { + enum4 = 30; + break; + } + case 'not-permitted': { + enum4 = 31; + break; + } + case 'pipe': { + enum4 = 32; + break; + } + case 'read-only': { + enum4 = 33; + break; + } + case 'invalid-seek': { + enum4 = 34; + break; + } + case 'text-file-busy': { + enum4 = 35; + break; + } + case 'cross-device': { + enum4 = 36; + break; + } + default: { + if ((e) instanceof Error) { + console.error(e); + } + + throw new TypeError(`"${val4}" is not one of the cases of error-code`); + } + } + dataView(memory0).setInt8(arg1 + 4, enum4, true); + break; + } + default: { + throw new TypeError('invalid variant specified for result'); + } + } +} + +function trampoline19(arg0, arg1) { + var handle1 = arg0; + var rep2 = handleTable5[(handle1 << 1) + 1] & ~T_FLAG; + var rsc0 = captureTable5.get(rep2); + if (!rsc0) { + rsc0 = Object.create(Descriptor.prototype); + Object.defineProperty(rsc0, symbolRscHandle, { writable: true, value: handle1}); + Object.defineProperty(rsc0, symbolRscRep, { writable: true, value: rep2}); + } + curResourceBorrows.push(rsc0); + let ret; + try { + ret = { tag: 'ok', val: rsc0.getFlags()}; + } catch (e) { + ret = { tag: 'err', val: getErrorPayload(e) }; + } + for (const rsc of curResourceBorrows) { + rsc[symbolRscHandle] = null; + } + curResourceBorrows = []; + var variant5 = ret; + switch (variant5.tag) { + case 'ok': { + const e = variant5.val; + dataView(memory0).setInt8(arg1 + 0, 0, true); + let flags3 = 0; + if (typeof e === 'object' && e !== null) { + flags3 = Boolean(e.read) << 0 | Boolean(e.write) << 1 | Boolean(e.fileIntegritySync) << 2 | Boolean(e.dataIntegritySync) << 3 | Boolean(e.requestedWriteSync) << 4 | Boolean(e.mutateDirectory) << 5; + } else if (e !== null && e!== undefined) { + throw new TypeError('only an object, undefined or null can be converted to flags'); + } + dataView(memory0).setInt8(arg1 + 1, flags3, true); + break; + } + case 'err': { + const e = variant5.val; + dataView(memory0).setInt8(arg1 + 0, 1, true); + var val4 = e; + let enum4; + switch (val4) { + case 'access': { + enum4 = 0; + break; + } + case 'would-block': { + enum4 = 1; + break; + } + case 'already': { + enum4 = 2; + break; + } + case 'bad-descriptor': { + enum4 = 3; + break; + } + case 'busy': { + enum4 = 4; + break; + } + case 'deadlock': { + enum4 = 5; + break; + } + case 'quota': { + enum4 = 6; + break; + } + case 'exist': { + enum4 = 7; + break; + } + case 'file-too-large': { + enum4 = 8; + break; + } + case 'illegal-byte-sequence': { + enum4 = 9; + break; + } + case 'in-progress': { + enum4 = 10; + break; + } + case 'interrupted': { + enum4 = 11; + break; + } + case 'invalid': { + enum4 = 12; + break; + } + case 'io': { + enum4 = 13; + break; + } + case 'is-directory': { + enum4 = 14; + break; + } + case 'loop': { + enum4 = 15; + break; + } + case 'too-many-links': { + enum4 = 16; + break; + } + case 'message-size': { + enum4 = 17; + break; + } + case 'name-too-long': { + enum4 = 18; + break; + } + case 'no-device': { + enum4 = 19; + break; + } + case 'no-entry': { + enum4 = 20; + break; + } + case 'no-lock': { + enum4 = 21; + break; + } + case 'insufficient-memory': { + enum4 = 22; + break; + } + case 'insufficient-space': { + enum4 = 23; + break; + } + case 'not-directory': { + enum4 = 24; + break; + } + case 'not-empty': { + enum4 = 25; + break; + } + case 'not-recoverable': { + enum4 = 26; + break; + } + case 'unsupported': { + enum4 = 27; + break; + } + case 'no-tty': { + enum4 = 28; + break; + } + case 'no-such-device': { + enum4 = 29; + break; + } + case 'overflow': { + enum4 = 30; + break; + } + case 'not-permitted': { + enum4 = 31; + break; + } + case 'pipe': { + enum4 = 32; + break; + } + case 'read-only': { + enum4 = 33; + break; + } + case 'invalid-seek': { + enum4 = 34; + break; + } + case 'text-file-busy': { + enum4 = 35; + break; + } + case 'cross-device': { + enum4 = 36; + break; + } + default: { + if ((e) instanceof Error) { + console.error(e); + } + + throw new TypeError(`"${val4}" is not one of the cases of error-code`); + } + } + dataView(memory0).setInt8(arg1 + 1, enum4, true); + break; + } + default: { + throw new TypeError('invalid variant specified for result'); + } + } +} + +function trampoline20(arg0, arg1) { + var handle1 = arg0; + var rep2 = handleTable5[(handle1 << 1) + 1] & ~T_FLAG; + var rsc0 = captureTable5.get(rep2); + if (!rsc0) { + rsc0 = Object.create(Descriptor.prototype); + Object.defineProperty(rsc0, symbolRscHandle, { writable: true, value: handle1}); + Object.defineProperty(rsc0, symbolRscRep, { writable: true, value: rep2}); + } + curResourceBorrows.push(rsc0); + let ret; + try { + ret = { tag: 'ok', val: rsc0.stat()}; + } catch (e) { + ret = { tag: 'err', val: getErrorPayload(e) }; + } + for (const rsc of curResourceBorrows) { + rsc[symbolRscHandle] = null; + } + curResourceBorrows = []; + var variant12 = ret; + switch (variant12.tag) { + case 'ok': { + const e = variant12.val; + dataView(memory0).setInt8(arg1 + 0, 0, true); + var {type: v3_0, linkCount: v3_1, size: v3_2, dataAccessTimestamp: v3_3, dataModificationTimestamp: v3_4, statusChangeTimestamp: v3_5 } = e; + var val4 = v3_0; + let enum4; + switch (val4) { + case 'unknown': { + enum4 = 0; + break; + } + case 'block-device': { + enum4 = 1; + break; + } + case 'character-device': { + enum4 = 2; + break; + } + case 'directory': { + enum4 = 3; + break; + } + case 'fifo': { + enum4 = 4; + break; + } + case 'symbolic-link': { + enum4 = 5; + break; + } + case 'regular-file': { + enum4 = 6; + break; + } + case 'socket': { + enum4 = 7; + break; + } + default: { + if ((v3_0) instanceof Error) { + console.error(v3_0); + } + + throw new TypeError(`"${val4}" is not one of the cases of descriptor-type`); + } + } + dataView(memory0).setInt8(arg1 + 8, enum4, true); + dataView(memory0).setBigInt64(arg1 + 16, toUint64(v3_1), true); + dataView(memory0).setBigInt64(arg1 + 24, toUint64(v3_2), true); + var variant6 = v3_3; + if (variant6 === null || variant6=== undefined) { + dataView(memory0).setInt8(arg1 + 32, 0, true); + } else { + const e = variant6; + dataView(memory0).setInt8(arg1 + 32, 1, true); + var {seconds: v5_0, nanoseconds: v5_1 } = e; + dataView(memory0).setBigInt64(arg1 + 40, toUint64(v5_0), true); + dataView(memory0).setInt32(arg1 + 48, toUint32(v5_1), true); + } + var variant8 = v3_4; + if (variant8 === null || variant8=== undefined) { + dataView(memory0).setInt8(arg1 + 56, 0, true); + } else { + const e = variant8; + dataView(memory0).setInt8(arg1 + 56, 1, true); + var {seconds: v7_0, nanoseconds: v7_1 } = e; + dataView(memory0).setBigInt64(arg1 + 64, toUint64(v7_0), true); + dataView(memory0).setInt32(arg1 + 72, toUint32(v7_1), true); + } + var variant10 = v3_5; + if (variant10 === null || variant10=== undefined) { + dataView(memory0).setInt8(arg1 + 80, 0, true); + } else { + const e = variant10; + dataView(memory0).setInt8(arg1 + 80, 1, true); + var {seconds: v9_0, nanoseconds: v9_1 } = e; + dataView(memory0).setBigInt64(arg1 + 88, toUint64(v9_0), true); + dataView(memory0).setInt32(arg1 + 96, toUint32(v9_1), true); + } + break; + } + case 'err': { + const e = variant12.val; + dataView(memory0).setInt8(arg1 + 0, 1, true); + var val11 = e; + let enum11; + switch (val11) { + case 'access': { + enum11 = 0; + break; + } + case 'would-block': { + enum11 = 1; + break; + } + case 'already': { + enum11 = 2; + break; + } + case 'bad-descriptor': { + enum11 = 3; + break; + } + case 'busy': { + enum11 = 4; + break; + } + case 'deadlock': { + enum11 = 5; + break; + } + case 'quota': { + enum11 = 6; + break; + } + case 'exist': { + enum11 = 7; + break; + } + case 'file-too-large': { + enum11 = 8; + break; + } + case 'illegal-byte-sequence': { + enum11 = 9; + break; + } + case 'in-progress': { + enum11 = 10; + break; + } + case 'interrupted': { + enum11 = 11; + break; + } + case 'invalid': { + enum11 = 12; + break; + } + case 'io': { + enum11 = 13; + break; + } + case 'is-directory': { + enum11 = 14; + break; + } + case 'loop': { + enum11 = 15; + break; + } + case 'too-many-links': { + enum11 = 16; + break; + } + case 'message-size': { + enum11 = 17; + break; + } + case 'name-too-long': { + enum11 = 18; + break; + } + case 'no-device': { + enum11 = 19; + break; + } + case 'no-entry': { + enum11 = 20; + break; + } + case 'no-lock': { + enum11 = 21; + break; + } + case 'insufficient-memory': { + enum11 = 22; + break; + } + case 'insufficient-space': { + enum11 = 23; + break; + } + case 'not-directory': { + enum11 = 24; + break; + } + case 'not-empty': { + enum11 = 25; + break; + } + case 'not-recoverable': { + enum11 = 26; + break; + } + case 'unsupported': { + enum11 = 27; + break; + } + case 'no-tty': { + enum11 = 28; + break; + } + case 'no-such-device': { + enum11 = 29; + break; + } + case 'overflow': { + enum11 = 30; + break; + } + case 'not-permitted': { + enum11 = 31; + break; + } + case 'pipe': { + enum11 = 32; + break; + } + case 'read-only': { + enum11 = 33; + break; + } + case 'invalid-seek': { + enum11 = 34; + break; + } + case 'text-file-busy': { + enum11 = 35; + break; + } + case 'cross-device': { + enum11 = 36; + break; + } + default: { + if ((e) instanceof Error) { + console.error(e); + } + + throw new TypeError(`"${val11}" is not one of the cases of error-code`); + } + } + dataView(memory0).setInt8(arg1 + 8, enum11, true); + break; + } + default: { + throw new TypeError('invalid variant specified for result'); + } + } +} + +function trampoline21(arg0, arg1, arg2) { + var handle1 = arg0; + var rep2 = handleTable1[(handle1 << 1) + 1] & ~T_FLAG; + var rsc0 = captureTable1.get(rep2); + if (!rsc0) { + rsc0 = Object.create(InputStream.prototype); + Object.defineProperty(rsc0, symbolRscHandle, { writable: true, value: handle1}); + Object.defineProperty(rsc0, symbolRscRep, { writable: true, value: rep2}); + } + curResourceBorrows.push(rsc0); + let ret; + try { + ret = { tag: 'ok', val: rsc0.read(BigInt.asUintN(64, arg1))}; + } catch (e) { + ret = { tag: 'err', val: getErrorPayload(e) }; + } + for (const rsc of curResourceBorrows) { + rsc[symbolRscHandle] = null; + } + curResourceBorrows = []; + var variant6 = ret; + switch (variant6.tag) { + case 'ok': { + const e = variant6.val; + dataView(memory0).setInt8(arg2 + 0, 0, true); + var val3 = e; + var len3 = val3.byteLength; + var ptr3 = realloc0(0, 0, 1, len3 * 1); + var src3 = new Uint8Array(val3.buffer || val3, val3.byteOffset, len3 * 1); + (new Uint8Array(memory0.buffer, ptr3, len3 * 1)).set(src3); + dataView(memory0).setInt32(arg2 + 8, len3, true); + dataView(memory0).setInt32(arg2 + 4, ptr3, true); + break; + } + case 'err': { + const e = variant6.val; + dataView(memory0).setInt8(arg2 + 0, 1, true); + var variant5 = e; + switch (variant5.tag) { + case 'last-operation-failed': { + const e = variant5.val; + dataView(memory0).setInt8(arg2 + 4, 0, true); + if (!(e instanceof Error$1)) { + throw new TypeError('Resource error: Not a valid "Error" resource.'); + } + var handle4 = e[symbolRscHandle]; + if (!handle4) { + const rep = e[symbolRscRep] || ++captureCnt0; + captureTable0.set(rep, e); + handle4 = rscTableCreateOwn(handleTable0, rep); + } + dataView(memory0).setInt32(arg2 + 8, handle4, true); + break; + } + case 'closed': { + dataView(memory0).setInt8(arg2 + 4, 1, true); + break; + } + default: { + throw new TypeError(`invalid variant tag value \`${JSON.stringify(variant5.tag)}\` (received \`${variant5}\`) specified for \`StreamError\``); + } + } + break; + } + default: { + throw new TypeError('invalid variant specified for result'); + } + } +} + +function trampoline22(arg0, arg1, arg2) { + var handle1 = arg0; + var rep2 = handleTable1[(handle1 << 1) + 1] & ~T_FLAG; + var rsc0 = captureTable1.get(rep2); + if (!rsc0) { + rsc0 = Object.create(InputStream.prototype); + Object.defineProperty(rsc0, symbolRscHandle, { writable: true, value: handle1}); + Object.defineProperty(rsc0, symbolRscRep, { writable: true, value: rep2}); + } + curResourceBorrows.push(rsc0); + let ret; + try { + ret = { tag: 'ok', val: rsc0.blockingRead(BigInt.asUintN(64, arg1))}; + } catch (e) { + ret = { tag: 'err', val: getErrorPayload(e) }; + } + for (const rsc of curResourceBorrows) { + rsc[symbolRscHandle] = null; + } + curResourceBorrows = []; + var variant6 = ret; + switch (variant6.tag) { + case 'ok': { + const e = variant6.val; + dataView(memory0).setInt8(arg2 + 0, 0, true); + var val3 = e; + var len3 = val3.byteLength; + var ptr3 = realloc0(0, 0, 1, len3 * 1); + var src3 = new Uint8Array(val3.buffer || val3, val3.byteOffset, len3 * 1); + (new Uint8Array(memory0.buffer, ptr3, len3 * 1)).set(src3); + dataView(memory0).setInt32(arg2 + 8, len3, true); + dataView(memory0).setInt32(arg2 + 4, ptr3, true); + break; + } + case 'err': { + const e = variant6.val; + dataView(memory0).setInt8(arg2 + 0, 1, true); + var variant5 = e; + switch (variant5.tag) { + case 'last-operation-failed': { + const e = variant5.val; + dataView(memory0).setInt8(arg2 + 4, 0, true); + if (!(e instanceof Error$1)) { + throw new TypeError('Resource error: Not a valid "Error" resource.'); + } + var handle4 = e[symbolRscHandle]; + if (!handle4) { + const rep = e[symbolRscRep] || ++captureCnt0; + captureTable0.set(rep, e); + handle4 = rscTableCreateOwn(handleTable0, rep); + } + dataView(memory0).setInt32(arg2 + 8, handle4, true); + break; + } + case 'closed': { + dataView(memory0).setInt8(arg2 + 4, 1, true); + break; + } + default: { + throw new TypeError(`invalid variant tag value \`${JSON.stringify(variant5.tag)}\` (received \`${variant5}\`) specified for \`StreamError\``); + } + } + break; + } + default: { + throw new TypeError('invalid variant specified for result'); + } + } +} + +function trampoline23(arg0, arg1) { + var handle1 = arg0; + var rep2 = handleTable2[(handle1 << 1) + 1] & ~T_FLAG; + var rsc0 = captureTable2.get(rep2); + if (!rsc0) { + rsc0 = Object.create(OutputStream.prototype); + Object.defineProperty(rsc0, symbolRscHandle, { writable: true, value: handle1}); + Object.defineProperty(rsc0, symbolRscRep, { writable: true, value: rep2}); + } + curResourceBorrows.push(rsc0); + let ret; + try { + ret = { tag: 'ok', val: rsc0.checkWrite()}; + } catch (e) { + ret = { tag: 'err', val: getErrorPayload(e) }; + } + for (const rsc of curResourceBorrows) { + rsc[symbolRscHandle] = null; + } + curResourceBorrows = []; + var variant5 = ret; + switch (variant5.tag) { + case 'ok': { + const e = variant5.val; + dataView(memory0).setInt8(arg1 + 0, 0, true); + dataView(memory0).setBigInt64(arg1 + 8, toUint64(e), true); + break; + } + case 'err': { + const e = variant5.val; + dataView(memory0).setInt8(arg1 + 0, 1, true); + var variant4 = e; + switch (variant4.tag) { + case 'last-operation-failed': { + const e = variant4.val; + dataView(memory0).setInt8(arg1 + 8, 0, true); + if (!(e instanceof Error$1)) { + throw new TypeError('Resource error: Not a valid "Error" resource.'); + } + var handle3 = e[symbolRscHandle]; + if (!handle3) { + const rep = e[symbolRscRep] || ++captureCnt0; + captureTable0.set(rep, e); + handle3 = rscTableCreateOwn(handleTable0, rep); + } + dataView(memory0).setInt32(arg1 + 12, handle3, true); + break; + } + case 'closed': { + dataView(memory0).setInt8(arg1 + 8, 1, true); + break; + } + default: { + throw new TypeError(`invalid variant tag value \`${JSON.stringify(variant4.tag)}\` (received \`${variant4}\`) specified for \`StreamError\``); + } + } + break; + } + default: { + throw new TypeError('invalid variant specified for result'); + } + } +} + +function trampoline24(arg0, arg1, arg2, arg3) { + var handle1 = arg0; + var rep2 = handleTable2[(handle1 << 1) + 1] & ~T_FLAG; + var rsc0 = captureTable2.get(rep2); + if (!rsc0) { + rsc0 = Object.create(OutputStream.prototype); + Object.defineProperty(rsc0, symbolRscHandle, { writable: true, value: handle1}); + Object.defineProperty(rsc0, symbolRscRep, { writable: true, value: rep2}); + } + curResourceBorrows.push(rsc0); + var ptr3 = arg1; + var len3 = arg2; + var result3 = new Uint8Array(memory0.buffer.slice(ptr3, ptr3 + len3 * 1)); + let ret; + try { + ret = { tag: 'ok', val: rsc0.write(result3)}; + } catch (e) { + ret = { tag: 'err', val: getErrorPayload(e) }; + } + for (const rsc of curResourceBorrows) { + rsc[symbolRscHandle] = null; + } + curResourceBorrows = []; + var variant6 = ret; + switch (variant6.tag) { + case 'ok': { + const e = variant6.val; + dataView(memory0).setInt8(arg3 + 0, 0, true); + break; + } + case 'err': { + const e = variant6.val; + dataView(memory0).setInt8(arg3 + 0, 1, true); + var variant5 = e; + switch (variant5.tag) { + case 'last-operation-failed': { + const e = variant5.val; + dataView(memory0).setInt8(arg3 + 4, 0, true); + if (!(e instanceof Error$1)) { + throw new TypeError('Resource error: Not a valid "Error" resource.'); + } + var handle4 = e[symbolRscHandle]; + if (!handle4) { + const rep = e[symbolRscRep] || ++captureCnt0; + captureTable0.set(rep, e); + handle4 = rscTableCreateOwn(handleTable0, rep); + } + dataView(memory0).setInt32(arg3 + 8, handle4, true); + break; + } + case 'closed': { + dataView(memory0).setInt8(arg3 + 4, 1, true); + break; + } + default: { + throw new TypeError(`invalid variant tag value \`${JSON.stringify(variant5.tag)}\` (received \`${variant5}\`) specified for \`StreamError\``); + } + } + break; + } + default: { + throw new TypeError('invalid variant specified for result'); + } + } +} + +function trampoline25(arg0, arg1, arg2, arg3) { + var handle1 = arg0; + var rep2 = handleTable2[(handle1 << 1) + 1] & ~T_FLAG; + var rsc0 = captureTable2.get(rep2); + if (!rsc0) { + rsc0 = Object.create(OutputStream.prototype); + Object.defineProperty(rsc0, symbolRscHandle, { writable: true, value: handle1}); + Object.defineProperty(rsc0, symbolRscRep, { writable: true, value: rep2}); + } + curResourceBorrows.push(rsc0); + var ptr3 = arg1; + var len3 = arg2; + var result3 = new Uint8Array(memory0.buffer.slice(ptr3, ptr3 + len3 * 1)); + let ret; + try { + ret = { tag: 'ok', val: rsc0.blockingWriteAndFlush(result3)}; + } catch (e) { + ret = { tag: 'err', val: getErrorPayload(e) }; + } + for (const rsc of curResourceBorrows) { + rsc[symbolRscHandle] = null; + } + curResourceBorrows = []; + var variant6 = ret; + switch (variant6.tag) { + case 'ok': { + const e = variant6.val; + dataView(memory0).setInt8(arg3 + 0, 0, true); + break; + } + case 'err': { + const e = variant6.val; + dataView(memory0).setInt8(arg3 + 0, 1, true); + var variant5 = e; + switch (variant5.tag) { + case 'last-operation-failed': { + const e = variant5.val; + dataView(memory0).setInt8(arg3 + 4, 0, true); + if (!(e instanceof Error$1)) { + throw new TypeError('Resource error: Not a valid "Error" resource.'); + } + var handle4 = e[symbolRscHandle]; + if (!handle4) { + const rep = e[symbolRscRep] || ++captureCnt0; + captureTable0.set(rep, e); + handle4 = rscTableCreateOwn(handleTable0, rep); + } + dataView(memory0).setInt32(arg3 + 8, handle4, true); + break; + } + case 'closed': { + dataView(memory0).setInt8(arg3 + 4, 1, true); + break; + } + default: { + throw new TypeError(`invalid variant tag value \`${JSON.stringify(variant5.tag)}\` (received \`${variant5}\`) specified for \`StreamError\``); + } + } + break; + } + default: { + throw new TypeError('invalid variant specified for result'); + } + } +} + +function trampoline26(arg0, arg1) { + var handle1 = arg0; + var rep2 = handleTable2[(handle1 << 1) + 1] & ~T_FLAG; + var rsc0 = captureTable2.get(rep2); + if (!rsc0) { + rsc0 = Object.create(OutputStream.prototype); + Object.defineProperty(rsc0, symbolRscHandle, { writable: true, value: handle1}); + Object.defineProperty(rsc0, symbolRscRep, { writable: true, value: rep2}); + } + curResourceBorrows.push(rsc0); + let ret; + try { + ret = { tag: 'ok', val: rsc0.blockingFlush()}; + } catch (e) { + ret = { tag: 'err', val: getErrorPayload(e) }; + } + for (const rsc of curResourceBorrows) { + rsc[symbolRscHandle] = null; + } + curResourceBorrows = []; + var variant5 = ret; + switch (variant5.tag) { + case 'ok': { + const e = variant5.val; + dataView(memory0).setInt8(arg1 + 0, 0, true); + break; + } + case 'err': { + const e = variant5.val; + dataView(memory0).setInt8(arg1 + 0, 1, true); + var variant4 = e; + switch (variant4.tag) { + case 'last-operation-failed': { + const e = variant4.val; + dataView(memory0).setInt8(arg1 + 4, 0, true); + if (!(e instanceof Error$1)) { + throw new TypeError('Resource error: Not a valid "Error" resource.'); + } + var handle3 = e[symbolRscHandle]; + if (!handle3) { + const rep = e[symbolRscRep] || ++captureCnt0; + captureTable0.set(rep, e); + handle3 = rscTableCreateOwn(handleTable0, rep); + } + dataView(memory0).setInt32(arg1 + 8, handle3, true); + break; + } + case 'closed': { + dataView(memory0).setInt8(arg1 + 4, 1, true); + break; + } + default: { + throw new TypeError(`invalid variant tag value \`${JSON.stringify(variant4.tag)}\` (received \`${variant4}\`) specified for \`StreamError\``); + } + } + break; + } + default: { + throw new TypeError('invalid variant specified for result'); + } + } +} + +function trampoline27(arg0, arg1) { + const ret = getRandomBytes(BigInt.asUintN(64, arg0)); + var val0 = ret; + var len0 = val0.byteLength; + var ptr0 = realloc0(0, 0, 1, len0 * 1); + var src0 = new Uint8Array(val0.buffer || val0, val0.byteOffset, len0 * 1); + (new Uint8Array(memory0.buffer, ptr0, len0 * 1)).set(src0); + dataView(memory0).setInt32(arg1 + 4, len0, true); + dataView(memory0).setInt32(arg1 + 0, ptr0, true); +} + +function trampoline28(arg0) { + const ret = getEnvironment(); + var vec3 = ret; + var len3 = vec3.length; + var result3 = realloc0(0, 0, 4, len3 * 16); + for (let i = 0; i < vec3.length; i++) { + const e = vec3[i]; + const base = result3 + i * 16;var [tuple0_0, tuple0_1] = e; + var ptr1 = utf8Encode(tuple0_0, realloc0, memory0); + var len1 = utf8EncodedLen; + dataView(memory0).setInt32(base + 4, len1, true); + dataView(memory0).setInt32(base + 0, ptr1, true); + var ptr2 = utf8Encode(tuple0_1, realloc0, memory0); + var len2 = utf8EncodedLen; + dataView(memory0).setInt32(base + 12, len2, true); + dataView(memory0).setInt32(base + 8, ptr2, true); + } + dataView(memory0).setInt32(arg0 + 4, len3, true); + dataView(memory0).setInt32(arg0 + 0, result3, true); +} +const handleTable3 = [T_FLAG, 0]; +const captureTable3= new Map(); +let captureCnt3 = 0; +handleTables[3] = handleTable3; + +function trampoline29(arg0) { + const ret = getTerminalStdin(); + var variant1 = ret; + if (variant1 === null || variant1=== undefined) { + dataView(memory0).setInt8(arg0 + 0, 0, true); + } else { + const e = variant1; + dataView(memory0).setInt8(arg0 + 0, 1, true); + if (!(e instanceof TerminalInput)) { + throw new TypeError('Resource error: Not a valid "TerminalInput" resource.'); + } + var handle0 = e[symbolRscHandle]; + if (!handle0) { + const rep = e[symbolRscRep] || ++captureCnt3; + captureTable3.set(rep, e); + handle0 = rscTableCreateOwn(handleTable3, rep); + } + dataView(memory0).setInt32(arg0 + 4, handle0, true); + } +} +const handleTable4 = [T_FLAG, 0]; +const captureTable4= new Map(); +let captureCnt4 = 0; +handleTables[4] = handleTable4; + +function trampoline30(arg0) { + const ret = getTerminalStdout(); + var variant1 = ret; + if (variant1 === null || variant1=== undefined) { + dataView(memory0).setInt8(arg0 + 0, 0, true); + } else { + const e = variant1; + dataView(memory0).setInt8(arg0 + 0, 1, true); + if (!(e instanceof TerminalOutput)) { + throw new TypeError('Resource error: Not a valid "TerminalOutput" resource.'); + } + var handle0 = e[symbolRscHandle]; + if (!handle0) { + const rep = e[symbolRscRep] || ++captureCnt4; + captureTable4.set(rep, e); + handle0 = rscTableCreateOwn(handleTable4, rep); + } + dataView(memory0).setInt32(arg0 + 4, handle0, true); + } +} + +function trampoline31(arg0) { + const ret = getTerminalStderr(); + var variant1 = ret; + if (variant1 === null || variant1=== undefined) { + dataView(memory0).setInt8(arg0 + 0, 0, true); + } else { + const e = variant1; + dataView(memory0).setInt8(arg0 + 0, 1, true); + if (!(e instanceof TerminalOutput)) { + throw new TypeError('Resource error: Not a valid "TerminalOutput" resource.'); + } + var handle0 = e[symbolRscHandle]; + if (!handle0) { + const rep = e[symbolRscRep] || ++captureCnt4; + captureTable4.set(rep, e); + handle0 = rscTableCreateOwn(handleTable4, rep); + } + dataView(memory0).setInt32(arg0 + 4, handle0, true); + } +} +let exports3; +let exports4; +let realloc1; +let postReturn0; +const handleTable6 = [T_FLAG, 0]; +const captureTable6= new Map(); +let captureCnt6 = 0; +handleTables[6] = handleTable6; +function trampoline1(handle) { + const handleEntry = rscTableRemove(handleTable6, handle); + if (handleEntry.own) { + throw new TypeError('unreachable resource trampoline') + } +} +function trampoline2(handle) { + const handleEntry = rscTableRemove(handleTable0, handle); + if (handleEntry.own) { + + const rsc = captureTable0.get(handleEntry.rep); + if (rsc) { + if (rsc[symbolDispose]) rsc[symbolDispose](); + captureTable0.delete(handleEntry.rep); + } else if (Error$1[symbolCabiDispose]) { + Error$1[symbolCabiDispose](handleEntry.rep); + } + } +} +function trampoline3(handle) { + const handleEntry = rscTableRemove(handleTable1, handle); + if (handleEntry.own) { + + const rsc = captureTable1.get(handleEntry.rep); + if (rsc) { + if (rsc[symbolDispose]) rsc[symbolDispose](); + captureTable1.delete(handleEntry.rep); + } else if (InputStream[symbolCabiDispose]) { + InputStream[symbolCabiDispose](handleEntry.rep); + } + } +} +function trampoline4(handle) { + const handleEntry = rscTableRemove(handleTable2, handle); + if (handleEntry.own) { + + const rsc = captureTable2.get(handleEntry.rep); + if (rsc) { + if (rsc[symbolDispose]) rsc[symbolDispose](); + captureTable2.delete(handleEntry.rep); + } else if (OutputStream[symbolCabiDispose]) { + OutputStream[symbolCabiDispose](handleEntry.rep); + } + } +} +function trampoline5(handle) { + const handleEntry = rscTableRemove(handleTable5, handle); + if (handleEntry.own) { + + const rsc = captureTable5.get(handleEntry.rep); + if (rsc) { + if (rsc[symbolDispose]) rsc[symbolDispose](); + captureTable5.delete(handleEntry.rep); + } else if (Descriptor[symbolCabiDispose]) { + Descriptor[symbolCabiDispose](handleEntry.rep); + } + } +} +function trampoline6(handle) { + const handleEntry = rscTableRemove(handleTable4, handle); + if (handleEntry.own) { + + const rsc = captureTable4.get(handleEntry.rep); + if (rsc) { + if (rsc[symbolDispose]) rsc[symbolDispose](); + captureTable4.delete(handleEntry.rep); + } else if (TerminalOutput[symbolCabiDispose]) { + TerminalOutput[symbolCabiDispose](handleEntry.rep); + } + } +} +function trampoline7(handle) { + const handleEntry = rscTableRemove(handleTable3, handle); + if (handleEntry.own) { + + const rsc = captureTable3.get(handleEntry.rep); + if (rsc) { + if (rsc[symbolDispose]) rsc[symbolDispose](); + captureTable3.delete(handleEntry.rep); + } else if (TerminalInput[symbolCabiDispose]) { + TerminalInput[symbolCabiDispose](handleEntry.rep); + } + } +} + +function optimize(arg0, arg1, arg2) { + var ptr0 = realloc1(0, 0, 8, 200); + var {k: v1_0, m: v1_1, delta: v1_2, beta: v1_3, sigmaObs: v1_4 } = arg0; + dataView(memory0).setFloat64(ptr0 + 0, +v1_0, true); + dataView(memory0).setFloat64(ptr0 + 8, +v1_1, true); + var val2 = v1_2; + var len2 = val2.length; + var ptr2 = realloc1(0, 0, 8, len2 * 8); + var src2 = new Uint8Array(val2.buffer, val2.byteOffset, len2 * 8); + (new Uint8Array(memory0.buffer, ptr2, len2 * 8)).set(src2); + dataView(memory0).setInt32(ptr0 + 20, len2, true); + dataView(memory0).setInt32(ptr0 + 16, ptr2, true); + var val3 = v1_3; + var len3 = val3.length; + var ptr3 = realloc1(0, 0, 8, len3 * 8); + var src3 = new Uint8Array(val3.buffer, val3.byteOffset, len3 * 8); + (new Uint8Array(memory0.buffer, ptr3, len3 * 8)).set(src3); + dataView(memory0).setInt32(ptr0 + 28, len3, true); + dataView(memory0).setInt32(ptr0 + 24, ptr3, true); + dataView(memory0).setFloat64(ptr0 + 32, +v1_4, true); + var ptr4 = utf8Encode(arg1, realloc1, memory0); + var len4 = utf8EncodedLen; + dataView(memory0).setInt32(ptr0 + 44, len4, true); + dataView(memory0).setInt32(ptr0 + 40, ptr4, true); + var {algorithm: v5_0, seed: v5_1, chain: v5_2, initAlpha: v5_3, tolObj: v5_4, tolRelObj: v5_5, tolGrad: v5_6, tolRelGrad: v5_7, tolParam: v5_8, historySize: v5_9, iter: v5_10, jacobian: v5_11, refresh: v5_12 } = arg2; + var variant7 = v5_0; + if (variant7 === null || variant7=== undefined) { + dataView(memory0).setInt8(ptr0 + 48, 0, true); + } else { + const e = variant7; + dataView(memory0).setInt8(ptr0 + 48, 1, true); + var val6 = e; + let enum6; + switch (val6) { + case 'newton': { + enum6 = 0; + break; + } + case 'bfgs': { + enum6 = 1; + break; + } + case 'lbfgs': { + enum6 = 2; + break; + } + default: { + if ((e) instanceof Error) { + console.error(e); + } + + throw new TypeError(`"${val6}" is not one of the cases of algorithm`); + } + } + dataView(memory0).setInt8(ptr0 + 49, enum6, true); + } + var variant8 = v5_1; + if (variant8 === null || variant8=== undefined) { + dataView(memory0).setInt8(ptr0 + 52, 0, true); + } else { + const e = variant8; + dataView(memory0).setInt8(ptr0 + 52, 1, true); + dataView(memory0).setInt32(ptr0 + 56, toUint32(e), true); + } + var variant9 = v5_2; + if (variant9 === null || variant9=== undefined) { + dataView(memory0).setInt8(ptr0 + 60, 0, true); + } else { + const e = variant9; + dataView(memory0).setInt8(ptr0 + 60, 1, true); + dataView(memory0).setInt32(ptr0 + 64, toUint32(e), true); + } + var variant10 = v5_3; + if (variant10 === null || variant10=== undefined) { + dataView(memory0).setInt8(ptr0 + 72, 0, true); + } else { + const e = variant10; + dataView(memory0).setInt8(ptr0 + 72, 1, true); + dataView(memory0).setFloat64(ptr0 + 80, +e, true); + } + var variant11 = v5_4; + if (variant11 === null || variant11=== undefined) { + dataView(memory0).setInt8(ptr0 + 88, 0, true); + } else { + const e = variant11; + dataView(memory0).setInt8(ptr0 + 88, 1, true); + dataView(memory0).setFloat64(ptr0 + 96, +e, true); + } + var variant12 = v5_5; + if (variant12 === null || variant12=== undefined) { + dataView(memory0).setInt8(ptr0 + 104, 0, true); + } else { + const e = variant12; + dataView(memory0).setInt8(ptr0 + 104, 1, true); + dataView(memory0).setFloat64(ptr0 + 112, +e, true); + } + var variant13 = v5_6; + if (variant13 === null || variant13=== undefined) { + dataView(memory0).setInt8(ptr0 + 120, 0, true); + } else { + const e = variant13; + dataView(memory0).setInt8(ptr0 + 120, 1, true); + dataView(memory0).setFloat64(ptr0 + 128, +e, true); + } + var variant14 = v5_7; + if (variant14 === null || variant14=== undefined) { + dataView(memory0).setInt8(ptr0 + 136, 0, true); + } else { + const e = variant14; + dataView(memory0).setInt8(ptr0 + 136, 1, true); + dataView(memory0).setFloat64(ptr0 + 144, +e, true); + } + var variant15 = v5_8; + if (variant15 === null || variant15=== undefined) { + dataView(memory0).setInt8(ptr0 + 152, 0, true); + } else { + const e = variant15; + dataView(memory0).setInt8(ptr0 + 152, 1, true); + dataView(memory0).setFloat64(ptr0 + 160, +e, true); + } + var variant16 = v5_9; + if (variant16 === null || variant16=== undefined) { + dataView(memory0).setInt8(ptr0 + 168, 0, true); + } else { + const e = variant16; + dataView(memory0).setInt8(ptr0 + 168, 1, true); + dataView(memory0).setInt32(ptr0 + 172, toUint32(e), true); + } + var variant17 = v5_10; + if (variant17 === null || variant17=== undefined) { + dataView(memory0).setInt8(ptr0 + 176, 0, true); + } else { + const e = variant17; + dataView(memory0).setInt8(ptr0 + 176, 1, true); + dataView(memory0).setInt32(ptr0 + 180, toUint32(e), true); + } + var variant18 = v5_11; + if (variant18 === null || variant18=== undefined) { + dataView(memory0).setInt8(ptr0 + 184, 0, true); + } else { + const e = variant18; + dataView(memory0).setInt8(ptr0 + 184, 1, true); + dataView(memory0).setInt8(ptr0 + 185, e ? 1 : 0, true); + } + var variant19 = v5_12; + if (variant19 === null || variant19=== undefined) { + dataView(memory0).setInt8(ptr0 + 188, 0, true); + } else { + const e = variant19; + dataView(memory0).setInt8(ptr0 + 188, 1, true); + dataView(memory0).setInt32(ptr0 + 192, toUint32(e), true); + } + const ret = exports1['augurs:prophet-wasmstan/optimizer#optimize'](ptr0); + let variant29; + switch (dataView(memory0).getUint8(ret + 0, true)) { + case 0: { + var ptr20 = dataView(memory0).getInt32(ret + 8, true); + var len20 = dataView(memory0).getInt32(ret + 12, true); + var result20 = utf8Decoder.decode(new Uint8Array(memory0.buffer, ptr20, len20)); + var ptr21 = dataView(memory0).getInt32(ret + 16, true); + var len21 = dataView(memory0).getInt32(ret + 20, true); + var result21 = utf8Decoder.decode(new Uint8Array(memory0.buffer, ptr21, len21)); + var ptr22 = dataView(memory0).getInt32(ret + 24, true); + var len22 = dataView(memory0).getInt32(ret + 28, true); + var result22 = utf8Decoder.decode(new Uint8Array(memory0.buffer, ptr22, len22)); + var ptr23 = dataView(memory0).getInt32(ret + 32, true); + var len23 = dataView(memory0).getInt32(ret + 36, true); + var result23 = utf8Decoder.decode(new Uint8Array(memory0.buffer, ptr23, len23)); + var ptr24 = dataView(memory0).getInt32(ret + 40, true); + var len24 = dataView(memory0).getInt32(ret + 44, true); + var result24 = utf8Decoder.decode(new Uint8Array(memory0.buffer, ptr24, len24)); + var ptr25 = dataView(memory0).getInt32(ret + 64, true); + var len25 = dataView(memory0).getInt32(ret + 68, true); + var result25 = new Float64Array(memory0.buffer.slice(ptr25, ptr25 + len25 * 8)); + var ptr26 = dataView(memory0).getInt32(ret + 72, true); + var len26 = dataView(memory0).getInt32(ret + 76, true); + var result26 = new Float64Array(memory0.buffer.slice(ptr26, ptr26 + len26 * 8)); + var ptr27 = dataView(memory0).getInt32(ret + 88, true); + var len27 = dataView(memory0).getInt32(ret + 92, true); + var result27 = new Float64Array(memory0.buffer.slice(ptr27, ptr27 + len27 * 8)); + variant29= { + tag: 'ok', + val: { + logs: { + debug: result20, + info: result21, + warn: result22, + error: result23, + fatal: result24, + }, + params: { + k: dataView(memory0).getFloat64(ret + 48, true), + m: dataView(memory0).getFloat64(ret + 56, true), + delta: result25, + beta: result26, + sigmaObs: dataView(memory0).getFloat64(ret + 80, true), + trend: result27, + }, + } + }; + break; + } + case 1: { + var ptr28 = dataView(memory0).getInt32(ret + 8, true); + var len28 = dataView(memory0).getInt32(ret + 12, true); + var result28 = utf8Decoder.decode(new Uint8Array(memory0.buffer, ptr28, len28)); + variant29= { + tag: 'err', + val: result28 + }; + break; + } + default: { + throw new TypeError('invalid variant discriminant for expected'); + } + } + const retVal = variant29; + postReturn0(ret); + if (typeof retVal === 'object' && retVal.tag === 'err') { + throw new ComponentError(retVal.val); + } + return retVal.val; +} + +const $init = (() => { + let gen = (function* init () { + const module0 = fetchCompile(new URL('./prophet-wasmstan.core.wasm', import.meta.url)); + const module1 = fetchCompile(new URL('./prophet-wasmstan.core2.wasm', import.meta.url)); + const module2 = base64Compile('AGFzbQEAAAABSQxgAX8AYAJ/fwBgAn9/AX9gA39+fwBgBH9/f38Bf2AEf39/fwBgA39+fwF/YAF/AX9gA39/fwF/YAR/fn9/AX9gAAF/YAJ+fwADIiECAgYHAgIIBAkEAAoCAAABAQMDAQEBAwMBBQUBCwAAAAAEBQFwASEhB6cBIgEwAAABMQABATIAAgEzAAMBNAAEATUABQE2AAYBNwAHATgACAE5AAkCMTAACgIxMQALAjEyAAwCMTMADQIxNAAOAjE1AA8CMTYAEAIxNwARAjE4ABICMTkAEwIyMAAUAjIxABUCMjIAFgIyMwAXAjI0ABgCMjUAGQIyNgAaAjI3ABsCMjgAHAIyOQAdAjMwAB4CMzEAHwIzMgAgCCRpbXBvcnRzAQAKmQMhCwAgACABQQARAgALCwAgACABQQERAgALDQAgACABIAJBAhEGAAsJACAAQQMRBwALCwAgACABQQQRAgALCwAgACABQQURAgALDQAgACABIAJBBhEIAAsPACAAIAEgAiADQQcRBAALDwAgACABIAIgA0EIEQkACw8AIAAgASACIANBCREEAAsJACAAQQoRAAALBwBBCxEKAAsLACAAIAFBDBECAAsJACAAQQ0RAAALCQAgAEEOEQAACwsAIAAgAUEPEQEACwsAIAAgAUEQEQEACw0AIAAgASACQRERAwALDQAgACABIAJBEhEDAAsLACAAIAFBExEBAAsLACAAIAFBFBEBAAsLACAAIAFBFREBAAsNACAAIAEgAkEWEQMACw0AIAAgASACQRcRAwALCwAgACABQRgRAQALDwAgACABIAIgA0EZEQUACw8AIAAgASACIANBGhEFAAsLACAAIAFBGxEBAAsLACAAIAFBHBELAAsJACAAQR0RAAALCQAgAEEeEQAACwkAIABBHxEAAAsJACAAQSARAAALAC8JcHJvZHVjZXJzAQxwcm9jZXNzZWQtYnkBDXdpdC1jb21wb25lbnQHMC4yMTkuMQ'); + const module3 = base64Compile('AGFzbQEAAAABSQxgAX8AYAJ/fwBgAn9/AX9gA39+fwBgBH9/f38Bf2AEf39/fwBgA39+fwF/YAF/AX9gA39/fwF/YAR/fn9/AX9gAAF/YAJ+fwACzAEiAAEwAAIAATEAAgABMgAGAAEzAAcAATQAAgABNQACAAE2AAgAATcABAABOAAJAAE5AAQAAjEwAAAAAjExAAoAAjEyAAIAAjEzAAAAAjE0AAAAAjE1AAEAAjE2AAEAAjE3AAMAAjE4AAMAAjE5AAEAAjIwAAEAAjIxAAEAAjIyAAMAAjIzAAMAAjI0AAEAAjI1AAUAAjI2AAUAAjI3AAEAAjI4AAsAAjI5AAAAAjMwAAAAAjMxAAAAAjMyAAAACCRpbXBvcnRzAXABISEJJwEAQQALIQABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fIAAvCXByb2R1Y2VycwEMcHJvY2Vzc2VkLWJ5AQ13aXQtY29tcG9uZW50BzAuMjE5LjE'); + const module4 = base64Compile('AGFzbQEAAAABBAFgAAACBQEAAAAACAEA'); + ({ exports: exports0 } = yield instantiateCore(yield module2)); + ({ exports: exports1 } = yield instantiateCore(yield module0, { + wasi_snapshot_preview1: { + clock_time_get: exports0['2'], + environ_get: exports0['0'], + environ_sizes_get: exports0['1'], + fd_close: exports0['3'], + fd_fdstat_get: exports0['4'], + fd_prestat_dir_name: exports0['6'], + fd_prestat_get: exports0['5'], + fd_read: exports0['7'], + fd_seek: exports0['8'], + fd_write: exports0['9'], + proc_exit: exports0['10'], + random_get: exports0['12'], + sched_yield: exports0['11'], + }, + })); + ({ exports: exports2 } = yield instantiateCore(yield module1, { + __main_module__: { + cabi_realloc: exports1.cabi_realloc, + }, + env: { + memory: exports1.memory, + }, + 'wasi:cli/environment@0.2.0': { + 'get-environment': exports0['29'], + }, + 'wasi:cli/exit@0.2.0': { + exit: trampoline9, + }, + 'wasi:cli/stderr@0.2.0': { + 'get-stderr': trampoline8, + }, + 'wasi:cli/stdin@0.2.0': { + 'get-stdin': trampoline10, + }, + 'wasi:cli/stdout@0.2.0': { + 'get-stdout': trampoline11, + }, + 'wasi:cli/terminal-input@0.2.0': { + '[resource-drop]terminal-input': trampoline7, + }, + 'wasi:cli/terminal-output@0.2.0': { + '[resource-drop]terminal-output': trampoline6, + }, + 'wasi:cli/terminal-stderr@0.2.0': { + 'get-terminal-stderr': exports0['32'], + }, + 'wasi:cli/terminal-stdin@0.2.0': { + 'get-terminal-stdin': exports0['30'], + }, + 'wasi:cli/terminal-stdout@0.2.0': { + 'get-terminal-stdout': exports0['31'], + }, + 'wasi:clocks/monotonic-clock@0.2.0': { + now: trampoline0, + }, + 'wasi:clocks/wall-clock@0.2.0': { + now: exports0['14'], + }, + 'wasi:filesystem/preopens@0.2.0': { + 'get-directories': exports0['13'], + }, + 'wasi:filesystem/types@0.2.0': { + '[method]descriptor.append-via-stream': exports0['19'], + '[method]descriptor.get-flags': exports0['20'], + '[method]descriptor.get-type': exports0['15'], + '[method]descriptor.read-via-stream': exports0['17'], + '[method]descriptor.stat': exports0['21'], + '[method]descriptor.write-via-stream': exports0['18'], + '[resource-drop]descriptor': trampoline5, + '[resource-drop]directory-entry-stream': trampoline1, + 'filesystem-error-code': exports0['16'], + }, + 'wasi:io/error@0.2.0': { + '[resource-drop]error': trampoline2, + }, + 'wasi:io/streams@0.2.0': { + '[method]input-stream.blocking-read': exports0['23'], + '[method]input-stream.read': exports0['22'], + '[method]output-stream.blocking-flush': exports0['27'], + '[method]output-stream.blocking-write-and-flush': exports0['26'], + '[method]output-stream.check-write': exports0['24'], + '[method]output-stream.write': exports0['25'], + '[resource-drop]input-stream': trampoline3, + '[resource-drop]output-stream': trampoline4, + }, + 'wasi:random/random@0.2.0': { + 'get-random-bytes': exports0['28'], + }, + })); + memory0 = exports1.memory; + realloc0 = exports2.cabi_import_realloc; + ({ exports: exports3 } = yield instantiateCore(yield module3, { + '': { + $imports: exports0.$imports, + '0': exports2.environ_get, + '1': exports2.environ_sizes_get, + '10': exports2.proc_exit, + '11': exports2.sched_yield, + '12': exports2.random_get, + '13': trampoline12, + '14': trampoline13, + '15': trampoline14, + '16': trampoline15, + '17': trampoline16, + '18': trampoline17, + '19': trampoline18, + '2': exports2.clock_time_get, + '20': trampoline19, + '21': trampoline20, + '22': trampoline21, + '23': trampoline22, + '24': trampoline23, + '25': trampoline24, + '26': trampoline25, + '27': trampoline26, + '28': trampoline27, + '29': trampoline28, + '3': exports2.fd_close, + '30': trampoline29, + '31': trampoline30, + '32': trampoline31, + '4': exports2.fd_fdstat_get, + '5': exports2.fd_prestat_get, + '6': exports2.fd_prestat_dir_name, + '7': exports2.fd_read, + '8': exports2.fd_seek, + '9': exports2.fd_write, + }, + })); + ({ exports: exports4 } = yield instantiateCore(yield module4, { + '': { + '': exports1._initialize, + }, + })); + realloc1 = exports1.cabi_realloc; + postReturn0 = exports1['cabi_post_augurs:prophet-wasmstan/optimizer#optimize']; + })(); + function run(g) { + return Promise.resolve(function step(v) { + const res = g.next(v); + if (res.done) return res.value; + return res.value.then(step); + }()); + } + return run(gen); +})(); + +await $init; +const optimizer = { + optimize: optimize, + +}; + +export { optimizer, optimizer as 'augurs:prophet-wasmstan/optimizer', } diff --git a/demo/dist/@bsull/augurs/changepoint.d.ts b/demo/dist/@bsull/augurs/changepoint.d.ts new file mode 100644 index 0000000..22f5b5f --- /dev/null +++ b/demo/dist/@bsull/augurs/changepoint.d.ts @@ -0,0 +1,271 @@ +/* tslint:disable */ +/* eslint-disable */ +/** +* Initialize logging. +* +* You can use this to emit logs from augurs to the browser console. +* The default is to log everything to the console, but you can +* change the log level and whether logs are emitted to the console +* or to the browser's performance timeline. +* +* IMPORTANT: this function should only be called once. It will throw +* an exception if called more than once. +* @param {LogConfig | undefined} [config] +*/ +export function initLogging(config?: LogConfig): void; +/** +* Initialize the logger and panic hook. +* +* This will be called automatically when the module is imported. +* It sets the default tracing subscriber to `tracing-wasm`, and +* sets WASM panics to print to the console with a helpful error +* message. +*/ +export function custom_init(): void; +/** + * The type of changepoint detector to use. + */ +export type ChangepointDetectorType = "normal-gamma" | "default-argpcp"; + +/** + * Parameters for the Normal Gamma prior. + * Options for the ETS MSTL model. + */ +export interface NormalGammaParameters { + /** + * The prior mean. + * + * Defaults to 0.0. + */ + mu?: number; + /** + * The relative precision of μ versus data. + * + * Defaults to 1.0. + */ + rho?: number; + /** + * The mean of rho (the precision) is v/s. + * + * Defaults to 1.0. + */ + s?: number; + /** + * The degrees of freedom of precision of rho. + * + * Defaults to 1.0. + */ + v?: number; +} + +/** + * Options for the Normal Gamma changepoint detector. + */ +export interface NormalGammaDetectorOptions { + /** + * The hazard lambda. + * + * `1/hazard` is the probability of the next step being a changepoint. + * Therefore, the larger the value, the lower the prior probability + * is for the any point to be a change-point. + * Mean run-length is lambda - 1. + * + * Defaults to 250.0. + */ + hazardLambda?: number; + /** + * The prior for the Normal distribution. + */ + prior?: NormalGammaParameters; +} + +/** + * Options for the default Autoregressive Gaussian Process detector. + */ +export interface DefaultArgpcpDetectorOptions { + /** + * The value of the constant kernel. + */ + constantValue?: number; + /** + * The length scale of the RBF kernel. + */ + lengthScale?: number; + /** + * The noise level of the white kernel. + */ + noiseLevel?: number; + /** + * The maximum autoregressive lag. + */ + maxLag?: number; + /** + * Scale Gamma distribution alpha parameter. + */ + alpha0?: number; + /** + * Scale Gamma distribution beta parameter. + */ + beta0?: number; + logisticHazardH?: number; + logisticHazardA?: number; + logisticHazardB?: number; +} + +/** + * Changepoints detected in a time series. + */ +export interface Changepoints { + /** + * The indices of the most likely changepoints. + */ + indices: number[]; +} + +/** + * The maximum log level to emit. + * + * The default is `Level::Info`. + */ +export type Level = "trace" | "debug" | "info" | "warn" | "error"; + +/** + * The target for augurs log events. + */ +export type LogTarget = "console" | "performance"; + +/** + * Log configuration. + */ +export interface LogConfig { + /** + * The maximum log level to emit. + * + * Defaults to `INFO`. + */ + maxLevel?: Level; + /** + * The target for augurs log events. + * + * Defaults to logging to the browser console. + */ + target?: LogTarget; + /** + * Whether to emit coloured logs. + * + * Defaults to `true`. + */ + color?: boolean; + /** + * Whether to show detailed fields such as augurs\' file names and line numbers + * in the logs. + * + * Probably not wise in production. + * + * Defaults to `false`. + */ + showDetailedFields?: boolean; +} + +/** + * Forecast intervals. + */ +export interface ForecastIntervals { + /** + * The confidence level for the intervals. + */ + level: number; + /** + * The lower prediction intervals. + */ + lower: number[]; + /** + * The upper prediction intervals. + */ + upper: number[]; +} + +/** + * A forecast containing point forecasts and, optionally, prediction intervals. + */ +export interface Forecast { + /** + * The point forecasts. + */ + point: number[]; + /** + * The forecast intervals, if requested and supported + * by the trend model. + */ + intervals: ForecastIntervals | undefined; +} + +/** +* A changepoint detector. +*/ +export class ChangepointDetector { + free(): void; +/** +* @param {ChangepointDetectorType} detectorType +*/ + constructor(detectorType: ChangepointDetectorType); +/** +* Create a new Bayesian Online changepoint detector with a Normal Gamma prior. +* @param {NormalGammaDetectorOptions | undefined} [opts] +* @returns {ChangepointDetector} +*/ + static normalGamma(opts?: NormalGammaDetectorOptions): ChangepointDetector; +/** +* Create a new Autoregressive Gaussian Process changepoint detector +* with the default kernel and parameters. +* @param {DefaultArgpcpDetectorOptions | undefined} [opts] +* @returns {ChangepointDetector} +*/ + static defaultArgpcp(opts?: DefaultArgpcpDetectorOptions): ChangepointDetector; +/** +* Detect changepoints in the given time series. +* @param {number[] | Float64Array} y +* @returns {Changepoints} +*/ + detectChangepoints(y: number[] | Float64Array): Changepoints; +} + +export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module; + +export interface InitOutput { + readonly memory: WebAssembly.Memory; + readonly __wbg_changepointdetector_free: (a: number, b: number) => void; + readonly changepointdetector_new: (a: number, b: number) => void; + readonly changepointdetector_normalGamma: (a: number, b: number) => void; + readonly changepointdetector_defaultArgpcp: (a: number, b: number) => void; + readonly changepointdetector_detectChangepoints: (a: number, b: number, c: number) => void; + readonly initLogging: (a: number, b: number) => void; + readonly custom_init: () => void; + readonly __wbindgen_malloc: (a: number, b: number) => number; + readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number; + readonly __wbindgen_add_to_stack_pointer: (a: number) => number; + readonly __wbindgen_free: (a: number, b: number, c: number) => void; + readonly __wbindgen_exn_store: (a: number) => void; + readonly __wbindgen_start: () => void; +} + +export type SyncInitInput = BufferSource | WebAssembly.Module; +/** +* Instantiates the given `module`, which can either be bytes or +* a precompiled `WebAssembly.Module`. +* +* @param {{ module: SyncInitInput }} module - Passing `SyncInitInput` directly is deprecated. +* +* @returns {InitOutput} +*/ +export function initSync(module: { module: SyncInitInput } | SyncInitInput): InitOutput; + +/** +* If `module_or_path` is {RequestInfo} or {URL}, makes a request and +* for everything else, calls `WebAssembly.instantiate` directly. +* +* @param {{ module_or_path: InitInput | Promise }} module_or_path - Passing `InitInput` directly is deprecated. +* +* @returns {Promise} +*/ +export default function __wbg_init (module_or_path?: { module_or_path: InitInput | Promise } | InitInput | Promise): Promise; diff --git a/demo/dist/@bsull/augurs/changepoint.js b/demo/dist/@bsull/augurs/changepoint.js new file mode 100644 index 0000000..e84ed67 --- /dev/null +++ b/demo/dist/@bsull/augurs/changepoint.js @@ -0,0 +1,710 @@ +let wasm; + +const cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } ); + +if (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); }; + +let cachedUint8ArrayMemory0 = null; + +function getUint8ArrayMemory0() { + if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) { + cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer); + } + return cachedUint8ArrayMemory0; +} + +function getStringFromWasm0(ptr, len) { + ptr = ptr >>> 0; + return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len)); +} + +const heap = new Array(128).fill(undefined); + +heap.push(undefined, null, true, false); + +let heap_next = heap.length; + +function addHeapObject(obj) { + if (heap_next === heap.length) heap.push(heap.length + 1); + const idx = heap_next; + heap_next = heap[idx]; + + heap[idx] = obj; + return idx; +} + +function getObject(idx) { return heap[idx]; } + +function dropObject(idx) { + if (idx < 132) return; + heap[idx] = heap_next; + heap_next = idx; +} + +function takeObject(idx) { + const ret = getObject(idx); + dropObject(idx); + return ret; +} + +let WASM_VECTOR_LEN = 0; + +const cachedTextEncoder = (typeof TextEncoder !== 'undefined' ? new TextEncoder('utf-8') : { encode: () => { throw Error('TextEncoder not available') } } ); + +const encodeString = (typeof cachedTextEncoder.encodeInto === 'function' + ? function (arg, view) { + return cachedTextEncoder.encodeInto(arg, view); +} + : function (arg, view) { + const buf = cachedTextEncoder.encode(arg); + view.set(buf); + return { + read: arg.length, + written: buf.length + }; +}); + +function passStringToWasm0(arg, malloc, realloc) { + + if (realloc === undefined) { + const buf = cachedTextEncoder.encode(arg); + const ptr = malloc(buf.length, 1) >>> 0; + getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf); + WASM_VECTOR_LEN = buf.length; + return ptr; + } + + let len = arg.length; + let ptr = malloc(len, 1) >>> 0; + + const mem = getUint8ArrayMemory0(); + + let offset = 0; + + for (; offset < len; offset++) { + const code = arg.charCodeAt(offset); + if (code > 0x7F) break; + mem[ptr + offset] = code; + } + + if (offset !== len) { + if (offset !== 0) { + arg = arg.slice(offset); + } + ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; + const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len); + const ret = encodeString(arg, view); + + offset += ret.written; + ptr = realloc(ptr, len, offset, 1) >>> 0; + } + + WASM_VECTOR_LEN = offset; + return ptr; +} + +function isLikeNone(x) { + return x === undefined || x === null; +} + +let cachedDataViewMemory0 = null; + +function getDataViewMemory0() { + if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer.detached === true || (cachedDataViewMemory0.buffer.detached === undefined && cachedDataViewMemory0.buffer !== wasm.memory.buffer)) { + cachedDataViewMemory0 = new DataView(wasm.memory.buffer); + } + return cachedDataViewMemory0; +} + +function debugString(val) { + // primitive types + const type = typeof val; + if (type == 'number' || type == 'boolean' || val == null) { + return `${val}`; + } + if (type == 'string') { + return `"${val}"`; + } + if (type == 'symbol') { + const description = val.description; + if (description == null) { + return 'Symbol'; + } else { + return `Symbol(${description})`; + } + } + if (type == 'function') { + const name = val.name; + if (typeof name == 'string' && name.length > 0) { + return `Function(${name})`; + } else { + return 'Function'; + } + } + // objects + if (Array.isArray(val)) { + const length = val.length; + let debug = '['; + if (length > 0) { + debug += debugString(val[0]); + } + for(let i = 1; i < length; i++) { + debug += ', ' + debugString(val[i]); + } + debug += ']'; + return debug; + } + // Test for built-in + const builtInMatches = /\[object ([^\]]+)\]/.exec(toString.call(val)); + let className; + if (builtInMatches.length > 1) { + className = builtInMatches[1]; + } else { + // Failed to match the standard '[object ClassName]' + return toString.call(val); + } + if (className == 'Object') { + // we're a user defined class or Object + // JSON.stringify avoids problems with cycles, and is generally much + // easier than looping through ownProperties of `val`. + try { + return 'Object(' + JSON.stringify(val) + ')'; + } catch (_) { + return 'Object'; + } + } + // errors + if (val instanceof Error) { + return `${val.name}: ${val.message}\n${val.stack}`; + } + // TODO we could test for more things here, like `Set`s and `Map`s. + return className; +} +/** +* Initialize logging. +* +* You can use this to emit logs from augurs to the browser console. +* The default is to log everything to the console, but you can +* change the log level and whether logs are emitted to the console +* or to the browser's performance timeline. +* +* IMPORTANT: this function should only be called once. It will throw +* an exception if called more than once. +* @param {LogConfig | undefined} [config] +*/ +export function initLogging(config) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.initLogging(retptr, isLikeNone(config) ? 0 : addHeapObject(config)); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + if (r1) { + throw takeObject(r0); + } + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +} + +/** +* Initialize the logger and panic hook. +* +* This will be called automatically when the module is imported. +* It sets the default tracing subscriber to `tracing-wasm`, and +* sets WASM panics to print to the console with a helpful error +* message. +*/ +export function custom_init() { + wasm.custom_init(); +} + +function handleError(f, args) { + try { + return f.apply(this, args); + } catch (e) { + wasm.__wbindgen_exn_store(addHeapObject(e)); + } +} + +const ChangepointDetectorFinalization = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(ptr => wasm.__wbg_changepointdetector_free(ptr >>> 0, 1)); +/** +* A changepoint detector. +*/ +export class ChangepointDetector { + + static __wrap(ptr) { + ptr = ptr >>> 0; + const obj = Object.create(ChangepointDetector.prototype); + obj.__wbg_ptr = ptr; + ChangepointDetectorFinalization.register(obj, obj.__wbg_ptr, obj); + return obj; + } + + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + ChangepointDetectorFinalization.unregister(this); + return ptr; + } + + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_changepointdetector_free(ptr, 0); + } + /** + * @param {ChangepointDetectorType} detectorType + */ + constructor(detectorType) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.changepointdetector_new(retptr, addHeapObject(detectorType)); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true); + if (r2) { + throw takeObject(r1); + } + this.__wbg_ptr = r0 >>> 0; + ChangepointDetectorFinalization.register(this, this.__wbg_ptr, this); + return this; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * Create a new Bayesian Online changepoint detector with a Normal Gamma prior. + * @param {NormalGammaDetectorOptions | undefined} [opts] + * @returns {ChangepointDetector} + */ + static normalGamma(opts) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.changepointdetector_normalGamma(retptr, isLikeNone(opts) ? 0 : addHeapObject(opts)); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true); + if (r2) { + throw takeObject(r1); + } + return ChangepointDetector.__wrap(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * Create a new Autoregressive Gaussian Process changepoint detector + * with the default kernel and parameters. + * @param {DefaultArgpcpDetectorOptions | undefined} [opts] + * @returns {ChangepointDetector} + */ + static defaultArgpcp(opts) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.changepointdetector_defaultArgpcp(retptr, isLikeNone(opts) ? 0 : addHeapObject(opts)); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true); + if (r2) { + throw takeObject(r1); + } + return ChangepointDetector.__wrap(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * Detect changepoints in the given time series. + * @param {number[] | Float64Array} y + * @returns {Changepoints} + */ + detectChangepoints(y) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.changepointdetector_detectChangepoints(retptr, this.__wbg_ptr, addHeapObject(y)); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true); + if (r2) { + throw takeObject(r1); + } + return takeObject(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } +} + +async function __wbg_load(module, imports) { + if (typeof Response === 'function' && module instanceof Response) { + if (typeof WebAssembly.instantiateStreaming === 'function') { + try { + return await WebAssembly.instantiateStreaming(module, imports); + + } catch (e) { + if (module.headers.get('Content-Type') != 'application/wasm') { + console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e); + + } else { + throw e; + } + } + } + + const bytes = await module.arrayBuffer(); + return await WebAssembly.instantiate(bytes, imports); + + } else { + const instance = await WebAssembly.instantiate(module, imports); + + if (instance instanceof WebAssembly.Instance) { + return { instance, module }; + + } else { + return instance; + } + } +} + +function __wbg_get_imports() { + const imports = {}; + imports.wbg = {}; + imports.wbg.__wbindgen_error_new = function(arg0, arg1) { + const ret = new Error(getStringFromWasm0(arg0, arg1)); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_is_string = function(arg0) { + const ret = typeof(getObject(arg0)) === 'string'; + return ret; + }; + imports.wbg.__wbindgen_object_drop_ref = function(arg0) { + takeObject(arg0); + }; + imports.wbg.__wbindgen_string_get = function(arg0, arg1) { + const obj = getObject(arg1); + const ret = typeof(obj) === 'string' ? obj : undefined; + var ptr1 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + var len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }; + imports.wbg.__wbindgen_object_clone_ref = function(arg0) { + const ret = getObject(arg0); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_string_new = function(arg0, arg1) { + const ret = getStringFromWasm0(arg0, arg1); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_is_object = function(arg0) { + const val = getObject(arg0); + const ret = typeof(val) === 'object' && val !== null; + return ret; + }; + imports.wbg.__wbindgen_is_undefined = function(arg0) { + const ret = getObject(arg0) === undefined; + return ret; + }; + imports.wbg.__wbindgen_in = function(arg0, arg1) { + const ret = getObject(arg0) in getObject(arg1); + return ret; + }; + imports.wbg.__wbindgen_number_get = function(arg0, arg1) { + const obj = getObject(arg1); + const ret = typeof(obj) === 'number' ? obj : undefined; + getDataViewMemory0().setFloat64(arg0 + 8 * 1, isLikeNone(ret) ? 0 : ret, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, !isLikeNone(ret), true); + }; + imports.wbg.__wbindgen_is_bigint = function(arg0) { + const ret = typeof(getObject(arg0)) === 'bigint'; + return ret; + }; + imports.wbg.__wbindgen_bigint_from_u64 = function(arg0) { + const ret = BigInt.asUintN(64, arg0); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_jsval_eq = function(arg0, arg1) { + const ret = getObject(arg0) === getObject(arg1); + return ret; + }; + imports.wbg.__wbindgen_boolean_get = function(arg0) { + const v = getObject(arg0); + const ret = typeof(v) === 'boolean' ? (v ? 1 : 0) : 2; + return ret; + }; + imports.wbg.__wbg_new_abda76e883ba8a5f = function() { + const ret = new Error(); + return addHeapObject(ret); + }; + imports.wbg.__wbg_stack_658279fe44541cf6 = function(arg0, arg1) { + const ret = getObject(arg1).stack; + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }; + imports.wbg.__wbg_error_f851667af71bcfc6 = function(arg0, arg1) { + let deferred0_0; + let deferred0_1; + try { + deferred0_0 = arg0; + deferred0_1 = arg1; + console.error(getStringFromWasm0(arg0, arg1)); + } finally { + wasm.__wbindgen_free(deferred0_0, deferred0_1, 1); + } + }; + imports.wbg.__wbg_mark_f0616123624944ec = function(arg0, arg1) { + performance.mark(getStringFromWasm0(arg0, arg1)); + }; + imports.wbg.__wbg_log_914e3639af348b4e = function(arg0, arg1) { + let deferred0_0; + let deferred0_1; + try { + deferred0_0 = arg0; + deferred0_1 = arg1; + console.log(getStringFromWasm0(arg0, arg1)); + } finally { + wasm.__wbindgen_free(deferred0_0, deferred0_1, 1); + } + }; + imports.wbg.__wbg_log_12b4ba535cbd9499 = function(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7) { + let deferred0_0; + let deferred0_1; + try { + deferred0_0 = arg0; + deferred0_1 = arg1; + console.log(getStringFromWasm0(arg0, arg1), getStringFromWasm0(arg2, arg3), getStringFromWasm0(arg4, arg5), getStringFromWasm0(arg6, arg7)); + } finally { + wasm.__wbindgen_free(deferred0_0, deferred0_1, 1); + } + }; + imports.wbg.__wbg_measure_a990198e921c09fd = function() { return handleError(function (arg0, arg1, arg2, arg3) { + let deferred0_0; + let deferred0_1; + let deferred1_0; + let deferred1_1; + try { + deferred0_0 = arg0; + deferred0_1 = arg1; + deferred1_0 = arg2; + deferred1_1 = arg3; + performance.measure(getStringFromWasm0(arg0, arg1), getStringFromWasm0(arg2, arg3)); + } finally { + wasm.__wbindgen_free(deferred0_0, deferred0_1, 1); + wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); + } + }, arguments) }; + imports.wbg.__wbindgen_is_function = function(arg0) { + const ret = typeof(getObject(arg0)) === 'function'; + return ret; + }; + imports.wbg.__wbindgen_jsval_loose_eq = function(arg0, arg1) { + const ret = getObject(arg0) == getObject(arg1); + return ret; + }; + imports.wbg.__wbindgen_as_number = function(arg0) { + const ret = +getObject(arg0); + return ret; + }; + imports.wbg.__wbg_String_b9412f8799faab3e = function(arg0, arg1) { + const ret = String(getObject(arg1)); + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }; + imports.wbg.__wbindgen_number_new = function(arg0) { + const ret = arg0; + return addHeapObject(ret); + }; + imports.wbg.__wbg_getwithrefkey_edc2c8960f0f1191 = function(arg0, arg1) { + const ret = getObject(arg0)[getObject(arg1)]; + return addHeapObject(ret); + }; + imports.wbg.__wbg_set_f975102236d3c502 = function(arg0, arg1, arg2) { + getObject(arg0)[takeObject(arg1)] = takeObject(arg2); + }; + imports.wbg.__wbg_call_1084a111329e68ce = function() { return handleError(function (arg0, arg1) { + const ret = getObject(arg0).call(getObject(arg1)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_get_3baa728f9d58d3f6 = function(arg0, arg1) { + const ret = getObject(arg0)[arg1 >>> 0]; + return addHeapObject(ret); + }; + imports.wbg.__wbg_length_ae22078168b726f5 = function(arg0) { + const ret = getObject(arg0).length; + return ret; + }; + imports.wbg.__wbg_new_a220cf903aa02ca2 = function() { + const ret = new Array(); + return addHeapObject(ret); + }; + imports.wbg.__wbg_next_de3e9db4440638b2 = function(arg0) { + const ret = getObject(arg0).next; + return addHeapObject(ret); + }; + imports.wbg.__wbg_next_f9cb570345655b9a = function() { return handleError(function (arg0) { + const ret = getObject(arg0).next(); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_done_bfda7aa8f252b39f = function(arg0) { + const ret = getObject(arg0).done; + return ret; + }; + imports.wbg.__wbg_value_6d39332ab4788d86 = function(arg0) { + const ret = getObject(arg0).value; + return addHeapObject(ret); + }; + imports.wbg.__wbg_iterator_888179a48810a9fe = function() { + const ret = Symbol.iterator; + return addHeapObject(ret); + }; + imports.wbg.__wbg_get_224d16597dbbfd96 = function() { return handleError(function (arg0, arg1) { + const ret = Reflect.get(getObject(arg0), getObject(arg1)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_new_525245e2b9901204 = function() { + const ret = new Object(); + return addHeapObject(ret); + }; + imports.wbg.__wbg_set_673dda6c73d19609 = function(arg0, arg1, arg2) { + getObject(arg0)[arg1 >>> 0] = takeObject(arg2); + }; + imports.wbg.__wbg_isArray_8364a5371e9737d8 = function(arg0) { + const ret = Array.isArray(getObject(arg0)); + return ret; + }; + imports.wbg.__wbg_instanceof_ArrayBuffer_61dfc3198373c902 = function(arg0) { + let result; + try { + result = getObject(arg0) instanceof ArrayBuffer; + } catch (_) { + result = false; + } + const ret = result; + return ret; + }; + imports.wbg.__wbg_isSafeInteger_7f1ed56200d90674 = function(arg0) { + const ret = Number.isSafeInteger(getObject(arg0)); + return ret; + }; + imports.wbg.__wbg_entries_7a0e06255456ebcd = function(arg0) { + const ret = Object.entries(getObject(arg0)); + return addHeapObject(ret); + }; + imports.wbg.__wbg_buffer_b7b08af79b0b0974 = function(arg0) { + const ret = getObject(arg0).buffer; + return addHeapObject(ret); + }; + imports.wbg.__wbg_new_ea1883e1e5e86686 = function(arg0) { + const ret = new Uint8Array(getObject(arg0)); + return addHeapObject(ret); + }; + imports.wbg.__wbg_set_d1e79e2388520f18 = function(arg0, arg1, arg2) { + getObject(arg0).set(getObject(arg1), arg2 >>> 0); + }; + imports.wbg.__wbg_length_8339fcf5d8ecd12e = function(arg0) { + const ret = getObject(arg0).length; + return ret; + }; + imports.wbg.__wbg_instanceof_Uint8Array_247a91427532499e = function(arg0) { + let result; + try { + result = getObject(arg0) instanceof Uint8Array; + } catch (_) { + result = false; + } + const ret = result; + return ret; + }; + imports.wbg.__wbindgen_bigint_get_as_i64 = function(arg0, arg1) { + const v = getObject(arg1); + const ret = typeof(v) === 'bigint' ? v : undefined; + getDataViewMemory0().setBigInt64(arg0 + 8 * 1, isLikeNone(ret) ? BigInt(0) : ret, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, !isLikeNone(ret), true); + }; + imports.wbg.__wbindgen_debug_string = function(arg0, arg1) { + const ret = debugString(getObject(arg1)); + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }; + imports.wbg.__wbindgen_throw = function(arg0, arg1) { + throw new Error(getStringFromWasm0(arg0, arg1)); + }; + imports.wbg.__wbindgen_memory = function() { + const ret = wasm.memory; + return addHeapObject(ret); + }; + + return imports; +} + +function __wbg_init_memory(imports, memory) { + +} + +function __wbg_finalize_init(instance, module) { + wasm = instance.exports; + __wbg_init.__wbindgen_wasm_module = module; + cachedDataViewMemory0 = null; + cachedUint8ArrayMemory0 = null; + + + wasm.__wbindgen_start(); + return wasm; +} + +function initSync(module) { + if (wasm !== undefined) return wasm; + + + if (typeof module !== 'undefined' && Object.getPrototypeOf(module) === Object.prototype) + ({module} = module) + else + console.warn('using deprecated parameters for `initSync()`; pass a single object instead') + + const imports = __wbg_get_imports(); + + __wbg_init_memory(imports); + + if (!(module instanceof WebAssembly.Module)) { + module = new WebAssembly.Module(module); + } + + const instance = new WebAssembly.Instance(module, imports); + + return __wbg_finalize_init(instance, module); +} + +async function __wbg_init(module_or_path) { + if (wasm !== undefined) return wasm; + + + if (typeof module_or_path !== 'undefined' && Object.getPrototypeOf(module_or_path) === Object.prototype) + ({module_or_path} = module_or_path) + else + console.warn('using deprecated parameters for the initialization function; pass a single object instead') + + if (typeof module_or_path === 'undefined') { + module_or_path = new URL('changepoint_bg.wasm', import.meta.url); + } + const imports = __wbg_get_imports(); + + if (typeof module_or_path === 'string' || (typeof Request === 'function' && module_or_path instanceof Request) || (typeof URL === 'function' && module_or_path instanceof URL)) { + module_or_path = fetch(module_or_path); + } + + __wbg_init_memory(imports); + + const { instance, module } = await __wbg_load(await module_or_path, imports); + + return __wbg_finalize_init(instance, module); +} + +export { initSync }; +export default __wbg_init; diff --git a/demo/dist/@bsull/augurs/changepoint_bg.wasm b/demo/dist/@bsull/augurs/changepoint_bg.wasm new file mode 100644 index 0000000..d8b272d Binary files /dev/null and b/demo/dist/@bsull/augurs/changepoint_bg.wasm differ diff --git a/demo/dist/@bsull/augurs/changepoint_bg.wasm.d.ts b/demo/dist/@bsull/augurs/changepoint_bg.wasm.d.ts new file mode 100644 index 0000000..ce9ecc8 --- /dev/null +++ b/demo/dist/@bsull/augurs/changepoint_bg.wasm.d.ts @@ -0,0 +1,16 @@ +/* tslint:disable */ +/* eslint-disable */ +export const memory: WebAssembly.Memory; +export function __wbg_changepointdetector_free(a: number, b: number): void; +export function changepointdetector_new(a: number, b: number): void; +export function changepointdetector_normalGamma(a: number, b: number): void; +export function changepointdetector_defaultArgpcp(a: number, b: number): void; +export function changepointdetector_detectChangepoints(a: number, b: number, c: number): void; +export function initLogging(a: number, b: number): void; +export function custom_init(): void; +export function __wbindgen_malloc(a: number, b: number): number; +export function __wbindgen_realloc(a: number, b: number, c: number, d: number): number; +export function __wbindgen_add_to_stack_pointer(a: number): number; +export function __wbindgen_free(a: number, b: number, c: number): void; +export function __wbindgen_exn_store(a: number): void; +export function __wbindgen_start(): void; diff --git a/demo/dist/@bsull/augurs/clustering.d.ts b/demo/dist/@bsull/augurs/clustering.d.ts new file mode 100644 index 0000000..3f5c3a2 --- /dev/null +++ b/demo/dist/@bsull/augurs/clustering.d.ts @@ -0,0 +1,177 @@ +/* tslint:disable */ +/* eslint-disable */ +/** +* Initialize logging. +* +* You can use this to emit logs from augurs to the browser console. +* The default is to log everything to the console, but you can +* change the log level and whether logs are emitted to the console +* or to the browser's performance timeline. +* +* IMPORTANT: this function should only be called once. It will throw +* an exception if called more than once. +* @param {LogConfig | undefined} [config] +*/ +export function initLogging(config?: LogConfig): void; +/** +* Initialize the logger and panic hook. +* +* This will be called automatically when the module is imported. +* It sets the default tracing subscriber to `tracing-wasm`, and +* sets WASM panics to print to the console with a helpful error +* message. +*/ +export function custom_init(): void; +/** + * Options for the dynamic time warping calculation. + */ +export interface DbscanOptions { + /** + * The maximum distance between two samples for one to be considered as in the + * neighborhood of the other. + */ + epsilon: number; + /** + * The number of samples in a neighborhood for a point to be considered as a core + * point. + */ + minClusterSize: number; +} + +/** + * The maximum log level to emit. + * + * The default is `Level::Info`. + */ +export type Level = "trace" | "debug" | "info" | "warn" | "error"; + +/** + * The target for augurs log events. + */ +export type LogTarget = "console" | "performance"; + +/** + * Log configuration. + */ +export interface LogConfig { + /** + * The maximum log level to emit. + * + * Defaults to `INFO`. + */ + maxLevel?: Level; + /** + * The target for augurs log events. + * + * Defaults to logging to the browser console. + */ + target?: LogTarget; + /** + * Whether to emit coloured logs. + * + * Defaults to `true`. + */ + color?: boolean; + /** + * Whether to show detailed fields such as augurs\' file names and line numbers + * in the logs. + * + * Probably not wise in production. + * + * Defaults to `false`. + */ + showDetailedFields?: boolean; +} + +/** + * Forecast intervals. + */ +export interface ForecastIntervals { + /** + * The confidence level for the intervals. + */ + level: number; + /** + * The lower prediction intervals. + */ + lower: number[]; + /** + * The upper prediction intervals. + */ + upper: number[]; +} + +/** + * A forecast containing point forecasts and, optionally, prediction intervals. + */ +export interface Forecast { + /** + * The point forecasts. + */ + point: number[]; + /** + * The forecast intervals, if requested and supported + * by the trend model. + */ + intervals: ForecastIntervals | undefined; +} + +/** +* A DBSCAN clustering algorithm. +*/ +export class DbscanClusterer { + free(): void; +/** +* Create a new DBSCAN instance. +* @param {DbscanOptions} opts +*/ + constructor(opts: DbscanOptions); +/** +* Fit the DBSCAN clustering algorithm to the given distance matrix. +* +* The distance matrix can be obtained using the `Dtw` class. +* +* The return value is an `Int32Array` of cluster IDs, with `-1` indicating noise. +* @param {number[][] | Float64Array[]} distanceMatrix +* @returns {Int32Array} +*/ + fit(distanceMatrix: number[][] | Float64Array[]): Int32Array; +} + +export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module; + +export interface InitOutput { + readonly memory: WebAssembly.Memory; + readonly __wbg_dbscanclusterer_free: (a: number, b: number) => void; + readonly dbscanclusterer_new: (a: number) => number; + readonly dbscanclusterer_fit: (a: number, b: number, c: number) => void; + readonly initLogging: (a: number, b: number) => void; + readonly custom_init: () => void; + readonly __wbindgen_malloc: (a: number, b: number) => number; + readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number; + readonly __wbindgen_add_to_stack_pointer: (a: number) => number; + readonly __wbindgen_free: (a: number, b: number, c: number) => void; + readonly __wbindgen_exn_store: (a: number) => void; + readonly __wbindgen_start: () => void; +} + +export type SyncInitInput = BufferSource | WebAssembly.Module; +/** +* Instantiates the given `module`, which can either be bytes or +* a precompiled `WebAssembly.Module`. +* +* @param {{ module: SyncInitInput }} module - Passing `SyncInitInput` directly is deprecated. +* +* @returns {InitOutput} +*/ +export function initSync(module: { module: SyncInitInput } | SyncInitInput): InitOutput; + +/** +* If `module_or_path` is {RequestInfo} or {URL}, makes a request and +* for everything else, calls `WebAssembly.instantiate` directly. +* +* @param {{ module_or_path: InitInput | Promise }} module_or_path - Passing `InitInput` directly is deprecated. +* +* @returns {Promise} +*/ +export default function __wbg_init (module_or_path?: { module_or_path: InitInput | Promise } | InitInput | Promise): Promise; diff --git a/demo/dist/@bsull/augurs/clustering.js b/demo/dist/@bsull/augurs/clustering.js new file mode 100644 index 0000000..5f40d15 --- /dev/null +++ b/demo/dist/@bsull/augurs/clustering.js @@ -0,0 +1,655 @@ +let wasm; + +const cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } ); + +if (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); }; + +let cachedUint8ArrayMemory0 = null; + +function getUint8ArrayMemory0() { + if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) { + cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer); + } + return cachedUint8ArrayMemory0; +} + +function getStringFromWasm0(ptr, len) { + ptr = ptr >>> 0; + return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len)); +} + +const heap = new Array(128).fill(undefined); + +heap.push(undefined, null, true, false); + +let heap_next = heap.length; + +function addHeapObject(obj) { + if (heap_next === heap.length) heap.push(heap.length + 1); + const idx = heap_next; + heap_next = heap[idx]; + + heap[idx] = obj; + return idx; +} + +function getObject(idx) { return heap[idx]; } + +function dropObject(idx) { + if (idx < 132) return; + heap[idx] = heap_next; + heap_next = idx; +} + +function takeObject(idx) { + const ret = getObject(idx); + dropObject(idx); + return ret; +} + +function isLikeNone(x) { + return x === undefined || x === null; +} + +let cachedDataViewMemory0 = null; + +function getDataViewMemory0() { + if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer.detached === true || (cachedDataViewMemory0.buffer.detached === undefined && cachedDataViewMemory0.buffer !== wasm.memory.buffer)) { + cachedDataViewMemory0 = new DataView(wasm.memory.buffer); + } + return cachedDataViewMemory0; +} + +let WASM_VECTOR_LEN = 0; + +const cachedTextEncoder = (typeof TextEncoder !== 'undefined' ? new TextEncoder('utf-8') : { encode: () => { throw Error('TextEncoder not available') } } ); + +const encodeString = (typeof cachedTextEncoder.encodeInto === 'function' + ? function (arg, view) { + return cachedTextEncoder.encodeInto(arg, view); +} + : function (arg, view) { + const buf = cachedTextEncoder.encode(arg); + view.set(buf); + return { + read: arg.length, + written: buf.length + }; +}); + +function passStringToWasm0(arg, malloc, realloc) { + + if (realloc === undefined) { + const buf = cachedTextEncoder.encode(arg); + const ptr = malloc(buf.length, 1) >>> 0; + getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf); + WASM_VECTOR_LEN = buf.length; + return ptr; + } + + let len = arg.length; + let ptr = malloc(len, 1) >>> 0; + + const mem = getUint8ArrayMemory0(); + + let offset = 0; + + for (; offset < len; offset++) { + const code = arg.charCodeAt(offset); + if (code > 0x7F) break; + mem[ptr + offset] = code; + } + + if (offset !== len) { + if (offset !== 0) { + arg = arg.slice(offset); + } + ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; + const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len); + const ret = encodeString(arg, view); + + offset += ret.written; + ptr = realloc(ptr, len, offset, 1) >>> 0; + } + + WASM_VECTOR_LEN = offset; + return ptr; +} + +function debugString(val) { + // primitive types + const type = typeof val; + if (type == 'number' || type == 'boolean' || val == null) { + return `${val}`; + } + if (type == 'string') { + return `"${val}"`; + } + if (type == 'symbol') { + const description = val.description; + if (description == null) { + return 'Symbol'; + } else { + return `Symbol(${description})`; + } + } + if (type == 'function') { + const name = val.name; + if (typeof name == 'string' && name.length > 0) { + return `Function(${name})`; + } else { + return 'Function'; + } + } + // objects + if (Array.isArray(val)) { + const length = val.length; + let debug = '['; + if (length > 0) { + debug += debugString(val[0]); + } + for(let i = 1; i < length; i++) { + debug += ', ' + debugString(val[i]); + } + debug += ']'; + return debug; + } + // Test for built-in + const builtInMatches = /\[object ([^\]]+)\]/.exec(toString.call(val)); + let className; + if (builtInMatches.length > 1) { + className = builtInMatches[1]; + } else { + // Failed to match the standard '[object ClassName]' + return toString.call(val); + } + if (className == 'Object') { + // we're a user defined class or Object + // JSON.stringify avoids problems with cycles, and is generally much + // easier than looping through ownProperties of `val`. + try { + return 'Object(' + JSON.stringify(val) + ')'; + } catch (_) { + return 'Object'; + } + } + // errors + if (val instanceof Error) { + return `${val.name}: ${val.message}\n${val.stack}`; + } + // TODO we could test for more things here, like `Set`s and `Map`s. + return className; +} + +let cachedInt32ArrayMemory0 = null; + +function getInt32ArrayMemory0() { + if (cachedInt32ArrayMemory0 === null || cachedInt32ArrayMemory0.byteLength === 0) { + cachedInt32ArrayMemory0 = new Int32Array(wasm.memory.buffer); + } + return cachedInt32ArrayMemory0; +} + +function getArrayI32FromWasm0(ptr, len) { + ptr = ptr >>> 0; + return getInt32ArrayMemory0().subarray(ptr / 4, ptr / 4 + len); +} +/** +* Initialize logging. +* +* You can use this to emit logs from augurs to the browser console. +* The default is to log everything to the console, but you can +* change the log level and whether logs are emitted to the console +* or to the browser's performance timeline. +* +* IMPORTANT: this function should only be called once. It will throw +* an exception if called more than once. +* @param {LogConfig | undefined} [config] +*/ +export function initLogging(config) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.initLogging(retptr, isLikeNone(config) ? 0 : addHeapObject(config)); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + if (r1) { + throw takeObject(r0); + } + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +} + +/** +* Initialize the logger and panic hook. +* +* This will be called automatically when the module is imported. +* It sets the default tracing subscriber to `tracing-wasm`, and +* sets WASM panics to print to the console with a helpful error +* message. +*/ +export function custom_init() { + wasm.custom_init(); +} + +function handleError(f, args) { + try { + return f.apply(this, args); + } catch (e) { + wasm.__wbindgen_exn_store(addHeapObject(e)); + } +} + +const DbscanClustererFinalization = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(ptr => wasm.__wbg_dbscanclusterer_free(ptr >>> 0, 1)); +/** +* A DBSCAN clustering algorithm. +*/ +export class DbscanClusterer { + + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + DbscanClustererFinalization.unregister(this); + return ptr; + } + + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_dbscanclusterer_free(ptr, 0); + } + /** + * Create a new DBSCAN instance. + * @param {DbscanOptions} opts + */ + constructor(opts) { + const ret = wasm.dbscanclusterer_new(addHeapObject(opts)); + this.__wbg_ptr = ret >>> 0; + DbscanClustererFinalization.register(this, this.__wbg_ptr, this); + return this; + } + /** + * Fit the DBSCAN clustering algorithm to the given distance matrix. + * + * The distance matrix can be obtained using the `Dtw` class. + * + * The return value is an `Int32Array` of cluster IDs, with `-1` indicating noise. + * @param {number[][] | Float64Array[]} distanceMatrix + * @returns {Int32Array} + */ + fit(distanceMatrix) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.dbscanclusterer_fit(retptr, this.__wbg_ptr, addHeapObject(distanceMatrix)); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true); + var r3 = getDataViewMemory0().getInt32(retptr + 4 * 3, true); + if (r3) { + throw takeObject(r2); + } + var v1 = getArrayI32FromWasm0(r0, r1).slice(); + wasm.__wbindgen_free(r0, r1 * 4, 4); + return v1; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } +} + +async function __wbg_load(module, imports) { + if (typeof Response === 'function' && module instanceof Response) { + if (typeof WebAssembly.instantiateStreaming === 'function') { + try { + return await WebAssembly.instantiateStreaming(module, imports); + + } catch (e) { + if (module.headers.get('Content-Type') != 'application/wasm') { + console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e); + + } else { + throw e; + } + } + } + + const bytes = await module.arrayBuffer(); + return await WebAssembly.instantiate(bytes, imports); + + } else { + const instance = await WebAssembly.instantiate(module, imports); + + if (instance instanceof WebAssembly.Instance) { + return { instance, module }; + + } else { + return instance; + } + } +} + +function __wbg_get_imports() { + const imports = {}; + imports.wbg = {}; + imports.wbg.__wbindgen_error_new = function(arg0, arg1) { + const ret = new Error(getStringFromWasm0(arg0, arg1)); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_is_object = function(arg0) { + const val = getObject(arg0); + const ret = typeof(val) === 'object' && val !== null; + return ret; + }; + imports.wbg.__wbindgen_is_undefined = function(arg0) { + const ret = getObject(arg0) === undefined; + return ret; + }; + imports.wbg.__wbindgen_in = function(arg0, arg1) { + const ret = getObject(arg0) in getObject(arg1); + return ret; + }; + imports.wbg.__wbindgen_object_drop_ref = function(arg0) { + takeObject(arg0); + }; + imports.wbg.__wbindgen_number_get = function(arg0, arg1) { + const obj = getObject(arg1); + const ret = typeof(obj) === 'number' ? obj : undefined; + getDataViewMemory0().setFloat64(arg0 + 8 * 1, isLikeNone(ret) ? 0 : ret, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, !isLikeNone(ret), true); + }; + imports.wbg.__wbindgen_is_bigint = function(arg0) { + const ret = typeof(getObject(arg0)) === 'bigint'; + return ret; + }; + imports.wbg.__wbindgen_bigint_from_u64 = function(arg0) { + const ret = BigInt.asUintN(64, arg0); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_jsval_eq = function(arg0, arg1) { + const ret = getObject(arg0) === getObject(arg1); + return ret; + }; + imports.wbg.__wbindgen_object_clone_ref = function(arg0) { + const ret = getObject(arg0); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_is_string = function(arg0) { + const ret = typeof(getObject(arg0)) === 'string'; + return ret; + }; + imports.wbg.__wbindgen_string_get = function(arg0, arg1) { + const obj = getObject(arg1); + const ret = typeof(obj) === 'string' ? obj : undefined; + var ptr1 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + var len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }; + imports.wbg.__wbindgen_boolean_get = function(arg0) { + const v = getObject(arg0); + const ret = typeof(v) === 'boolean' ? (v ? 1 : 0) : 2; + return ret; + }; + imports.wbg.__wbg_new_abda76e883ba8a5f = function() { + const ret = new Error(); + return addHeapObject(ret); + }; + imports.wbg.__wbg_stack_658279fe44541cf6 = function(arg0, arg1) { + const ret = getObject(arg1).stack; + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }; + imports.wbg.__wbg_error_f851667af71bcfc6 = function(arg0, arg1) { + let deferred0_0; + let deferred0_1; + try { + deferred0_0 = arg0; + deferred0_1 = arg1; + console.error(getStringFromWasm0(arg0, arg1)); + } finally { + wasm.__wbindgen_free(deferred0_0, deferred0_1, 1); + } + }; + imports.wbg.__wbg_mark_f0616123624944ec = function(arg0, arg1) { + performance.mark(getStringFromWasm0(arg0, arg1)); + }; + imports.wbg.__wbg_log_914e3639af348b4e = function(arg0, arg1) { + let deferred0_0; + let deferred0_1; + try { + deferred0_0 = arg0; + deferred0_1 = arg1; + console.log(getStringFromWasm0(arg0, arg1)); + } finally { + wasm.__wbindgen_free(deferred0_0, deferred0_1, 1); + } + }; + imports.wbg.__wbg_log_12b4ba535cbd9499 = function(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7) { + let deferred0_0; + let deferred0_1; + try { + deferred0_0 = arg0; + deferred0_1 = arg1; + console.log(getStringFromWasm0(arg0, arg1), getStringFromWasm0(arg2, arg3), getStringFromWasm0(arg4, arg5), getStringFromWasm0(arg6, arg7)); + } finally { + wasm.__wbindgen_free(deferred0_0, deferred0_1, 1); + } + }; + imports.wbg.__wbg_measure_a990198e921c09fd = function() { return handleError(function (arg0, arg1, arg2, arg3) { + let deferred0_0; + let deferred0_1; + let deferred1_0; + let deferred1_1; + try { + deferred0_0 = arg0; + deferred0_1 = arg1; + deferred1_0 = arg2; + deferred1_1 = arg3; + performance.measure(getStringFromWasm0(arg0, arg1), getStringFromWasm0(arg2, arg3)); + } finally { + wasm.__wbindgen_free(deferred0_0, deferred0_1, 1); + wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); + } + }, arguments) }; + imports.wbg.__wbindgen_jsval_loose_eq = function(arg0, arg1) { + const ret = getObject(arg0) == getObject(arg1); + return ret; + }; + imports.wbg.__wbindgen_as_number = function(arg0) { + const ret = +getObject(arg0); + return ret; + }; + imports.wbg.__wbg_String_b9412f8799faab3e = function(arg0, arg1) { + const ret = String(getObject(arg1)); + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }; + imports.wbg.__wbindgen_string_new = function(arg0, arg1) { + const ret = getStringFromWasm0(arg0, arg1); + return addHeapObject(ret); + }; + imports.wbg.__wbg_getwithrefkey_edc2c8960f0f1191 = function(arg0, arg1) { + const ret = getObject(arg0)[getObject(arg1)]; + return addHeapObject(ret); + }; + imports.wbg.__wbg_call_1084a111329e68ce = function() { return handleError(function (arg0, arg1) { + const ret = getObject(arg0).call(getObject(arg1)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_get_3baa728f9d58d3f6 = function(arg0, arg1) { + const ret = getObject(arg0)[arg1 >>> 0]; + return addHeapObject(ret); + }; + imports.wbg.__wbg_length_ae22078168b726f5 = function(arg0) { + const ret = getObject(arg0).length; + return ret; + }; + imports.wbg.__wbindgen_is_function = function(arg0) { + const ret = typeof(getObject(arg0)) === 'function'; + return ret; + }; + imports.wbg.__wbg_next_de3e9db4440638b2 = function(arg0) { + const ret = getObject(arg0).next; + return addHeapObject(ret); + }; + imports.wbg.__wbg_next_f9cb570345655b9a = function() { return handleError(function (arg0) { + const ret = getObject(arg0).next(); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_done_bfda7aa8f252b39f = function(arg0) { + const ret = getObject(arg0).done; + return ret; + }; + imports.wbg.__wbg_value_6d39332ab4788d86 = function(arg0) { + const ret = getObject(arg0).value; + return addHeapObject(ret); + }; + imports.wbg.__wbg_iterator_888179a48810a9fe = function() { + const ret = Symbol.iterator; + return addHeapObject(ret); + }; + imports.wbg.__wbg_get_224d16597dbbfd96 = function() { return handleError(function (arg0, arg1) { + const ret = Reflect.get(getObject(arg0), getObject(arg1)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_isArray_8364a5371e9737d8 = function(arg0) { + const ret = Array.isArray(getObject(arg0)); + return ret; + }; + imports.wbg.__wbg_instanceof_ArrayBuffer_61dfc3198373c902 = function(arg0) { + let result; + try { + result = getObject(arg0) instanceof ArrayBuffer; + } catch (_) { + result = false; + } + const ret = result; + return ret; + }; + imports.wbg.__wbg_isSafeInteger_7f1ed56200d90674 = function(arg0) { + const ret = Number.isSafeInteger(getObject(arg0)); + return ret; + }; + imports.wbg.__wbg_entries_7a0e06255456ebcd = function(arg0) { + const ret = Object.entries(getObject(arg0)); + return addHeapObject(ret); + }; + imports.wbg.__wbg_buffer_b7b08af79b0b0974 = function(arg0) { + const ret = getObject(arg0).buffer; + return addHeapObject(ret); + }; + imports.wbg.__wbg_new_ea1883e1e5e86686 = function(arg0) { + const ret = new Uint8Array(getObject(arg0)); + return addHeapObject(ret); + }; + imports.wbg.__wbg_set_d1e79e2388520f18 = function(arg0, arg1, arg2) { + getObject(arg0).set(getObject(arg1), arg2 >>> 0); + }; + imports.wbg.__wbg_length_8339fcf5d8ecd12e = function(arg0) { + const ret = getObject(arg0).length; + return ret; + }; + imports.wbg.__wbg_instanceof_Uint8Array_247a91427532499e = function(arg0) { + let result; + try { + result = getObject(arg0) instanceof Uint8Array; + } catch (_) { + result = false; + } + const ret = result; + return ret; + }; + imports.wbg.__wbindgen_bigint_get_as_i64 = function(arg0, arg1) { + const v = getObject(arg1); + const ret = typeof(v) === 'bigint' ? v : undefined; + getDataViewMemory0().setBigInt64(arg0 + 8 * 1, isLikeNone(ret) ? BigInt(0) : ret, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, !isLikeNone(ret), true); + }; + imports.wbg.__wbindgen_debug_string = function(arg0, arg1) { + const ret = debugString(getObject(arg1)); + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }; + imports.wbg.__wbindgen_throw = function(arg0, arg1) { + throw new Error(getStringFromWasm0(arg0, arg1)); + }; + imports.wbg.__wbindgen_memory = function() { + const ret = wasm.memory; + return addHeapObject(ret); + }; + + return imports; +} + +function __wbg_init_memory(imports, memory) { + +} + +function __wbg_finalize_init(instance, module) { + wasm = instance.exports; + __wbg_init.__wbindgen_wasm_module = module; + cachedDataViewMemory0 = null; + cachedInt32ArrayMemory0 = null; + cachedUint8ArrayMemory0 = null; + + + wasm.__wbindgen_start(); + return wasm; +} + +function initSync(module) { + if (wasm !== undefined) return wasm; + + + if (typeof module !== 'undefined' && Object.getPrototypeOf(module) === Object.prototype) + ({module} = module) + else + console.warn('using deprecated parameters for `initSync()`; pass a single object instead') + + const imports = __wbg_get_imports(); + + __wbg_init_memory(imports); + + if (!(module instanceof WebAssembly.Module)) { + module = new WebAssembly.Module(module); + } + + const instance = new WebAssembly.Instance(module, imports); + + return __wbg_finalize_init(instance, module); +} + +async function __wbg_init(module_or_path) { + if (wasm !== undefined) return wasm; + + + if (typeof module_or_path !== 'undefined' && Object.getPrototypeOf(module_or_path) === Object.prototype) + ({module_or_path} = module_or_path) + else + console.warn('using deprecated parameters for the initialization function; pass a single object instead') + + if (typeof module_or_path === 'undefined') { + module_or_path = new URL('clustering_bg.wasm', import.meta.url); + } + const imports = __wbg_get_imports(); + + if (typeof module_or_path === 'string' || (typeof Request === 'function' && module_or_path instanceof Request) || (typeof URL === 'function' && module_or_path instanceof URL)) { + module_or_path = fetch(module_or_path); + } + + __wbg_init_memory(imports); + + const { instance, module } = await __wbg_load(await module_or_path, imports); + + return __wbg_finalize_init(instance, module); +} + +export { initSync }; +export default __wbg_init; diff --git a/demo/dist/@bsull/augurs/clustering_bg.wasm b/demo/dist/@bsull/augurs/clustering_bg.wasm new file mode 100644 index 0000000..05cbad7 Binary files /dev/null and b/demo/dist/@bsull/augurs/clustering_bg.wasm differ diff --git a/demo/dist/@bsull/augurs/clustering_bg.wasm.d.ts b/demo/dist/@bsull/augurs/clustering_bg.wasm.d.ts new file mode 100644 index 0000000..cf64e67 --- /dev/null +++ b/demo/dist/@bsull/augurs/clustering_bg.wasm.d.ts @@ -0,0 +1,14 @@ +/* tslint:disable */ +/* eslint-disable */ +export const memory: WebAssembly.Memory; +export function __wbg_dbscanclusterer_free(a: number, b: number): void; +export function dbscanclusterer_new(a: number): number; +export function dbscanclusterer_fit(a: number, b: number, c: number): void; +export function initLogging(a: number, b: number): void; +export function custom_init(): void; +export function __wbindgen_malloc(a: number, b: number): number; +export function __wbindgen_realloc(a: number, b: number, c: number, d: number): number; +export function __wbindgen_add_to_stack_pointer(a: number): number; +export function __wbindgen_free(a: number, b: number, c: number): void; +export function __wbindgen_exn_store(a: number): void; +export function __wbindgen_start(): void; diff --git a/demo/dist/@bsull/augurs/core.d.ts b/demo/dist/@bsull/augurs/core.d.ts new file mode 100644 index 0000000..db4b296 --- /dev/null +++ b/demo/dist/@bsull/augurs/core.d.ts @@ -0,0 +1,137 @@ +/* tslint:disable */ +/* eslint-disable */ +/** +* Initialize logging. +* +* You can use this to emit logs from augurs to the browser console. +* The default is to log everything to the console, but you can +* change the log level and whether logs are emitted to the console +* or to the browser's performance timeline. +* +* IMPORTANT: this function should only be called once. It will throw +* an exception if called more than once. +* @param {LogConfig | undefined} [config] +*/ +export function initLogging(config?: LogConfig): void; +/** +* Initialize the logger and panic hook. +* +* This will be called automatically when the module is imported. +* It sets the default tracing subscriber to `tracing-wasm`, and +* sets WASM panics to print to the console with a helpful error +* message. +*/ +export function custom_init(): void; +/** + * The maximum log level to emit. + * + * The default is `Level::Info`. + */ +export type Level = "trace" | "debug" | "info" | "warn" | "error"; + +/** + * The target for augurs log events. + */ +export type LogTarget = "console" | "performance"; + +/** + * Log configuration. + */ +export interface LogConfig { + /** + * The maximum log level to emit. + * + * Defaults to `INFO`. + */ + maxLevel?: Level; + /** + * The target for augurs log events. + * + * Defaults to logging to the browser console. + */ + target?: LogTarget; + /** + * Whether to emit coloured logs. + * + * Defaults to `true`. + */ + color?: boolean; + /** + * Whether to show detailed fields such as augurs\' file names and line numbers + * in the logs. + * + * Probably not wise in production. + * + * Defaults to `false`. + */ + showDetailedFields?: boolean; +} + +/** + * Forecast intervals. + */ +export interface ForecastIntervals { + /** + * The confidence level for the intervals. + */ + level: number; + /** + * The lower prediction intervals. + */ + lower: number[]; + /** + * The upper prediction intervals. + */ + upper: number[]; +} + +/** + * A forecast containing point forecasts and, optionally, prediction intervals. + */ +export interface Forecast { + /** + * The point forecasts. + */ + point: number[]; + /** + * The forecast intervals, if requested and supported + * by the trend model. + */ + intervals: ForecastIntervals | undefined; +} + + +export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module; + +export interface InitOutput { + readonly memory: WebAssembly.Memory; + readonly initLogging: (a: number, b: number) => void; + readonly custom_init: () => void; + readonly __wbindgen_malloc: (a: number, b: number) => number; + readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number; + readonly __wbindgen_add_to_stack_pointer: (a: number) => number; + readonly __wbindgen_free: (a: number, b: number, c: number) => void; + readonly __wbindgen_exn_store: (a: number) => void; + readonly __wbindgen_start: () => void; +} + +export type SyncInitInput = BufferSource | WebAssembly.Module; +/** +* Instantiates the given `module`, which can either be bytes or +* a precompiled `WebAssembly.Module`. +* +* @param {{ module: SyncInitInput }} module - Passing `SyncInitInput` directly is deprecated. +* +* @returns {InitOutput} +*/ +export function initSync(module: { module: SyncInitInput } | SyncInitInput): InitOutput; + +/** +* If `module_or_path` is {RequestInfo} or {URL}, makes a request and +* for everything else, calls `WebAssembly.instantiate` directly. +* +* @param {{ module_or_path: InitInput | Promise }} module_or_path - Passing `InitInput` directly is deprecated. +* +* @returns {Promise} +*/ +export default function __wbg_init (module_or_path?: { module_or_path: InitInput | Promise } | InitInput | Promise): Promise; diff --git a/demo/dist/@bsull/augurs/core.js b/demo/dist/@bsull/augurs/core.js new file mode 100644 index 0000000..3a48116 --- /dev/null +++ b/demo/dist/@bsull/augurs/core.js @@ -0,0 +1,520 @@ +let wasm; + +const heap = new Array(128).fill(undefined); + +heap.push(undefined, null, true, false); + +function getObject(idx) { return heap[idx]; } + +let heap_next = heap.length; + +function dropObject(idx) { + if (idx < 132) return; + heap[idx] = heap_next; + heap_next = idx; +} + +function takeObject(idx) { + const ret = getObject(idx); + dropObject(idx); + return ret; +} + +const cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } ); + +if (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); }; + +let cachedUint8ArrayMemory0 = null; + +function getUint8ArrayMemory0() { + if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) { + cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer); + } + return cachedUint8ArrayMemory0; +} + +function getStringFromWasm0(ptr, len) { + ptr = ptr >>> 0; + return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len)); +} + +function addHeapObject(obj) { + if (heap_next === heap.length) heap.push(heap.length + 1); + const idx = heap_next; + heap_next = heap[idx]; + + heap[idx] = obj; + return idx; +} + +function isLikeNone(x) { + return x === undefined || x === null; +} + +let cachedDataViewMemory0 = null; + +function getDataViewMemory0() { + if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer.detached === true || (cachedDataViewMemory0.buffer.detached === undefined && cachedDataViewMemory0.buffer !== wasm.memory.buffer)) { + cachedDataViewMemory0 = new DataView(wasm.memory.buffer); + } + return cachedDataViewMemory0; +} + +let WASM_VECTOR_LEN = 0; + +const cachedTextEncoder = (typeof TextEncoder !== 'undefined' ? new TextEncoder('utf-8') : { encode: () => { throw Error('TextEncoder not available') } } ); + +const encodeString = (typeof cachedTextEncoder.encodeInto === 'function' + ? function (arg, view) { + return cachedTextEncoder.encodeInto(arg, view); +} + : function (arg, view) { + const buf = cachedTextEncoder.encode(arg); + view.set(buf); + return { + read: arg.length, + written: buf.length + }; +}); + +function passStringToWasm0(arg, malloc, realloc) { + + if (realloc === undefined) { + const buf = cachedTextEncoder.encode(arg); + const ptr = malloc(buf.length, 1) >>> 0; + getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf); + WASM_VECTOR_LEN = buf.length; + return ptr; + } + + let len = arg.length; + let ptr = malloc(len, 1) >>> 0; + + const mem = getUint8ArrayMemory0(); + + let offset = 0; + + for (; offset < len; offset++) { + const code = arg.charCodeAt(offset); + if (code > 0x7F) break; + mem[ptr + offset] = code; + } + + if (offset !== len) { + if (offset !== 0) { + arg = arg.slice(offset); + } + ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; + const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len); + const ret = encodeString(arg, view); + + offset += ret.written; + ptr = realloc(ptr, len, offset, 1) >>> 0; + } + + WASM_VECTOR_LEN = offset; + return ptr; +} + +function debugString(val) { + // primitive types + const type = typeof val; + if (type == 'number' || type == 'boolean' || val == null) { + return `${val}`; + } + if (type == 'string') { + return `"${val}"`; + } + if (type == 'symbol') { + const description = val.description; + if (description == null) { + return 'Symbol'; + } else { + return `Symbol(${description})`; + } + } + if (type == 'function') { + const name = val.name; + if (typeof name == 'string' && name.length > 0) { + return `Function(${name})`; + } else { + return 'Function'; + } + } + // objects + if (Array.isArray(val)) { + const length = val.length; + let debug = '['; + if (length > 0) { + debug += debugString(val[0]); + } + for(let i = 1; i < length; i++) { + debug += ', ' + debugString(val[i]); + } + debug += ']'; + return debug; + } + // Test for built-in + const builtInMatches = /\[object ([^\]]+)\]/.exec(toString.call(val)); + let className; + if (builtInMatches.length > 1) { + className = builtInMatches[1]; + } else { + // Failed to match the standard '[object ClassName]' + return toString.call(val); + } + if (className == 'Object') { + // we're a user defined class or Object + // JSON.stringify avoids problems with cycles, and is generally much + // easier than looping through ownProperties of `val`. + try { + return 'Object(' + JSON.stringify(val) + ')'; + } catch (_) { + return 'Object'; + } + } + // errors + if (val instanceof Error) { + return `${val.name}: ${val.message}\n${val.stack}`; + } + // TODO we could test for more things here, like `Set`s and `Map`s. + return className; +} +/** +* Initialize logging. +* +* You can use this to emit logs from augurs to the browser console. +* The default is to log everything to the console, but you can +* change the log level and whether logs are emitted to the console +* or to the browser's performance timeline. +* +* IMPORTANT: this function should only be called once. It will throw +* an exception if called more than once. +* @param {LogConfig | undefined} [config] +*/ +export function initLogging(config) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.initLogging(retptr, isLikeNone(config) ? 0 : addHeapObject(config)); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + if (r1) { + throw takeObject(r0); + } + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +} + +/** +* Initialize the logger and panic hook. +* +* This will be called automatically when the module is imported. +* It sets the default tracing subscriber to `tracing-wasm`, and +* sets WASM panics to print to the console with a helpful error +* message. +*/ +export function custom_init() { + wasm.custom_init(); +} + +function handleError(f, args) { + try { + return f.apply(this, args); + } catch (e) { + wasm.__wbindgen_exn_store(addHeapObject(e)); + } +} + +async function __wbg_load(module, imports) { + if (typeof Response === 'function' && module instanceof Response) { + if (typeof WebAssembly.instantiateStreaming === 'function') { + try { + return await WebAssembly.instantiateStreaming(module, imports); + + } catch (e) { + if (module.headers.get('Content-Type') != 'application/wasm') { + console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e); + + } else { + throw e; + } + } + } + + const bytes = await module.arrayBuffer(); + return await WebAssembly.instantiate(bytes, imports); + + } else { + const instance = await WebAssembly.instantiate(module, imports); + + if (instance instanceof WebAssembly.Instance) { + return { instance, module }; + + } else { + return instance; + } + } +} + +function __wbg_get_imports() { + const imports = {}; + imports.wbg = {}; + imports.wbg.__wbindgen_object_drop_ref = function(arg0) { + takeObject(arg0); + }; + imports.wbg.__wbindgen_error_new = function(arg0, arg1) { + const ret = new Error(getStringFromWasm0(arg0, arg1)); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_number_get = function(arg0, arg1) { + const obj = getObject(arg1); + const ret = typeof(obj) === 'number' ? obj : undefined; + getDataViewMemory0().setFloat64(arg0 + 8 * 1, isLikeNone(ret) ? 0 : ret, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, !isLikeNone(ret), true); + }; + imports.wbg.__wbindgen_is_string = function(arg0) { + const ret = typeof(getObject(arg0)) === 'string'; + return ret; + }; + imports.wbg.__wbindgen_string_get = function(arg0, arg1) { + const obj = getObject(arg1); + const ret = typeof(obj) === 'string' ? obj : undefined; + var ptr1 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + var len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }; + imports.wbg.__wbindgen_object_clone_ref = function(arg0) { + const ret = getObject(arg0); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_is_object = function(arg0) { + const val = getObject(arg0); + const ret = typeof(val) === 'object' && val !== null; + return ret; + }; + imports.wbg.__wbindgen_is_undefined = function(arg0) { + const ret = getObject(arg0) === undefined; + return ret; + }; + imports.wbg.__wbindgen_in = function(arg0, arg1) { + const ret = getObject(arg0) in getObject(arg1); + return ret; + }; + imports.wbg.__wbindgen_boolean_get = function(arg0) { + const v = getObject(arg0); + const ret = typeof(v) === 'boolean' ? (v ? 1 : 0) : 2; + return ret; + }; + imports.wbg.__wbg_new_abda76e883ba8a5f = function() { + const ret = new Error(); + return addHeapObject(ret); + }; + imports.wbg.__wbg_stack_658279fe44541cf6 = function(arg0, arg1) { + const ret = getObject(arg1).stack; + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }; + imports.wbg.__wbg_error_f851667af71bcfc6 = function(arg0, arg1) { + let deferred0_0; + let deferred0_1; + try { + deferred0_0 = arg0; + deferred0_1 = arg1; + console.error(getStringFromWasm0(arg0, arg1)); + } finally { + wasm.__wbindgen_free(deferred0_0, deferred0_1, 1); + } + }; + imports.wbg.__wbg_mark_f0616123624944ec = function(arg0, arg1) { + performance.mark(getStringFromWasm0(arg0, arg1)); + }; + imports.wbg.__wbg_log_914e3639af348b4e = function(arg0, arg1) { + let deferred0_0; + let deferred0_1; + try { + deferred0_0 = arg0; + deferred0_1 = arg1; + console.log(getStringFromWasm0(arg0, arg1)); + } finally { + wasm.__wbindgen_free(deferred0_0, deferred0_1, 1); + } + }; + imports.wbg.__wbg_log_12b4ba535cbd9499 = function(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7) { + let deferred0_0; + let deferred0_1; + try { + deferred0_0 = arg0; + deferred0_1 = arg1; + console.log(getStringFromWasm0(arg0, arg1), getStringFromWasm0(arg2, arg3), getStringFromWasm0(arg4, arg5), getStringFromWasm0(arg6, arg7)); + } finally { + wasm.__wbindgen_free(deferred0_0, deferred0_1, 1); + } + }; + imports.wbg.__wbg_measure_a990198e921c09fd = function() { return handleError(function (arg0, arg1, arg2, arg3) { + let deferred0_0; + let deferred0_1; + let deferred1_0; + let deferred1_1; + try { + deferred0_0 = arg0; + deferred0_1 = arg1; + deferred1_0 = arg2; + deferred1_1 = arg3; + performance.measure(getStringFromWasm0(arg0, arg1), getStringFromWasm0(arg2, arg3)); + } finally { + wasm.__wbindgen_free(deferred0_0, deferred0_1, 1); + wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); + } + }, arguments) }; + imports.wbg.__wbindgen_jsval_loose_eq = function(arg0, arg1) { + const ret = getObject(arg0) == getObject(arg1); + return ret; + }; + imports.wbg.__wbg_String_b9412f8799faab3e = function(arg0, arg1) { + const ret = String(getObject(arg1)); + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }; + imports.wbg.__wbindgen_string_new = function(arg0, arg1) { + const ret = getStringFromWasm0(arg0, arg1); + return addHeapObject(ret); + }; + imports.wbg.__wbg_getwithrefkey_edc2c8960f0f1191 = function(arg0, arg1) { + const ret = getObject(arg0)[getObject(arg1)]; + return addHeapObject(ret); + }; + imports.wbg.__wbg_get_3baa728f9d58d3f6 = function(arg0, arg1) { + const ret = getObject(arg0)[arg1 >>> 0]; + return addHeapObject(ret); + }; + imports.wbg.__wbg_length_ae22078168b726f5 = function(arg0) { + const ret = getObject(arg0).length; + return ret; + }; + imports.wbg.__wbg_instanceof_ArrayBuffer_61dfc3198373c902 = function(arg0) { + let result; + try { + result = getObject(arg0) instanceof ArrayBuffer; + } catch (_) { + result = false; + } + const ret = result; + return ret; + }; + imports.wbg.__wbg_entries_7a0e06255456ebcd = function(arg0) { + const ret = Object.entries(getObject(arg0)); + return addHeapObject(ret); + }; + imports.wbg.__wbg_buffer_b7b08af79b0b0974 = function(arg0) { + const ret = getObject(arg0).buffer; + return addHeapObject(ret); + }; + imports.wbg.__wbg_new_ea1883e1e5e86686 = function(arg0) { + const ret = new Uint8Array(getObject(arg0)); + return addHeapObject(ret); + }; + imports.wbg.__wbg_set_d1e79e2388520f18 = function(arg0, arg1, arg2) { + getObject(arg0).set(getObject(arg1), arg2 >>> 0); + }; + imports.wbg.__wbg_length_8339fcf5d8ecd12e = function(arg0) { + const ret = getObject(arg0).length; + return ret; + }; + imports.wbg.__wbg_instanceof_Uint8Array_247a91427532499e = function(arg0) { + let result; + try { + result = getObject(arg0) instanceof Uint8Array; + } catch (_) { + result = false; + } + const ret = result; + return ret; + }; + imports.wbg.__wbindgen_debug_string = function(arg0, arg1) { + const ret = debugString(getObject(arg1)); + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }; + imports.wbg.__wbindgen_throw = function(arg0, arg1) { + throw new Error(getStringFromWasm0(arg0, arg1)); + }; + imports.wbg.__wbindgen_memory = function() { + const ret = wasm.memory; + return addHeapObject(ret); + }; + + return imports; +} + +function __wbg_init_memory(imports, memory) { + +} + +function __wbg_finalize_init(instance, module) { + wasm = instance.exports; + __wbg_init.__wbindgen_wasm_module = module; + cachedDataViewMemory0 = null; + cachedUint8ArrayMemory0 = null; + + + wasm.__wbindgen_start(); + return wasm; +} + +function initSync(module) { + if (wasm !== undefined) return wasm; + + + if (typeof module !== 'undefined' && Object.getPrototypeOf(module) === Object.prototype) + ({module} = module) + else + console.warn('using deprecated parameters for `initSync()`; pass a single object instead') + + const imports = __wbg_get_imports(); + + __wbg_init_memory(imports); + + if (!(module instanceof WebAssembly.Module)) { + module = new WebAssembly.Module(module); + } + + const instance = new WebAssembly.Instance(module, imports); + + return __wbg_finalize_init(instance, module); +} + +async function __wbg_init(module_or_path) { + if (wasm !== undefined) return wasm; + + + if (typeof module_or_path !== 'undefined' && Object.getPrototypeOf(module_or_path) === Object.prototype) + ({module_or_path} = module_or_path) + else + console.warn('using deprecated parameters for the initialization function; pass a single object instead') + + if (typeof module_or_path === 'undefined') { + module_or_path = new URL('core_bg.wasm', import.meta.url); + } + const imports = __wbg_get_imports(); + + if (typeof module_or_path === 'string' || (typeof Request === 'function' && module_or_path instanceof Request) || (typeof URL === 'function' && module_or_path instanceof URL)) { + module_or_path = fetch(module_or_path); + } + + __wbg_init_memory(imports); + + const { instance, module } = await __wbg_load(await module_or_path, imports); + + return __wbg_finalize_init(instance, module); +} + +export { initSync }; +export default __wbg_init; diff --git a/demo/dist/@bsull/augurs/core_bg.wasm b/demo/dist/@bsull/augurs/core_bg.wasm new file mode 100644 index 0000000..40518c0 Binary files /dev/null and b/demo/dist/@bsull/augurs/core_bg.wasm differ diff --git a/demo/dist/@bsull/augurs/core_bg.wasm.d.ts b/demo/dist/@bsull/augurs/core_bg.wasm.d.ts new file mode 100644 index 0000000..ad6173a --- /dev/null +++ b/demo/dist/@bsull/augurs/core_bg.wasm.d.ts @@ -0,0 +1,11 @@ +/* tslint:disable */ +/* eslint-disable */ +export const memory: WebAssembly.Memory; +export function initLogging(a: number, b: number): void; +export function custom_init(): void; +export function __wbindgen_malloc(a: number, b: number): number; +export function __wbindgen_realloc(a: number, b: number, c: number, d: number): number; +export function __wbindgen_add_to_stack_pointer(a: number): number; +export function __wbindgen_free(a: number, b: number, c: number): void; +export function __wbindgen_exn_store(a: number): void; +export function __wbindgen_start(): void; diff --git a/demo/dist/@bsull/augurs/dtw.d.ts b/demo/dist/@bsull/augurs/dtw.d.ts new file mode 100644 index 0000000..1539dec --- /dev/null +++ b/demo/dist/@bsull/augurs/dtw.d.ts @@ -0,0 +1,225 @@ +/* tslint:disable */ +/* eslint-disable */ +/** +* Initialize logging. +* +* You can use this to emit logs from augurs to the browser console. +* The default is to log everything to the console, but you can +* change the log level and whether logs are emitted to the console +* or to the browser's performance timeline. +* +* IMPORTANT: this function should only be called once. It will throw +* an exception if called more than once. +* @param {LogConfig | undefined} [config] +*/ +export function initLogging(config?: LogConfig): void; +/** +* Initialize the logger and panic hook. +* +* This will be called automatically when the module is imported. +* It sets the default tracing subscriber to `tracing-wasm`, and +* sets WASM panics to print to the console with a helpful error +* message. +*/ +export function custom_init(): void; +/** + * Options for the dynamic time warping calculation. + */ +export interface DtwOptions { + /** + * The size of the Sakoe-Chiba band. + */ + window?: number; + /** + * The maximum distance permitted between two points. + * + * If the distance between two points exceeds this value, the algorithm will + * early abandon and use `maxDistance`. + * + * Only used when calculating distance matrices using [`Dtw::distanceMatrix`], + * not when calculating the distance between two series. + */ + maxDistance?: number; + /** + * The lower bound, used for early abandoning. + * If specified, before calculating the DTW (which can be expensive), check if the + * lower bound of the DTW is greater than this distance; if so, skip the DTW + * calculation and return this bound instead. + */ + lowerBound?: number; + /** + * The upper bound, used for early abandoning. + * If specified, before calculating the DTW (which can be expensive), check if the + * upper bound of the DTW is less than this distance; if so, skip the DTW + * calculation and return this bound instead. + */ + upperBound?: number; +} + +/** + * The distance function to use for Dynamic Time Warping. + */ +export type DistanceFunction = "euclidean" | "manhattan"; + +/** + * The maximum log level to emit. + * + * The default is `Level::Info`. + */ +export type Level = "trace" | "debug" | "info" | "warn" | "error"; + +/** + * The target for augurs log events. + */ +export type LogTarget = "console" | "performance"; + +/** + * Log configuration. + */ +export interface LogConfig { + /** + * The maximum log level to emit. + * + * Defaults to `INFO`. + */ + maxLevel?: Level; + /** + * The target for augurs log events. + * + * Defaults to logging to the browser console. + */ + target?: LogTarget; + /** + * Whether to emit coloured logs. + * + * Defaults to `true`. + */ + color?: boolean; + /** + * Whether to show detailed fields such as augurs\' file names and line numbers + * in the logs. + * + * Probably not wise in production. + * + * Defaults to `false`. + */ + showDetailedFields?: boolean; +} + +/** + * Forecast intervals. + */ +export interface ForecastIntervals { + /** + * The confidence level for the intervals. + */ + level: number; + /** + * The lower prediction intervals. + */ + lower: number[]; + /** + * The upper prediction intervals. + */ + upper: number[]; +} + +/** + * A forecast containing point forecasts and, optionally, prediction intervals. + */ +export interface Forecast { + /** + * The point forecasts. + */ + point: number[]; + /** + * The forecast intervals, if requested and supported + * by the trend model. + */ + intervals: ForecastIntervals | undefined; +} + +/** +* Dynamic Time Warping. +* +* The `window` parameter can be used to specify the Sakoe-Chiba band size. +* The distance function depends on the constructor used; `euclidean` and +* `manhattan` are available, `euclidean` being the default. +*/ +export class Dtw { + free(): void; +/** +* Create a new `Dtw` instance. +* @param {DistanceFunction} distanceFunction +* @param {DtwOptions | undefined} [opts] +*/ + constructor(distanceFunction: DistanceFunction, opts?: DtwOptions); +/** +* Create a new `Dtw` instance using the Euclidean distance. +* @param {DtwOptions | undefined} [opts] +* @returns {Dtw} +*/ + static euclidean(opts?: DtwOptions): Dtw; +/** +* Create a new `Dtw` instance using the Manhattan distance. +* @param {DtwOptions | undefined} [opts] +* @returns {Dtw} +*/ + static manhattan(opts?: DtwOptions): Dtw; +/** +* Calculate the distance between two arrays under Dynamic Time Warping. +* @param {number[] | Float64Array} a +* @param {number[] | Float64Array} b +* @returns {number} +*/ + distance(a: number[] | Float64Array, b: number[] | Float64Array): number; +/** +* Compute the distance matrix between all pairs of series. +* +* The series do not all have to be the same length. +* @param {number[][] | Float64Array[]} series +* @returns {(Float64Array)[]} +*/ + distanceMatrix(series: number[][] | Float64Array[]): (Float64Array)[]; +} + +export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module; + +export interface InitOutput { + readonly memory: WebAssembly.Memory; + readonly __wbg_dtw_free: (a: number, b: number) => void; + readonly dtw_new: (a: number, b: number) => number; + readonly dtw_euclidean: (a: number) => number; + readonly dtw_manhattan: (a: number) => number; + readonly dtw_distance: (a: number, b: number, c: number, d: number) => void; + readonly dtw_distanceMatrix: (a: number, b: number, c: number) => void; + readonly initLogging: (a: number, b: number) => void; + readonly custom_init: () => void; + readonly __wbindgen_malloc: (a: number, b: number) => number; + readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number; + readonly __wbindgen_add_to_stack_pointer: (a: number) => number; + readonly __wbindgen_free: (a: number, b: number, c: number) => void; + readonly __wbindgen_exn_store: (a: number) => void; + readonly __wbindgen_start: () => void; +} + +export type SyncInitInput = BufferSource | WebAssembly.Module; +/** +* Instantiates the given `module`, which can either be bytes or +* a precompiled `WebAssembly.Module`. +* +* @param {{ module: SyncInitInput }} module - Passing `SyncInitInput` directly is deprecated. +* +* @returns {InitOutput} +*/ +export function initSync(module: { module: SyncInitInput } | SyncInitInput): InitOutput; + +/** +* If `module_or_path` is {RequestInfo} or {URL}, makes a request and +* for everything else, calls `WebAssembly.instantiate` directly. +* +* @param {{ module_or_path: InitInput | Promise }} module_or_path - Passing `InitInput` directly is deprecated. +* +* @returns {Promise} +*/ +export default function __wbg_init (module_or_path?: { module_or_path: InitInput | Promise } | InitInput | Promise): Promise; diff --git a/demo/dist/@bsull/augurs/dtw.js b/demo/dist/@bsull/augurs/dtw.js new file mode 100644 index 0000000..723bc17 --- /dev/null +++ b/demo/dist/@bsull/augurs/dtw.js @@ -0,0 +1,715 @@ +let wasm; + +const cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } ); + +if (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); }; + +let cachedUint8ArrayMemory0 = null; + +function getUint8ArrayMemory0() { + if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) { + cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer); + } + return cachedUint8ArrayMemory0; +} + +function getStringFromWasm0(ptr, len) { + ptr = ptr >>> 0; + return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len)); +} + +const heap = new Array(128).fill(undefined); + +heap.push(undefined, null, true, false); + +let heap_next = heap.length; + +function addHeapObject(obj) { + if (heap_next === heap.length) heap.push(heap.length + 1); + const idx = heap_next; + heap_next = heap[idx]; + + heap[idx] = obj; + return idx; +} + +function getObject(idx) { return heap[idx]; } + +function dropObject(idx) { + if (idx < 132) return; + heap[idx] = heap_next; + heap_next = idx; +} + +function takeObject(idx) { + const ret = getObject(idx); + dropObject(idx); + return ret; +} + +function isLikeNone(x) { + return x === undefined || x === null; +} + +let cachedDataViewMemory0 = null; + +function getDataViewMemory0() { + if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer.detached === true || (cachedDataViewMemory0.buffer.detached === undefined && cachedDataViewMemory0.buffer !== wasm.memory.buffer)) { + cachedDataViewMemory0 = new DataView(wasm.memory.buffer); + } + return cachedDataViewMemory0; +} + +let WASM_VECTOR_LEN = 0; + +const cachedTextEncoder = (typeof TextEncoder !== 'undefined' ? new TextEncoder('utf-8') : { encode: () => { throw Error('TextEncoder not available') } } ); + +const encodeString = (typeof cachedTextEncoder.encodeInto === 'function' + ? function (arg, view) { + return cachedTextEncoder.encodeInto(arg, view); +} + : function (arg, view) { + const buf = cachedTextEncoder.encode(arg); + view.set(buf); + return { + read: arg.length, + written: buf.length + }; +}); + +function passStringToWasm0(arg, malloc, realloc) { + + if (realloc === undefined) { + const buf = cachedTextEncoder.encode(arg); + const ptr = malloc(buf.length, 1) >>> 0; + getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf); + WASM_VECTOR_LEN = buf.length; + return ptr; + } + + let len = arg.length; + let ptr = malloc(len, 1) >>> 0; + + const mem = getUint8ArrayMemory0(); + + let offset = 0; + + for (; offset < len; offset++) { + const code = arg.charCodeAt(offset); + if (code > 0x7F) break; + mem[ptr + offset] = code; + } + + if (offset !== len) { + if (offset !== 0) { + arg = arg.slice(offset); + } + ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; + const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len); + const ret = encodeString(arg, view); + + offset += ret.written; + ptr = realloc(ptr, len, offset, 1) >>> 0; + } + + WASM_VECTOR_LEN = offset; + return ptr; +} + +function debugString(val) { + // primitive types + const type = typeof val; + if (type == 'number' || type == 'boolean' || val == null) { + return `${val}`; + } + if (type == 'string') { + return `"${val}"`; + } + if (type == 'symbol') { + const description = val.description; + if (description == null) { + return 'Symbol'; + } else { + return `Symbol(${description})`; + } + } + if (type == 'function') { + const name = val.name; + if (typeof name == 'string' && name.length > 0) { + return `Function(${name})`; + } else { + return 'Function'; + } + } + // objects + if (Array.isArray(val)) { + const length = val.length; + let debug = '['; + if (length > 0) { + debug += debugString(val[0]); + } + for(let i = 1; i < length; i++) { + debug += ', ' + debugString(val[i]); + } + debug += ']'; + return debug; + } + // Test for built-in + const builtInMatches = /\[object ([^\]]+)\]/.exec(toString.call(val)); + let className; + if (builtInMatches.length > 1) { + className = builtInMatches[1]; + } else { + // Failed to match the standard '[object ClassName]' + return toString.call(val); + } + if (className == 'Object') { + // we're a user defined class or Object + // JSON.stringify avoids problems with cycles, and is generally much + // easier than looping through ownProperties of `val`. + try { + return 'Object(' + JSON.stringify(val) + ')'; + } catch (_) { + return 'Object'; + } + } + // errors + if (val instanceof Error) { + return `${val.name}: ${val.message}\n${val.stack}`; + } + // TODO we could test for more things here, like `Set`s and `Map`s. + return className; +} + +function getArrayJsValueFromWasm0(ptr, len) { + ptr = ptr >>> 0; + const mem = getDataViewMemory0(); + const result = []; + for (let i = ptr; i < ptr + 4 * len; i += 4) { + result.push(takeObject(mem.getUint32(i, true))); + } + return result; +} +/** +* Initialize logging. +* +* You can use this to emit logs from augurs to the browser console. +* The default is to log everything to the console, but you can +* change the log level and whether logs are emitted to the console +* or to the browser's performance timeline. +* +* IMPORTANT: this function should only be called once. It will throw +* an exception if called more than once. +* @param {LogConfig | undefined} [config] +*/ +export function initLogging(config) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.initLogging(retptr, isLikeNone(config) ? 0 : addHeapObject(config)); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + if (r1) { + throw takeObject(r0); + } + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +} + +/** +* Initialize the logger and panic hook. +* +* This will be called automatically when the module is imported. +* It sets the default tracing subscriber to `tracing-wasm`, and +* sets WASM panics to print to the console with a helpful error +* message. +*/ +export function custom_init() { + wasm.custom_init(); +} + +function handleError(f, args) { + try { + return f.apply(this, args); + } catch (e) { + wasm.__wbindgen_exn_store(addHeapObject(e)); + } +} + +const DtwFinalization = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(ptr => wasm.__wbg_dtw_free(ptr >>> 0, 1)); +/** +* Dynamic Time Warping. +* +* The `window` parameter can be used to specify the Sakoe-Chiba band size. +* The distance function depends on the constructor used; `euclidean` and +* `manhattan` are available, `euclidean` being the default. +*/ +export class Dtw { + + static __wrap(ptr) { + ptr = ptr >>> 0; + const obj = Object.create(Dtw.prototype); + obj.__wbg_ptr = ptr; + DtwFinalization.register(obj, obj.__wbg_ptr, obj); + return obj; + } + + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + DtwFinalization.unregister(this); + return ptr; + } + + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_dtw_free(ptr, 0); + } + /** + * Create a new `Dtw` instance. + * @param {DistanceFunction} distanceFunction + * @param {DtwOptions | undefined} [opts] + */ + constructor(distanceFunction, opts) { + const ret = wasm.dtw_new(addHeapObject(distanceFunction), isLikeNone(opts) ? 0 : addHeapObject(opts)); + this.__wbg_ptr = ret >>> 0; + DtwFinalization.register(this, this.__wbg_ptr, this); + return this; + } + /** + * Create a new `Dtw` instance using the Euclidean distance. + * @param {DtwOptions | undefined} [opts] + * @returns {Dtw} + */ + static euclidean(opts) { + const ret = wasm.dtw_euclidean(isLikeNone(opts) ? 0 : addHeapObject(opts)); + return Dtw.__wrap(ret); + } + /** + * Create a new `Dtw` instance using the Manhattan distance. + * @param {DtwOptions | undefined} [opts] + * @returns {Dtw} + */ + static manhattan(opts) { + const ret = wasm.dtw_manhattan(isLikeNone(opts) ? 0 : addHeapObject(opts)); + return Dtw.__wrap(ret); + } + /** + * Calculate the distance between two arrays under Dynamic Time Warping. + * @param {number[] | Float64Array} a + * @param {number[] | Float64Array} b + * @returns {number} + */ + distance(a, b) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.dtw_distance(retptr, this.__wbg_ptr, addHeapObject(a), addHeapObject(b)); + var r0 = getDataViewMemory0().getFloat64(retptr + 8 * 0, true); + var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true); + var r3 = getDataViewMemory0().getInt32(retptr + 4 * 3, true); + if (r3) { + throw takeObject(r2); + } + return r0; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * Compute the distance matrix between all pairs of series. + * + * The series do not all have to be the same length. + * @param {number[][] | Float64Array[]} series + * @returns {(Float64Array)[]} + */ + distanceMatrix(series) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.dtw_distanceMatrix(retptr, this.__wbg_ptr, addHeapObject(series)); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true); + var r3 = getDataViewMemory0().getInt32(retptr + 4 * 3, true); + if (r3) { + throw takeObject(r2); + } + var v1 = getArrayJsValueFromWasm0(r0, r1).slice(); + wasm.__wbindgen_free(r0, r1 * 4, 4); + return v1; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } +} + +async function __wbg_load(module, imports) { + if (typeof Response === 'function' && module instanceof Response) { + if (typeof WebAssembly.instantiateStreaming === 'function') { + try { + return await WebAssembly.instantiateStreaming(module, imports); + + } catch (e) { + if (module.headers.get('Content-Type') != 'application/wasm') { + console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e); + + } else { + throw e; + } + } + } + + const bytes = await module.arrayBuffer(); + return await WebAssembly.instantiate(bytes, imports); + + } else { + const instance = await WebAssembly.instantiate(module, imports); + + if (instance instanceof WebAssembly.Instance) { + return { instance, module }; + + } else { + return instance; + } + } +} + +function __wbg_get_imports() { + const imports = {}; + imports.wbg = {}; + imports.wbg.__wbindgen_error_new = function(arg0, arg1) { + const ret = new Error(getStringFromWasm0(arg0, arg1)); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_is_object = function(arg0) { + const val = getObject(arg0); + const ret = typeof(val) === 'object' && val !== null; + return ret; + }; + imports.wbg.__wbindgen_is_undefined = function(arg0) { + const ret = getObject(arg0) === undefined; + return ret; + }; + imports.wbg.__wbindgen_in = function(arg0, arg1) { + const ret = getObject(arg0) in getObject(arg1); + return ret; + }; + imports.wbg.__wbindgen_object_drop_ref = function(arg0) { + takeObject(arg0); + }; + imports.wbg.__wbindgen_is_bigint = function(arg0) { + const ret = typeof(getObject(arg0)) === 'bigint'; + return ret; + }; + imports.wbg.__wbindgen_bigint_from_u64 = function(arg0) { + const ret = BigInt.asUintN(64, arg0); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_jsval_eq = function(arg0, arg1) { + const ret = getObject(arg0) === getObject(arg1); + return ret; + }; + imports.wbg.__wbindgen_number_get = function(arg0, arg1) { + const obj = getObject(arg1); + const ret = typeof(obj) === 'number' ? obj : undefined; + getDataViewMemory0().setFloat64(arg0 + 8 * 1, isLikeNone(ret) ? 0 : ret, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, !isLikeNone(ret), true); + }; + imports.wbg.__wbindgen_object_clone_ref = function(arg0) { + const ret = getObject(arg0); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_is_string = function(arg0) { + const ret = typeof(getObject(arg0)) === 'string'; + return ret; + }; + imports.wbg.__wbindgen_string_get = function(arg0, arg1) { + const obj = getObject(arg1); + const ret = typeof(obj) === 'string' ? obj : undefined; + var ptr1 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + var len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }; + imports.wbg.__wbindgen_boolean_get = function(arg0) { + const v = getObject(arg0); + const ret = typeof(v) === 'boolean' ? (v ? 1 : 0) : 2; + return ret; + }; + imports.wbg.__wbg_new_abda76e883ba8a5f = function() { + const ret = new Error(); + return addHeapObject(ret); + }; + imports.wbg.__wbg_stack_658279fe44541cf6 = function(arg0, arg1) { + const ret = getObject(arg1).stack; + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }; + imports.wbg.__wbg_error_f851667af71bcfc6 = function(arg0, arg1) { + let deferred0_0; + let deferred0_1; + try { + deferred0_0 = arg0; + deferred0_1 = arg1; + console.error(getStringFromWasm0(arg0, arg1)); + } finally { + wasm.__wbindgen_free(deferred0_0, deferred0_1, 1); + } + }; + imports.wbg.__wbg_mark_f0616123624944ec = function(arg0, arg1) { + performance.mark(getStringFromWasm0(arg0, arg1)); + }; + imports.wbg.__wbg_log_914e3639af348b4e = function(arg0, arg1) { + let deferred0_0; + let deferred0_1; + try { + deferred0_0 = arg0; + deferred0_1 = arg1; + console.log(getStringFromWasm0(arg0, arg1)); + } finally { + wasm.__wbindgen_free(deferred0_0, deferred0_1, 1); + } + }; + imports.wbg.__wbg_log_12b4ba535cbd9499 = function(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7) { + let deferred0_0; + let deferred0_1; + try { + deferred0_0 = arg0; + deferred0_1 = arg1; + console.log(getStringFromWasm0(arg0, arg1), getStringFromWasm0(arg2, arg3), getStringFromWasm0(arg4, arg5), getStringFromWasm0(arg6, arg7)); + } finally { + wasm.__wbindgen_free(deferred0_0, deferred0_1, 1); + } + }; + imports.wbg.__wbg_measure_a990198e921c09fd = function() { return handleError(function (arg0, arg1, arg2, arg3) { + let deferred0_0; + let deferred0_1; + let deferred1_0; + let deferred1_1; + try { + deferred0_0 = arg0; + deferred0_1 = arg1; + deferred1_0 = arg2; + deferred1_1 = arg3; + performance.measure(getStringFromWasm0(arg0, arg1), getStringFromWasm0(arg2, arg3)); + } finally { + wasm.__wbindgen_free(deferred0_0, deferred0_1, 1); + wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); + } + }, arguments) }; + imports.wbg.__wbindgen_jsval_loose_eq = function(arg0, arg1) { + const ret = getObject(arg0) == getObject(arg1); + return ret; + }; + imports.wbg.__wbindgen_as_number = function(arg0) { + const ret = +getObject(arg0); + return ret; + }; + imports.wbg.__wbg_String_b9412f8799faab3e = function(arg0, arg1) { + const ret = String(getObject(arg1)); + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }; + imports.wbg.__wbindgen_string_new = function(arg0, arg1) { + const ret = getStringFromWasm0(arg0, arg1); + return addHeapObject(ret); + }; + imports.wbg.__wbg_getwithrefkey_edc2c8960f0f1191 = function(arg0, arg1) { + const ret = getObject(arg0)[getObject(arg1)]; + return addHeapObject(ret); + }; + imports.wbg.__wbg_call_1084a111329e68ce = function() { return handleError(function (arg0, arg1) { + const ret = getObject(arg0).call(getObject(arg1)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_get_3baa728f9d58d3f6 = function(arg0, arg1) { + const ret = getObject(arg0)[arg1 >>> 0]; + return addHeapObject(ret); + }; + imports.wbg.__wbg_length_ae22078168b726f5 = function(arg0) { + const ret = getObject(arg0).length; + return ret; + }; + imports.wbg.__wbindgen_is_function = function(arg0) { + const ret = typeof(getObject(arg0)) === 'function'; + return ret; + }; + imports.wbg.__wbg_next_de3e9db4440638b2 = function(arg0) { + const ret = getObject(arg0).next; + return addHeapObject(ret); + }; + imports.wbg.__wbg_next_f9cb570345655b9a = function() { return handleError(function (arg0) { + const ret = getObject(arg0).next(); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_done_bfda7aa8f252b39f = function(arg0) { + const ret = getObject(arg0).done; + return ret; + }; + imports.wbg.__wbg_value_6d39332ab4788d86 = function(arg0) { + const ret = getObject(arg0).value; + return addHeapObject(ret); + }; + imports.wbg.__wbg_iterator_888179a48810a9fe = function() { + const ret = Symbol.iterator; + return addHeapObject(ret); + }; + imports.wbg.__wbg_get_224d16597dbbfd96 = function() { return handleError(function (arg0, arg1) { + const ret = Reflect.get(getObject(arg0), getObject(arg1)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_isArray_8364a5371e9737d8 = function(arg0) { + const ret = Array.isArray(getObject(arg0)); + return ret; + }; + imports.wbg.__wbg_instanceof_ArrayBuffer_61dfc3198373c902 = function(arg0) { + let result; + try { + result = getObject(arg0) instanceof ArrayBuffer; + } catch (_) { + result = false; + } + const ret = result; + return ret; + }; + imports.wbg.__wbg_isSafeInteger_7f1ed56200d90674 = function(arg0) { + const ret = Number.isSafeInteger(getObject(arg0)); + return ret; + }; + imports.wbg.__wbg_entries_7a0e06255456ebcd = function(arg0) { + const ret = Object.entries(getObject(arg0)); + return addHeapObject(ret); + }; + imports.wbg.__wbg_buffer_b7b08af79b0b0974 = function(arg0) { + const ret = getObject(arg0).buffer; + return addHeapObject(ret); + }; + imports.wbg.__wbg_new_ea1883e1e5e86686 = function(arg0) { + const ret = new Uint8Array(getObject(arg0)); + return addHeapObject(ret); + }; + imports.wbg.__wbg_set_d1e79e2388520f18 = function(arg0, arg1, arg2) { + getObject(arg0).set(getObject(arg1), arg2 >>> 0); + }; + imports.wbg.__wbg_length_8339fcf5d8ecd12e = function(arg0) { + const ret = getObject(arg0).length; + return ret; + }; + imports.wbg.__wbg_newwithbyteoffsetandlength_a6ac1429e5962b5d = function(arg0, arg1, arg2) { + const ret = new Float64Array(getObject(arg0), arg1 >>> 0, arg2 >>> 0); + return addHeapObject(ret); + }; + imports.wbg.__wbg_set_2ba50dc715327edc = function(arg0, arg1, arg2) { + getObject(arg0).set(getObject(arg1), arg2 >>> 0); + }; + imports.wbg.__wbg_length_a9e7e8ccaa5e7434 = function(arg0) { + const ret = getObject(arg0).length; + return ret; + }; + imports.wbg.__wbg_instanceof_Uint8Array_247a91427532499e = function(arg0) { + let result; + try { + result = getObject(arg0) instanceof Uint8Array; + } catch (_) { + result = false; + } + const ret = result; + return ret; + }; + imports.wbg.__wbg_newwithlength_67c54fcff2372990 = function(arg0) { + const ret = new Float64Array(arg0 >>> 0); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_bigint_get_as_i64 = function(arg0, arg1) { + const v = getObject(arg1); + const ret = typeof(v) === 'bigint' ? v : undefined; + getDataViewMemory0().setBigInt64(arg0 + 8 * 1, isLikeNone(ret) ? BigInt(0) : ret, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, !isLikeNone(ret), true); + }; + imports.wbg.__wbindgen_debug_string = function(arg0, arg1) { + const ret = debugString(getObject(arg1)); + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }; + imports.wbg.__wbindgen_throw = function(arg0, arg1) { + throw new Error(getStringFromWasm0(arg0, arg1)); + }; + imports.wbg.__wbindgen_memory = function() { + const ret = wasm.memory; + return addHeapObject(ret); + }; + + return imports; +} + +function __wbg_init_memory(imports, memory) { + +} + +function __wbg_finalize_init(instance, module) { + wasm = instance.exports; + __wbg_init.__wbindgen_wasm_module = module; + cachedDataViewMemory0 = null; + cachedUint8ArrayMemory0 = null; + + + wasm.__wbindgen_start(); + return wasm; +} + +function initSync(module) { + if (wasm !== undefined) return wasm; + + + if (typeof module !== 'undefined' && Object.getPrototypeOf(module) === Object.prototype) + ({module} = module) + else + console.warn('using deprecated parameters for `initSync()`; pass a single object instead') + + const imports = __wbg_get_imports(); + + __wbg_init_memory(imports); + + if (!(module instanceof WebAssembly.Module)) { + module = new WebAssembly.Module(module); + } + + const instance = new WebAssembly.Instance(module, imports); + + return __wbg_finalize_init(instance, module); +} + +async function __wbg_init(module_or_path) { + if (wasm !== undefined) return wasm; + + + if (typeof module_or_path !== 'undefined' && Object.getPrototypeOf(module_or_path) === Object.prototype) + ({module_or_path} = module_or_path) + else + console.warn('using deprecated parameters for the initialization function; pass a single object instead') + + if (typeof module_or_path === 'undefined') { + module_or_path = new URL('dtw_bg.wasm', import.meta.url); + } + const imports = __wbg_get_imports(); + + if (typeof module_or_path === 'string' || (typeof Request === 'function' && module_or_path instanceof Request) || (typeof URL === 'function' && module_or_path instanceof URL)) { + module_or_path = fetch(module_or_path); + } + + __wbg_init_memory(imports); + + const { instance, module } = await __wbg_load(await module_or_path, imports); + + return __wbg_finalize_init(instance, module); +} + +export { initSync }; +export default __wbg_init; diff --git a/demo/dist/@bsull/augurs/dtw_bg.wasm b/demo/dist/@bsull/augurs/dtw_bg.wasm new file mode 100644 index 0000000..8263036 Binary files /dev/null and b/demo/dist/@bsull/augurs/dtw_bg.wasm differ diff --git a/demo/dist/@bsull/augurs/dtw_bg.wasm.d.ts b/demo/dist/@bsull/augurs/dtw_bg.wasm.d.ts new file mode 100644 index 0000000..4d4d49d --- /dev/null +++ b/demo/dist/@bsull/augurs/dtw_bg.wasm.d.ts @@ -0,0 +1,17 @@ +/* tslint:disable */ +/* eslint-disable */ +export const memory: WebAssembly.Memory; +export function __wbg_dtw_free(a: number, b: number): void; +export function dtw_new(a: number, b: number): number; +export function dtw_euclidean(a: number): number; +export function dtw_manhattan(a: number): number; +export function dtw_distance(a: number, b: number, c: number, d: number): void; +export function dtw_distanceMatrix(a: number, b: number, c: number): void; +export function initLogging(a: number, b: number): void; +export function custom_init(): void; +export function __wbindgen_malloc(a: number, b: number): number; +export function __wbindgen_realloc(a: number, b: number, c: number, d: number): number; +export function __wbindgen_add_to_stack_pointer(a: number): number; +export function __wbindgen_free(a: number, b: number, c: number): void; +export function __wbindgen_exn_store(a: number): void; +export function __wbindgen_start(): void; diff --git a/demo/dist/@bsull/augurs/ets.d.ts b/demo/dist/@bsull/augurs/ets.d.ts new file mode 100644 index 0000000..4e8c0c8 --- /dev/null +++ b/demo/dist/@bsull/augurs/ets.d.ts @@ -0,0 +1,184 @@ +/* tslint:disable */ +/* eslint-disable */ +/** +* Initialize logging. +* +* You can use this to emit logs from augurs to the browser console. +* The default is to log everything to the console, but you can +* change the log level and whether logs are emitted to the console +* or to the browser's performance timeline. +* +* IMPORTANT: this function should only be called once. It will throw +* an exception if called more than once. +* @param {LogConfig | undefined} [config] +*/ +export function initLogging(config?: LogConfig): void; +/** +* Initialize the logger and panic hook. +* +* This will be called automatically when the module is imported. +* It sets the default tracing subscriber to `tracing-wasm`, and +* sets WASM panics to print to the console with a helpful error +* message. +*/ +export function custom_init(): void; +/** + * The maximum log level to emit. + * + * The default is `Level::Info`. + */ +export type Level = "trace" | "debug" | "info" | "warn" | "error"; + +/** + * The target for augurs log events. + */ +export type LogTarget = "console" | "performance"; + +/** + * Log configuration. + */ +export interface LogConfig { + /** + * The maximum log level to emit. + * + * Defaults to `INFO`. + */ + maxLevel?: Level; + /** + * The target for augurs log events. + * + * Defaults to logging to the browser console. + */ + target?: LogTarget; + /** + * Whether to emit coloured logs. + * + * Defaults to `true`. + */ + color?: boolean; + /** + * Whether to show detailed fields such as augurs\' file names and line numbers + * in the logs. + * + * Probably not wise in production. + * + * Defaults to `false`. + */ + showDetailedFields?: boolean; +} + +/** + * Forecast intervals. + */ +export interface ForecastIntervals { + /** + * The confidence level for the intervals. + */ + level: number; + /** + * The lower prediction intervals. + */ + lower: number[]; + /** + * The upper prediction intervals. + */ + upper: number[]; +} + +/** + * A forecast containing point forecasts and, optionally, prediction intervals. + */ +export interface Forecast { + /** + * The point forecasts. + */ + point: number[]; + /** + * The forecast intervals, if requested and supported + * by the trend model. + */ + intervals: ForecastIntervals | undefined; +} + +/** +* Automatic ETS model selection. +*/ +export class AutoETS { + free(): void; +/** +* Create a new `AutoETS` model search instance. +* +* # Errors +* +* If the `spec` string is invalid, this function returns an error. +* @param {number} seasonLength +* @param {string} spec +*/ + constructor(seasonLength: number, spec: string); +/** +* Search for the best model, fitting it to the data. +* +* The model will be stored on the inner `AutoETS` instance, after which +* forecasts can be produced using its `predict` method. +* +* # Errors +* +* If no model can be found, or if any parameters are invalid, this function +* returns an error. +* @param {number[] | Float64Array} y +*/ + fit(y: number[] | Float64Array): void; +/** +* Predict the next `horizon` values using the best model, optionally including +* prediction intervals at the specified level. +* +* `level` should be a float between 0 and 1 representing the confidence level. +* +* # Errors +* +* This function will return an error if no model has been fit yet (using [`AutoETS::fit`]). +* @param {number} horizon +* @param {number | undefined} [level] +* @returns {Forecast} +*/ + predict(horizon: number, level?: number): Forecast; +} + +export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module; + +export interface InitOutput { + readonly memory: WebAssembly.Memory; + readonly __wbg_autoets_free: (a: number, b: number) => void; + readonly autoets_new: (a: number, b: number, c: number, d: number) => void; + readonly autoets_fit: (a: number, b: number, c: number) => void; + readonly autoets_predict: (a: number, b: number, c: number, d: number, e: number) => void; + readonly initLogging: (a: number, b: number) => void; + readonly custom_init: () => void; + readonly __wbindgen_malloc: (a: number, b: number) => number; + readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number; + readonly __wbindgen_add_to_stack_pointer: (a: number) => number; + readonly __wbindgen_exn_store: (a: number) => void; + readonly __wbindgen_free: (a: number, b: number, c: number) => void; + readonly __wbindgen_start: () => void; +} + +export type SyncInitInput = BufferSource | WebAssembly.Module; +/** +* Instantiates the given `module`, which can either be bytes or +* a precompiled `WebAssembly.Module`. +* +* @param {{ module: SyncInitInput }} module - Passing `SyncInitInput` directly is deprecated. +* +* @returns {InitOutput} +*/ +export function initSync(module: { module: SyncInitInput } | SyncInitInput): InitOutput; + +/** +* If `module_or_path` is {RequestInfo} or {URL}, makes a request and +* for everything else, calls `WebAssembly.instantiate` directly. +* +* @param {{ module_or_path: InitInput | Promise }} module_or_path - Passing `InitInput` directly is deprecated. +* +* @returns {Promise} +*/ +export default function __wbg_init (module_or_path?: { module_or_path: InitInput | Promise } | InitInput | Promise): Promise; diff --git a/demo/dist/@bsull/augurs/ets.js b/demo/dist/@bsull/augurs/ets.js new file mode 100644 index 0000000..58471fb --- /dev/null +++ b/demo/dist/@bsull/augurs/ets.js @@ -0,0 +1,742 @@ +let wasm; + +const cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } ); + +if (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); }; + +let cachedUint8ArrayMemory0 = null; + +function getUint8ArrayMemory0() { + if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) { + cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer); + } + return cachedUint8ArrayMemory0; +} + +function getStringFromWasm0(ptr, len) { + ptr = ptr >>> 0; + return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len)); +} + +const heap = new Array(128).fill(undefined); + +heap.push(undefined, null, true, false); + +let heap_next = heap.length; + +function addHeapObject(obj) { + if (heap_next === heap.length) heap.push(heap.length + 1); + const idx = heap_next; + heap_next = heap[idx]; + + heap[idx] = obj; + return idx; +} + +function getObject(idx) { return heap[idx]; } + +function dropObject(idx) { + if (idx < 132) return; + heap[idx] = heap_next; + heap_next = idx; +} + +function takeObject(idx) { + const ret = getObject(idx); + dropObject(idx); + return ret; +} + +function isLikeNone(x) { + return x === undefined || x === null; +} + +let cachedDataViewMemory0 = null; + +function getDataViewMemory0() { + if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer.detached === true || (cachedDataViewMemory0.buffer.detached === undefined && cachedDataViewMemory0.buffer !== wasm.memory.buffer)) { + cachedDataViewMemory0 = new DataView(wasm.memory.buffer); + } + return cachedDataViewMemory0; +} + +let WASM_VECTOR_LEN = 0; + +const cachedTextEncoder = (typeof TextEncoder !== 'undefined' ? new TextEncoder('utf-8') : { encode: () => { throw Error('TextEncoder not available') } } ); + +const encodeString = (typeof cachedTextEncoder.encodeInto === 'function' + ? function (arg, view) { + return cachedTextEncoder.encodeInto(arg, view); +} + : function (arg, view) { + const buf = cachedTextEncoder.encode(arg); + view.set(buf); + return { + read: arg.length, + written: buf.length + }; +}); + +function passStringToWasm0(arg, malloc, realloc) { + + if (realloc === undefined) { + const buf = cachedTextEncoder.encode(arg); + const ptr = malloc(buf.length, 1) >>> 0; + getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf); + WASM_VECTOR_LEN = buf.length; + return ptr; + } + + let len = arg.length; + let ptr = malloc(len, 1) >>> 0; + + const mem = getUint8ArrayMemory0(); + + let offset = 0; + + for (; offset < len; offset++) { + const code = arg.charCodeAt(offset); + if (code > 0x7F) break; + mem[ptr + offset] = code; + } + + if (offset !== len) { + if (offset !== 0) { + arg = arg.slice(offset); + } + ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; + const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len); + const ret = encodeString(arg, view); + + offset += ret.written; + ptr = realloc(ptr, len, offset, 1) >>> 0; + } + + WASM_VECTOR_LEN = offset; + return ptr; +} + +function debugString(val) { + // primitive types + const type = typeof val; + if (type == 'number' || type == 'boolean' || val == null) { + return `${val}`; + } + if (type == 'string') { + return `"${val}"`; + } + if (type == 'symbol') { + const description = val.description; + if (description == null) { + return 'Symbol'; + } else { + return `Symbol(${description})`; + } + } + if (type == 'function') { + const name = val.name; + if (typeof name == 'string' && name.length > 0) { + return `Function(${name})`; + } else { + return 'Function'; + } + } + // objects + if (Array.isArray(val)) { + const length = val.length; + let debug = '['; + if (length > 0) { + debug += debugString(val[0]); + } + for(let i = 1; i < length; i++) { + debug += ', ' + debugString(val[i]); + } + debug += ']'; + return debug; + } + // Test for built-in + const builtInMatches = /\[object ([^\]]+)\]/.exec(toString.call(val)); + let className; + if (builtInMatches.length > 1) { + className = builtInMatches[1]; + } else { + // Failed to match the standard '[object ClassName]' + return toString.call(val); + } + if (className == 'Object') { + // we're a user defined class or Object + // JSON.stringify avoids problems with cycles, and is generally much + // easier than looping through ownProperties of `val`. + try { + return 'Object(' + JSON.stringify(val) + ')'; + } catch (_) { + return 'Object'; + } + } + // errors + if (val instanceof Error) { + return `${val.name}: ${val.message}\n${val.stack}`; + } + // TODO we could test for more things here, like `Set`s and `Map`s. + return className; +} + +function handleError(f, args) { + try { + return f.apply(this, args); + } catch (e) { + wasm.__wbindgen_exn_store(addHeapObject(e)); + } +} +/** +* Initialize logging. +* +* You can use this to emit logs from augurs to the browser console. +* The default is to log everything to the console, but you can +* change the log level and whether logs are emitted to the console +* or to the browser's performance timeline. +* +* IMPORTANT: this function should only be called once. It will throw +* an exception if called more than once. +* @param {LogConfig | undefined} [config] +*/ +export function initLogging(config) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.initLogging(retptr, isLikeNone(config) ? 0 : addHeapObject(config)); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + if (r1) { + throw takeObject(r0); + } + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +} + +/** +* Initialize the logger and panic hook. +* +* This will be called automatically when the module is imported. +* It sets the default tracing subscriber to `tracing-wasm`, and +* sets WASM panics to print to the console with a helpful error +* message. +*/ +export function custom_init() { + wasm.custom_init(); +} + +const AutoETSFinalization = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(ptr => wasm.__wbg_autoets_free(ptr >>> 0, 1)); +/** +* Automatic ETS model selection. +*/ +export class AutoETS { + + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + AutoETSFinalization.unregister(this); + return ptr; + } + + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_autoets_free(ptr, 0); + } + /** + * Create a new `AutoETS` model search instance. + * + * # Errors + * + * If the `spec` string is invalid, this function returns an error. + * @param {number} seasonLength + * @param {string} spec + */ + constructor(seasonLength, spec) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + const ptr0 = passStringToWasm0(spec, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + wasm.autoets_new(retptr, seasonLength, ptr0, len0); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true); + if (r2) { + throw takeObject(r1); + } + this.__wbg_ptr = r0 >>> 0; + AutoETSFinalization.register(this, this.__wbg_ptr, this); + return this; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * Search for the best model, fitting it to the data. + * + * The model will be stored on the inner `AutoETS` instance, after which + * forecasts can be produced using its `predict` method. + * + * # Errors + * + * If no model can be found, or if any parameters are invalid, this function + * returns an error. + * @param {number[] | Float64Array} y + */ + fit(y) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.autoets_fit(retptr, this.__wbg_ptr, addHeapObject(y)); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + if (r1) { + throw takeObject(r0); + } + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * Predict the next `horizon` values using the best model, optionally including + * prediction intervals at the specified level. + * + * `level` should be a float between 0 and 1 representing the confidence level. + * + * # Errors + * + * This function will return an error if no model has been fit yet (using [`AutoETS::fit`]). + * @param {number} horizon + * @param {number | undefined} [level] + * @returns {Forecast} + */ + predict(horizon, level) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.autoets_predict(retptr, this.__wbg_ptr, horizon, !isLikeNone(level), isLikeNone(level) ? 0 : level); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true); + if (r2) { + throw takeObject(r1); + } + return takeObject(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } +} + +async function __wbg_load(module, imports) { + if (typeof Response === 'function' && module instanceof Response) { + if (typeof WebAssembly.instantiateStreaming === 'function') { + try { + return await WebAssembly.instantiateStreaming(module, imports); + + } catch (e) { + if (module.headers.get('Content-Type') != 'application/wasm') { + console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e); + + } else { + throw e; + } + } + } + + const bytes = await module.arrayBuffer(); + return await WebAssembly.instantiate(bytes, imports); + + } else { + const instance = await WebAssembly.instantiate(module, imports); + + if (instance instanceof WebAssembly.Instance) { + return { instance, module }; + + } else { + return instance; + } + } +} + +function __wbg_get_imports() { + const imports = {}; + imports.wbg = {}; + imports.wbg.__wbindgen_error_new = function(arg0, arg1) { + const ret = new Error(getStringFromWasm0(arg0, arg1)); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_object_drop_ref = function(arg0) { + takeObject(arg0); + }; + imports.wbg.__wbg_crypto_1d1f22824a6a080c = function(arg0) { + const ret = getObject(arg0).crypto; + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_is_object = function(arg0) { + const val = getObject(arg0); + const ret = typeof(val) === 'object' && val !== null; + return ret; + }; + imports.wbg.__wbg_process_4a72847cc503995b = function(arg0) { + const ret = getObject(arg0).process; + return addHeapObject(ret); + }; + imports.wbg.__wbg_versions_f686565e586dd935 = function(arg0) { + const ret = getObject(arg0).versions; + return addHeapObject(ret); + }; + imports.wbg.__wbg_node_104a2ff8d6ea03a2 = function(arg0) { + const ret = getObject(arg0).node; + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_is_string = function(arg0) { + const ret = typeof(getObject(arg0)) === 'string'; + return ret; + }; + imports.wbg.__wbg_require_cca90b1a94a0255b = function() { return handleError(function () { + const ret = module.require; + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbindgen_is_function = function(arg0) { + const ret = typeof(getObject(arg0)) === 'function'; + return ret; + }; + imports.wbg.__wbindgen_string_new = function(arg0, arg1) { + const ret = getStringFromWasm0(arg0, arg1); + return addHeapObject(ret); + }; + imports.wbg.__wbg_msCrypto_eb05e62b530a1508 = function(arg0) { + const ret = getObject(arg0).msCrypto; + return addHeapObject(ret); + }; + imports.wbg.__wbg_randomFillSync_5c9c955aa56b6049 = function() { return handleError(function (arg0, arg1) { + getObject(arg0).randomFillSync(takeObject(arg1)); + }, arguments) }; + imports.wbg.__wbg_getRandomValues_3aa56aa6edec874c = function() { return handleError(function (arg0, arg1) { + getObject(arg0).getRandomValues(getObject(arg1)); + }, arguments) }; + imports.wbg.__wbindgen_number_get = function(arg0, arg1) { + const obj = getObject(arg1); + const ret = typeof(obj) === 'number' ? obj : undefined; + getDataViewMemory0().setFloat64(arg0 + 8 * 1, isLikeNone(ret) ? 0 : ret, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, !isLikeNone(ret), true); + }; + imports.wbg.__wbindgen_string_get = function(arg0, arg1) { + const obj = getObject(arg1); + const ret = typeof(obj) === 'string' ? obj : undefined; + var ptr1 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + var len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }; + imports.wbg.__wbindgen_object_clone_ref = function(arg0) { + const ret = getObject(arg0); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_is_undefined = function(arg0) { + const ret = getObject(arg0) === undefined; + return ret; + }; + imports.wbg.__wbindgen_in = function(arg0, arg1) { + const ret = getObject(arg0) in getObject(arg1); + return ret; + }; + imports.wbg.__wbindgen_boolean_get = function(arg0) { + const v = getObject(arg0); + const ret = typeof(v) === 'boolean' ? (v ? 1 : 0) : 2; + return ret; + }; + imports.wbg.__wbg_new_abda76e883ba8a5f = function() { + const ret = new Error(); + return addHeapObject(ret); + }; + imports.wbg.__wbg_stack_658279fe44541cf6 = function(arg0, arg1) { + const ret = getObject(arg1).stack; + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }; + imports.wbg.__wbg_error_f851667af71bcfc6 = function(arg0, arg1) { + let deferred0_0; + let deferred0_1; + try { + deferred0_0 = arg0; + deferred0_1 = arg1; + console.error(getStringFromWasm0(arg0, arg1)); + } finally { + wasm.__wbindgen_free(deferred0_0, deferred0_1, 1); + } + }; + imports.wbg.__wbg_mark_f0616123624944ec = function(arg0, arg1) { + performance.mark(getStringFromWasm0(arg0, arg1)); + }; + imports.wbg.__wbg_log_914e3639af348b4e = function(arg0, arg1) { + let deferred0_0; + let deferred0_1; + try { + deferred0_0 = arg0; + deferred0_1 = arg1; + console.log(getStringFromWasm0(arg0, arg1)); + } finally { + wasm.__wbindgen_free(deferred0_0, deferred0_1, 1); + } + }; + imports.wbg.__wbg_log_12b4ba535cbd9499 = function(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7) { + let deferred0_0; + let deferred0_1; + try { + deferred0_0 = arg0; + deferred0_1 = arg1; + console.log(getStringFromWasm0(arg0, arg1), getStringFromWasm0(arg2, arg3), getStringFromWasm0(arg4, arg5), getStringFromWasm0(arg6, arg7)); + } finally { + wasm.__wbindgen_free(deferred0_0, deferred0_1, 1); + } + }; + imports.wbg.__wbg_measure_a990198e921c09fd = function() { return handleError(function (arg0, arg1, arg2, arg3) { + let deferred0_0; + let deferred0_1; + let deferred1_0; + let deferred1_1; + try { + deferred0_0 = arg0; + deferred0_1 = arg1; + deferred1_0 = arg2; + deferred1_1 = arg3; + performance.measure(getStringFromWasm0(arg0, arg1), getStringFromWasm0(arg2, arg3)); + } finally { + wasm.__wbindgen_free(deferred0_0, deferred0_1, 1); + wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); + } + }, arguments) }; + imports.wbg.__wbindgen_jsval_loose_eq = function(arg0, arg1) { + const ret = getObject(arg0) == getObject(arg1); + return ret; + }; + imports.wbg.__wbg_String_b9412f8799faab3e = function(arg0, arg1) { + const ret = String(getObject(arg1)); + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }; + imports.wbg.__wbindgen_number_new = function(arg0) { + const ret = arg0; + return addHeapObject(ret); + }; + imports.wbg.__wbg_getwithrefkey_edc2c8960f0f1191 = function(arg0, arg1) { + const ret = getObject(arg0)[getObject(arg1)]; + return addHeapObject(ret); + }; + imports.wbg.__wbg_set_f975102236d3c502 = function(arg0, arg1, arg2) { + getObject(arg0)[takeObject(arg1)] = takeObject(arg2); + }; + imports.wbg.__wbg_self_3093d5d1f7bcb682 = function() { return handleError(function () { + const ret = self.self; + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_window_3bcfc4d31bc012f8 = function() { return handleError(function () { + const ret = window.window; + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_globalThis_86b222e13bdf32ed = function() { return handleError(function () { + const ret = globalThis.globalThis; + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_global_e5a3fe56f8be9485 = function() { return handleError(function () { + const ret = global.global; + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_newnoargs_76313bd6ff35d0f2 = function(arg0, arg1) { + const ret = new Function(getStringFromWasm0(arg0, arg1)); + return addHeapObject(ret); + }; + imports.wbg.__wbg_call_1084a111329e68ce = function() { return handleError(function (arg0, arg1) { + const ret = getObject(arg0).call(getObject(arg1)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_get_3baa728f9d58d3f6 = function(arg0, arg1) { + const ret = getObject(arg0)[arg1 >>> 0]; + return addHeapObject(ret); + }; + imports.wbg.__wbg_length_ae22078168b726f5 = function(arg0) { + const ret = getObject(arg0).length; + return ret; + }; + imports.wbg.__wbg_new_a220cf903aa02ca2 = function() { + const ret = new Array(); + return addHeapObject(ret); + }; + imports.wbg.__wbg_next_de3e9db4440638b2 = function(arg0) { + const ret = getObject(arg0).next; + return addHeapObject(ret); + }; + imports.wbg.__wbg_next_f9cb570345655b9a = function() { return handleError(function (arg0) { + const ret = getObject(arg0).next(); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_done_bfda7aa8f252b39f = function(arg0) { + const ret = getObject(arg0).done; + return ret; + }; + imports.wbg.__wbg_value_6d39332ab4788d86 = function(arg0) { + const ret = getObject(arg0).value; + return addHeapObject(ret); + }; + imports.wbg.__wbg_iterator_888179a48810a9fe = function() { + const ret = Symbol.iterator; + return addHeapObject(ret); + }; + imports.wbg.__wbg_get_224d16597dbbfd96 = function() { return handleError(function (arg0, arg1) { + const ret = Reflect.get(getObject(arg0), getObject(arg1)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_new_525245e2b9901204 = function() { + const ret = new Object(); + return addHeapObject(ret); + }; + imports.wbg.__wbg_set_673dda6c73d19609 = function(arg0, arg1, arg2) { + getObject(arg0)[arg1 >>> 0] = takeObject(arg2); + }; + imports.wbg.__wbg_isArray_8364a5371e9737d8 = function(arg0) { + const ret = Array.isArray(getObject(arg0)); + return ret; + }; + imports.wbg.__wbg_instanceof_ArrayBuffer_61dfc3198373c902 = function(arg0) { + let result; + try { + result = getObject(arg0) instanceof ArrayBuffer; + } catch (_) { + result = false; + } + const ret = result; + return ret; + }; + imports.wbg.__wbg_call_89af060b4e1523f2 = function() { return handleError(function (arg0, arg1, arg2) { + const ret = getObject(arg0).call(getObject(arg1), getObject(arg2)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_entries_7a0e06255456ebcd = function(arg0) { + const ret = Object.entries(getObject(arg0)); + return addHeapObject(ret); + }; + imports.wbg.__wbg_buffer_b7b08af79b0b0974 = function(arg0) { + const ret = getObject(arg0).buffer; + return addHeapObject(ret); + }; + imports.wbg.__wbg_newwithbyteoffsetandlength_8a2cb9ca96b27ec9 = function(arg0, arg1, arg2) { + const ret = new Uint8Array(getObject(arg0), arg1 >>> 0, arg2 >>> 0); + return addHeapObject(ret); + }; + imports.wbg.__wbg_new_ea1883e1e5e86686 = function(arg0) { + const ret = new Uint8Array(getObject(arg0)); + return addHeapObject(ret); + }; + imports.wbg.__wbg_set_d1e79e2388520f18 = function(arg0, arg1, arg2) { + getObject(arg0).set(getObject(arg1), arg2 >>> 0); + }; + imports.wbg.__wbg_length_8339fcf5d8ecd12e = function(arg0) { + const ret = getObject(arg0).length; + return ret; + }; + imports.wbg.__wbg_instanceof_Uint8Array_247a91427532499e = function(arg0) { + let result; + try { + result = getObject(arg0) instanceof Uint8Array; + } catch (_) { + result = false; + } + const ret = result; + return ret; + }; + imports.wbg.__wbg_newwithlength_ec548f448387c968 = function(arg0) { + const ret = new Uint8Array(arg0 >>> 0); + return addHeapObject(ret); + }; + imports.wbg.__wbg_subarray_7c2e3576afe181d1 = function(arg0, arg1, arg2) { + const ret = getObject(arg0).subarray(arg1 >>> 0, arg2 >>> 0); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_debug_string = function(arg0, arg1) { + const ret = debugString(getObject(arg1)); + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }; + imports.wbg.__wbindgen_throw = function(arg0, arg1) { + throw new Error(getStringFromWasm0(arg0, arg1)); + }; + imports.wbg.__wbindgen_memory = function() { + const ret = wasm.memory; + return addHeapObject(ret); + }; + + return imports; +} + +function __wbg_init_memory(imports, memory) { + +} + +function __wbg_finalize_init(instance, module) { + wasm = instance.exports; + __wbg_init.__wbindgen_wasm_module = module; + cachedDataViewMemory0 = null; + cachedUint8ArrayMemory0 = null; + + + wasm.__wbindgen_start(); + return wasm; +} + +function initSync(module) { + if (wasm !== undefined) return wasm; + + + if (typeof module !== 'undefined' && Object.getPrototypeOf(module) === Object.prototype) + ({module} = module) + else + console.warn('using deprecated parameters for `initSync()`; pass a single object instead') + + const imports = __wbg_get_imports(); + + __wbg_init_memory(imports); + + if (!(module instanceof WebAssembly.Module)) { + module = new WebAssembly.Module(module); + } + + const instance = new WebAssembly.Instance(module, imports); + + return __wbg_finalize_init(instance, module); +} + +async function __wbg_init(module_or_path) { + if (wasm !== undefined) return wasm; + + + if (typeof module_or_path !== 'undefined' && Object.getPrototypeOf(module_or_path) === Object.prototype) + ({module_or_path} = module_or_path) + else + console.warn('using deprecated parameters for the initialization function; pass a single object instead') + + if (typeof module_or_path === 'undefined') { + module_or_path = new URL('ets_bg.wasm', import.meta.url); + } + const imports = __wbg_get_imports(); + + if (typeof module_or_path === 'string' || (typeof Request === 'function' && module_or_path instanceof Request) || (typeof URL === 'function' && module_or_path instanceof URL)) { + module_or_path = fetch(module_or_path); + } + + __wbg_init_memory(imports); + + const { instance, module } = await __wbg_load(await module_or_path, imports); + + return __wbg_finalize_init(instance, module); +} + +export { initSync }; +export default __wbg_init; diff --git a/demo/dist/@bsull/augurs/ets_bg.wasm b/demo/dist/@bsull/augurs/ets_bg.wasm new file mode 100644 index 0000000..9e74d73 Binary files /dev/null and b/demo/dist/@bsull/augurs/ets_bg.wasm differ diff --git a/demo/dist/@bsull/augurs/ets_bg.wasm.d.ts b/demo/dist/@bsull/augurs/ets_bg.wasm.d.ts new file mode 100644 index 0000000..d19539a --- /dev/null +++ b/demo/dist/@bsull/augurs/ets_bg.wasm.d.ts @@ -0,0 +1,15 @@ +/* tslint:disable */ +/* eslint-disable */ +export const memory: WebAssembly.Memory; +export function __wbg_autoets_free(a: number, b: number): void; +export function autoets_new(a: number, b: number, c: number, d: number): void; +export function autoets_fit(a: number, b: number, c: number): void; +export function autoets_predict(a: number, b: number, c: number, d: number, e: number): void; +export function initLogging(a: number, b: number): void; +export function custom_init(): void; +export function __wbindgen_malloc(a: number, b: number): number; +export function __wbindgen_realloc(a: number, b: number, c: number, d: number): number; +export function __wbindgen_add_to_stack_pointer(a: number): number; +export function __wbindgen_exn_store(a: number): void; +export function __wbindgen_free(a: number, b: number, c: number): void; +export function __wbindgen_start(): void; diff --git a/demo/dist/@bsull/augurs/mstl.d.ts b/demo/dist/@bsull/augurs/mstl.d.ts new file mode 100644 index 0000000..d6b41e6 --- /dev/null +++ b/demo/dist/@bsull/augurs/mstl.d.ts @@ -0,0 +1,219 @@ +/* tslint:disable */ +/* eslint-disable */ +/** +* Create a new MSTL model with the given periods using the `AutoETS` trend model. +* +* @deprecated use `MSTL.ets` instead +* @param {number[] | Uint32Array} periods +* @param {ETSOptions | undefined} [options] +* @returns {MSTL} +*/ +export function ets(periods: number[] | Uint32Array, options?: ETSOptions): MSTL; +/** +* Initialize logging. +* +* You can use this to emit logs from augurs to the browser console. +* The default is to log everything to the console, but you can +* change the log level and whether logs are emitted to the console +* or to the browser's performance timeline. +* +* IMPORTANT: this function should only be called once. It will throw +* an exception if called more than once. +* @param {LogConfig | undefined} [config] +*/ +export function initLogging(config?: LogConfig): void; +/** +* Initialize the logger and panic hook. +* +* This will be called automatically when the module is imported. +* It sets the default tracing subscriber to `tracing-wasm`, and +* sets WASM panics to print to the console with a helpful error +* message. +*/ +export function custom_init(): void; +/** + * The type of trend forecaster to use. + */ +export type MSTLTrendModel = "ets"; + +/** + * Options for the ETS MSTL model. + */ +export interface ETSOptions { + /** + * Whether to impute missing values. + */ + impute?: boolean; + /** + * Whether to logit-transform the data before forecasting. + * + * If `true`, the training data will be transformed using the logit function. + * Forecasts will be back-transformed using the logistic function. + */ + logitTransform?: boolean; +} + +/** + * The maximum log level to emit. + * + * The default is `Level::Info`. + */ +export type Level = "trace" | "debug" | "info" | "warn" | "error"; + +/** + * The target for augurs log events. + */ +export type LogTarget = "console" | "performance"; + +/** + * Log configuration. + */ +export interface LogConfig { + /** + * The maximum log level to emit. + * + * Defaults to `INFO`. + */ + maxLevel?: Level; + /** + * The target for augurs log events. + * + * Defaults to logging to the browser console. + */ + target?: LogTarget; + /** + * Whether to emit coloured logs. + * + * Defaults to `true`. + */ + color?: boolean; + /** + * Whether to show detailed fields such as augurs\' file names and line numbers + * in the logs. + * + * Probably not wise in production. + * + * Defaults to `false`. + */ + showDetailedFields?: boolean; +} + +/** + * Forecast intervals. + */ +export interface ForecastIntervals { + /** + * The confidence level for the intervals. + */ + level: number; + /** + * The lower prediction intervals. + */ + lower: number[]; + /** + * The upper prediction intervals. + */ + upper: number[]; +} + +/** + * A forecast containing point forecasts and, optionally, prediction intervals. + */ +export interface Forecast { + /** + * The point forecasts. + */ + point: number[]; + /** + * The forecast intervals, if requested and supported + * by the trend model. + */ + intervals: ForecastIntervals | undefined; +} + +/** +* A MSTL model. +*/ +export class MSTL { + free(): void; +/** +* Create a new MSTL model with the given periods using the given trend model. +* @param {MSTLTrendModel} trend_forecaster +* @param {number[] | Uint32Array} periods +* @param {ETSOptions | undefined} [options] +*/ + constructor(trend_forecaster: MSTLTrendModel, periods: number[] | Uint32Array, options?: ETSOptions); +/** +* Create a new MSTL model with the given periods using the `AutoETS` trend model. +* @param {number[] | Uint32Array} periods +* @param {ETSOptions | undefined} [options] +* @returns {MSTL} +*/ + static ets(periods: number[] | Uint32Array, options?: ETSOptions): MSTL; +/** +* Fit the model to the given time series. +* @param {number[] | Float64Array} y +*/ + fit(y: number[] | Float64Array): void; +/** +* Predict the next `horizon` values, optionally including prediction +* intervals at the given level. +* +* If provided, `level` must be a float between 0 and 1. +* @param {number} horizon +* @param {number | undefined} [level] +* @returns {Forecast} +*/ + predict(horizon: number, level?: number): Forecast; +/** +* Produce in-sample forecasts, optionally including prediction +* intervals at the given level. +* +* If provided, `level` must be a float between 0 and 1. +* @param {number | undefined} [level] +* @returns {Forecast} +*/ + predictInSample(level?: number): Forecast; +} + +export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module; + +export interface InitOutput { + readonly memory: WebAssembly.Memory; + readonly __wbg_mstl_free: (a: number, b: number) => void; + readonly mstl_new: (a: number, b: number, c: number, d: number) => void; + readonly mstl_fit: (a: number, b: number, c: number) => void; + readonly mstl_predict: (a: number, b: number, c: number, d: number, e: number) => void; + readonly mstl_predictInSample: (a: number, b: number, c: number, d: number) => void; + readonly ets: (a: number, b: number, c: number) => void; + readonly mstl_ets: (a: number, b: number, c: number) => void; + readonly initLogging: (a: number, b: number) => void; + readonly custom_init: () => void; + readonly __wbindgen_malloc: (a: number, b: number) => number; + readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number; + readonly __wbindgen_add_to_stack_pointer: (a: number) => number; + readonly __wbindgen_free: (a: number, b: number, c: number) => void; + readonly __wbindgen_exn_store: (a: number) => void; + readonly __wbindgen_start: () => void; +} + +export type SyncInitInput = BufferSource | WebAssembly.Module; +/** +* Instantiates the given `module`, which can either be bytes or +* a precompiled `WebAssembly.Module`. +* +* @param {{ module: SyncInitInput }} module - Passing `SyncInitInput` directly is deprecated. +* +* @returns {InitOutput} +*/ +export function initSync(module: { module: SyncInitInput } | SyncInitInput): InitOutput; + +/** +* If `module_or_path` is {RequestInfo} or {URL}, makes a request and +* for everything else, calls `WebAssembly.instantiate` directly. +* +* @param {{ module_or_path: InitInput | Promise }} module_or_path - Passing `InitInput` directly is deprecated. +* +* @returns {Promise} +*/ +export default function __wbg_init (module_or_path?: { module_or_path: InitInput | Promise } | InitInput | Promise): Promise; diff --git a/demo/dist/@bsull/augurs/mstl.js b/demo/dist/@bsull/augurs/mstl.js new file mode 100644 index 0000000..6559a86 --- /dev/null +++ b/demo/dist/@bsull/augurs/mstl.js @@ -0,0 +1,827 @@ +let wasm; + +const heap = new Array(128).fill(undefined); + +heap.push(undefined, null, true, false); + +function getObject(idx) { return heap[idx]; } + +let heap_next = heap.length; + +function dropObject(idx) { + if (idx < 132) return; + heap[idx] = heap_next; + heap_next = idx; +} + +function takeObject(idx) { + const ret = getObject(idx); + dropObject(idx); + return ret; +} + +const cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } ); + +if (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); }; + +let cachedUint8ArrayMemory0 = null; + +function getUint8ArrayMemory0() { + if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) { + cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer); + } + return cachedUint8ArrayMemory0; +} + +function getStringFromWasm0(ptr, len) { + ptr = ptr >>> 0; + return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len)); +} + +function addHeapObject(obj) { + if (heap_next === heap.length) heap.push(heap.length + 1); + const idx = heap_next; + heap_next = heap[idx]; + + heap[idx] = obj; + return idx; +} + +let WASM_VECTOR_LEN = 0; + +const cachedTextEncoder = (typeof TextEncoder !== 'undefined' ? new TextEncoder('utf-8') : { encode: () => { throw Error('TextEncoder not available') } } ); + +const encodeString = (typeof cachedTextEncoder.encodeInto === 'function' + ? function (arg, view) { + return cachedTextEncoder.encodeInto(arg, view); +} + : function (arg, view) { + const buf = cachedTextEncoder.encode(arg); + view.set(buf); + return { + read: arg.length, + written: buf.length + }; +}); + +function passStringToWasm0(arg, malloc, realloc) { + + if (realloc === undefined) { + const buf = cachedTextEncoder.encode(arg); + const ptr = malloc(buf.length, 1) >>> 0; + getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf); + WASM_VECTOR_LEN = buf.length; + return ptr; + } + + let len = arg.length; + let ptr = malloc(len, 1) >>> 0; + + const mem = getUint8ArrayMemory0(); + + let offset = 0; + + for (; offset < len; offset++) { + const code = arg.charCodeAt(offset); + if (code > 0x7F) break; + mem[ptr + offset] = code; + } + + if (offset !== len) { + if (offset !== 0) { + arg = arg.slice(offset); + } + ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; + const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len); + const ret = encodeString(arg, view); + + offset += ret.written; + ptr = realloc(ptr, len, offset, 1) >>> 0; + } + + WASM_VECTOR_LEN = offset; + return ptr; +} + +function isLikeNone(x) { + return x === undefined || x === null; +} + +let cachedDataViewMemory0 = null; + +function getDataViewMemory0() { + if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer.detached === true || (cachedDataViewMemory0.buffer.detached === undefined && cachedDataViewMemory0.buffer !== wasm.memory.buffer)) { + cachedDataViewMemory0 = new DataView(wasm.memory.buffer); + } + return cachedDataViewMemory0; +} + +function debugString(val) { + // primitive types + const type = typeof val; + if (type == 'number' || type == 'boolean' || val == null) { + return `${val}`; + } + if (type == 'string') { + return `"${val}"`; + } + if (type == 'symbol') { + const description = val.description; + if (description == null) { + return 'Symbol'; + } else { + return `Symbol(${description})`; + } + } + if (type == 'function') { + const name = val.name; + if (typeof name == 'string' && name.length > 0) { + return `Function(${name})`; + } else { + return 'Function'; + } + } + // objects + if (Array.isArray(val)) { + const length = val.length; + let debug = '['; + if (length > 0) { + debug += debugString(val[0]); + } + for(let i = 1; i < length; i++) { + debug += ', ' + debugString(val[i]); + } + debug += ']'; + return debug; + } + // Test for built-in + const builtInMatches = /\[object ([^\]]+)\]/.exec(toString.call(val)); + let className; + if (builtInMatches.length > 1) { + className = builtInMatches[1]; + } else { + // Failed to match the standard '[object ClassName]' + return toString.call(val); + } + if (className == 'Object') { + // we're a user defined class or Object + // JSON.stringify avoids problems with cycles, and is generally much + // easier than looping through ownProperties of `val`. + try { + return 'Object(' + JSON.stringify(val) + ')'; + } catch (_) { + return 'Object'; + } + } + // errors + if (val instanceof Error) { + return `${val.name}: ${val.message}\n${val.stack}`; + } + // TODO we could test for more things here, like `Set`s and `Map`s. + return className; +} +/** +* Create a new MSTL model with the given periods using the `AutoETS` trend model. +* +* @deprecated use `MSTL.ets` instead +* @param {number[] | Uint32Array} periods +* @param {ETSOptions | undefined} [options] +* @returns {MSTL} +*/ +export function ets(periods, options) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.ets(retptr, addHeapObject(periods), isLikeNone(options) ? 0 : addHeapObject(options)); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true); + if (r2) { + throw takeObject(r1); + } + return MSTL.__wrap(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +} + +/** +* Initialize logging. +* +* You can use this to emit logs from augurs to the browser console. +* The default is to log everything to the console, but you can +* change the log level and whether logs are emitted to the console +* or to the browser's performance timeline. +* +* IMPORTANT: this function should only be called once. It will throw +* an exception if called more than once. +* @param {LogConfig | undefined} [config] +*/ +export function initLogging(config) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.initLogging(retptr, isLikeNone(config) ? 0 : addHeapObject(config)); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + if (r1) { + throw takeObject(r0); + } + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +} + +/** +* Initialize the logger and panic hook. +* +* This will be called automatically when the module is imported. +* It sets the default tracing subscriber to `tracing-wasm`, and +* sets WASM panics to print to the console with a helpful error +* message. +*/ +export function custom_init() { + wasm.custom_init(); +} + +function handleError(f, args) { + try { + return f.apply(this, args); + } catch (e) { + wasm.__wbindgen_exn_store(addHeapObject(e)); + } +} + +const MSTLFinalization = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(ptr => wasm.__wbg_mstl_free(ptr >>> 0, 1)); +/** +* A MSTL model. +*/ +export class MSTL { + + static __wrap(ptr) { + ptr = ptr >>> 0; + const obj = Object.create(MSTL.prototype); + obj.__wbg_ptr = ptr; + MSTLFinalization.register(obj, obj.__wbg_ptr, obj); + return obj; + } + + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + MSTLFinalization.unregister(this); + return ptr; + } + + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_mstl_free(ptr, 0); + } + /** + * Create a new MSTL model with the given periods using the given trend model. + * @param {MSTLTrendModel} trend_forecaster + * @param {number[] | Uint32Array} periods + * @param {ETSOptions | undefined} [options] + */ + constructor(trend_forecaster, periods, options) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.mstl_new(retptr, addHeapObject(trend_forecaster), addHeapObject(periods), isLikeNone(options) ? 0 : addHeapObject(options)); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true); + if (r2) { + throw takeObject(r1); + } + this.__wbg_ptr = r0 >>> 0; + MSTLFinalization.register(this, this.__wbg_ptr, this); + return this; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * Create a new MSTL model with the given periods using the `AutoETS` trend model. + * @param {number[] | Uint32Array} periods + * @param {ETSOptions | undefined} [options] + * @returns {MSTL} + */ + static ets(periods, options) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.ets(retptr, addHeapObject(periods), isLikeNone(options) ? 0 : addHeapObject(options)); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true); + if (r2) { + throw takeObject(r1); + } + return MSTL.__wrap(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * Fit the model to the given time series. + * @param {number[] | Float64Array} y + */ + fit(y) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.mstl_fit(retptr, this.__wbg_ptr, addHeapObject(y)); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + if (r1) { + throw takeObject(r0); + } + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * Predict the next `horizon` values, optionally including prediction + * intervals at the given level. + * + * If provided, `level` must be a float between 0 and 1. + * @param {number} horizon + * @param {number | undefined} [level] + * @returns {Forecast} + */ + predict(horizon, level) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.mstl_predict(retptr, this.__wbg_ptr, horizon, !isLikeNone(level), isLikeNone(level) ? 0 : level); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true); + if (r2) { + throw takeObject(r1); + } + return takeObject(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * Produce in-sample forecasts, optionally including prediction + * intervals at the given level. + * + * If provided, `level` must be a float between 0 and 1. + * @param {number | undefined} [level] + * @returns {Forecast} + */ + predictInSample(level) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.mstl_predictInSample(retptr, this.__wbg_ptr, !isLikeNone(level), isLikeNone(level) ? 0 : level); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true); + if (r2) { + throw takeObject(r1); + } + return takeObject(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } +} + +async function __wbg_load(module, imports) { + if (typeof Response === 'function' && module instanceof Response) { + if (typeof WebAssembly.instantiateStreaming === 'function') { + try { + return await WebAssembly.instantiateStreaming(module, imports); + + } catch (e) { + if (module.headers.get('Content-Type') != 'application/wasm') { + console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e); + + } else { + throw e; + } + } + } + + const bytes = await module.arrayBuffer(); + return await WebAssembly.instantiate(bytes, imports); + + } else { + const instance = await WebAssembly.instantiate(module, imports); + + if (instance instanceof WebAssembly.Instance) { + return { instance, module }; + + } else { + return instance; + } + } +} + +function __wbg_get_imports() { + const imports = {}; + imports.wbg = {}; + imports.wbg.__wbindgen_object_drop_ref = function(arg0) { + takeObject(arg0); + }; + imports.wbg.__wbindgen_error_new = function(arg0, arg1) { + const ret = new Error(getStringFromWasm0(arg0, arg1)); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_is_string = function(arg0) { + const ret = typeof(getObject(arg0)) === 'string'; + return ret; + }; + imports.wbg.__wbindgen_string_get = function(arg0, arg1) { + const obj = getObject(arg1); + const ret = typeof(obj) === 'string' ? obj : undefined; + var ptr1 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + var len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }; + imports.wbg.__wbindgen_object_clone_ref = function(arg0) { + const ret = getObject(arg0); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_string_new = function(arg0, arg1) { + const ret = getStringFromWasm0(arg0, arg1); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_is_object = function(arg0) { + const val = getObject(arg0); + const ret = typeof(val) === 'object' && val !== null; + return ret; + }; + imports.wbg.__wbindgen_is_undefined = function(arg0) { + const ret = getObject(arg0) === undefined; + return ret; + }; + imports.wbg.__wbindgen_in = function(arg0, arg1) { + const ret = getObject(arg0) in getObject(arg1); + return ret; + }; + imports.wbg.__wbindgen_boolean_get = function(arg0) { + const v = getObject(arg0); + const ret = typeof(v) === 'boolean' ? (v ? 1 : 0) : 2; + return ret; + }; + imports.wbg.__wbindgen_number_get = function(arg0, arg1) { + const obj = getObject(arg1); + const ret = typeof(obj) === 'number' ? obj : undefined; + getDataViewMemory0().setFloat64(arg0 + 8 * 1, isLikeNone(ret) ? 0 : ret, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, !isLikeNone(ret), true); + }; + imports.wbg.__wbindgen_is_bigint = function(arg0) { + const ret = typeof(getObject(arg0)) === 'bigint'; + return ret; + }; + imports.wbg.__wbindgen_bigint_from_u64 = function(arg0) { + const ret = BigInt.asUintN(64, arg0); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_jsval_eq = function(arg0, arg1) { + const ret = getObject(arg0) === getObject(arg1); + return ret; + }; + imports.wbg.__wbg_new_abda76e883ba8a5f = function() { + const ret = new Error(); + return addHeapObject(ret); + }; + imports.wbg.__wbg_stack_658279fe44541cf6 = function(arg0, arg1) { + const ret = getObject(arg1).stack; + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }; + imports.wbg.__wbg_error_f851667af71bcfc6 = function(arg0, arg1) { + let deferred0_0; + let deferred0_1; + try { + deferred0_0 = arg0; + deferred0_1 = arg1; + console.error(getStringFromWasm0(arg0, arg1)); + } finally { + wasm.__wbindgen_free(deferred0_0, deferred0_1, 1); + } + }; + imports.wbg.__wbg_mark_f0616123624944ec = function(arg0, arg1) { + performance.mark(getStringFromWasm0(arg0, arg1)); + }; + imports.wbg.__wbg_log_914e3639af348b4e = function(arg0, arg1) { + let deferred0_0; + let deferred0_1; + try { + deferred0_0 = arg0; + deferred0_1 = arg1; + console.log(getStringFromWasm0(arg0, arg1)); + } finally { + wasm.__wbindgen_free(deferred0_0, deferred0_1, 1); + } + }; + imports.wbg.__wbg_log_12b4ba535cbd9499 = function(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7) { + let deferred0_0; + let deferred0_1; + try { + deferred0_0 = arg0; + deferred0_1 = arg1; + console.log(getStringFromWasm0(arg0, arg1), getStringFromWasm0(arg2, arg3), getStringFromWasm0(arg4, arg5), getStringFromWasm0(arg6, arg7)); + } finally { + wasm.__wbindgen_free(deferred0_0, deferred0_1, 1); + } + }; + imports.wbg.__wbg_measure_a990198e921c09fd = function() { return handleError(function (arg0, arg1, arg2, arg3) { + let deferred0_0; + let deferred0_1; + let deferred1_0; + let deferred1_1; + try { + deferred0_0 = arg0; + deferred0_1 = arg1; + deferred1_0 = arg2; + deferred1_1 = arg3; + performance.measure(getStringFromWasm0(arg0, arg1), getStringFromWasm0(arg2, arg3)); + } finally { + wasm.__wbindgen_free(deferred0_0, deferred0_1, 1); + wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); + } + }, arguments) }; + imports.wbg.__wbg_crypto_1d1f22824a6a080c = function(arg0) { + const ret = getObject(arg0).crypto; + return addHeapObject(ret); + }; + imports.wbg.__wbg_process_4a72847cc503995b = function(arg0) { + const ret = getObject(arg0).process; + return addHeapObject(ret); + }; + imports.wbg.__wbg_versions_f686565e586dd935 = function(arg0) { + const ret = getObject(arg0).versions; + return addHeapObject(ret); + }; + imports.wbg.__wbg_node_104a2ff8d6ea03a2 = function(arg0) { + const ret = getObject(arg0).node; + return addHeapObject(ret); + }; + imports.wbg.__wbg_require_cca90b1a94a0255b = function() { return handleError(function () { + const ret = module.require; + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbindgen_is_function = function(arg0) { + const ret = typeof(getObject(arg0)) === 'function'; + return ret; + }; + imports.wbg.__wbg_msCrypto_eb05e62b530a1508 = function(arg0) { + const ret = getObject(arg0).msCrypto; + return addHeapObject(ret); + }; + imports.wbg.__wbg_randomFillSync_5c9c955aa56b6049 = function() { return handleError(function (arg0, arg1) { + getObject(arg0).randomFillSync(takeObject(arg1)); + }, arguments) }; + imports.wbg.__wbg_getRandomValues_3aa56aa6edec874c = function() { return handleError(function (arg0, arg1) { + getObject(arg0).getRandomValues(getObject(arg1)); + }, arguments) }; + imports.wbg.__wbindgen_jsval_loose_eq = function(arg0, arg1) { + const ret = getObject(arg0) == getObject(arg1); + return ret; + }; + imports.wbg.__wbindgen_as_number = function(arg0) { + const ret = +getObject(arg0); + return ret; + }; + imports.wbg.__wbg_String_b9412f8799faab3e = function(arg0, arg1) { + const ret = String(getObject(arg1)); + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }; + imports.wbg.__wbindgen_number_new = function(arg0) { + const ret = arg0; + return addHeapObject(ret); + }; + imports.wbg.__wbg_getwithrefkey_edc2c8960f0f1191 = function(arg0, arg1) { + const ret = getObject(arg0)[getObject(arg1)]; + return addHeapObject(ret); + }; + imports.wbg.__wbg_set_f975102236d3c502 = function(arg0, arg1, arg2) { + getObject(arg0)[takeObject(arg1)] = takeObject(arg2); + }; + imports.wbg.__wbg_self_3093d5d1f7bcb682 = function() { return handleError(function () { + const ret = self.self; + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_window_3bcfc4d31bc012f8 = function() { return handleError(function () { + const ret = window.window; + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_globalThis_86b222e13bdf32ed = function() { return handleError(function () { + const ret = globalThis.globalThis; + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_global_e5a3fe56f8be9485 = function() { return handleError(function () { + const ret = global.global; + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_newnoargs_76313bd6ff35d0f2 = function(arg0, arg1) { + const ret = new Function(getStringFromWasm0(arg0, arg1)); + return addHeapObject(ret); + }; + imports.wbg.__wbg_call_1084a111329e68ce = function() { return handleError(function (arg0, arg1) { + const ret = getObject(arg0).call(getObject(arg1)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_get_3baa728f9d58d3f6 = function(arg0, arg1) { + const ret = getObject(arg0)[arg1 >>> 0]; + return addHeapObject(ret); + }; + imports.wbg.__wbg_length_ae22078168b726f5 = function(arg0) { + const ret = getObject(arg0).length; + return ret; + }; + imports.wbg.__wbg_new_a220cf903aa02ca2 = function() { + const ret = new Array(); + return addHeapObject(ret); + }; + imports.wbg.__wbg_next_de3e9db4440638b2 = function(arg0) { + const ret = getObject(arg0).next; + return addHeapObject(ret); + }; + imports.wbg.__wbg_next_f9cb570345655b9a = function() { return handleError(function (arg0) { + const ret = getObject(arg0).next(); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_done_bfda7aa8f252b39f = function(arg0) { + const ret = getObject(arg0).done; + return ret; + }; + imports.wbg.__wbg_value_6d39332ab4788d86 = function(arg0) { + const ret = getObject(arg0).value; + return addHeapObject(ret); + }; + imports.wbg.__wbg_iterator_888179a48810a9fe = function() { + const ret = Symbol.iterator; + return addHeapObject(ret); + }; + imports.wbg.__wbg_get_224d16597dbbfd96 = function() { return handleError(function (arg0, arg1) { + const ret = Reflect.get(getObject(arg0), getObject(arg1)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_new_525245e2b9901204 = function() { + const ret = new Object(); + return addHeapObject(ret); + }; + imports.wbg.__wbg_set_673dda6c73d19609 = function(arg0, arg1, arg2) { + getObject(arg0)[arg1 >>> 0] = takeObject(arg2); + }; + imports.wbg.__wbg_isArray_8364a5371e9737d8 = function(arg0) { + const ret = Array.isArray(getObject(arg0)); + return ret; + }; + imports.wbg.__wbg_instanceof_ArrayBuffer_61dfc3198373c902 = function(arg0) { + let result; + try { + result = getObject(arg0) instanceof ArrayBuffer; + } catch (_) { + result = false; + } + const ret = result; + return ret; + }; + imports.wbg.__wbg_call_89af060b4e1523f2 = function() { return handleError(function (arg0, arg1, arg2) { + const ret = getObject(arg0).call(getObject(arg1), getObject(arg2)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_isSafeInteger_7f1ed56200d90674 = function(arg0) { + const ret = Number.isSafeInteger(getObject(arg0)); + return ret; + }; + imports.wbg.__wbg_entries_7a0e06255456ebcd = function(arg0) { + const ret = Object.entries(getObject(arg0)); + return addHeapObject(ret); + }; + imports.wbg.__wbg_buffer_b7b08af79b0b0974 = function(arg0) { + const ret = getObject(arg0).buffer; + return addHeapObject(ret); + }; + imports.wbg.__wbg_newwithbyteoffsetandlength_8a2cb9ca96b27ec9 = function(arg0, arg1, arg2) { + const ret = new Uint8Array(getObject(arg0), arg1 >>> 0, arg2 >>> 0); + return addHeapObject(ret); + }; + imports.wbg.__wbg_new_ea1883e1e5e86686 = function(arg0) { + const ret = new Uint8Array(getObject(arg0)); + return addHeapObject(ret); + }; + imports.wbg.__wbg_set_d1e79e2388520f18 = function(arg0, arg1, arg2) { + getObject(arg0).set(getObject(arg1), arg2 >>> 0); + }; + imports.wbg.__wbg_length_8339fcf5d8ecd12e = function(arg0) { + const ret = getObject(arg0).length; + return ret; + }; + imports.wbg.__wbg_instanceof_Uint8Array_247a91427532499e = function(arg0) { + let result; + try { + result = getObject(arg0) instanceof Uint8Array; + } catch (_) { + result = false; + } + const ret = result; + return ret; + }; + imports.wbg.__wbg_newwithlength_ec548f448387c968 = function(arg0) { + const ret = new Uint8Array(arg0 >>> 0); + return addHeapObject(ret); + }; + imports.wbg.__wbg_subarray_7c2e3576afe181d1 = function(arg0, arg1, arg2) { + const ret = getObject(arg0).subarray(arg1 >>> 0, arg2 >>> 0); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_bigint_get_as_i64 = function(arg0, arg1) { + const v = getObject(arg1); + const ret = typeof(v) === 'bigint' ? v : undefined; + getDataViewMemory0().setBigInt64(arg0 + 8 * 1, isLikeNone(ret) ? BigInt(0) : ret, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, !isLikeNone(ret), true); + }; + imports.wbg.__wbindgen_debug_string = function(arg0, arg1) { + const ret = debugString(getObject(arg1)); + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }; + imports.wbg.__wbindgen_throw = function(arg0, arg1) { + throw new Error(getStringFromWasm0(arg0, arg1)); + }; + imports.wbg.__wbindgen_memory = function() { + const ret = wasm.memory; + return addHeapObject(ret); + }; + + return imports; +} + +function __wbg_init_memory(imports, memory) { + +} + +function __wbg_finalize_init(instance, module) { + wasm = instance.exports; + __wbg_init.__wbindgen_wasm_module = module; + cachedDataViewMemory0 = null; + cachedUint8ArrayMemory0 = null; + + + wasm.__wbindgen_start(); + return wasm; +} + +function initSync(module) { + if (wasm !== undefined) return wasm; + + + if (typeof module !== 'undefined' && Object.getPrototypeOf(module) === Object.prototype) + ({module} = module) + else + console.warn('using deprecated parameters for `initSync()`; pass a single object instead') + + const imports = __wbg_get_imports(); + + __wbg_init_memory(imports); + + if (!(module instanceof WebAssembly.Module)) { + module = new WebAssembly.Module(module); + } + + const instance = new WebAssembly.Instance(module, imports); + + return __wbg_finalize_init(instance, module); +} + +async function __wbg_init(module_or_path) { + if (wasm !== undefined) return wasm; + + + if (typeof module_or_path !== 'undefined' && Object.getPrototypeOf(module_or_path) === Object.prototype) + ({module_or_path} = module_or_path) + else + console.warn('using deprecated parameters for the initialization function; pass a single object instead') + + if (typeof module_or_path === 'undefined') { + module_or_path = new URL('mstl_bg.wasm', import.meta.url); + } + const imports = __wbg_get_imports(); + + if (typeof module_or_path === 'string' || (typeof Request === 'function' && module_or_path instanceof Request) || (typeof URL === 'function' && module_or_path instanceof URL)) { + module_or_path = fetch(module_or_path); + } + + __wbg_init_memory(imports); + + const { instance, module } = await __wbg_load(await module_or_path, imports); + + return __wbg_finalize_init(instance, module); +} + +export { initSync }; +export default __wbg_init; diff --git a/demo/dist/@bsull/augurs/mstl_bg.wasm b/demo/dist/@bsull/augurs/mstl_bg.wasm new file mode 100644 index 0000000..8931388 Binary files /dev/null and b/demo/dist/@bsull/augurs/mstl_bg.wasm differ diff --git a/demo/dist/@bsull/augurs/mstl_bg.wasm.d.ts b/demo/dist/@bsull/augurs/mstl_bg.wasm.d.ts new file mode 100644 index 0000000..b979a6e --- /dev/null +++ b/demo/dist/@bsull/augurs/mstl_bg.wasm.d.ts @@ -0,0 +1,18 @@ +/* tslint:disable */ +/* eslint-disable */ +export const memory: WebAssembly.Memory; +export function __wbg_mstl_free(a: number, b: number): void; +export function mstl_new(a: number, b: number, c: number, d: number): void; +export function mstl_fit(a: number, b: number, c: number): void; +export function mstl_predict(a: number, b: number, c: number, d: number, e: number): void; +export function mstl_predictInSample(a: number, b: number, c: number, d: number): void; +export function ets(a: number, b: number, c: number): void; +export function mstl_ets(a: number, b: number, c: number): void; +export function initLogging(a: number, b: number): void; +export function custom_init(): void; +export function __wbindgen_malloc(a: number, b: number): number; +export function __wbindgen_realloc(a: number, b: number, c: number, d: number): number; +export function __wbindgen_add_to_stack_pointer(a: number): number; +export function __wbindgen_free(a: number, b: number, c: number): void; +export function __wbindgen_exn_store(a: number): void; +export function __wbindgen_start(): void; diff --git a/demo/dist/@bsull/augurs/outlier.d.ts b/demo/dist/@bsull/augurs/outlier.d.ts new file mode 100644 index 0000000..13eb7f5 --- /dev/null +++ b/demo/dist/@bsull/augurs/outlier.d.ts @@ -0,0 +1,303 @@ +/* tslint:disable */ +/* eslint-disable */ +/** +* Initialize logging. +* +* You can use this to emit logs from augurs to the browser console. +* The default is to log everything to the console, but you can +* change the log level and whether logs are emitted to the console +* or to the browser's performance timeline. +* +* IMPORTANT: this function should only be called once. It will throw +* an exception if called more than once. +* @param {LogConfig | undefined} [config] +*/ +export function initLogging(config?: LogConfig): void; +/** +* Initialize the logger and panic hook. +* +* This will be called automatically when the module is imported. +* It sets the default tracing subscriber to `tracing-wasm`, and +* sets WASM panics to print to the console with a helpful error +* message. +*/ +export function custom_init(): void; +/** + * Options for the DBSCAN outlier detector. + */ +export interface OutlierDetectorOptions { + /** + * A scale-invariant sensitivity parameter. + * + * This must be in (0, 1) and will be used to estimate a sensible + * value of epsilon based on the data. + */ + sensitivity: number; +} + +/** + * The type of outlier detector to use. + */ +export type OutlierDetectorType = "dbscan" | "mad"; + +/** + * A band indicating the min and max value considered outlying + * at each timestamp. + */ +export interface ClusterBand { + /** + * The minimum value considered outlying at each timestamp. + */ + min: number[]; + /** + * The maximum value considered outlying at each timestamp. + */ + max: number[]; +} + +/** + * A potentially outlying series. + */ +export interface OutlierSeries { + /** + * Whether the series is an outlier for at least one of the samples. + */ + isOutlier: boolean; + /** + * The intervals of the series that are considered outliers. + */ + outlierIntervals: OutlierInterval[]; + /** + * The outlier scores of the series for each sample. + */ + scores: number[]; +} + +/** + * An interval for which a series is outlying. + */ +export interface OutlierInterval { + /** + * The start index of the interval. + */ + start: number; + /** + * The end index of the interval, if any. + */ + end: number | undefined; +} + +/** + * The result of applying an outlier detection algorithm to a group of time series. + */ +export interface OutlierOutput { + /** + * The indexes of the series considered outliers. + */ + outlyingSeries: number[]; + /** + * The results of the detection for each series. + */ + seriesResults: OutlierSeries[]; + /** + * The band indicating the min and max value considered outlying + * at each timestamp. + * + * This may be undefined if no cluster was found (for example if + * there were fewer than 3 series in the input data in the case of + * DBSCAN). + */ + clusterBand: ClusterBand | undefined; +} + +/** + * The maximum log level to emit. + * + * The default is `Level::Info`. + */ +export type Level = "trace" | "debug" | "info" | "warn" | "error"; + +/** + * The target for augurs log events. + */ +export type LogTarget = "console" | "performance"; + +/** + * Log configuration. + */ +export interface LogConfig { + /** + * The maximum log level to emit. + * + * Defaults to `INFO`. + */ + maxLevel?: Level; + /** + * The target for augurs log events. + * + * Defaults to logging to the browser console. + */ + target?: LogTarget; + /** + * Whether to emit coloured logs. + * + * Defaults to `true`. + */ + color?: boolean; + /** + * Whether to show detailed fields such as augurs\' file names and line numbers + * in the logs. + * + * Probably not wise in production. + * + * Defaults to `false`. + */ + showDetailedFields?: boolean; +} + +/** + * Forecast intervals. + */ +export interface ForecastIntervals { + /** + * The confidence level for the intervals. + */ + level: number; + /** + * The lower prediction intervals. + */ + lower: number[]; + /** + * The upper prediction intervals. + */ + upper: number[]; +} + +/** + * A forecast containing point forecasts and, optionally, prediction intervals. + */ +export interface Forecast { + /** + * The point forecasts. + */ + point: number[]; + /** + * The forecast intervals, if requested and supported + * by the trend model. + */ + intervals: ForecastIntervals | undefined; +} + +/** +* A 'loaded' outlier detector, ready to detect outliers. +* +* This is returned by the `preprocess` method of `OutlierDetector`, +* and holds the preprocessed data for the detector. +*/ +export class LoadedOutlierDetector { + free(): void; +/** +* Detect outliers in the given time series. +* @returns {OutlierOutput} +*/ + detect(): OutlierOutput; +/** +* Update the detector with new options. +* +* # Errors +* +* This method will return an error if the detector and options types +* are incompatible. +* @param {OutlierDetectorOptions} options +*/ + updateDetector(options: OutlierDetectorOptions): void; +} +/** +* A detector for detecting outlying time series in a group of series. +*/ +export class OutlierDetector { + free(): void; +/** +* Create a new outlier detector. +* @param {OutlierDetectorType} detectorType +* @param {OutlierDetectorOptions} options +*/ + constructor(detectorType: OutlierDetectorType, options: OutlierDetectorOptions); +/** +* Create a new outlier detector using the DBSCAN algorithm. +* @param {OutlierDetectorOptions} options +* @returns {OutlierDetector} +*/ + static dbscan(options: OutlierDetectorOptions): OutlierDetector; +/** +* Create a new outlier detector using the MAD algorithm. +* @param {OutlierDetectorOptions} options +* @returns {OutlierDetector} +*/ + static mad(options: OutlierDetectorOptions): OutlierDetector; +/** +* Detect outlying time series in a group of series. +* +* Note: if you plan to run the detector multiple times on the same data, +* you should use the `preprocess` method to cache the preprocessed data, +* then call `detect` on the `LoadedOutlierDetector` returned by `preprocess`. +* @param {number[][] | Float64Array[]} y +* @returns {OutlierOutput} +*/ + detect(y: number[][] | Float64Array[]): OutlierOutput; +/** +* Preprocess the data for the detector. +* +* The returned value is a 'loaded' outlier detector, which can be used +* to detect outliers without needing to preprocess the data again. +* +* This is useful if you plan to run the detector multiple times on the same data. +* @param {number[][] | Float64Array[]} y +* @returns {LoadedOutlierDetector} +*/ + preprocess(y: number[][] | Float64Array[]): LoadedOutlierDetector; +} + +export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module; + +export interface InitOutput { + readonly memory: WebAssembly.Memory; + readonly __wbg_outlierdetector_free: (a: number, b: number) => void; + readonly outlierdetector_new: (a: number, b: number, c: number) => void; + readonly outlierdetector_dbscan: (a: number, b: number) => void; + readonly outlierdetector_mad: (a: number, b: number) => void; + readonly outlierdetector_detect: (a: number, b: number, c: number) => void; + readonly outlierdetector_preprocess: (a: number, b: number, c: number) => void; + readonly __wbg_loadedoutlierdetector_free: (a: number, b: number) => void; + readonly loadedoutlierdetector_detect: (a: number, b: number) => void; + readonly loadedoutlierdetector_updateDetector: (a: number, b: number, c: number) => void; + readonly initLogging: (a: number, b: number) => void; + readonly custom_init: () => void; + readonly __wbindgen_malloc: (a: number, b: number) => number; + readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number; + readonly __wbindgen_add_to_stack_pointer: (a: number) => number; + readonly __wbindgen_free: (a: number, b: number, c: number) => void; + readonly __wbindgen_exn_store: (a: number) => void; + readonly __wbindgen_start: () => void; +} + +export type SyncInitInput = BufferSource | WebAssembly.Module; +/** +* Instantiates the given `module`, which can either be bytes or +* a precompiled `WebAssembly.Module`. +* +* @param {{ module: SyncInitInput }} module - Passing `SyncInitInput` directly is deprecated. +* +* @returns {InitOutput} +*/ +export function initSync(module: { module: SyncInitInput } | SyncInitInput): InitOutput; + +/** +* If `module_or_path` is {RequestInfo} or {URL}, makes a request and +* for everything else, calls `WebAssembly.instantiate` directly. +* +* @param {{ module_or_path: InitInput | Promise }} module_or_path - Passing `InitInput` directly is deprecated. +* +* @returns {Promise} +*/ +export default function __wbg_init (module_or_path?: { module_or_path: InitInput | Promise } | InitInput | Promise): Promise; diff --git a/demo/dist/@bsull/augurs/outlier.js b/demo/dist/@bsull/augurs/outlier.js new file mode 100644 index 0000000..204c6c4 --- /dev/null +++ b/demo/dist/@bsull/augurs/outlier.js @@ -0,0 +1,791 @@ +let wasm; + +const cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } ); + +if (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); }; + +let cachedUint8ArrayMemory0 = null; + +function getUint8ArrayMemory0() { + if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) { + cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer); + } + return cachedUint8ArrayMemory0; +} + +function getStringFromWasm0(ptr, len) { + ptr = ptr >>> 0; + return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len)); +} + +const heap = new Array(128).fill(undefined); + +heap.push(undefined, null, true, false); + +let heap_next = heap.length; + +function addHeapObject(obj) { + if (heap_next === heap.length) heap.push(heap.length + 1); + const idx = heap_next; + heap_next = heap[idx]; + + heap[idx] = obj; + return idx; +} + +function getObject(idx) { return heap[idx]; } + +function dropObject(idx) { + if (idx < 132) return; + heap[idx] = heap_next; + heap_next = idx; +} + +function takeObject(idx) { + const ret = getObject(idx); + dropObject(idx); + return ret; +} + +function isLikeNone(x) { + return x === undefined || x === null; +} + +let cachedDataViewMemory0 = null; + +function getDataViewMemory0() { + if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer.detached === true || (cachedDataViewMemory0.buffer.detached === undefined && cachedDataViewMemory0.buffer !== wasm.memory.buffer)) { + cachedDataViewMemory0 = new DataView(wasm.memory.buffer); + } + return cachedDataViewMemory0; +} + +let WASM_VECTOR_LEN = 0; + +const cachedTextEncoder = (typeof TextEncoder !== 'undefined' ? new TextEncoder('utf-8') : { encode: () => { throw Error('TextEncoder not available') } } ); + +const encodeString = (typeof cachedTextEncoder.encodeInto === 'function' + ? function (arg, view) { + return cachedTextEncoder.encodeInto(arg, view); +} + : function (arg, view) { + const buf = cachedTextEncoder.encode(arg); + view.set(buf); + return { + read: arg.length, + written: buf.length + }; +}); + +function passStringToWasm0(arg, malloc, realloc) { + + if (realloc === undefined) { + const buf = cachedTextEncoder.encode(arg); + const ptr = malloc(buf.length, 1) >>> 0; + getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf); + WASM_VECTOR_LEN = buf.length; + return ptr; + } + + let len = arg.length; + let ptr = malloc(len, 1) >>> 0; + + const mem = getUint8ArrayMemory0(); + + let offset = 0; + + for (; offset < len; offset++) { + const code = arg.charCodeAt(offset); + if (code > 0x7F) break; + mem[ptr + offset] = code; + } + + if (offset !== len) { + if (offset !== 0) { + arg = arg.slice(offset); + } + ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; + const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len); + const ret = encodeString(arg, view); + + offset += ret.written; + ptr = realloc(ptr, len, offset, 1) >>> 0; + } + + WASM_VECTOR_LEN = offset; + return ptr; +} + +function debugString(val) { + // primitive types + const type = typeof val; + if (type == 'number' || type == 'boolean' || val == null) { + return `${val}`; + } + if (type == 'string') { + return `"${val}"`; + } + if (type == 'symbol') { + const description = val.description; + if (description == null) { + return 'Symbol'; + } else { + return `Symbol(${description})`; + } + } + if (type == 'function') { + const name = val.name; + if (typeof name == 'string' && name.length > 0) { + return `Function(${name})`; + } else { + return 'Function'; + } + } + // objects + if (Array.isArray(val)) { + const length = val.length; + let debug = '['; + if (length > 0) { + debug += debugString(val[0]); + } + for(let i = 1; i < length; i++) { + debug += ', ' + debugString(val[i]); + } + debug += ']'; + return debug; + } + // Test for built-in + const builtInMatches = /\[object ([^\]]+)\]/.exec(toString.call(val)); + let className; + if (builtInMatches.length > 1) { + className = builtInMatches[1]; + } else { + // Failed to match the standard '[object ClassName]' + return toString.call(val); + } + if (className == 'Object') { + // we're a user defined class or Object + // JSON.stringify avoids problems with cycles, and is generally much + // easier than looping through ownProperties of `val`. + try { + return 'Object(' + JSON.stringify(val) + ')'; + } catch (_) { + return 'Object'; + } + } + // errors + if (val instanceof Error) { + return `${val.name}: ${val.message}\n${val.stack}`; + } + // TODO we could test for more things here, like `Set`s and `Map`s. + return className; +} +/** +* Initialize logging. +* +* You can use this to emit logs from augurs to the browser console. +* The default is to log everything to the console, but you can +* change the log level and whether logs are emitted to the console +* or to the browser's performance timeline. +* +* IMPORTANT: this function should only be called once. It will throw +* an exception if called more than once. +* @param {LogConfig | undefined} [config] +*/ +export function initLogging(config) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.initLogging(retptr, isLikeNone(config) ? 0 : addHeapObject(config)); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + if (r1) { + throw takeObject(r0); + } + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +} + +/** +* Initialize the logger and panic hook. +* +* This will be called automatically when the module is imported. +* It sets the default tracing subscriber to `tracing-wasm`, and +* sets WASM panics to print to the console with a helpful error +* message. +*/ +export function custom_init() { + wasm.custom_init(); +} + +function handleError(f, args) { + try { + return f.apply(this, args); + } catch (e) { + wasm.__wbindgen_exn_store(addHeapObject(e)); + } +} + +const LoadedOutlierDetectorFinalization = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(ptr => wasm.__wbg_loadedoutlierdetector_free(ptr >>> 0, 1)); +/** +* A 'loaded' outlier detector, ready to detect outliers. +* +* This is returned by the `preprocess` method of `OutlierDetector`, +* and holds the preprocessed data for the detector. +*/ +export class LoadedOutlierDetector { + + static __wrap(ptr) { + ptr = ptr >>> 0; + const obj = Object.create(LoadedOutlierDetector.prototype); + obj.__wbg_ptr = ptr; + LoadedOutlierDetectorFinalization.register(obj, obj.__wbg_ptr, obj); + return obj; + } + + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + LoadedOutlierDetectorFinalization.unregister(this); + return ptr; + } + + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_loadedoutlierdetector_free(ptr, 0); + } + /** + * Detect outliers in the given time series. + * @returns {OutlierOutput} + */ + detect() { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.loadedoutlierdetector_detect(retptr, this.__wbg_ptr); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true); + if (r2) { + throw takeObject(r1); + } + return takeObject(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * Update the detector with new options. + * + * # Errors + * + * This method will return an error if the detector and options types + * are incompatible. + * @param {OutlierDetectorOptions} options + */ + updateDetector(options) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.loadedoutlierdetector_updateDetector(retptr, this.__wbg_ptr, addHeapObject(options)); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + if (r1) { + throw takeObject(r0); + } + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } +} + +const OutlierDetectorFinalization = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(ptr => wasm.__wbg_outlierdetector_free(ptr >>> 0, 1)); +/** +* A detector for detecting outlying time series in a group of series. +*/ +export class OutlierDetector { + + static __wrap(ptr) { + ptr = ptr >>> 0; + const obj = Object.create(OutlierDetector.prototype); + obj.__wbg_ptr = ptr; + OutlierDetectorFinalization.register(obj, obj.__wbg_ptr, obj); + return obj; + } + + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + OutlierDetectorFinalization.unregister(this); + return ptr; + } + + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_outlierdetector_free(ptr, 0); + } + /** + * Create a new outlier detector. + * @param {OutlierDetectorType} detectorType + * @param {OutlierDetectorOptions} options + */ + constructor(detectorType, options) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.outlierdetector_new(retptr, addHeapObject(detectorType), addHeapObject(options)); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true); + if (r2) { + throw takeObject(r1); + } + this.__wbg_ptr = r0 >>> 0; + OutlierDetectorFinalization.register(this, this.__wbg_ptr, this); + return this; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * Create a new outlier detector using the DBSCAN algorithm. + * @param {OutlierDetectorOptions} options + * @returns {OutlierDetector} + */ + static dbscan(options) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.outlierdetector_dbscan(retptr, addHeapObject(options)); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true); + if (r2) { + throw takeObject(r1); + } + return OutlierDetector.__wrap(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * Create a new outlier detector using the MAD algorithm. + * @param {OutlierDetectorOptions} options + * @returns {OutlierDetector} + */ + static mad(options) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.outlierdetector_mad(retptr, addHeapObject(options)); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true); + if (r2) { + throw takeObject(r1); + } + return OutlierDetector.__wrap(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * Detect outlying time series in a group of series. + * + * Note: if you plan to run the detector multiple times on the same data, + * you should use the `preprocess` method to cache the preprocessed data, + * then call `detect` on the `LoadedOutlierDetector` returned by `preprocess`. + * @param {number[][] | Float64Array[]} y + * @returns {OutlierOutput} + */ + detect(y) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.outlierdetector_detect(retptr, this.__wbg_ptr, addHeapObject(y)); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true); + if (r2) { + throw takeObject(r1); + } + return takeObject(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * Preprocess the data for the detector. + * + * The returned value is a 'loaded' outlier detector, which can be used + * to detect outliers without needing to preprocess the data again. + * + * This is useful if you plan to run the detector multiple times on the same data. + * @param {number[][] | Float64Array[]} y + * @returns {LoadedOutlierDetector} + */ + preprocess(y) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.outlierdetector_preprocess(retptr, this.__wbg_ptr, addHeapObject(y)); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true); + if (r2) { + throw takeObject(r1); + } + return LoadedOutlierDetector.__wrap(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } +} + +async function __wbg_load(module, imports) { + if (typeof Response === 'function' && module instanceof Response) { + if (typeof WebAssembly.instantiateStreaming === 'function') { + try { + return await WebAssembly.instantiateStreaming(module, imports); + + } catch (e) { + if (module.headers.get('Content-Type') != 'application/wasm') { + console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e); + + } else { + throw e; + } + } + } + + const bytes = await module.arrayBuffer(); + return await WebAssembly.instantiate(bytes, imports); + + } else { + const instance = await WebAssembly.instantiate(module, imports); + + if (instance instanceof WebAssembly.Instance) { + return { instance, module }; + + } else { + return instance; + } + } +} + +function __wbg_get_imports() { + const imports = {}; + imports.wbg = {}; + imports.wbg.__wbindgen_error_new = function(arg0, arg1) { + const ret = new Error(getStringFromWasm0(arg0, arg1)); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_object_drop_ref = function(arg0) { + takeObject(arg0); + }; + imports.wbg.__wbindgen_is_object = function(arg0) { + const val = getObject(arg0); + const ret = typeof(val) === 'object' && val !== null; + return ret; + }; + imports.wbg.__wbindgen_is_undefined = function(arg0) { + const ret = getObject(arg0) === undefined; + return ret; + }; + imports.wbg.__wbindgen_in = function(arg0, arg1) { + const ret = getObject(arg0) in getObject(arg1); + return ret; + }; + imports.wbg.__wbindgen_number_get = function(arg0, arg1) { + const obj = getObject(arg1); + const ret = typeof(obj) === 'number' ? obj : undefined; + getDataViewMemory0().setFloat64(arg0 + 8 * 1, isLikeNone(ret) ? 0 : ret, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, !isLikeNone(ret), true); + }; + imports.wbg.__wbindgen_object_clone_ref = function(arg0) { + const ret = getObject(arg0); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_is_string = function(arg0) { + const ret = typeof(getObject(arg0)) === 'string'; + return ret; + }; + imports.wbg.__wbindgen_string_get = function(arg0, arg1) { + const obj = getObject(arg1); + const ret = typeof(obj) === 'string' ? obj : undefined; + var ptr1 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + var len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }; + imports.wbg.__wbindgen_bigint_from_u64 = function(arg0) { + const ret = BigInt.asUintN(64, arg0); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_boolean_get = function(arg0) { + const v = getObject(arg0); + const ret = typeof(v) === 'boolean' ? (v ? 1 : 0) : 2; + return ret; + }; + imports.wbg.__wbg_new_abda76e883ba8a5f = function() { + const ret = new Error(); + return addHeapObject(ret); + }; + imports.wbg.__wbg_stack_658279fe44541cf6 = function(arg0, arg1) { + const ret = getObject(arg1).stack; + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }; + imports.wbg.__wbg_error_f851667af71bcfc6 = function(arg0, arg1) { + let deferred0_0; + let deferred0_1; + try { + deferred0_0 = arg0; + deferred0_1 = arg1; + console.error(getStringFromWasm0(arg0, arg1)); + } finally { + wasm.__wbindgen_free(deferred0_0, deferred0_1, 1); + } + }; + imports.wbg.__wbg_mark_f0616123624944ec = function(arg0, arg1) { + performance.mark(getStringFromWasm0(arg0, arg1)); + }; + imports.wbg.__wbg_log_914e3639af348b4e = function(arg0, arg1) { + let deferred0_0; + let deferred0_1; + try { + deferred0_0 = arg0; + deferred0_1 = arg1; + console.log(getStringFromWasm0(arg0, arg1)); + } finally { + wasm.__wbindgen_free(deferred0_0, deferred0_1, 1); + } + }; + imports.wbg.__wbg_log_12b4ba535cbd9499 = function(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7) { + let deferred0_0; + let deferred0_1; + try { + deferred0_0 = arg0; + deferred0_1 = arg1; + console.log(getStringFromWasm0(arg0, arg1), getStringFromWasm0(arg2, arg3), getStringFromWasm0(arg4, arg5), getStringFromWasm0(arg6, arg7)); + } finally { + wasm.__wbindgen_free(deferred0_0, deferred0_1, 1); + } + }; + imports.wbg.__wbg_measure_a990198e921c09fd = function() { return handleError(function (arg0, arg1, arg2, arg3) { + let deferred0_0; + let deferred0_1; + let deferred1_0; + let deferred1_1; + try { + deferred0_0 = arg0; + deferred0_1 = arg1; + deferred1_0 = arg2; + deferred1_1 = arg3; + performance.measure(getStringFromWasm0(arg0, arg1), getStringFromWasm0(arg2, arg3)); + } finally { + wasm.__wbindgen_free(deferred0_0, deferred0_1, 1); + wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); + } + }, arguments) }; + imports.wbg.__wbindgen_jsval_loose_eq = function(arg0, arg1) { + const ret = getObject(arg0) == getObject(arg1); + return ret; + }; + imports.wbg.__wbg_String_b9412f8799faab3e = function(arg0, arg1) { + const ret = String(getObject(arg1)); + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }; + imports.wbg.__wbindgen_number_new = function(arg0) { + const ret = arg0; + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_string_new = function(arg0, arg1) { + const ret = getStringFromWasm0(arg0, arg1); + return addHeapObject(ret); + }; + imports.wbg.__wbg_getwithrefkey_edc2c8960f0f1191 = function(arg0, arg1) { + const ret = getObject(arg0)[getObject(arg1)]; + return addHeapObject(ret); + }; + imports.wbg.__wbg_set_f975102236d3c502 = function(arg0, arg1, arg2) { + getObject(arg0)[takeObject(arg1)] = takeObject(arg2); + }; + imports.wbg.__wbg_call_1084a111329e68ce = function() { return handleError(function (arg0, arg1) { + const ret = getObject(arg0).call(getObject(arg1)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_get_3baa728f9d58d3f6 = function(arg0, arg1) { + const ret = getObject(arg0)[arg1 >>> 0]; + return addHeapObject(ret); + }; + imports.wbg.__wbg_length_ae22078168b726f5 = function(arg0) { + const ret = getObject(arg0).length; + return ret; + }; + imports.wbg.__wbg_new_a220cf903aa02ca2 = function() { + const ret = new Array(); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_is_function = function(arg0) { + const ret = typeof(getObject(arg0)) === 'function'; + return ret; + }; + imports.wbg.__wbg_next_de3e9db4440638b2 = function(arg0) { + const ret = getObject(arg0).next; + return addHeapObject(ret); + }; + imports.wbg.__wbg_next_f9cb570345655b9a = function() { return handleError(function (arg0) { + const ret = getObject(arg0).next(); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_done_bfda7aa8f252b39f = function(arg0) { + const ret = getObject(arg0).done; + return ret; + }; + imports.wbg.__wbg_value_6d39332ab4788d86 = function(arg0) { + const ret = getObject(arg0).value; + return addHeapObject(ret); + }; + imports.wbg.__wbg_iterator_888179a48810a9fe = function() { + const ret = Symbol.iterator; + return addHeapObject(ret); + }; + imports.wbg.__wbg_get_224d16597dbbfd96 = function() { return handleError(function (arg0, arg1) { + const ret = Reflect.get(getObject(arg0), getObject(arg1)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_new_525245e2b9901204 = function() { + const ret = new Object(); + return addHeapObject(ret); + }; + imports.wbg.__wbg_set_673dda6c73d19609 = function(arg0, arg1, arg2) { + getObject(arg0)[arg1 >>> 0] = takeObject(arg2); + }; + imports.wbg.__wbg_isArray_8364a5371e9737d8 = function(arg0) { + const ret = Array.isArray(getObject(arg0)); + return ret; + }; + imports.wbg.__wbg_instanceof_ArrayBuffer_61dfc3198373c902 = function(arg0) { + let result; + try { + result = getObject(arg0) instanceof ArrayBuffer; + } catch (_) { + result = false; + } + const ret = result; + return ret; + }; + imports.wbg.__wbg_entries_7a0e06255456ebcd = function(arg0) { + const ret = Object.entries(getObject(arg0)); + return addHeapObject(ret); + }; + imports.wbg.__wbg_buffer_b7b08af79b0b0974 = function(arg0) { + const ret = getObject(arg0).buffer; + return addHeapObject(ret); + }; + imports.wbg.__wbg_new_ea1883e1e5e86686 = function(arg0) { + const ret = new Uint8Array(getObject(arg0)); + return addHeapObject(ret); + }; + imports.wbg.__wbg_set_d1e79e2388520f18 = function(arg0, arg1, arg2) { + getObject(arg0).set(getObject(arg1), arg2 >>> 0); + }; + imports.wbg.__wbg_length_8339fcf5d8ecd12e = function(arg0) { + const ret = getObject(arg0).length; + return ret; + }; + imports.wbg.__wbg_instanceof_Uint8Array_247a91427532499e = function(arg0) { + let result; + try { + result = getObject(arg0) instanceof Uint8Array; + } catch (_) { + result = false; + } + const ret = result; + return ret; + }; + imports.wbg.__wbindgen_debug_string = function(arg0, arg1) { + const ret = debugString(getObject(arg1)); + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }; + imports.wbg.__wbindgen_throw = function(arg0, arg1) { + throw new Error(getStringFromWasm0(arg0, arg1)); + }; + imports.wbg.__wbindgen_memory = function() { + const ret = wasm.memory; + return addHeapObject(ret); + }; + + return imports; +} + +function __wbg_init_memory(imports, memory) { + +} + +function __wbg_finalize_init(instance, module) { + wasm = instance.exports; + __wbg_init.__wbindgen_wasm_module = module; + cachedDataViewMemory0 = null; + cachedUint8ArrayMemory0 = null; + + + wasm.__wbindgen_start(); + return wasm; +} + +function initSync(module) { + if (wasm !== undefined) return wasm; + + + if (typeof module !== 'undefined' && Object.getPrototypeOf(module) === Object.prototype) + ({module} = module) + else + console.warn('using deprecated parameters for `initSync()`; pass a single object instead') + + const imports = __wbg_get_imports(); + + __wbg_init_memory(imports); + + if (!(module instanceof WebAssembly.Module)) { + module = new WebAssembly.Module(module); + } + + const instance = new WebAssembly.Instance(module, imports); + + return __wbg_finalize_init(instance, module); +} + +async function __wbg_init(module_or_path) { + if (wasm !== undefined) return wasm; + + + if (typeof module_or_path !== 'undefined' && Object.getPrototypeOf(module_or_path) === Object.prototype) + ({module_or_path} = module_or_path) + else + console.warn('using deprecated parameters for the initialization function; pass a single object instead') + + if (typeof module_or_path === 'undefined') { + module_or_path = new URL('outlier_bg.wasm', import.meta.url); + } + const imports = __wbg_get_imports(); + + if (typeof module_or_path === 'string' || (typeof Request === 'function' && module_or_path instanceof Request) || (typeof URL === 'function' && module_or_path instanceof URL)) { + module_or_path = fetch(module_or_path); + } + + __wbg_init_memory(imports); + + const { instance, module } = await __wbg_load(await module_or_path, imports); + + return __wbg_finalize_init(instance, module); +} + +export { initSync }; +export default __wbg_init; diff --git a/demo/dist/@bsull/augurs/outlier_bg.wasm b/demo/dist/@bsull/augurs/outlier_bg.wasm new file mode 100644 index 0000000..7aeae83 Binary files /dev/null and b/demo/dist/@bsull/augurs/outlier_bg.wasm differ diff --git a/demo/dist/@bsull/augurs/outlier_bg.wasm.d.ts b/demo/dist/@bsull/augurs/outlier_bg.wasm.d.ts new file mode 100644 index 0000000..173a860 --- /dev/null +++ b/demo/dist/@bsull/augurs/outlier_bg.wasm.d.ts @@ -0,0 +1,20 @@ +/* tslint:disable */ +/* eslint-disable */ +export const memory: WebAssembly.Memory; +export function __wbg_outlierdetector_free(a: number, b: number): void; +export function outlierdetector_new(a: number, b: number, c: number): void; +export function outlierdetector_dbscan(a: number, b: number): void; +export function outlierdetector_mad(a: number, b: number): void; +export function outlierdetector_detect(a: number, b: number, c: number): void; +export function outlierdetector_preprocess(a: number, b: number, c: number): void; +export function __wbg_loadedoutlierdetector_free(a: number, b: number): void; +export function loadedoutlierdetector_detect(a: number, b: number): void; +export function loadedoutlierdetector_updateDetector(a: number, b: number, c: number): void; +export function initLogging(a: number, b: number): void; +export function custom_init(): void; +export function __wbindgen_malloc(a: number, b: number): number; +export function __wbindgen_realloc(a: number, b: number, c: number, d: number): number; +export function __wbindgen_add_to_stack_pointer(a: number): number; +export function __wbindgen_free(a: number, b: number, c: number): void; +export function __wbindgen_exn_store(a: number): void; +export function __wbindgen_start(): void; diff --git a/demo/dist/@bsull/augurs/package.json b/demo/dist/@bsull/augurs/package.json new file mode 100644 index 0000000..88d2627 --- /dev/null +++ b/demo/dist/@bsull/augurs/package.json @@ -0,0 +1,41 @@ +{ + "name": "@bsull/augurs", + "description": "JavaScript bindings for the augurs time series library.", + "version": "0.6.0", + "collaborators": [ + "Ben Sully ProphetOptimizeOutput; + +/** + * An optimizer for the Prophet model. + */ +interface ProphetOptimizer { + optimize: ProphetOptimizerFunction; +} + + +/** + * Arguments for optimization. + */ +export interface ProphetOptimizeOptions { + /** + * Algorithm to use. + */ + algorithm?: ProphetAlgorithm; + /** + * The random seed to use for the optimization. + */ + seed?: number; + /** + * The chain id to advance the PRNG. + */ + chain?: number; + /** + * Line search step size for first iteration. + */ + initAlpha?: number; + /** + * Convergence tolerance on changes in objective function value. + */ + tolObj?: number; + /** + * Convergence tolerance on relative changes in objective function value. + */ + tolRelObj?: number; + /** + * Convergence tolerance on the norm of the gradient. + */ + tolGrad?: number; + /** + * Convergence tolerance on the relative norm of the gradient. + */ + tolRelGrad?: number; + /** + * Convergence tolerance on changes in parameter value. + */ + tolParam?: number; + /** + * Size of the history for LBFGS Hessian approximation. The value should + * be less than the dimensionality of the parameter space. 5-10 usually + * sufficient. + */ + historySize?: number; + /** + * Total number of iterations. + */ + iter?: number; + /** + * When `true`, use the Jacobian matrix to approximate the Hessian. + * Default is `false`. + */ + jacobian?: boolean; + /** + * How frequently to emit convergence statistics, in number of iterations. + */ + refresh?: number; +} + +/** + * The initial parameters for the optimization. + */ +export interface ProphetInitialParams { + /** + * Base trend growth rate. + */ + k: number; + /** + * Trend offset. + */ + m: number; + /** + * Trend rate adjustments, length s in data. + */ + delta: Float64Array; + /** + * Regressor coefficients, length k in data. + */ + beta: Float64Array; + /** + * Observation noise. + */ + sigmaObs: number; +} + +/** + * The algorithm to use for optimization. One of: \'BFGS\', \'LBFGS\', \'Newton\'. + */ +export type ProphetAlgorithm = "newton" | "bfgs" | "lbfgs"; + +/** + * The type of trend to use. + */ +export type ProphetTrendIndicator = "linear" | "logistic" | "flat"; + +/** + * Data for the Prophet model. + */ +export interface ProphetStanData { + /** + * Number of time periods. + */ + T: number; + /** + * Time series, length n. + */ + y: number[]; + /** + * Time, length n. + */ + t: number[]; + /** + * Capacities for logistic trend, length n. + */ + cap: number[]; + /** + * Number of changepoints. + */ + S: number; + /** + * Times of trend changepoints, length s. + */ + t_change: number[]; + /** + * The type of trend to use. + * + * Possible values are: + * - 0 for linear trend + * - 1 for logistic trend + * - 2 for flat trend. + */ + trend_indicator: number; + /** + * Number of regressors. + * + * Must be greater than or equal to 1. + */ + K: number; + /** + * Indicator of additive features, length k. + */ + s_a: number[]; + /** + * Indicator of multiplicative features, length k. + */ + s_m: number[]; + /** + * Regressors, shape (n, k). + */ + X: number[]; + /** + * Scale on seasonality prior. + * + * Must all be greater than zero. + */ + sigmas: number[]; + /** + * Scale on changepoints prior. + * Must be greater than 0. + */ + tau: number; +} + +/** + * Data for the Prophet Stan model, in JSON format. + * + * The JSON should represent an object of type `ProphetStanData`. + */ +export type ProphetStanDataJSON = string; + +/** + * Log messages from the optimizer. + */ +export interface ProphetLogs { + /** + * Debug logs. + */ + debug: string; + /** + * Info logs. + */ + info: string; + /** + * Warning logs. + */ + warn: string; + /** + * Error logs. + */ + error: string; + /** + * Fatal logs. + */ + fatal: string; +} + +/** + * The output of the optimizer. + */ +export interface ProphetOptimizeOutput { + /** + * Logs emitted by the optimizer, split by log level. + */ + logs: ProphetLogs; + /** + * The optimized parameters. + */ + params: ProphetOptimizedParams; +} + +/** + * The optimal parameters found by the optimizer. + */ +export interface ProphetOptimizedParams { + /** + * Base trend growth rate. + */ + k: number; + /** + * Trend offset. + */ + m: number; + /** + * Observation noise. + */ + sigmaObs: number; + /** + * Trend rate adjustments. + */ + delta: Float64Array; + /** + * Regressor coefficients. + */ + beta: Float64Array; + /** + * Transformed trend. + */ + trend: Float64Array; +} + +export type TimestampSeconds = number; + +/** + * The data needed to train a Prophet model. + * + * Seasonality conditions, regressors, + * floor and cap columns. + */ +export interface ProphetTrainingData { + /** + * The timestamps of the time series. + * + * These should be in seconds since the epoch. + */ + ds: TimestampSeconds[] | BigInt64Array; + /** + * The time series values to fit the model to. + */ + y: number[] | Float64Array; + /** + * Optionally, an upper bound (cap) on the values of the time series. + * + * Only used if the model\'s growth type is `logistic`. + */ + cap?: number[] | Float64Array; + /** + * Optionally, a lower bound (floor) on the values of the time series. + * + * Only used if the model\'s growth type is `logistic`. + */ + floor?: number[] | Float64Array; + /** + * Optional indicator variables for conditional seasonalities. + * + * The keys of the map are the names of the seasonality components, + * and the values are boolean arrays of length `T` where `true` indicates + * that the component is active for the corresponding time point. + * + * There must be a key in this map for each seasonality component + * that is marked as conditional in the model. + */ + seasonalityConditions?: Map; + /** + * Optional exogynous regressors. + */ + x?: Map; +} + +/** + * The data needed to predict with a Prophet model. + * + * The structure of the prediction data must be the same as the + * training data used to train the model, with the exception of + * `y` (which is being predicted). + * + * That is, if your model used certain seasonality conditions or + * regressors, you must include them in the prediction data. + */ +export interface ProphetPredictionData { + /** + * The timestamps of the time series. + * + * These should be in seconds since the epoch. + */ + ds: TimestampSeconds[]; + /** + * Optionally, an upper bound (cap) on the values of the time series. + * + * Only used if the model\'s growth type is `logistic`. + */ + cap?: number[]; + /** + * Optionally, a lower bound (floor) on the values of the time series. + * + * Only used if the model\'s growth type is `logistic`. + */ + floor?: number[]; + /** + * Optional indicator variables for conditional seasonalities. + * + * The keys of the map are the names of the seasonality components, + * and the values are boolean arrays of length `T` where `true` indicates + * that the component is active for the corresponding time point. + * + * There must be a key in this map for each seasonality component + * that is marked as conditional in the model. + */ + seasonalityConditions?: Map; + /** + * Optional exogynous regressors. + */ + x?: Map; +} + +/** + * Predictions from a Prophet model. + * + * The `yhat` field contains the forecasts for the input time series. + * All other fields contain individual components of the model which + * contribute towards the final `yhat` estimate. + * + * Certain fields (such as `cap` and `floor`) may be `None` if the + * model did not use them (e.g. the model was not configured to use + * logistic trend). + */ +export interface ProphetPredictions { + /** + * The timestamps of the forecasts. + */ + ds: TimestampSeconds[]; + /** + * Forecasts of the input time series `y`. + */ + yhat: Forecast; + /** + * The trend contribution at each time point. + */ + trend: Forecast; + /** + * The cap for the logistic growth. + * + * Will only be `Some` if the model used [`GrowthType::Logistic`](crate::GrowthType::Logistic). + */ + cap: number[] | undefined; + /** + * The floor for the logistic growth. + * + * Will only be `Some` if the model used [`GrowthType::Logistic`](crate::GrowthType::Logistic) + * and the floor was provided in the input data. + */ + floor: number[] | undefined; + /** + * The combined combination of all _additive_ components. + * + * This includes seasonalities, holidays and regressors if their mode + * was configured to be [`FeatureMode::Additive`](crate::FeatureMode::Additive). + */ + additive: Forecast; + /** + * The combined combination of all _multiplicative_ components. + * + * This includes seasonalities, holidays and regressors if their mode + * was configured to be [`FeatureMode::Multiplicative`](crate::FeatureMode::Multiplicative). + */ + multiplicative: Forecast; + /** + * Mapping from holiday name to that holiday\'s contribution. + */ + holidays: Map; + /** + * Mapping from seasonality name to that seasonality\'s contribution. + */ + seasonalities: Map; + /** + * Mapping from regressor name to that regressor\'s contribution. + */ + regressors: Map; +} + +/** + * Options for Prophet, after applying defaults. + * + * The only required field is `optimizer`. See the documentation for + * `Optimizer` for more details. + * + * All other options are treated exactly the same as the original + * Prophet library; see its [documentation] for more detail. + * + * [documentation]: https://facebook.github.io/prophet/docs/quick_start.html + */ +export interface ProphetOptions { + /** + * Optimizer, used to find the maximum likelihood estimate of the + * Prophet Stan model parameters. + * + * See the documentation for `ProphetOptions` for more details. + */ + optimizer: ProphetOptimizer; + /** + * The type of growth (trend) to use. + * + * Defaults to [`GrowthType::Linear`]. + */ + growth?: ProphetGrowthType; + /** + * An optional list of changepoints. + * + * If not provided, changepoints will be automatically selected. + */ + changepoints?: TimestampSeconds[]; + /** + * The number of potential changepoints to include. + * + * Not used if `changepoints` is provided. + * + * If provided and `changepoints` is not provided, then + * `n_changepoints` potential changepoints will be selected + * uniformly from the first `changepoint_range` proportion of + * the history. + * + * Defaults to 25. + */ + nChangepoints?: number; + /** + * The proportion of the history to consider for potential changepoints. + * + * Not used if `changepoints` is provided. + * + * Defaults to `0.8` for the first 80% of the data. + */ + changepointRange?: number; + /** + * How to fit yearly seasonality. + * + * Defaults to [`SeasonalityOption::Auto`]. + */ + yearlySeasonality?: ProphetSeasonalityOption; + /** + * How to fit weekly seasonality. + * + * Defaults to [`SeasonalityOption::Auto`]. + */ + weeklySeasonality?: ProphetSeasonalityOption; + /** + * How to fit daily seasonality. + * + * Defaults to [`SeasonalityOption::Auto`]. + */ + dailySeasonality?: ProphetSeasonalityOption; + /** + * How to model seasonality. + * + * Defaults to [`FeatureMode::Additive`]. + */ + seasonalityMode?: ProphetFeatureMode; + /** + * The prior scale for seasonality. + * + * This modulates the strength of seasonality, + * with larger values allowing the model to fit + * larger seasonal fluctuations and smaller values + * dampening the seasonality. + * + * Can be specified for individual seasonalities + * using [`Prophet::add_seasonality`](crate::Prophet::add_seasonality). + * + * Defaults to `10.0`. + */ + seasonalityPriorScale?: number; + /** + * The prior scale for changepoints. + * + * This modulates the flexibility of the automatic + * changepoint selection. Large values will allow many + * changepoints, while small values will allow few + * changepoints. + * + * Defaults to `0.05`. + */ + changepointPriorScale?: number; + /** + * How to perform parameter estimation. + * + * When [`EstimationMode::Mle`] or [`EstimationMode::Map`] + * are used then no MCMC samples are taken. + * + * Defaults to [`EstimationMode::Mle`]. + */ + estimation?: ProphetEstimationMode; + /** + * The width of the uncertainty intervals. + * + * Must be between `0.0` and `1.0`. Common values are + * `0.8` (80%), `0.9` (90%) and `0.95` (95%). + * + * Defaults to `0.8` for 80% intervals. + */ + intervalWidth?: number; + /** + * The number of simulated draws used to estimate uncertainty intervals. + * + * Setting this value to `0` will disable uncertainty + * estimation and speed up the calculation. + * + * Defaults to `1000`. + */ + uncertaintySamples?: number; + /** + * How to scale the data prior to fitting the model. + * + * Defaults to [`Scaling::AbsMax`]. + */ + scaling?: ProphetScaling; + /** + * Holidays to include in the model. + */ + holidays?: Map; + /** + * Prior scale for holidays. + * + * This parameter modulates the strength of the holiday + * components model, unless overridden in each individual + * holiday\'s input. + * + * Defaults to `100.0`. + */ + holidaysPriorScale?: number; + /** + * How to model holidays. + * + * Defaults to the same value as [`ProphetOptions::seasonality_mode`]. + */ + holidaysMode?: ProphetFeatureMode; +} + +/** + * The type of growth to use. + */ +export type ProphetGrowthType = "linear" | "logistic" | "flat"; + +/** + * Define whether to include a specific seasonality, and how it should be specified. + */ +export type ProphetSeasonalityOption = { type: "auto" } | { type: "manual"; enabled: boolean } | { type: "fourier"; order: number }; + +/** + * How to scale the data prior to fitting the model. + */ +export type ProphetScaling = "absMax" | "minMax"; + +/** + * How to do parameter estimation. + * + * Note: for now, only MLE/MAP estimation is supported, i.e. there + * is no support for MCMC sampling. This will be added in the future! + * The enum will be marked as `non_exhaustive` until that point. + */ +export type ProphetEstimationMode = "mle" | "map"; + +/** + * The mode of a seasonality, regressor, or holiday. + */ +export type ProphetFeatureMode = "additive" | "multiplicative"; + +/** + * A holiday to be considered by the Prophet model. + */ +export interface ProphetHoliday { + /** + * The dates of the holiday. + */ + ds: TimestampSeconds[]; + /** + * The lower window for the holiday. + * + * The lower window is the number of days before the holiday + * that it is observed. For example, if the holiday is on + * 2023-01-01 and the lower window is -1, then the holiday will + * _also_ be observed on 2022-12-31. + */ + lowerWindow?: number[]; + /** + * The upper window for the holiday. + * + * The upper window is the number of days after the holiday + * that it is observed. For example, if the holiday is on + * 2023-01-01 and the upper window is 1, then the holiday will + * _also_ be observed on 2023-01-02. + */ + upperWindow?: number[]; + /** + * The prior scale for the holiday. + */ + priorScale?: number; +} + +/** + * The maximum log level to emit. + * + * The default is `Level::Info`. + */ +export type Level = "trace" | "debug" | "info" | "warn" | "error"; + +/** + * The target for augurs log events. + */ +export type LogTarget = "console" | "performance"; + +/** + * Log configuration. + */ +export interface LogConfig { + /** + * The maximum log level to emit. + * + * Defaults to `INFO`. + */ + maxLevel?: Level; + /** + * The target for augurs log events. + * + * Defaults to logging to the browser console. + */ + target?: LogTarget; + /** + * Whether to emit coloured logs. + * + * Defaults to `true`. + */ + color?: boolean; + /** + * Whether to show detailed fields such as augurs\' file names and line numbers + * in the logs. + * + * Probably not wise in production. + * + * Defaults to `false`. + */ + showDetailedFields?: boolean; +} + +/** + * Forecast intervals. + */ +export interface ForecastIntervals { + /** + * The confidence level for the intervals. + */ + level: number; + /** + * The lower prediction intervals. + */ + lower: number[]; + /** + * The upper prediction intervals. + */ + upper: number[]; +} + +/** + * A forecast containing point forecasts and, optionally, prediction intervals. + */ +export interface Forecast { + /** + * The point forecasts. + */ + point: number[]; + /** + * The forecast intervals, if requested and supported + * by the trend model. + */ + intervals: ForecastIntervals | undefined; +} + +/** +* The [Prophet] time-series forecasting model. +* +* Prophet is a forecasting procedure designed for automated forecasting +* at scale with minimal manual input. +* +* Create a new Prophet instance with the constructor, passing in an optimizer +* and some other optional arguments. +* +* # Example +* +* ```javascript +* import { Prophet } from '@bsull/augurs'; +* import { optimizer } from '@bsull/augurs-prophet-wasmstan'; +* +* const prophet = new Prophet({ optimizer }); +* const ds = [ +* 1704067200n, 1704871384n, 1705675569n, 1706479753n, 1707283938n, 1708088123n, +* 1708892307n, 1709696492n, 1710500676n, 1711304861n, 1712109046n, 1712913230n, +* ]; +* const y = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0]; +* const trainingData = { ds, y }; +* prophet.fit(trainingData); +* const predictions = prophet.predict(); +* console.log(predictions.yhat); // yhat is an object with 'point', 'lower' and 'upper'. +* ``` +* +* [Prophet]: https://facebook.github.io/prophet/ +*/ +export class Prophet { + free(): void; +/** +* Create a new Prophet model. +* @param {ProphetOptions} opts +*/ + constructor(opts: ProphetOptions); +/** +* Fit the model to some training data. +* @param {ProphetTrainingData} data +* @param {ProphetOptimizeOptions | undefined} [opts] +*/ + fit(data: ProphetTrainingData, opts?: ProphetOptimizeOptions): void; +/** +* Predict using the model. +* +* If `data` is omitted, predictions will be produced for the training data +* history. +* +* This will throw an exception if the model hasn't already been fit. +* @param {ProphetPredictionData | undefined} [data] +* @returns {ProphetPredictions} +*/ + predict(data?: ProphetPredictionData): ProphetPredictions; +} + +export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module; + +export interface InitOutput { + readonly memory: WebAssembly.Memory; + readonly __wbg_prophet_free: (a: number, b: number) => void; + readonly prophet_new: (a: number, b: number) => void; + readonly prophet_fit: (a: number, b: number, c: number, d: number) => void; + readonly prophet_predict: (a: number, b: number, c: number) => void; + readonly initLogging: (a: number, b: number) => void; + readonly custom_init: () => void; + readonly __wbindgen_malloc: (a: number, b: number) => number; + readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number; + readonly __wbindgen_add_to_stack_pointer: (a: number) => number; + readonly __wbindgen_exn_store: (a: number) => void; + readonly __wbindgen_free: (a: number, b: number, c: number) => void; + readonly __wbindgen_start: () => void; +} + +export type SyncInitInput = BufferSource | WebAssembly.Module; +/** +* Instantiates the given `module`, which can either be bytes or +* a precompiled `WebAssembly.Module`. +* +* @param {{ module: SyncInitInput }} module - Passing `SyncInitInput` directly is deprecated. +* +* @returns {InitOutput} +*/ +export function initSync(module: { module: SyncInitInput } | SyncInitInput): InitOutput; + +/** +* If `module_or_path` is {RequestInfo} or {URL}, makes a request and +* for everything else, calls `WebAssembly.instantiate` directly. +* +* @param {{ module_or_path: InitInput | Promise }} module_or_path - Passing `InitInput` directly is deprecated. +* +* @returns {Promise} +*/ +export default function __wbg_init (module_or_path?: { module_or_path: InitInput | Promise } | InitInput | Promise): Promise; diff --git a/demo/dist/@bsull/augurs/prophet.js b/demo/dist/@bsull/augurs/prophet.js new file mode 100644 index 0000000..6198cfb --- /dev/null +++ b/demo/dist/@bsull/augurs/prophet.js @@ -0,0 +1,828 @@ +let wasm; + +const heap = new Array(128).fill(undefined); + +heap.push(undefined, null, true, false); + +function getObject(idx) { return heap[idx]; } + +let heap_next = heap.length; + +function dropObject(idx) { + if (idx < 132) return; + heap[idx] = heap_next; + heap_next = idx; +} + +function takeObject(idx) { + const ret = getObject(idx); + dropObject(idx); + return ret; +} + +function isLikeNone(x) { + return x === undefined || x === null; +} + +let cachedDataViewMemory0 = null; + +function getDataViewMemory0() { + if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer.detached === true || (cachedDataViewMemory0.buffer.detached === undefined && cachedDataViewMemory0.buffer !== wasm.memory.buffer)) { + cachedDataViewMemory0 = new DataView(wasm.memory.buffer); + } + return cachedDataViewMemory0; +} + +let WASM_VECTOR_LEN = 0; + +let cachedUint8ArrayMemory0 = null; + +function getUint8ArrayMemory0() { + if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) { + cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer); + } + return cachedUint8ArrayMemory0; +} + +const cachedTextEncoder = (typeof TextEncoder !== 'undefined' ? new TextEncoder('utf-8') : { encode: () => { throw Error('TextEncoder not available') } } ); + +const encodeString = (typeof cachedTextEncoder.encodeInto === 'function' + ? function (arg, view) { + return cachedTextEncoder.encodeInto(arg, view); +} + : function (arg, view) { + const buf = cachedTextEncoder.encode(arg); + view.set(buf); + return { + read: arg.length, + written: buf.length + }; +}); + +function passStringToWasm0(arg, malloc, realloc) { + + if (realloc === undefined) { + const buf = cachedTextEncoder.encode(arg); + const ptr = malloc(buf.length, 1) >>> 0; + getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf); + WASM_VECTOR_LEN = buf.length; + return ptr; + } + + let len = arg.length; + let ptr = malloc(len, 1) >>> 0; + + const mem = getUint8ArrayMemory0(); + + let offset = 0; + + for (; offset < len; offset++) { + const code = arg.charCodeAt(offset); + if (code > 0x7F) break; + mem[ptr + offset] = code; + } + + if (offset !== len) { + if (offset !== 0) { + arg = arg.slice(offset); + } + ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; + const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len); + const ret = encodeString(arg, view); + + offset += ret.written; + ptr = realloc(ptr, len, offset, 1) >>> 0; + } + + WASM_VECTOR_LEN = offset; + return ptr; +} + +const cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } ); + +if (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); }; + +function getStringFromWasm0(ptr, len) { + ptr = ptr >>> 0; + return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len)); +} + +function addHeapObject(obj) { + if (heap_next === heap.length) heap.push(heap.length + 1); + const idx = heap_next; + heap_next = heap[idx]; + + heap[idx] = obj; + return idx; +} + +function debugString(val) { + // primitive types + const type = typeof val; + if (type == 'number' || type == 'boolean' || val == null) { + return `${val}`; + } + if (type == 'string') { + return `"${val}"`; + } + if (type == 'symbol') { + const description = val.description; + if (description == null) { + return 'Symbol'; + } else { + return `Symbol(${description})`; + } + } + if (type == 'function') { + const name = val.name; + if (typeof name == 'string' && name.length > 0) { + return `Function(${name})`; + } else { + return 'Function'; + } + } + // objects + if (Array.isArray(val)) { + const length = val.length; + let debug = '['; + if (length > 0) { + debug += debugString(val[0]); + } + for(let i = 1; i < length; i++) { + debug += ', ' + debugString(val[i]); + } + debug += ']'; + return debug; + } + // Test for built-in + const builtInMatches = /\[object ([^\]]+)\]/.exec(toString.call(val)); + let className; + if (builtInMatches.length > 1) { + className = builtInMatches[1]; + } else { + // Failed to match the standard '[object ClassName]' + return toString.call(val); + } + if (className == 'Object') { + // we're a user defined class or Object + // JSON.stringify avoids problems with cycles, and is generally much + // easier than looping through ownProperties of `val`. + try { + return 'Object(' + JSON.stringify(val) + ')'; + } catch (_) { + return 'Object'; + } + } + // errors + if (val instanceof Error) { + return `${val.name}: ${val.message}\n${val.stack}`; + } + // TODO we could test for more things here, like `Set`s and `Map`s. + return className; +} + +function handleError(f, args) { + try { + return f.apply(this, args); + } catch (e) { + wasm.__wbindgen_exn_store(addHeapObject(e)); + } +} +/** +* Initialize logging. +* +* You can use this to emit logs from augurs to the browser console. +* The default is to log everything to the console, but you can +* change the log level and whether logs are emitted to the console +* or to the browser's performance timeline. +* +* IMPORTANT: this function should only be called once. It will throw +* an exception if called more than once. +* @param {LogConfig | undefined} [config] +*/ +export function initLogging(config) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.initLogging(retptr, isLikeNone(config) ? 0 : addHeapObject(config)); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + if (r1) { + throw takeObject(r0); + } + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +} + +/** +* Initialize the logger and panic hook. +* +* This will be called automatically when the module is imported. +* It sets the default tracing subscriber to `tracing-wasm`, and +* sets WASM panics to print to the console with a helpful error +* message. +*/ +export function custom_init() { + wasm.custom_init(); +} + +const ProphetFinalization = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(ptr => wasm.__wbg_prophet_free(ptr >>> 0, 1)); +/** +* The [Prophet] time-series forecasting model. +* +* Prophet is a forecasting procedure designed for automated forecasting +* at scale with minimal manual input. +* +* Create a new Prophet instance with the constructor, passing in an optimizer +* and some other optional arguments. +* +* # Example +* +* ```javascript +* import { Prophet } from '@bsull/augurs'; +* import { optimizer } from '@bsull/augurs-prophet-wasmstan'; +* +* const prophet = new Prophet({ optimizer }); +* const ds = [ +* 1704067200n, 1704871384n, 1705675569n, 1706479753n, 1707283938n, 1708088123n, +* 1708892307n, 1709696492n, 1710500676n, 1711304861n, 1712109046n, 1712913230n, +* ]; +* const y = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0]; +* const trainingData = { ds, y }; +* prophet.fit(trainingData); +* const predictions = prophet.predict(); +* console.log(predictions.yhat); // yhat is an object with 'point', 'lower' and 'upper'. +* ``` +* +* [Prophet]: https://facebook.github.io/prophet/ +*/ +export class Prophet { + + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + ProphetFinalization.unregister(this); + return ptr; + } + + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_prophet_free(ptr, 0); + } + /** + * Create a new Prophet model. + * @param {ProphetOptions} opts + */ + constructor(opts) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.prophet_new(retptr, addHeapObject(opts)); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true); + if (r2) { + throw takeObject(r1); + } + this.__wbg_ptr = r0 >>> 0; + ProphetFinalization.register(this, this.__wbg_ptr, this); + return this; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * Fit the model to some training data. + * @param {ProphetTrainingData} data + * @param {ProphetOptimizeOptions | undefined} [opts] + */ + fit(data, opts) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.prophet_fit(retptr, this.__wbg_ptr, addHeapObject(data), isLikeNone(opts) ? 0 : addHeapObject(opts)); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + if (r1) { + throw takeObject(r0); + } + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * Predict using the model. + * + * If `data` is omitted, predictions will be produced for the training data + * history. + * + * This will throw an exception if the model hasn't already been fit. + * @param {ProphetPredictionData | undefined} [data] + * @returns {ProphetPredictions} + */ + predict(data) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.prophet_predict(retptr, this.__wbg_ptr, isLikeNone(data) ? 0 : addHeapObject(data)); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true); + if (r2) { + throw takeObject(r1); + } + return takeObject(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } +} + +async function __wbg_load(module, imports) { + if (typeof Response === 'function' && module instanceof Response) { + if (typeof WebAssembly.instantiateStreaming === 'function') { + try { + return await WebAssembly.instantiateStreaming(module, imports); + + } catch (e) { + if (module.headers.get('Content-Type') != 'application/wasm') { + console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e); + + } else { + throw e; + } + } + } + + const bytes = await module.arrayBuffer(); + return await WebAssembly.instantiate(bytes, imports); + + } else { + const instance = await WebAssembly.instantiate(module, imports); + + if (instance instanceof WebAssembly.Instance) { + return { instance, module }; + + } else { + return instance; + } + } +} + +function __wbg_get_imports() { + const imports = {}; + imports.wbg = {}; + imports.wbg.__wbindgen_object_drop_ref = function(arg0) { + takeObject(arg0); + }; + imports.wbg.__wbindgen_number_get = function(arg0, arg1) { + const obj = getObject(arg1); + const ret = typeof(obj) === 'number' ? obj : undefined; + getDataViewMemory0().setFloat64(arg0 + 8 * 1, isLikeNone(ret) ? 0 : ret, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, !isLikeNone(ret), true); + }; + imports.wbg.__wbindgen_string_get = function(arg0, arg1) { + const obj = getObject(arg1); + const ret = typeof(obj) === 'string' ? obj : undefined; + var ptr1 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + var len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }; + imports.wbg.__wbindgen_error_new = function(arg0, arg1) { + const ret = new Error(getStringFromWasm0(arg0, arg1)); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_boolean_get = function(arg0) { + const v = getObject(arg0); + const ret = typeof(v) === 'boolean' ? (v ? 1 : 0) : 2; + return ret; + }; + imports.wbg.__wbindgen_is_bigint = function(arg0) { + const ret = typeof(getObject(arg0)) === 'bigint'; + return ret; + }; + imports.wbg.__wbindgen_is_object = function(arg0) { + const val = getObject(arg0); + const ret = typeof(val) === 'object' && val !== null; + return ret; + }; + imports.wbg.__wbindgen_in = function(arg0, arg1) { + const ret = getObject(arg0) in getObject(arg1); + return ret; + }; + imports.wbg.__wbindgen_bigint_from_i64 = function(arg0) { + const ret = arg0; + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_jsval_eq = function(arg0, arg1) { + const ret = getObject(arg0) === getObject(arg1); + return ret; + }; + imports.wbg.__wbindgen_bigint_from_u64 = function(arg0) { + const ret = BigInt.asUintN(64, arg0); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_is_undefined = function(arg0) { + const ret = getObject(arg0) === undefined; + return ret; + }; + imports.wbg.__wbindgen_is_string = function(arg0) { + const ret = typeof(getObject(arg0)) === 'string'; + return ret; + }; + imports.wbg.__wbindgen_as_number = function(arg0) { + const ret = +getObject(arg0); + return ret; + }; + imports.wbg.__wbindgen_object_clone_ref = function(arg0) { + const ret = getObject(arg0); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_string_new = function(arg0, arg1) { + const ret = getStringFromWasm0(arg0, arg1); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_is_function = function(arg0) { + const ret = typeof(getObject(arg0)) === 'function'; + return ret; + }; + imports.wbg.__wbindgen_number_new = function(arg0) { + const ret = arg0; + return addHeapObject(ret); + }; + imports.wbg.__wbg_crypto_1d1f22824a6a080c = function(arg0) { + const ret = getObject(arg0).crypto; + return addHeapObject(ret); + }; + imports.wbg.__wbg_process_4a72847cc503995b = function(arg0) { + const ret = getObject(arg0).process; + return addHeapObject(ret); + }; + imports.wbg.__wbg_versions_f686565e586dd935 = function(arg0) { + const ret = getObject(arg0).versions; + return addHeapObject(ret); + }; + imports.wbg.__wbg_node_104a2ff8d6ea03a2 = function(arg0) { + const ret = getObject(arg0).node; + return addHeapObject(ret); + }; + imports.wbg.__wbg_require_cca90b1a94a0255b = function() { return handleError(function () { + const ret = module.require; + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_msCrypto_eb05e62b530a1508 = function(arg0) { + const ret = getObject(arg0).msCrypto; + return addHeapObject(ret); + }; + imports.wbg.__wbg_randomFillSync_5c9c955aa56b6049 = function() { return handleError(function (arg0, arg1) { + getObject(arg0).randomFillSync(takeObject(arg1)); + }, arguments) }; + imports.wbg.__wbg_getRandomValues_3aa56aa6edec874c = function() { return handleError(function (arg0, arg1) { + getObject(arg0).getRandomValues(getObject(arg1)); + }, arguments) }; + imports.wbg.__wbindgen_jsval_loose_eq = function(arg0, arg1) { + const ret = getObject(arg0) == getObject(arg1); + return ret; + }; + imports.wbg.__wbg_String_b9412f8799faab3e = function(arg0, arg1) { + const ret = String(getObject(arg1)); + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }; + imports.wbg.__wbg_getwithrefkey_edc2c8960f0f1191 = function(arg0, arg1) { + const ret = getObject(arg0)[getObject(arg1)]; + return addHeapObject(ret); + }; + imports.wbg.__wbg_set_f975102236d3c502 = function(arg0, arg1, arg2) { + getObject(arg0)[takeObject(arg1)] = takeObject(arg2); + }; + imports.wbg.__wbg_self_3093d5d1f7bcb682 = function() { return handleError(function () { + const ret = self.self; + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_window_3bcfc4d31bc012f8 = function() { return handleError(function () { + const ret = window.window; + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_globalThis_86b222e13bdf32ed = function() { return handleError(function () { + const ret = globalThis.globalThis; + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_global_e5a3fe56f8be9485 = function() { return handleError(function () { + const ret = global.global; + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_newnoargs_76313bd6ff35d0f2 = function(arg0, arg1) { + const ret = new Function(getStringFromWasm0(arg0, arg1)); + return addHeapObject(ret); + }; + imports.wbg.__wbg_call_1084a111329e68ce = function() { return handleError(function (arg0, arg1) { + const ret = getObject(arg0).call(getObject(arg1)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_get_3baa728f9d58d3f6 = function(arg0, arg1) { + const ret = getObject(arg0)[arg1 >>> 0]; + return addHeapObject(ret); + }; + imports.wbg.__wbg_length_ae22078168b726f5 = function(arg0) { + const ret = getObject(arg0).length; + return ret; + }; + imports.wbg.__wbg_new_a220cf903aa02ca2 = function() { + const ret = new Array(); + return addHeapObject(ret); + }; + imports.wbg.__wbg_new_8608a2b51a5f6737 = function() { + const ret = new Map(); + return addHeapObject(ret); + }; + imports.wbg.__wbg_next_de3e9db4440638b2 = function(arg0) { + const ret = getObject(arg0).next; + return addHeapObject(ret); + }; + imports.wbg.__wbg_next_f9cb570345655b9a = function() { return handleError(function (arg0) { + const ret = getObject(arg0).next(); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_done_bfda7aa8f252b39f = function(arg0) { + const ret = getObject(arg0).done; + return ret; + }; + imports.wbg.__wbg_value_6d39332ab4788d86 = function(arg0) { + const ret = getObject(arg0).value; + return addHeapObject(ret); + }; + imports.wbg.__wbg_iterator_888179a48810a9fe = function() { + const ret = Symbol.iterator; + return addHeapObject(ret); + }; + imports.wbg.__wbg_get_224d16597dbbfd96 = function() { return handleError(function (arg0, arg1) { + const ret = Reflect.get(getObject(arg0), getObject(arg1)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_new_525245e2b9901204 = function() { + const ret = new Object(); + return addHeapObject(ret); + }; + imports.wbg.__wbg_set_673dda6c73d19609 = function(arg0, arg1, arg2) { + getObject(arg0)[arg1 >>> 0] = takeObject(arg2); + }; + imports.wbg.__wbg_isArray_8364a5371e9737d8 = function(arg0) { + const ret = Array.isArray(getObject(arg0)); + return ret; + }; + imports.wbg.__wbg_instanceof_ArrayBuffer_61dfc3198373c902 = function(arg0) { + let result; + try { + result = getObject(arg0) instanceof ArrayBuffer; + } catch (_) { + result = false; + } + const ret = result; + return ret; + }; + imports.wbg.__wbg_call_89af060b4e1523f2 = function() { return handleError(function (arg0, arg1, arg2) { + const ret = getObject(arg0).call(getObject(arg1), getObject(arg2)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_call_7de908392845a9a5 = function() { return handleError(function (arg0, arg1, arg2, arg3, arg4) { + const ret = getObject(arg0).call(getObject(arg1), getObject(arg2), getObject(arg3), getObject(arg4)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_instanceof_Map_763ce0e95960d55e = function(arg0) { + let result; + try { + result = getObject(arg0) instanceof Map; + } catch (_) { + result = false; + } + const ret = result; + return ret; + }; + imports.wbg.__wbg_set_49185437f0ab06f8 = function(arg0, arg1, arg2) { + const ret = getObject(arg0).set(getObject(arg1), getObject(arg2)); + return addHeapObject(ret); + }; + imports.wbg.__wbg_isSafeInteger_7f1ed56200d90674 = function(arg0) { + const ret = Number.isSafeInteger(getObject(arg0)); + return ret; + }; + imports.wbg.__wbg_instanceof_Object_b80213ae6cc9aafb = function(arg0) { + let result; + try { + result = getObject(arg0) instanceof Object; + } catch (_) { + result = false; + } + const ret = result; + return ret; + }; + imports.wbg.__wbg_entries_7a0e06255456ebcd = function(arg0) { + const ret = Object.entries(getObject(arg0)); + return addHeapObject(ret); + }; + imports.wbg.__wbg_buffer_b7b08af79b0b0974 = function(arg0) { + const ret = getObject(arg0).buffer; + return addHeapObject(ret); + }; + imports.wbg.__wbg_newwithbyteoffsetandlength_8a2cb9ca96b27ec9 = function(arg0, arg1, arg2) { + const ret = new Uint8Array(getObject(arg0), arg1 >>> 0, arg2 >>> 0); + return addHeapObject(ret); + }; + imports.wbg.__wbg_new_ea1883e1e5e86686 = function(arg0) { + const ret = new Uint8Array(getObject(arg0)); + return addHeapObject(ret); + }; + imports.wbg.__wbg_set_d1e79e2388520f18 = function(arg0, arg1, arg2) { + getObject(arg0).set(getObject(arg1), arg2 >>> 0); + }; + imports.wbg.__wbg_length_8339fcf5d8ecd12e = function(arg0) { + const ret = getObject(arg0).length; + return ret; + }; + imports.wbg.__wbg_newwithbyteoffsetandlength_a6ac1429e5962b5d = function(arg0, arg1, arg2) { + const ret = new Float64Array(getObject(arg0), arg1 >>> 0, arg2 >>> 0); + return addHeapObject(ret); + }; + imports.wbg.__wbg_set_2ba50dc715327edc = function(arg0, arg1, arg2) { + getObject(arg0).set(getObject(arg1), arg2 >>> 0); + }; + imports.wbg.__wbg_length_a9e7e8ccaa5e7434 = function(arg0) { + const ret = getObject(arg0).length; + return ret; + }; + imports.wbg.__wbg_instanceof_Uint8Array_247a91427532499e = function(arg0) { + let result; + try { + result = getObject(arg0) instanceof Uint8Array; + } catch (_) { + result = false; + } + const ret = result; + return ret; + }; + imports.wbg.__wbg_newwithlength_ec548f448387c968 = function(arg0) { + const ret = new Uint8Array(arg0 >>> 0); + return addHeapObject(ret); + }; + imports.wbg.__wbg_subarray_7c2e3576afe181d1 = function(arg0, arg1, arg2) { + const ret = getObject(arg0).subarray(arg1 >>> 0, arg2 >>> 0); + return addHeapObject(ret); + }; + imports.wbg.__wbg_newwithlength_67c54fcff2372990 = function(arg0) { + const ret = new Float64Array(arg0 >>> 0); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_bigint_get_as_i64 = function(arg0, arg1) { + const v = getObject(arg1); + const ret = typeof(v) === 'bigint' ? v : undefined; + getDataViewMemory0().setBigInt64(arg0 + 8 * 1, isLikeNone(ret) ? BigInt(0) : ret, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, !isLikeNone(ret), true); + }; + imports.wbg.__wbindgen_debug_string = function(arg0, arg1) { + const ret = debugString(getObject(arg1)); + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }; + imports.wbg.__wbindgen_throw = function(arg0, arg1) { + throw new Error(getStringFromWasm0(arg0, arg1)); + }; + imports.wbg.__wbindgen_memory = function() { + const ret = wasm.memory; + return addHeapObject(ret); + }; + imports.wbg.__wbg_mark_f0616123624944ec = function(arg0, arg1) { + performance.mark(getStringFromWasm0(arg0, arg1)); + }; + imports.wbg.__wbg_log_914e3639af348b4e = function(arg0, arg1) { + let deferred0_0; + let deferred0_1; + try { + deferred0_0 = arg0; + deferred0_1 = arg1; + console.log(getStringFromWasm0(arg0, arg1)); + } finally { + wasm.__wbindgen_free(deferred0_0, deferred0_1, 1); + } + }; + imports.wbg.__wbg_log_12b4ba535cbd9499 = function(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7) { + let deferred0_0; + let deferred0_1; + try { + deferred0_0 = arg0; + deferred0_1 = arg1; + console.log(getStringFromWasm0(arg0, arg1), getStringFromWasm0(arg2, arg3), getStringFromWasm0(arg4, arg5), getStringFromWasm0(arg6, arg7)); + } finally { + wasm.__wbindgen_free(deferred0_0, deferred0_1, 1); + } + }; + imports.wbg.__wbg_measure_a990198e921c09fd = function() { return handleError(function (arg0, arg1, arg2, arg3) { + let deferred0_0; + let deferred0_1; + let deferred1_0; + let deferred1_1; + try { + deferred0_0 = arg0; + deferred0_1 = arg1; + deferred1_0 = arg2; + deferred1_1 = arg3; + performance.measure(getStringFromWasm0(arg0, arg1), getStringFromWasm0(arg2, arg3)); + } finally { + wasm.__wbindgen_free(deferred0_0, deferred0_1, 1); + wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); + } + }, arguments) }; + imports.wbg.__wbg_new_abda76e883ba8a5f = function() { + const ret = new Error(); + return addHeapObject(ret); + }; + imports.wbg.__wbg_stack_658279fe44541cf6 = function(arg0, arg1) { + const ret = getObject(arg1).stack; + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }; + imports.wbg.__wbg_error_f851667af71bcfc6 = function(arg0, arg1) { + let deferred0_0; + let deferred0_1; + try { + deferred0_0 = arg0; + deferred0_1 = arg1; + console.error(getStringFromWasm0(arg0, arg1)); + } finally { + wasm.__wbindgen_free(deferred0_0, deferred0_1, 1); + } + }; + + return imports; +} + +function __wbg_init_memory(imports, memory) { + +} + +function __wbg_finalize_init(instance, module) { + wasm = instance.exports; + __wbg_init.__wbindgen_wasm_module = module; + cachedDataViewMemory0 = null; + cachedUint8ArrayMemory0 = null; + + + wasm.__wbindgen_start(); + return wasm; +} + +function initSync(module) { + if (wasm !== undefined) return wasm; + + + if (typeof module !== 'undefined' && Object.getPrototypeOf(module) === Object.prototype) + ({module} = module) + else + console.warn('using deprecated parameters for `initSync()`; pass a single object instead') + + const imports = __wbg_get_imports(); + + __wbg_init_memory(imports); + + if (!(module instanceof WebAssembly.Module)) { + module = new WebAssembly.Module(module); + } + + const instance = new WebAssembly.Instance(module, imports); + + return __wbg_finalize_init(instance, module); +} + +async function __wbg_init(module_or_path) { + if (wasm !== undefined) return wasm; + + + if (typeof module_or_path !== 'undefined' && Object.getPrototypeOf(module_or_path) === Object.prototype) + ({module_or_path} = module_or_path) + else + console.warn('using deprecated parameters for the initialization function; pass a single object instead') + + if (typeof module_or_path === 'undefined') { + module_or_path = new URL('prophet_bg.wasm', import.meta.url); + } + const imports = __wbg_get_imports(); + + if (typeof module_or_path === 'string' || (typeof Request === 'function' && module_or_path instanceof Request) || (typeof URL === 'function' && module_or_path instanceof URL)) { + module_or_path = fetch(module_or_path); + } + + __wbg_init_memory(imports); + + const { instance, module } = await __wbg_load(await module_or_path, imports); + + return __wbg_finalize_init(instance, module); +} + +export { initSync }; +export default __wbg_init; diff --git a/demo/dist/@bsull/augurs/prophet_bg.wasm b/demo/dist/@bsull/augurs/prophet_bg.wasm new file mode 100644 index 0000000..4b5ff4e Binary files /dev/null and b/demo/dist/@bsull/augurs/prophet_bg.wasm differ diff --git a/demo/dist/@bsull/augurs/prophet_bg.wasm.d.ts b/demo/dist/@bsull/augurs/prophet_bg.wasm.d.ts new file mode 100644 index 0000000..2f12469 --- /dev/null +++ b/demo/dist/@bsull/augurs/prophet_bg.wasm.d.ts @@ -0,0 +1,15 @@ +/* tslint:disable */ +/* eslint-disable */ +export const memory: WebAssembly.Memory; +export function __wbg_prophet_free(a: number, b: number): void; +export function prophet_new(a: number, b: number): void; +export function prophet_fit(a: number, b: number, c: number, d: number): void; +export function prophet_predict(a: number, b: number, c: number): void; +export function initLogging(a: number, b: number): void; +export function custom_init(): void; +export function __wbindgen_malloc(a: number, b: number): number; +export function __wbindgen_realloc(a: number, b: number, c: number, d: number): number; +export function __wbindgen_add_to_stack_pointer(a: number): number; +export function __wbindgen_exn_store(a: number): void; +export function __wbindgen_free(a: number, b: number, c: number): void; +export function __wbindgen_start(): void; diff --git a/demo/dist/@bsull/augurs/seasons.d.ts b/demo/dist/@bsull/augurs/seasons.d.ts new file mode 100644 index 0000000..17a474d --- /dev/null +++ b/demo/dist/@bsull/augurs/seasons.d.ts @@ -0,0 +1,171 @@ +/* tslint:disable */ +/* eslint-disable */ +/** +* Detect the seasonal periods in a time series. +* @param {number[] | Float64Array} y +* @param {SeasonalityOptions | undefined} [options] +* @returns {Uint32Array} +*/ +export function seasonalities(y: number[] | Float64Array, options?: SeasonalityOptions): Uint32Array; +/** +* Initialize logging. +* +* You can use this to emit logs from augurs to the browser console. +* The default is to log everything to the console, but you can +* change the log level and whether logs are emitted to the console +* or to the browser's performance timeline. +* +* IMPORTANT: this function should only be called once. It will throw +* an exception if called more than once. +* @param {LogConfig | undefined} [config] +*/ +export function initLogging(config?: LogConfig): void; +/** +* Initialize the logger and panic hook. +* +* This will be called automatically when the module is imported. +* It sets the default tracing subscriber to `tracing-wasm`, and +* sets WASM panics to print to the console with a helpful error +* message. +*/ +export function custom_init(): void; +/** + * Options for detecting seasonal periods. + */ +export interface SeasonalityOptions { + /** + * The minimum period to consider when detecting seasonal periods. + * + * The default is 4. + */ + minPeriod: number | undefined; + /** + * The maximum period to consider when detecting seasonal periods. + * + * The default is the length of the data divided by 3, or 512, whichever is smaller. + */ + maxPeriod: number | undefined; + /** + * The threshold for detecting peaks in the periodogram. + * + * The value will be clamped to the range 0.01 to 0.99. + * + * The default is 0.9. + */ + threshold: number | undefined; +} + +/** + * The maximum log level to emit. + * + * The default is `Level::Info`. + */ +export type Level = "trace" | "debug" | "info" | "warn" | "error"; + +/** + * The target for augurs log events. + */ +export type LogTarget = "console" | "performance"; + +/** + * Log configuration. + */ +export interface LogConfig { + /** + * The maximum log level to emit. + * + * Defaults to `INFO`. + */ + maxLevel?: Level; + /** + * The target for augurs log events. + * + * Defaults to logging to the browser console. + */ + target?: LogTarget; + /** + * Whether to emit coloured logs. + * + * Defaults to `true`. + */ + color?: boolean; + /** + * Whether to show detailed fields such as augurs\' file names and line numbers + * in the logs. + * + * Probably not wise in production. + * + * Defaults to `false`. + */ + showDetailedFields?: boolean; +} + +/** + * Forecast intervals. + */ +export interface ForecastIntervals { + /** + * The confidence level for the intervals. + */ + level: number; + /** + * The lower prediction intervals. + */ + lower: number[]; + /** + * The upper prediction intervals. + */ + upper: number[]; +} + +/** + * A forecast containing point forecasts and, optionally, prediction intervals. + */ +export interface Forecast { + /** + * The point forecasts. + */ + point: number[]; + /** + * The forecast intervals, if requested and supported + * by the trend model. + */ + intervals: ForecastIntervals | undefined; +} + + +export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module; + +export interface InitOutput { + readonly memory: WebAssembly.Memory; + readonly seasonalities: (a: number, b: number, c: number) => void; + readonly initLogging: (a: number, b: number) => void; + readonly custom_init: () => void; + readonly __wbindgen_malloc: (a: number, b: number) => number; + readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number; + readonly __wbindgen_add_to_stack_pointer: (a: number) => number; + readonly __wbindgen_free: (a: number, b: number, c: number) => void; + readonly __wbindgen_exn_store: (a: number) => void; + readonly __wbindgen_start: () => void; +} + +export type SyncInitInput = BufferSource | WebAssembly.Module; +/** +* Instantiates the given `module`, which can either be bytes or +* a precompiled `WebAssembly.Module`. +* +* @param {{ module: SyncInitInput }} module - Passing `SyncInitInput` directly is deprecated. +* +* @returns {InitOutput} +*/ +export function initSync(module: { module: SyncInitInput } | SyncInitInput): InitOutput; + +/** +* If `module_or_path` is {RequestInfo} or {URL}, makes a request and +* for everything else, calls `WebAssembly.instantiate` directly. +* +* @param {{ module_or_path: InitInput | Promise }} module_or_path - Passing `InitInput` directly is deprecated. +* +* @returns {Promise} +*/ +export default function __wbg_init (module_or_path?: { module_or_path: InitInput | Promise } | InitInput | Promise): Promise; diff --git a/demo/dist/@bsull/augurs/seasons.js b/demo/dist/@bsull/augurs/seasons.js new file mode 100644 index 0000000..9569a07 --- /dev/null +++ b/demo/dist/@bsull/augurs/seasons.js @@ -0,0 +1,604 @@ +let wasm; + +const heap = new Array(128).fill(undefined); + +heap.push(undefined, null, true, false); + +function getObject(idx) { return heap[idx]; } + +let heap_next = heap.length; + +function dropObject(idx) { + if (idx < 132) return; + heap[idx] = heap_next; + heap_next = idx; +} + +function takeObject(idx) { + const ret = getObject(idx); + dropObject(idx); + return ret; +} + +const cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } ); + +if (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); }; + +let cachedUint8ArrayMemory0 = null; + +function getUint8ArrayMemory0() { + if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) { + cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer); + } + return cachedUint8ArrayMemory0; +} + +function getStringFromWasm0(ptr, len) { + ptr = ptr >>> 0; + return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len)); +} + +function addHeapObject(obj) { + if (heap_next === heap.length) heap.push(heap.length + 1); + const idx = heap_next; + heap_next = heap[idx]; + + heap[idx] = obj; + return idx; +} + +function isLikeNone(x) { + return x === undefined || x === null; +} + +let cachedDataViewMemory0 = null; + +function getDataViewMemory0() { + if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer.detached === true || (cachedDataViewMemory0.buffer.detached === undefined && cachedDataViewMemory0.buffer !== wasm.memory.buffer)) { + cachedDataViewMemory0 = new DataView(wasm.memory.buffer); + } + return cachedDataViewMemory0; +} + +let WASM_VECTOR_LEN = 0; + +const cachedTextEncoder = (typeof TextEncoder !== 'undefined' ? new TextEncoder('utf-8') : { encode: () => { throw Error('TextEncoder not available') } } ); + +const encodeString = (typeof cachedTextEncoder.encodeInto === 'function' + ? function (arg, view) { + return cachedTextEncoder.encodeInto(arg, view); +} + : function (arg, view) { + const buf = cachedTextEncoder.encode(arg); + view.set(buf); + return { + read: arg.length, + written: buf.length + }; +}); + +function passStringToWasm0(arg, malloc, realloc) { + + if (realloc === undefined) { + const buf = cachedTextEncoder.encode(arg); + const ptr = malloc(buf.length, 1) >>> 0; + getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf); + WASM_VECTOR_LEN = buf.length; + return ptr; + } + + let len = arg.length; + let ptr = malloc(len, 1) >>> 0; + + const mem = getUint8ArrayMemory0(); + + let offset = 0; + + for (; offset < len; offset++) { + const code = arg.charCodeAt(offset); + if (code > 0x7F) break; + mem[ptr + offset] = code; + } + + if (offset !== len) { + if (offset !== 0) { + arg = arg.slice(offset); + } + ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; + const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len); + const ret = encodeString(arg, view); + + offset += ret.written; + ptr = realloc(ptr, len, offset, 1) >>> 0; + } + + WASM_VECTOR_LEN = offset; + return ptr; +} + +function debugString(val) { + // primitive types + const type = typeof val; + if (type == 'number' || type == 'boolean' || val == null) { + return `${val}`; + } + if (type == 'string') { + return `"${val}"`; + } + if (type == 'symbol') { + const description = val.description; + if (description == null) { + return 'Symbol'; + } else { + return `Symbol(${description})`; + } + } + if (type == 'function') { + const name = val.name; + if (typeof name == 'string' && name.length > 0) { + return `Function(${name})`; + } else { + return 'Function'; + } + } + // objects + if (Array.isArray(val)) { + const length = val.length; + let debug = '['; + if (length > 0) { + debug += debugString(val[0]); + } + for(let i = 1; i < length; i++) { + debug += ', ' + debugString(val[i]); + } + debug += ']'; + return debug; + } + // Test for built-in + const builtInMatches = /\[object ([^\]]+)\]/.exec(toString.call(val)); + let className; + if (builtInMatches.length > 1) { + className = builtInMatches[1]; + } else { + // Failed to match the standard '[object ClassName]' + return toString.call(val); + } + if (className == 'Object') { + // we're a user defined class or Object + // JSON.stringify avoids problems with cycles, and is generally much + // easier than looping through ownProperties of `val`. + try { + return 'Object(' + JSON.stringify(val) + ')'; + } catch (_) { + return 'Object'; + } + } + // errors + if (val instanceof Error) { + return `${val.name}: ${val.message}\n${val.stack}`; + } + // TODO we could test for more things here, like `Set`s and `Map`s. + return className; +} + +let cachedUint32ArrayMemory0 = null; + +function getUint32ArrayMemory0() { + if (cachedUint32ArrayMemory0 === null || cachedUint32ArrayMemory0.byteLength === 0) { + cachedUint32ArrayMemory0 = new Uint32Array(wasm.memory.buffer); + } + return cachedUint32ArrayMemory0; +} + +function getArrayU32FromWasm0(ptr, len) { + ptr = ptr >>> 0; + return getUint32ArrayMemory0().subarray(ptr / 4, ptr / 4 + len); +} +/** +* Detect the seasonal periods in a time series. +* @param {number[] | Float64Array} y +* @param {SeasonalityOptions | undefined} [options] +* @returns {Uint32Array} +*/ +export function seasonalities(y, options) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.seasonalities(retptr, addHeapObject(y), isLikeNone(options) ? 0 : addHeapObject(options)); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true); + var r3 = getDataViewMemory0().getInt32(retptr + 4 * 3, true); + if (r3) { + throw takeObject(r2); + } + var v1 = getArrayU32FromWasm0(r0, r1).slice(); + wasm.__wbindgen_free(r0, r1 * 4, 4); + return v1; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +} + +/** +* Initialize logging. +* +* You can use this to emit logs from augurs to the browser console. +* The default is to log everything to the console, but you can +* change the log level and whether logs are emitted to the console +* or to the browser's performance timeline. +* +* IMPORTANT: this function should only be called once. It will throw +* an exception if called more than once. +* @param {LogConfig | undefined} [config] +*/ +export function initLogging(config) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.initLogging(retptr, isLikeNone(config) ? 0 : addHeapObject(config)); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + if (r1) { + throw takeObject(r0); + } + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +} + +/** +* Initialize the logger and panic hook. +* +* This will be called automatically when the module is imported. +* It sets the default tracing subscriber to `tracing-wasm`, and +* sets WASM panics to print to the console with a helpful error +* message. +*/ +export function custom_init() { + wasm.custom_init(); +} + +function handleError(f, args) { + try { + return f.apply(this, args); + } catch (e) { + wasm.__wbindgen_exn_store(addHeapObject(e)); + } +} + +async function __wbg_load(module, imports) { + if (typeof Response === 'function' && module instanceof Response) { + if (typeof WebAssembly.instantiateStreaming === 'function') { + try { + return await WebAssembly.instantiateStreaming(module, imports); + + } catch (e) { + if (module.headers.get('Content-Type') != 'application/wasm') { + console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e); + + } else { + throw e; + } + } + } + + const bytes = await module.arrayBuffer(); + return await WebAssembly.instantiate(bytes, imports); + + } else { + const instance = await WebAssembly.instantiate(module, imports); + + if (instance instanceof WebAssembly.Instance) { + return { instance, module }; + + } else { + return instance; + } + } +} + +function __wbg_get_imports() { + const imports = {}; + imports.wbg = {}; + imports.wbg.__wbindgen_object_drop_ref = function(arg0) { + takeObject(arg0); + }; + imports.wbg.__wbindgen_error_new = function(arg0, arg1) { + const ret = new Error(getStringFromWasm0(arg0, arg1)); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_is_object = function(arg0) { + const val = getObject(arg0); + const ret = typeof(val) === 'object' && val !== null; + return ret; + }; + imports.wbg.__wbindgen_is_undefined = function(arg0) { + const ret = getObject(arg0) === undefined; + return ret; + }; + imports.wbg.__wbindgen_in = function(arg0, arg1) { + const ret = getObject(arg0) in getObject(arg1); + return ret; + }; + imports.wbg.__wbindgen_number_get = function(arg0, arg1) { + const obj = getObject(arg1); + const ret = typeof(obj) === 'number' ? obj : undefined; + getDataViewMemory0().setFloat64(arg0 + 8 * 1, isLikeNone(ret) ? 0 : ret, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, !isLikeNone(ret), true); + }; + imports.wbg.__wbindgen_object_clone_ref = function(arg0) { + const ret = getObject(arg0); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_is_string = function(arg0) { + const ret = typeof(getObject(arg0)) === 'string'; + return ret; + }; + imports.wbg.__wbindgen_string_get = function(arg0, arg1) { + const obj = getObject(arg1); + const ret = typeof(obj) === 'string' ? obj : undefined; + var ptr1 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + var len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }; + imports.wbg.__wbindgen_boolean_get = function(arg0) { + const v = getObject(arg0); + const ret = typeof(v) === 'boolean' ? (v ? 1 : 0) : 2; + return ret; + }; + imports.wbg.__wbg_new_abda76e883ba8a5f = function() { + const ret = new Error(); + return addHeapObject(ret); + }; + imports.wbg.__wbg_stack_658279fe44541cf6 = function(arg0, arg1) { + const ret = getObject(arg1).stack; + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }; + imports.wbg.__wbg_error_f851667af71bcfc6 = function(arg0, arg1) { + let deferred0_0; + let deferred0_1; + try { + deferred0_0 = arg0; + deferred0_1 = arg1; + console.error(getStringFromWasm0(arg0, arg1)); + } finally { + wasm.__wbindgen_free(deferred0_0, deferred0_1, 1); + } + }; + imports.wbg.__wbg_mark_f0616123624944ec = function(arg0, arg1) { + performance.mark(getStringFromWasm0(arg0, arg1)); + }; + imports.wbg.__wbg_log_914e3639af348b4e = function(arg0, arg1) { + let deferred0_0; + let deferred0_1; + try { + deferred0_0 = arg0; + deferred0_1 = arg1; + console.log(getStringFromWasm0(arg0, arg1)); + } finally { + wasm.__wbindgen_free(deferred0_0, deferred0_1, 1); + } + }; + imports.wbg.__wbg_log_12b4ba535cbd9499 = function(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7) { + let deferred0_0; + let deferred0_1; + try { + deferred0_0 = arg0; + deferred0_1 = arg1; + console.log(getStringFromWasm0(arg0, arg1), getStringFromWasm0(arg2, arg3), getStringFromWasm0(arg4, arg5), getStringFromWasm0(arg6, arg7)); + } finally { + wasm.__wbindgen_free(deferred0_0, deferred0_1, 1); + } + }; + imports.wbg.__wbg_measure_a990198e921c09fd = function() { return handleError(function (arg0, arg1, arg2, arg3) { + let deferred0_0; + let deferred0_1; + let deferred1_0; + let deferred1_1; + try { + deferred0_0 = arg0; + deferred0_1 = arg1; + deferred1_0 = arg2; + deferred1_1 = arg3; + performance.measure(getStringFromWasm0(arg0, arg1), getStringFromWasm0(arg2, arg3)); + } finally { + wasm.__wbindgen_free(deferred0_0, deferred0_1, 1); + wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); + } + }, arguments) }; + imports.wbg.__wbindgen_jsval_loose_eq = function(arg0, arg1) { + const ret = getObject(arg0) == getObject(arg1); + return ret; + }; + imports.wbg.__wbindgen_as_number = function(arg0) { + const ret = +getObject(arg0); + return ret; + }; + imports.wbg.__wbg_String_b9412f8799faab3e = function(arg0, arg1) { + const ret = String(getObject(arg1)); + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }; + imports.wbg.__wbindgen_string_new = function(arg0, arg1) { + const ret = getStringFromWasm0(arg0, arg1); + return addHeapObject(ret); + }; + imports.wbg.__wbg_getwithrefkey_edc2c8960f0f1191 = function(arg0, arg1) { + const ret = getObject(arg0)[getObject(arg1)]; + return addHeapObject(ret); + }; + imports.wbg.__wbg_call_1084a111329e68ce = function() { return handleError(function (arg0, arg1) { + const ret = getObject(arg0).call(getObject(arg1)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_get_3baa728f9d58d3f6 = function(arg0, arg1) { + const ret = getObject(arg0)[arg1 >>> 0]; + return addHeapObject(ret); + }; + imports.wbg.__wbg_length_ae22078168b726f5 = function(arg0) { + const ret = getObject(arg0).length; + return ret; + }; + imports.wbg.__wbindgen_is_function = function(arg0) { + const ret = typeof(getObject(arg0)) === 'function'; + return ret; + }; + imports.wbg.__wbg_next_de3e9db4440638b2 = function(arg0) { + const ret = getObject(arg0).next; + return addHeapObject(ret); + }; + imports.wbg.__wbg_next_f9cb570345655b9a = function() { return handleError(function (arg0) { + const ret = getObject(arg0).next(); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_done_bfda7aa8f252b39f = function(arg0) { + const ret = getObject(arg0).done; + return ret; + }; + imports.wbg.__wbg_value_6d39332ab4788d86 = function(arg0) { + const ret = getObject(arg0).value; + return addHeapObject(ret); + }; + imports.wbg.__wbg_iterator_888179a48810a9fe = function() { + const ret = Symbol.iterator; + return addHeapObject(ret); + }; + imports.wbg.__wbg_get_224d16597dbbfd96 = function() { return handleError(function (arg0, arg1) { + const ret = Reflect.get(getObject(arg0), getObject(arg1)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_isArray_8364a5371e9737d8 = function(arg0) { + const ret = Array.isArray(getObject(arg0)); + return ret; + }; + imports.wbg.__wbg_instanceof_ArrayBuffer_61dfc3198373c902 = function(arg0) { + let result; + try { + result = getObject(arg0) instanceof ArrayBuffer; + } catch (_) { + result = false; + } + const ret = result; + return ret; + }; + imports.wbg.__wbg_isSafeInteger_7f1ed56200d90674 = function(arg0) { + const ret = Number.isSafeInteger(getObject(arg0)); + return ret; + }; + imports.wbg.__wbg_entries_7a0e06255456ebcd = function(arg0) { + const ret = Object.entries(getObject(arg0)); + return addHeapObject(ret); + }; + imports.wbg.__wbg_buffer_b7b08af79b0b0974 = function(arg0) { + const ret = getObject(arg0).buffer; + return addHeapObject(ret); + }; + imports.wbg.__wbg_new_ea1883e1e5e86686 = function(arg0) { + const ret = new Uint8Array(getObject(arg0)); + return addHeapObject(ret); + }; + imports.wbg.__wbg_set_d1e79e2388520f18 = function(arg0, arg1, arg2) { + getObject(arg0).set(getObject(arg1), arg2 >>> 0); + }; + imports.wbg.__wbg_length_8339fcf5d8ecd12e = function(arg0) { + const ret = getObject(arg0).length; + return ret; + }; + imports.wbg.__wbg_instanceof_Uint8Array_247a91427532499e = function(arg0) { + let result; + try { + result = getObject(arg0) instanceof Uint8Array; + } catch (_) { + result = false; + } + const ret = result; + return ret; + }; + imports.wbg.__wbindgen_debug_string = function(arg0, arg1) { + const ret = debugString(getObject(arg1)); + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }; + imports.wbg.__wbindgen_throw = function(arg0, arg1) { + throw new Error(getStringFromWasm0(arg0, arg1)); + }; + imports.wbg.__wbindgen_memory = function() { + const ret = wasm.memory; + return addHeapObject(ret); + }; + + return imports; +} + +function __wbg_init_memory(imports, memory) { + +} + +function __wbg_finalize_init(instance, module) { + wasm = instance.exports; + __wbg_init.__wbindgen_wasm_module = module; + cachedDataViewMemory0 = null; + cachedUint32ArrayMemory0 = null; + cachedUint8ArrayMemory0 = null; + + + wasm.__wbindgen_start(); + return wasm; +} + +function initSync(module) { + if (wasm !== undefined) return wasm; + + + if (typeof module !== 'undefined' && Object.getPrototypeOf(module) === Object.prototype) + ({module} = module) + else + console.warn('using deprecated parameters for `initSync()`; pass a single object instead') + + const imports = __wbg_get_imports(); + + __wbg_init_memory(imports); + + if (!(module instanceof WebAssembly.Module)) { + module = new WebAssembly.Module(module); + } + + const instance = new WebAssembly.Instance(module, imports); + + return __wbg_finalize_init(instance, module); +} + +async function __wbg_init(module_or_path) { + if (wasm !== undefined) return wasm; + + + if (typeof module_or_path !== 'undefined' && Object.getPrototypeOf(module_or_path) === Object.prototype) + ({module_or_path} = module_or_path) + else + console.warn('using deprecated parameters for the initialization function; pass a single object instead') + + if (typeof module_or_path === 'undefined') { + module_or_path = new URL('seasons_bg.wasm', import.meta.url); + } + const imports = __wbg_get_imports(); + + if (typeof module_or_path === 'string' || (typeof Request === 'function' && module_or_path instanceof Request) || (typeof URL === 'function' && module_or_path instanceof URL)) { + module_or_path = fetch(module_or_path); + } + + __wbg_init_memory(imports); + + const { instance, module } = await __wbg_load(await module_or_path, imports); + + return __wbg_finalize_init(instance, module); +} + +export { initSync }; +export default __wbg_init; diff --git a/demo/dist/@bsull/augurs/seasons_bg.wasm b/demo/dist/@bsull/augurs/seasons_bg.wasm new file mode 100644 index 0000000..c796d5c Binary files /dev/null and b/demo/dist/@bsull/augurs/seasons_bg.wasm differ diff --git a/demo/dist/@bsull/augurs/seasons_bg.wasm.d.ts b/demo/dist/@bsull/augurs/seasons_bg.wasm.d.ts new file mode 100644 index 0000000..0a0f3b3 --- /dev/null +++ b/demo/dist/@bsull/augurs/seasons_bg.wasm.d.ts @@ -0,0 +1,12 @@ +/* tslint:disable */ +/* eslint-disable */ +export const memory: WebAssembly.Memory; +export function seasonalities(a: number, b: number, c: number): void; +export function initLogging(a: number, b: number): void; +export function custom_init(): void; +export function __wbindgen_malloc(a: number, b: number): number; +export function __wbindgen_realloc(a: number, b: number, c: number, d: number): number; +export function __wbindgen_add_to_stack_pointer(a: number): number; +export function __wbindgen_free(a: number, b: number, c: number): void; +export function __wbindgen_exn_store(a: number): void; +export function __wbindgen_start(): void; diff --git a/demo/dist/@bytecodealliance/preview2-shim/LICENSE b/demo/dist/@bytecodealliance/preview2-shim/LICENSE new file mode 100644 index 0000000..f9d8195 --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/LICENSE @@ -0,0 +1,220 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +--- LLVM Exceptions to the Apache 2.0 License ---- + +As an exception, if, as a result of your compiling your source code, portions +of this Software are embedded into an Object form of such source code, you +may redistribute such embedded portions in such Object form without complying +with the conditions of Sections 4(a), 4(b) and 4(d) of the License. + +In addition, if you combine or link compiled forms of this Software with +software that is licensed under the GPLv2 ("Combined Software") and if a +court of competent jurisdiction determines that the patent provision (Section +3), the indemnity provision (Section 9) or other Section of the License +conflicts with the conditions of the GPLv2, you may retroactively and +prospectively choose to deem waived or otherwise exclude such Section(s) of +the License, but only in their entirety and only with respect to the Combined +Software. + diff --git a/demo/dist/@bytecodealliance/preview2-shim/README.md b/demo/dist/@bytecodealliance/preview2-shim/README.md new file mode 100644 index 0000000..6a1b6f8 --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/README.md @@ -0,0 +1,18 @@ +# Preview2 Shim + +WASI Preview2 implementations for Node.js & browsers. + +Node.js support is fully tested and conformant against the Wasmtime test suite. + +Browser support is considered experimental, and not currently suitable for production applications. + +# License + +This project is licensed under the Apache 2.0 license with the LLVM exception. +See [LICENSE](LICENSE) for more details. + +### Contribution + +Unless you explicitly state otherwise, any contribution intentionally submitted +for inclusion in this project by you, as defined in the Apache-2.0 license, +shall be licensed as above, without any additional terms or conditions. diff --git a/demo/dist/@bytecodealliance/preview2-shim/lib/browser/cli.js b/demo/dist/@bytecodealliance/preview2-shim/lib/browser/cli.js new file mode 100644 index 0000000..476a16e --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/lib/browser/cli.js @@ -0,0 +1,159 @@ +import { _setCwd as fsSetCwd } from './filesystem.js'; +import { streams } from './io.js'; +const { InputStream, OutputStream } = streams; + +const symbolDispose = Symbol.dispose ?? Symbol.for('dispose'); + +let _env = [], _args = [], _cwd = "/"; +export function _setEnv (envObj) { + _env = Object.entries(envObj); +} +export function _setArgs (args) { + _args = args; +} + +export function _setCwd (cwd) { + fsSetCwd(_cwd = cwd); +} + +export const environment = { + getEnvironment () { + return _env; + }, + getArguments () { + return _args; + }, + initialCwd () { + return _cwd; + } +}; + +class ComponentExit extends Error { + constructor(ok) { + super(`Component exited ${ok ? 'successfully' : 'with error'}`); + this.exitError = true; + this.ok = ok; + } +} + +export const exit = { + exit (status) { + throw new ComponentExit(status.tag === 'err' ? true : false); + } +}; + +/** + * @param {import('../common/io.js').InputStreamHandler} handler + */ +export function _setStdin (handler) { + stdinStream.handler = handler; +} +/** + * @param {import('../common/io.js').OutputStreamHandler} handler + */ +export function _setStderr (handler) { + stderrStream.handler = handler; +} +/** + * @param {import('../common/io.js').OutputStreamHandler} handler + */ +export function _setStdout (handler) { + stdoutStream.handler = handler; +} + +const stdinStream = new InputStream({ + blockingRead (_len) { + // TODO + }, + subscribe () { + // TODO + }, + [symbolDispose] () { + // TODO + } +}); +let textDecoder = new TextDecoder(); +const stdoutStream = new OutputStream({ + write (contents) { + if (contents[contents.length - 1] == 10) { + // console.log already appends a new line + contents = contents.subarray(0, contents.length - 1); + } + console.log(textDecoder.decode(contents)); + }, + blockingFlush () { + }, + [symbolDispose] () { + } +}); +const stderrStream = new OutputStream({ + write (contents) { + if (contents[contents.length - 1] == 10) { + // console.error already appends a new line + contents = contents.subarray(0, contents.length - 1); + } + console.error(textDecoder.decode(contents)); + }, + blockingFlush () { + }, + [symbolDispose] () { + + } +}); + +export const stdin = { + InputStream, + getStdin () { + return stdinStream; + } +}; + +export const stdout = { + OutputStream, + getStdout () { + return stdoutStream; + } +}; + +export const stderr = { + OutputStream, + getStderr () { + return stderrStream; + } +}; + +class TerminalInput {} +class TerminalOutput {} + +const terminalStdoutInstance = new TerminalOutput(); +const terminalStderrInstance = new TerminalOutput(); +const terminalStdinInstance = new TerminalInput(); + +export const terminalInput = { + TerminalInput +}; + +export const terminalOutput = { + TerminalOutput +}; + +export const terminalStderr = { + TerminalOutput, + getTerminalStderr () { + return terminalStderrInstance; + } +}; + +export const terminalStdin = { + TerminalInput, + getTerminalStdin () { + return terminalStdinInstance; + } +}; + +export const terminalStdout = { + TerminalOutput, + getTerminalStdout () { + return terminalStdoutInstance; + } +}; diff --git a/demo/dist/@bytecodealliance/preview2-shim/lib/browser/clocks.js b/demo/dist/@bytecodealliance/preview2-shim/lib/browser/clocks.js new file mode 100644 index 0000000..0a0b7bd --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/lib/browser/clocks.js @@ -0,0 +1,34 @@ +export const monotonicClock = { + resolution() { + // usually we dont get sub-millisecond accuracy in the browser + // Note: is there a better way to determine this? + return 1e6; + }, + now () { + // performance.now() is in milliseconds, but we want nanoseconds + return BigInt(Math.floor(performance.now() * 1e6)); + }, + subscribeInstant (instant) { + instant = BigInt(instant); + const now = this.now(); + if (instant <= now) + return this.subscribeDuration(0); + return this.subscribeDuration(instant - now); + }, + subscribeDuration (_duration) { + _duration = BigInt(_duration); + console.log(`[monotonic-clock] subscribe`); + } +}; + +export const wallClock = { + now() { + let now = Date.now(); // in milliseconds + const seconds = BigInt(Math.floor(now / 1e3)); + const nanoseconds = (now % 1e3) * 1e6; + return { seconds, nanoseconds }; + }, + resolution() { + return { seconds: 0n, nanoseconds: 1e6 }; + } +}; diff --git a/demo/dist/@bytecodealliance/preview2-shim/lib/browser/filesystem.js b/demo/dist/@bytecodealliance/preview2-shim/lib/browser/filesystem.js new file mode 100644 index 0000000..dcf3566 --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/lib/browser/filesystem.js @@ -0,0 +1,286 @@ +import { streams } from './io.js'; +import { environment } from './cli.js'; + +const { InputStream, OutputStream } = streams; + +let _cwd = "/"; + +export function _setCwd (cwd) { + _cwd = cwd; +} + +export function _setFileData (fileData) { + _fileData = fileData; + _rootPreopen[0] = new Descriptor(fileData); + const cwd = environment.initialCwd(); + _setCwd(cwd || '/'); +} + +export function _getFileData () { + return JSON.stringify(_fileData); +} + +let _fileData = { dir: {} }; + +const timeZero = { + seconds: BigInt(0), + nanoseconds: 0 +}; + +function getChildEntry (parentEntry, subpath, openFlags) { + if (subpath === '.' && _rootPreopen && descriptorGetEntry(_rootPreopen[0]) === parentEntry) { + subpath = _cwd; + if (subpath.startsWith('/') && subpath !== '/') + subpath = subpath.slice(1); + } + let entry = parentEntry; + let segmentIdx; + do { + if (!entry || !entry.dir) throw 'not-directory'; + segmentIdx = subpath.indexOf('/'); + const segment = segmentIdx === -1 ? subpath : subpath.slice(0, segmentIdx); + if (segment === '..') throw 'no-entry'; + if (segment === '.' || segment === ''); + else if (!entry.dir[segment] && openFlags.create) + entry = entry.dir[segment] = openFlags.directory ? { dir: {} } : { source: new Uint8Array([]) }; + else + entry = entry.dir[segment]; + subpath = subpath.slice(segmentIdx + 1); + } while (segmentIdx !== -1) + if (!entry) throw 'no-entry'; + return entry; +} + +function getSource (fileEntry) { + if (typeof fileEntry.source === 'string') { + fileEntry.source = new TextEncoder().encode(fileEntry.source); + } + return fileEntry.source; +} + +class DirectoryEntryStream { + constructor (entries) { + this.idx = 0; + this.entries = entries; + } + readDirectoryEntry () { + if (this.idx === this.entries.length) + return null; + const [name, entry] = this.entries[this.idx]; + this.idx += 1; + return { + name, + type: entry.dir ? 'directory' : 'regular-file' + }; + } +} + +class Descriptor { + #stream; + #entry; + #mtime = 0; + + _getEntry (descriptor) { + return descriptor.#entry; + } + + constructor (entry, isStream) { + if (isStream) + this.#stream = entry; + else + this.#entry = entry; + } + + readViaStream(_offset) { + const source = getSource(this.#entry); + let offset = Number(_offset); + return new InputStream({ + blockingRead (len) { + if (offset === source.byteLength) + throw { tag: 'closed' }; + const bytes = source.slice(offset, offset + Number(len)); + offset += bytes.byteLength; + return bytes; + } + }); + } + + writeViaStream(_offset) { + const entry = this.#entry; + let offset = Number(_offset); + return new OutputStream({ + write (buf) { + const newSource = new Uint8Array(buf.byteLength + entry.source.byteLength); + newSource.set(entry.source, 0); + newSource.set(buf, offset); + offset += buf.byteLength; + entry.source = newSource; + return buf.byteLength; + } + }); + } + + appendViaStream() { + console.log(`[filesystem] APPEND STREAM`); + } + + advise(descriptor, offset, length, advice) { + console.log(`[filesystem] ADVISE`, descriptor, offset, length, advice); + } + + syncData() { + console.log(`[filesystem] SYNC DATA`); + } + + getFlags() { + console.log(`[filesystem] FLAGS FOR`); + } + + getType() { + if (this.#stream) return 'fifo'; + if (this.#entry.dir) return 'directory'; + if (this.#entry.source) return 'regular-file'; + return 'unknown'; + } + + setSize(size) { + console.log(`[filesystem] SET SIZE`, size); + } + + setTimes(dataAccessTimestamp, dataModificationTimestamp) { + console.log(`[filesystem] SET TIMES`, dataAccessTimestamp, dataModificationTimestamp); + } + + read(length, offset) { + const source = getSource(this.#entry); + return [source.slice(offset, offset + length), offset + length >= source.byteLength]; + } + + write(buffer, offset) { + if (offset !== 0) throw 'invalid-seek'; + this.#entry.source = buffer; + return buffer.byteLength; + } + + readDirectory() { + if (!this.#entry?.dir) + throw 'bad-descriptor'; + return new DirectoryEntryStream(Object.entries(this.#entry.dir).sort(([a], [b]) => a > b ? 1 : -1)); + } + + sync() { + console.log(`[filesystem] SYNC`); + } + + createDirectoryAt(path) { + const entry = getChildEntry(this.#entry, path, { create: true, directory: true }); + if (entry.source) throw 'exist'; + } + + stat() { + let type = 'unknown', size = BigInt(0); + if (this.#entry.source) { + type = 'regular-file'; + const source = getSource(this.#entry); + size = BigInt(source.byteLength); + } + else if (this.#entry.dir) { + type = 'directory'; + } + return { + type, + linkCount: BigInt(0), + size, + dataAccessTimestamp: timeZero, + dataModificationTimestamp: timeZero, + statusChangeTimestamp: timeZero, + } + } + + statAt(_pathFlags, path) { + const entry = getChildEntry(this.#entry, path, { create: false, directory: false }); + let type = 'unknown', size = BigInt(0); + if (entry.source) { + type = 'regular-file'; + const source = getSource(entry); + size = BigInt(source.byteLength); + } + else if (entry.dir) { + type = 'directory'; + } + return { + type, + linkCount: BigInt(0), + size, + dataAccessTimestamp: timeZero, + dataModificationTimestamp: timeZero, + statusChangeTimestamp: timeZero, + }; + } + + setTimesAt() { + console.log(`[filesystem] SET TIMES AT`); + } + + linkAt() { + console.log(`[filesystem] LINK AT`); + } + + openAt(_pathFlags, path, openFlags, _descriptorFlags, _modes) { + const childEntry = getChildEntry(this.#entry, path, openFlags); + return new Descriptor(childEntry); + } + + readlinkAt() { + console.log(`[filesystem] READLINK AT`); + } + + removeDirectoryAt() { + console.log(`[filesystem] REMOVE DIR AT`); + } + + renameAt() { + console.log(`[filesystem] RENAME AT`); + } + + symlinkAt() { + console.log(`[filesystem] SYMLINK AT`); + } + + unlinkFileAt() { + console.log(`[filesystem] UNLINK FILE AT`); + } + + isSameObject(other) { + return other === this; + } + + metadataHash() { + let upper = BigInt(0); + upper += BigInt(this.#mtime); + return { upper, lower: BigInt(0) }; + } + + metadataHashAt(_pathFlags, _path) { + let upper = BigInt(0); + upper += BigInt(this.#mtime); + return { upper, lower: BigInt(0) }; + } +} +const descriptorGetEntry = Descriptor.prototype._getEntry; +delete Descriptor.prototype._getEntry; + +let _preopens = [[new Descriptor(_fileData), '/']], _rootPreopen = _preopens[0]; + +export const preopens = { + getDirectories () { + return _preopens; + } +} + +export const types = { + Descriptor, + DirectoryEntryStream +}; + +export { types as filesystemTypes } diff --git a/demo/dist/@bytecodealliance/preview2-shim/lib/browser/http.js b/demo/dist/@bytecodealliance/preview2-shim/lib/browser/http.js new file mode 100644 index 0000000..4a1b244 --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/lib/browser/http.js @@ -0,0 +1,144 @@ +/** + * @param {import("../../types/interfaces/wasi-http-types").Request} req + * @returns {string} + */ +export function send(req) { + console.log(`[http] Send (browser) ${req.uri}`); + try { + const xhr = new XMLHttpRequest(); + xhr.open(req.method.toString(), req.uri, false); + const requestHeaders = new Headers(req.headers); + for (let [name, value] of requestHeaders.entries()) { + if (name !== "user-agent" && name !== "host") { + xhr.setRequestHeader(name, value); + } + } + xhr.send(req.body && req.body.length > 0 ? req.body : null); + const body = xhr.response ? new TextEncoder().encode(xhr.response) : undefined; + const headers = []; + xhr.getAllResponseHeaders().trim().split(/[\r\n]+/).forEach((line) => { + var parts = line.split(': '); + var key = parts.shift(); + var value = parts.join(': '); + headers.push([key, value]); + }); + return { + status: xhr.status, + headers, + body, + }; + } catch (err) { + throw new Error(err.message); + } +} + +export const incomingHandler = { + handle () { + + } +}; + +export const outgoingHandler = { + handle () { + + } +}; + +export const types = { + dropFields(_fields) { + console.log("[types] Drop fields"); + }, + newFields(_entries) { + console.log("[types] New fields"); + }, + fieldsGet(_fields, _name) { + console.log("[types] Fields get"); + }, + fieldsSet(_fields, _name, _value) { + console.log("[types] Fields set"); + }, + fieldsDelete(_fields, _name) { + console.log("[types] Fields delete"); + }, + fieldsAppend(_fields, _name, _value) { + console.log("[types] Fields append"); + }, + fieldsEntries(_fields) { + console.log("[types] Fields entries"); + }, + fieldsClone(_fields) { + console.log("[types] Fields clone"); + }, + finishIncomingStream(s) { + console.log(`[types] Finish incoming stream ${s}`); + }, + finishOutgoingStream(s, _trailers) { + console.log(`[types] Finish outgoing stream ${s}`); + }, + dropIncomingRequest(_req) { + console.log("[types] Drop incoming request"); + }, + dropOutgoingRequest(_req) { + console.log("[types] Drop outgoing request"); + }, + incomingRequestMethod(_req) { + console.log("[types] Incoming request method"); + }, + incomingRequestPathWithQuery(_req) { + console.log("[types] Incoming request path with query"); + }, + incomingRequestScheme(_req) { + console.log("[types] Incoming request scheme"); + }, + incomingRequestAuthority(_req) { + console.log("[types] Incoming request authority"); + }, + incomingRequestHeaders(_req) { + console.log("[types] Incoming request headers"); + }, + incomingRequestConsume(_req) { + console.log("[types] Incoming request consume"); + }, + newOutgoingRequest(_method, _pathWithQuery, _scheme, _authority, _headers) { + console.log("[types] New outgoing request"); + }, + outgoingRequestWrite(_req) { + console.log("[types] Outgoing request write"); + }, + dropResponseOutparam(_res) { + console.log("[types] Drop response outparam"); + }, + setResponseOutparam(_response) { + console.log("[types] Drop fields"); + }, + dropIncomingResponse(_res) { + console.log("[types] Drop incoming response"); + }, + dropOutgoingResponse(_res) { + console.log("[types] Drop outgoing response"); + }, + incomingResponseStatus(_res) { + console.log("[types] Incoming response status"); + }, + incomingResponseHeaders(_res) { + console.log("[types] Incoming response headers"); + }, + incomingResponseConsume(_res) { + console.log("[types] Incoming response consume"); + }, + newOutgoingResponse(_statusCode, _headers) { + console.log("[types] New outgoing response"); + }, + outgoingResponseWrite(_res) { + console.log("[types] Outgoing response write"); + }, + dropFutureIncomingResponse(_f) { + console.log("[types] Drop future incoming response"); + }, + futureIncomingResponseGet(_f) { + console.log("[types] Future incoming response get"); + }, + listenToFutureIncomingResponse(_f) { + console.log("[types] Listen to future incoming response"); + } +}; diff --git a/demo/dist/@bytecodealliance/preview2-shim/lib/browser/index.js b/demo/dist/@bytecodealliance/preview2-shim/lib/browser/index.js new file mode 100644 index 0000000..da23919 --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/lib/browser/index.js @@ -0,0 +1,17 @@ +import * as clocks from "./clocks.js"; +import * as filesystem from "./filesystem.js"; +import * as http from "./http.js"; +import * as io from "./io.js"; +import * as random from "./random.js"; +import * as sockets from "./sockets.js"; +import * as cli from "./cli.js"; + +export { + clocks, + filesystem, + http, + io, + random, + sockets, + cli, +} diff --git a/demo/dist/@bytecodealliance/preview2-shim/lib/browser/io.js b/demo/dist/@bytecodealliance/preview2-shim/lib/browser/io.js new file mode 100644 index 0000000..b450678 --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/lib/browser/io.js @@ -0,0 +1,185 @@ +let id = 0; + +const symbolDispose = Symbol.dispose || Symbol.for('dispose'); + +const IoError = class Error { + constructor (msg) { + this.msg = msg; + } + toDebugString () { + return this.msg; + } +} + +/** + * @typedef {{ + * read?: (len: BigInt) => Uint8Array, + * blockingRead: (len: BigInt) => Uint8Array, + * skip?: (len: BigInt) => BigInt, + * blockingSkip?: (len: BigInt) => BigInt, + * subscribe: () => void, + * drop?: () => void, + * }} InputStreamHandler + * + * @typedef {{ + * checkWrite?: () -> BigInt, + * write: (buf: Uint8Array) => BigInt, + * blockingWriteAndFlush?: (buf: Uint8Array) => void, + * flush?: () => void, + * blockingFlush: () => void, + * writeZeroes?: (len: BigInt) => void, + * blockingWriteZeroes?: (len: BigInt) => void, + * blockingWriteZeroesAndFlush?: (len: BigInt) => void, + * splice?: (src: InputStream, len: BigInt) => BigInt, + * blockingSplice?: (src: InputStream, len: BigInt) => BigInt, + * forward?: (src: InputStream) => void, + * subscribe?: () => void, + * drop?: () => void, + * }} OutputStreamHandler + * + **/ + +class InputStream { + /** + * @param {InputStreamHandler} handler + */ + constructor (handler) { + if (!handler) + console.trace('no handler'); + this.id = ++id; + this.handler = handler; + } + read(len) { + if (this.handler.read) + return this.handler.read(len); + return this.handler.blockingRead.call(this, len); + } + blockingRead(len) { + return this.handler.blockingRead.call(this, len); + } + skip(len) { + if (this.handler.skip) + return this.handler.skip.call(this, len); + if (this.handler.read) { + const bytes = this.handler.read.call(this, len); + return BigInt(bytes.byteLength); + } + return this.blockingSkip.call(this, len); + } + blockingSkip(len) { + if (this.handler.blockingSkip) + return this.handler.blockingSkip.call(this, len); + const bytes = this.handler.blockingRead.call(this, len); + return BigInt(bytes.byteLength); + } + subscribe() { + console.log(`[streams] Subscribe to input stream ${this.id}`); + } + [symbolDispose] () { + if (this.handler.drop) + this.handler.drop.call(this); + } +} + +class OutputStream { + /** + * @param {OutputStreamHandler} handler + */ + constructor (handler) { + if (!handler) + console.trace('no handler'); + this.id = ++id; + this.open = true; + this.handler = handler; + } + checkWrite(len) { + if (!this.open) + return 0n; + if (this.handler.checkWrite) + return this.handler.checkWrite.call(this, len); + return 1_000_000n; + } + write(buf) { + this.handler.write.call(this, buf); + } + blockingWriteAndFlush(buf) { + /// Perform a write of up to 4096 bytes, and then flush the stream. Block + /// until all of these operations are complete, or an error occurs. + /// + /// This is a convenience wrapper around the use of `check-write`, + /// `subscribe`, `write`, and `flush`, and is implemented with the + /// following pseudo-code: + /// + /// ```text + /// let pollable = this.subscribe(); + /// while !contents.is_empty() { + /// // Wait for the stream to become writable + /// poll-one(pollable); + /// let Ok(n) = this.check-write(); // eliding error handling + /// let len = min(n, contents.len()); + /// let (chunk, rest) = contents.split_at(len); + /// this.write(chunk ); // eliding error handling + /// contents = rest; + /// } + /// this.flush(); + /// // Wait for completion of `flush` + /// poll-one(pollable); + /// // Check for any errors that arose during `flush` + /// let _ = this.check-write(); // eliding error handling + /// ``` + this.handler.write.call(this, buf); + } + flush() { + if (this.handler.flush) + this.handler.flush.call(this); + } + blockingFlush() { + this.open = true; + } + writeZeroes(len) { + this.write.call(this, new Uint8Array(Number(len))); + } + blockingWriteZeroes(len) { + this.blockingWrite.call(this, new Uint8Array(Number(len))); + } + blockingWriteZeroesAndFlush(len) { + this.blockingWriteAndFlush.call(this, new Uint8Array(Number(len))); + } + splice(src, len) { + const spliceLen = Math.min(len, this.checkWrite.call(this)); + const bytes = src.read(spliceLen); + this.write.call(this, bytes); + return bytes.byteLength; + } + blockingSplice(_src, _len) { + console.log(`[streams] Blocking splice ${this.id}`); + } + forward(_src) { + console.log(`[streams] Forward ${this.id}`); + } + subscribe() { + console.log(`[streams] Subscribe to output stream ${this.id}`); + } + [symbolDispose]() { + } +} + +export const error = { Error: IoError }; + +export const streams = { InputStream, OutputStream }; + +class Pollable {} + +function pollList (_list) { + // TODO +} + +function pollOne (_poll) { + // TODO +} + +export const poll = { + Pollable, + pollList, + pollOne +}; diff --git a/demo/dist/@bytecodealliance/preview2-shim/lib/browser/random.js b/demo/dist/@bytecodealliance/preview2-shim/lib/browser/random.js new file mode 100644 index 0000000..0c47385 --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/lib/browser/random.js @@ -0,0 +1,56 @@ +const MAX_BYTES = 65536; + +let insecureRandomValue1, insecureRandomValue2; + +export const insecure = { + getInsecureRandomBytes (len) { + return random.getRandomBytes(len); + }, + getInsecureRandomU64 () { + return random.getRandomU64(); + } +}; + +let insecureSeedValue1, insecureSeedValue2; + +export const insecureSeed = { + insecureSeed () { + if (insecureSeedValue1 === undefined) { + insecureSeedValue1 = random.getRandomU64(); + insecureSeedValue2 = random.getRandomU64(); + } + return [insecureSeedValue1, insecureSeedValue2]; + } +}; + +export const random = { + getRandomBytes(len) { + const bytes = new Uint8Array(Number(len)); + + if (len > MAX_BYTES) { + // this is the max bytes crypto.getRandomValues + // can do at once see https://developer.mozilla.org/en-US/docs/Web/API/window.crypto.getRandomValues + for (var generated = 0; generated < len; generated += MAX_BYTES) { + // buffer.slice automatically checks if the end is past the end of + // the buffer so we don't have to here + crypto.getRandomValues(bytes.subarray(generated, generated + MAX_BYTES)); + } + } else { + crypto.getRandomValues(bytes); + } + + return bytes; + }, + + getRandomU64 () { + return crypto.getRandomValues(new BigUint64Array(1))[0]; + }, + + insecureRandom () { + if (insecureRandomValue1 === undefined) { + insecureRandomValue1 = random.getRandomU64(); + insecureRandomValue2 = random.getRandomU64(); + } + return [insecureRandomValue1, insecureRandomValue2]; + } +}; diff --git a/demo/dist/@bytecodealliance/preview2-shim/lib/browser/sockets.js b/demo/dist/@bytecodealliance/preview2-shim/lib/browser/sockets.js new file mode 100644 index 0000000..6dda749 --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/lib/browser/sockets.js @@ -0,0 +1,186 @@ +export const instanceNetwork = { + instanceNetwork () { + console.log(`[sockets] instance network`); + } +}; + +export const ipNameLookup = { + dropResolveAddressStream () { + + }, + subscribe () { + + }, + resolveAddresses () { + + }, + resolveNextAddress () { + + }, + nonBlocking () { + + }, + setNonBlocking () { + + }, +}; + +export const network = { + dropNetwork () { + + } +}; + +export const tcpCreateSocket = { + createTcpSocket () { + + } +}; + +export const tcp = { + subscribe () { + + }, + dropTcpSocket() { + + }, + bind() { + + }, + connect() { + + }, + listen() { + + }, + accept() { + + }, + localAddress() { + + }, + remoteAddress() { + + }, + addressFamily() { + + }, + setListenBacklogSize() { + + }, + keepAlive() { + + }, + setKeepAlive() { + + }, + noDelay() { + + }, + setNoDelay() { + + }, + unicastHopLimit() { + + }, + setUnicastHopLimit() { + + }, + receiveBufferSize() { + + }, + setReceiveBufferSize() { + + }, + sendBufferSize() { + + }, + setSendBufferSize() { + + }, + nonBlocking() { + + }, + setNonBlocking() { + + }, + shutdown() { + + } +}; + +export const udp = { + subscribe () { + + }, + + dropUdpSocket () { + + }, + + bind () { + + }, + + connect () { + + }, + + receive () { + + }, + + send () { + + }, + + localAddress () { + + }, + + remoteAddress () { + + }, + + addressFamily () { + + }, + + unicastHopLimit () { + + }, + + setUnicastHopLimit () { + + }, + + receiveBufferSize () { + + }, + + setReceiveBufferSize () { + + }, + + sendBufferSize () { + + }, + + setSendBufferSize () { + + }, + + nonBlocking () { + + }, + + setNonBlocking () { + + } +}; + +export const udpCreateSocket = { + createUdpSocket () { + + } +}; diff --git a/demo/dist/@bytecodealliance/preview2-shim/lib/io/calls.js b/demo/dist/@bytecodealliance/preview2-shim/lib/io/calls.js new file mode 100644 index 0000000..e1438cc --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/lib/io/calls.js @@ -0,0 +1,127 @@ +let call_id = 0; + +// Call is a 32 bit integer, leading 8 bits are call number, trailing 24 bits allow custom call types +export const CALL_MASK = 0xff000000; +export const CALL_TYPE_MASK = 0x00ffffff; +export const CALL_SHIFT = 24; + +// Type indiciator for generic Stream, Future, and Poll calls +let cnt = 0; +export const STDIN = ++cnt; +export const STDOUT = ++cnt; +export const STDERR = ++cnt; +export const FILE = ++cnt; +export const HTTP = ++cnt; +export const SOCKET_TCP = ++cnt; +export const SOCKET_UDP = ++cnt; +export const CLOCKS = ++cnt; + +// Io Input Stream +export const INPUT_STREAM_CREATE = ++call_id << CALL_SHIFT; +export const INPUT_STREAM_READ = ++call_id << CALL_SHIFT; +export const INPUT_STREAM_BLOCKING_READ = ++call_id << CALL_SHIFT; +export const INPUT_STREAM_SKIP = ++call_id << CALL_SHIFT; +export const INPUT_STREAM_BLOCKING_SKIP = ++call_id << CALL_SHIFT; +export const INPUT_STREAM_SUBSCRIBE = ++call_id << CALL_SHIFT; +export const INPUT_STREAM_DISPOSE = ++call_id << CALL_SHIFT; + +// Io Output Stream +export const OUTPUT_STREAM_CREATE = ++call_id << CALL_SHIFT; +export const OUTPUT_STREAM_CHECK_WRITE = ++call_id << CALL_SHIFT; +export const OUTPUT_STREAM_WRITE = ++call_id << CALL_SHIFT; +export const OUTPUT_STREAM_BLOCKING_WRITE_AND_FLUSH = ++call_id << CALL_SHIFT; +export const OUTPUT_STREAM_FLUSH = ++call_id << CALL_SHIFT; +export const OUTPUT_STREAM_BLOCKING_FLUSH = ++call_id << CALL_SHIFT; +export const OUTPUT_STREAM_WRITE_ZEROES = ++call_id << CALL_SHIFT; +export const OUTPUT_STREAM_BLOCKING_WRITE_ZEROES_AND_FLUSH = + ++call_id << CALL_SHIFT; +export const OUTPUT_STREAM_SPLICE = ++call_id << CALL_SHIFT; +export const OUTPUT_STREAM_BLOCKING_SPLICE = ++call_id << CALL_SHIFT; +export const OUTPUT_STREAM_SUBSCRIBE = ++call_id << CALL_SHIFT; +export const OUTPUT_STREAM_DISPOSE = ++call_id << CALL_SHIFT; + +export const OUTPUT_STREAM_GET_TOTAL_BYTES = ++call_id << CALL_SHIFT; + +// Io Poll +export const POLL_POLLABLE_READY = ++call_id << CALL_SHIFT; +export const POLL_POLLABLE_BLOCK = ++call_id << CALL_SHIFT; +export const POLL_POLLABLE_DISPOSE = ++call_id << CALL_SHIFT; +export const POLL_POLL_LIST = ++call_id << CALL_SHIFT; + +// Futures +export const FUTURE_DISPOSE = ++call_id << CALL_SHIFT; +export const FUTURE_TAKE_VALUE = ++call_id << CALL_SHIFT; +export const FUTURE_SUBSCRIBE = ++call_id << CALL_SHIFT; + +// Http +export const HTTP_CREATE_REQUEST = ++call_id << 24; +export const HTTP_OUTPUT_STREAM_FINISH = ++call_id << CALL_SHIFT; +// Http server +export const HTTP_SERVER_START = ++call_id << CALL_SHIFT; +export const HTTP_SERVER_STOP = ++call_id << CALL_SHIFT; +export const HTTP_SERVER_INCOMING_HANDLER = ++call_id << CALL_SHIFT; +export const HTTP_SERVER_SET_OUTGOING_RESPONSE = ++call_id << CALL_SHIFT; +export const HTTP_SERVER_CLEAR_OUTGOING_RESPONSE = ++call_id << CALL_SHIFT; +export const HTTP_OUTGOING_BODY_DISPOSE = ++call_id << CALL_SHIFT; + +// Clocks +export const CLOCKS_DURATION_SUBSCRIBE = ++call_id << CALL_SHIFT; +export const CLOCKS_INSTANT_SUBSCRIBE = ++call_id << CALL_SHIFT; + +// Sockets +// Tcp +export const SOCKET_TCP_CREATE_HANDLE = ++call_id << CALL_SHIFT; +export const SOCKET_TCP_BIND_START = ++call_id << CALL_SHIFT; +export const SOCKET_TCP_BIND_FINISH = ++call_id << CALL_SHIFT; +export const SOCKET_TCP_CONNECT_START = ++call_id << CALL_SHIFT; +export const SOCKET_TCP_CONNECT_FINISH = ++call_id << CALL_SHIFT; +export const SOCKET_TCP_SUBSCRIBE = ++call_id << CALL_SHIFT; +export const SOCKET_TCP_LISTEN_START = ++call_id << CALL_SHIFT; +export const SOCKET_TCP_LISTEN_FINISH = ++call_id << CALL_SHIFT; +export const SOCKET_TCP_IS_LISTENING = ++call_id << CALL_SHIFT; +export const SOCKET_TCP_ACCEPT = ++call_id << CALL_SHIFT; +export const SOCKET_TCP_GET_LOCAL_ADDRESS = ++call_id << CALL_SHIFT; +export const SOCKET_TCP_GET_REMOTE_ADDRESS = ++call_id << CALL_SHIFT; +export const SOCKET_TCP_SET_KEEP_ALIVE = ++call_id << CALL_SHIFT; +export const SOCKET_TCP_SET_LISTEN_BACKLOG_SIZE = ++call_id << CALL_SHIFT; +export const SOCKET_TCP_SHUTDOWN = ++call_id << CALL_SHIFT; +export const SOCKET_TCP_DISPOSE = ++call_id << CALL_SHIFT; +// Udp +export const SOCKET_UDP_CREATE_HANDLE = ++call_id << CALL_SHIFT; +export const SOCKET_UDP_BIND_START = ++call_id << CALL_SHIFT; +export const SOCKET_UDP_BIND_FINISH = ++call_id << CALL_SHIFT; +export const SOCKET_UDP_STREAM = ++call_id << CALL_SHIFT; +export const SOCKET_UDP_SUBSCRIBE = ++call_id << CALL_SHIFT; +export const SOCKET_UDP_DISPOSE = ++call_id << CALL_SHIFT; +export const SOCKET_UDP_GET_LOCAL_ADDRESS = ++call_id << CALL_SHIFT; +export const SOCKET_UDP_GET_RECEIVE_BUFFER_SIZE = ++call_id << CALL_SHIFT; +export const SOCKET_UDP_GET_REMOTE_ADDRESS = ++call_id << CALL_SHIFT; +export const SOCKET_UDP_GET_SEND_BUFFER_SIZE = ++call_id << CALL_SHIFT; +export const SOCKET_UDP_GET_UNICAST_HOP_LIMIT = ++call_id << CALL_SHIFT; +export const SOCKET_UDP_SET_RECEIVE_BUFFER_SIZE = ++call_id << CALL_SHIFT; +export const SOCKET_UDP_SET_SEND_BUFFER_SIZE = ++call_id << CALL_SHIFT; +export const SOCKET_UDP_SET_UNICAST_HOP_LIMIT = ++call_id << CALL_SHIFT; +export const SOCKET_INCOMING_DATAGRAM_STREAM_RECEIVE = ++call_id << CALL_SHIFT; +export const SOCKET_OUTGOING_DATAGRAM_STREAM_CHECK_SEND = + ++call_id << CALL_SHIFT; +export const SOCKET_OUTGOING_DATAGRAM_STREAM_SEND = ++call_id << CALL_SHIFT; +export const SOCKET_DATAGRAM_STREAM_SUBSCRIBE = ++call_id << CALL_SHIFT; +export const SOCKET_DATAGRAM_STREAM_DISPOSE = ++call_id << CALL_SHIFT; + +export const SOCKET_GET_DEFAULT_SEND_BUFFER_SIZE = ++call_id << CALL_SHIFT; +export const SOCKET_GET_DEFAULT_RECEIVE_BUFFER_SIZE = ++call_id << CALL_SHIFT; + +// Name lookup +export const SOCKET_RESOLVE_ADDRESS_CREATE_REQUEST = ++call_id << CALL_SHIFT; +export const SOCKET_RESOLVE_ADDRESS_TAKE_REQUEST = ++call_id << CALL_SHIFT; +export const SOCKET_RESOLVE_ADDRESS_SUBSCRIBE_REQUEST = ++call_id << CALL_SHIFT; +export const SOCKET_RESOLVE_ADDRESS_DISPOSE_REQUEST = ++call_id << CALL_SHIFT; + +export const reverseMap = {}; + +import * as calls from "./calls.js"; + +for (const name of Object.getOwnPropertyNames(calls)) { + if (name === "reverseMap") continue; + reverseMap[calls[name]] = name; +} diff --git a/demo/dist/@bytecodealliance/preview2-shim/lib/io/worker-http.js b/demo/dist/@bytecodealliance/preview2-shim/lib/io/worker-http.js new file mode 100644 index 0000000..4d067d9 --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/lib/io/worker-http.js @@ -0,0 +1,195 @@ +import { createReadableStream, getStreamOrThrow } from "./worker-thread.js"; +import { + createServer, + request as httpRequest, + Agent as HttpAgent, +} from "node:http"; +import { request as httpsRequest, Agent as HttpsAgent } from "node:https"; +import { parentPort } from "node:worker_threads"; +import { HTTP_SERVER_INCOMING_HANDLER } from "./calls.js"; + +const agentOptions = { + keepAlive: true, +}; +const httpAgent = new HttpAgent(agentOptions); +const httpsAgent = new HttpsAgent(agentOptions); + +const servers = new Map(); + +let responseCnt = 0; +const responses = new Map(); + +export async function stopHttpServer(id) { + await new Promise((resolve) => servers.get(id).close(resolve)); +} + +export function clearOutgoingResponse(id) { + responses.delete(id); +} + +export async function setOutgoingResponse( + id, + { statusCode, headers, streamId } +) { + const response = responses.get(id); + const textDecoder = new TextDecoder(); + response.writeHead( + statusCode, + Object.fromEntries( + headers.map(([key, val]) => [key, textDecoder.decode(val)]) + ) + ); + response.flushHeaders(); + const { stream } = getStreamOrThrow(streamId); + stream.pipe(response); + responses.delete(id); +} + +export async function startHttpServer(id, { port, host }) { + const server = createServer((req, res) => { + // create the streams and their ids + const streamId = createReadableStream(req); + const responseId = ++responseCnt; + parentPort.postMessage({ + type: HTTP_SERVER_INCOMING_HANDLER, + id, + payload: { + responseId, + method: req.method, + host: req.headers.host || host || "localhost", + pathWithQuery: req.url, + headers: Object.entries(req.headersDistinct).flatMap(([key, val]) => + val.map((val) => [key, val]) + ), + streamId, + }, + }); + responses.set(responseId, res); + }); + await new Promise((resolve, reject) => { + server.listen(port, host, resolve); + server.on("error", reject); + }); + servers.set(id, server); +} + +export async function createHttpRequest( + method, + scheme, + authority, + pathWithQuery, + headers, + bodyId, + connectTimeout, + betweenBytesTimeout, + firstByteTimeout +) { + let stream = null; + if (bodyId) { + try { + ({ stream } = getStreamOrThrow(bodyId)); + } catch (e) { + if (e.tag === "closed") + throw { tag: "internal-error", val: "Unexpected closed body stream" }; + // it should never be possible for the body stream to already + // be closed, or for there to be a write error + // we therefore just throw internal error here + if (e.tag === "last-operation-failed") + throw { + tag: "internal-error", + val: e.val, + }; + // entirely unknown error -> trap + throw e; + } + } + try { + // Make a request + let req; + switch (scheme) { + case "http:": + req = httpRequest({ + agent: httpAgent, + method, + host: authority.split(":")[0], + port: authority.split(":")[1], + path: pathWithQuery, + timeout: connectTimeout && Number(connectTimeout / 1_000_000n), + }); + break; + case "https:": + req = httpsRequest({ + agent: httpsAgent, + method, + host: authority.split(":")[0], + port: authority.split(":")[1], + path: pathWithQuery, + timeout: connectTimeout && Number(connectTimeout / 1_000_000n), + }); + break; + default: + throw { tag: "HTTP-protocol-error" }; + } + for (const [key, value] of headers) { + req.appendHeader(key, value); + } + req.flushHeaders(); + if (stream) { + stream.pipe(req); + } else { + req.end(); + } + const res = await new Promise((resolve, reject) => { + req.once('timeout', () => { + reject({ + tag: "connection-timeout" + }); + req.destroy(); + }); + req.once("response", resolve); + req.once("close", () => reject); + req.once("error", reject); + }); + if (firstByteTimeout) res.setTimeout(Number(firstByteTimeout / 1_000_000n)); + if (betweenBytesTimeout) + res.once("readable", () => { + res.setTimeout(Number(betweenBytesTimeout / 1_000_000n)); + }); + const bodyStreamId = createReadableStream(res); + return { + status: res.statusCode, + headers: Array.from(Object.entries(res.headers)), + bodyStreamId, + }; + } catch (e) { + if (e?.tag) throw e; + const err = getFirstError(e); + switch (err.code) { + case "ECONNRESET": + throw { tag: "HTTP-protocol-error" }; + case "ENOTFOUND": + throw { + tag: "DNS-error", + val: { + rcode: err.code, + infoCode: err.errno < 0 ? -err.errno : err.errno, + }, + }; + case "ECONNREFUSED": + throw { + tag: "connection-refused", + }; + } + throw { + tag: "internal-error", + val: err.toString(), + }; + } +} + +function getFirstError(e) { + if (typeof e !== "object" || e === null) return e; + if (e.cause) return getFirstError(e.cause); + if (e instanceof AggregateError) return getFirstError(e.errors[0]); + return e; +} diff --git a/demo/dist/@bytecodealliance/preview2-shim/lib/io/worker-io.js b/demo/dist/@bytecodealliance/preview2-shim/lib/io/worker-io.js new file mode 100644 index 0000000..b886d1c --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/lib/io/worker-io.js @@ -0,0 +1,520 @@ +import { fileURLToPath } from "node:url"; +import { createSyncFn } from "../synckit/index.js"; +import { + CALL_MASK, + CALL_TYPE_MASK, + FILE, + HTTP_SERVER_INCOMING_HANDLER, + HTTP, + INPUT_STREAM_BLOCKING_READ, + INPUT_STREAM_BLOCKING_SKIP, + INPUT_STREAM_DISPOSE, + INPUT_STREAM_READ, + INPUT_STREAM_SKIP, + INPUT_STREAM_SUBSCRIBE, + OUTPUT_STREAM_BLOCKING_FLUSH, + OUTPUT_STREAM_BLOCKING_SPLICE, + OUTPUT_STREAM_BLOCKING_WRITE_AND_FLUSH, + OUTPUT_STREAM_BLOCKING_WRITE_ZEROES_AND_FLUSH, + OUTPUT_STREAM_CHECK_WRITE, + OUTPUT_STREAM_DISPOSE, + OUTPUT_STREAM_FLUSH, + OUTPUT_STREAM_SPLICE, + OUTPUT_STREAM_SUBSCRIBE, + OUTPUT_STREAM_WRITE_ZEROES, + OUTPUT_STREAM_WRITE, + POLL_POLL_LIST, + POLL_POLLABLE_BLOCK, + POLL_POLLABLE_DISPOSE, + POLL_POLLABLE_READY, + SOCKET_TCP, + STDERR, + STDIN, + STDOUT, + reverseMap, +} from "./calls.js"; +import nodeProcess, { exit, stderr, stdout, env } from "node:process"; + +const _rawDebug = nodeProcess._rawDebug || console.error.bind(console); + +const workerPath = fileURLToPath( + new URL("./worker-thread.js", import.meta.url) +); + +const httpIncomingHandlers = new Map(); +export function registerIncomingHttpHandler(id, handler) { + httpIncomingHandlers.set(id, handler); +} + +const instanceId = Math.round(Math.random() * 1000).toString(); +const DEBUG_DEFAULT = false; +const DEBUG = + env.PREVIEW2_SHIM_DEBUG === "0" + ? false + : env.PREVIEW2_SHIM_DEBUG === "1" + ? true + : DEBUG_DEFAULT; + +/** + * @type {(call: number, id: number | null, payload: any) -> any} + */ +export let ioCall = createSyncFn(workerPath, DEBUG, (type, id, payload) => { + // 'callbacks' from the worker + // ONLY happens for an http server incoming handler, and NOTHING else (not even sockets, since accept is sync!) + if (type !== HTTP_SERVER_INCOMING_HANDLER) + throw new Error( + "Internal error: only incoming handler callback is permitted" + ); + const handler = httpIncomingHandlers.get(id); + if (!handler) + throw new Error( + `Internal error: no incoming handler registered for server ${id}` + ); + handler(payload); +}); +if (DEBUG) { + const _ioCall = ioCall; + ioCall = function ioCall(num, id, payload) { + if (typeof id !== "number" && id !== null) + throw new Error("id must be a number or null"); + let ret; + try { + _rawDebug( + instanceId, + reverseMap[num & CALL_MASK], + reverseMap[num & CALL_TYPE_MASK], + id, + payload + ); + ret = _ioCall(num, id, payload); + return ret; + } catch (e) { + ret = e; + throw ret; + } finally { + _rawDebug(instanceId, "->", ret); + } + }; +} + +const symbolDispose = Symbol.dispose || Symbol.for("dispose"); + +const finalizationRegistry = new FinalizationRegistry( + (dispose) => void dispose() +); + +const dummySymbol = Symbol(); + +/** + * + * @param {any} resource + * @param {any} parentResource + * @param {number} id + * @param {(number) => void} disposeFn + */ +export function registerDispose(resource, parentResource, id, disposeFn) { + // While strictly speaking all components should handle their disposal, + // this acts as a last-resort to catch all missed drops through the JS GC. + // Mainly for two cases - (1) components which are long lived, that get shut + // down and (2) users that interface with low-level WASI APIs directly in JS + // for various reasons may end up leaning on JS GC inadvertantly. + function finalizer() { + // This has no functional purpose other than to pin a strong reference + // from the child resource's finalizer to the parent resource, to ensure + // that we can never finalize a parent resource before a child resource. + // This makes the generational JS GC become piecewise over child resource + // graphs (generational at each resource hierarchy level at least). + if (parentResource?.[dummySymbol]) return; + disposeFn(id); + } + finalizationRegistry.register(resource, finalizer, finalizer); + return finalizer; +} + +export function earlyDispose(finalizer) { + finalizationRegistry.unregister(finalizer); + finalizer(); +} + +const _Error = Error; +const IoError = class Error extends _Error { + constructor(payload) { + super(payload); + this.payload = payload; + } + toDebugString() { + return this.message; + } +}; + +function streamIoErrorCall(call, id, payload) { + try { + return ioCall(call, id, payload); + } catch (e) { + if (e.tag === "closed") throw e; + if (e.tag === "last-operation-failed") { + e.val = new IoError(Object.assign(new Error(e.val.message), e.val)); + throw e; + } + // any invalid error is a trap + console.trace(e); + exit(1); + } +} + +class InputStream { + #id; + #streamType; + #finalizer; + read(len) { + return streamIoErrorCall( + INPUT_STREAM_READ | this.#streamType, + this.#id, + len + ); + } + blockingRead(len) { + return streamIoErrorCall( + INPUT_STREAM_BLOCKING_READ | this.#streamType, + this.#id, + len + ); + } + skip(len) { + return streamIoErrorCall( + INPUT_STREAM_SKIP | this.#streamType, + this.#id, + len + ); + } + blockingSkip(len) { + return streamIoErrorCall( + INPUT_STREAM_BLOCKING_SKIP | this.#streamType, + this.#id, + len + ); + } + subscribe() { + return pollableCreate( + ioCall(INPUT_STREAM_SUBSCRIBE | this.#streamType, this.#id), + this + ); + } + static _id(stream) { + return stream.#id; + } + /** + * @param {FILE | SOCKET_TCP | STDIN | HTTP} streamType + */ + static _create(streamType, id) { + const stream = new InputStream(); + stream.#id = id; + stream.#streamType = streamType; + let disposeFn; + switch (streamType) { + case FILE: + disposeFn = fileInputStreamDispose; + break; + case SOCKET_TCP: + disposeFn = socketTcpInputStreamDispose; + break; + case STDIN: + disposeFn = stdinInputStreamDispose; + break; + case HTTP: + disposeFn = httpInputStreamDispose; + break; + default: + throw new Error( + "wasi-io trap: Dispose function not created for stream type " + + reverseMap[streamType] + ); + } + stream.#finalizer = registerDispose(stream, null, id, disposeFn); + return stream; + } + [symbolDispose]() { + if (this.#finalizer) { + earlyDispose(this.#finalizer); + this.#finalizer = null; + } + } +} + +function fileInputStreamDispose(id) { + ioCall(INPUT_STREAM_DISPOSE | FILE, id, null); +} + +function socketTcpInputStreamDispose(id) { + ioCall(INPUT_STREAM_DISPOSE | SOCKET_TCP, id, null); +} + +function stdinInputStreamDispose(id) { + ioCall(INPUT_STREAM_DISPOSE | STDIN, id, null); +} + +function httpInputStreamDispose(id) { + ioCall(INPUT_STREAM_DISPOSE | HTTP, id, null); +} + +export const inputStreamCreate = InputStream._create; +delete InputStream._create; + +export const inputStreamId = InputStream._id; +delete InputStream._id; + +class OutputStream { + #id; + #streamType; + #finalizer; + checkWrite(len) { + return streamIoErrorCall( + OUTPUT_STREAM_CHECK_WRITE | this.#streamType, + this.#id, + len + ); + } + write(buf) { + if (this.#streamType <= STDERR) return this.blockingWriteAndFlush(buf); + return streamIoErrorCall( + OUTPUT_STREAM_WRITE | this.#streamType, + this.#id, + buf + ); + } + blockingWriteAndFlush(buf) { + if (this.#streamType <= STDERR) { + const stream = this.#streamType === STDERR ? stderr : stdout; + return void stream.write(buf); + } + return streamIoErrorCall( + OUTPUT_STREAM_BLOCKING_WRITE_AND_FLUSH | this.#streamType, + this.#id, + buf + ); + } + flush() { + return streamIoErrorCall(OUTPUT_STREAM_FLUSH | this.#streamType, this.#id); + } + blockingFlush() { + return streamIoErrorCall( + OUTPUT_STREAM_BLOCKING_FLUSH | this.#streamType, + this.#id + ); + } + writeZeroes(len) { + return streamIoErrorCall( + OUTPUT_STREAM_WRITE_ZEROES | this.#streamType, + this.#id, + len + ); + } + blockingWriteZeroesAndFlush(len) { + return streamIoErrorCall( + OUTPUT_STREAM_BLOCKING_WRITE_ZEROES_AND_FLUSH | this.#streamType, + this.#id, + len + ); + } + splice(src, len) { + return streamIoErrorCall( + OUTPUT_STREAM_SPLICE | this.#streamType, + this.#id, + { src: src.#id, len } + ); + } + blockingSplice(src, len) { + return streamIoErrorCall( + OUTPUT_STREAM_BLOCKING_SPLICE | this.#streamType, + this.#id, + { src: inputStreamId(src), len } + ); + } + subscribe() { + return pollableCreate( + ioCall(OUTPUT_STREAM_SUBSCRIBE | this.#streamType, this.#id) + ); + } + + static _id(outputStream) { + return outputStream.#id; + } + /** + * @param {OutputStreamType} streamType + * @param {any} createPayload + */ + static _create(streamType, id) { + const stream = new OutputStream(); + stream.#id = id; + stream.#streamType = streamType; + let disposeFn; + switch (streamType) { + case STDOUT: + disposeFn = stdoutOutputStreamDispose; + break; + case STDERR: + disposeFn = stderrOutputStreamDispose; + break; + case SOCKET_TCP: + disposeFn = socketTcpOutputStreamDispose; + break; + case FILE: + disposeFn = fileOutputStreamDispose; + break; + case HTTP: + return stream; + default: + throw new Error( + "wasi-io trap: Dispose function not created for stream type " + + reverseMap[streamType] + ); + } + stream.#finalizer = registerDispose(stream, null, id, disposeFn); + return stream; + } + + [symbolDispose]() { + if (this.#finalizer) { + earlyDispose(this.#finalizer); + this.#finalizer = null; + } + } +} + +function stdoutOutputStreamDispose(id) { + ioCall(OUTPUT_STREAM_DISPOSE | STDOUT, id); +} + +function stderrOutputStreamDispose(id) { + ioCall(OUTPUT_STREAM_DISPOSE | STDERR, id); +} + +function socketTcpOutputStreamDispose(id) { + ioCall(OUTPUT_STREAM_DISPOSE | SOCKET_TCP, id); +} + +function fileOutputStreamDispose(id) { + ioCall(OUTPUT_STREAM_DISPOSE | FILE, id); +} + +export const outputStreamCreate = OutputStream._create; +delete OutputStream._create; + +export const outputStreamId = OutputStream._id; +delete OutputStream._id; + +export const error = { Error: IoError }; + +export const streams = { InputStream, OutputStream }; + +function pollableDispose(id) { + ioCall(POLL_POLLABLE_DISPOSE, id); +} + +const rep = Symbol.for("cabiRep"); + +class Pollable { + #finalizer; + ready() { + return ioCall(POLL_POLLABLE_READY, this[rep]); + } + block() { + ioCall(POLL_POLLABLE_BLOCK, this[rep]); + } + static _create(id, parent) { + const pollable = new Pollable(); + pollable[rep] = id; + pollable.#finalizer = registerDispose( + pollable, + parent, + id, + pollableDispose + ); + return pollable; + } + [symbolDispose]() { + if (this.#finalizer && this[rep]) { + earlyDispose(this.#finalizer); + this.#finalizer = null; + } + } +} + +const cabiLowerSymbol = Symbol.for("cabiLower"); +const T_FLAG = 1 << 30; + +Pollable.prototype.ready[cabiLowerSymbol] = function ({ + resourceTables: [table], +}) { + return function pollableReady(handle) { + const rep = table[(handle << 1) + 1] & ~T_FLAG; + const ready = ioCall(POLL_POLLABLE_READY, rep); + return ready ? 1 : 0; + }; +}; + +Pollable.prototype.block[cabiLowerSymbol] = function ({ + resourceTables: [table], +}) { + return function pollableBlock(handle) { + const rep = table[(handle << 1) + 1] & ~T_FLAG; + ioCall(POLL_POLLABLE_BLOCK, rep); + }; +}; + +Pollable[Symbol.for("cabiDispose")] = function pollableDispose(rep) { + ioCall(POLL_POLLABLE_DISPOSE, rep); +}; + +export const pollableCreate = Pollable._create; +delete Pollable._create; + +export const poll = { + Pollable, + poll(list) { + return ioCall( + POLL_POLL_LIST, + null, + list.map((pollable) => pollable[rep]) + ); + }, +}; + +poll.poll[cabiLowerSymbol] = function ({ memory, realloc, resourceTables: [table] }) { + return function pollPollList (listPtr, len, retptr) { + const handleList = new Uint32Array(memory.buffer, listPtr, len); + const repList = Array(len); + for (let i = 0; i < len; i++) { + const handle = handleList[i]; + repList[i] = table[(handle << 1) + 1] & ~T_FLAG; + } + const result = ioCall(POLL_POLL_LIST, null, repList); + const ptr = realloc(0, 0, 4, result.byteLength); + const out = new Uint32Array(memory.buffer, ptr, result.length); + out.set(result); + const ret = new Uint32Array(memory.buffer, retptr, 2); + ret[0] = ptr; + ret[1] = result.length; + return retptr; + }; +}; + +export function createPoll(call, id, initPayload) { + return pollableCreate(ioCall(call, id, initPayload)); +} + +export function createPollLower(call, id, table) { + return function (initPayload) { + const rep = ioCall(call, id, initPayload); + const free = table[0] & ~T_FLAG; + if (free === 0) { + table.push(0); + table.push(rep | T_FLAG); + return (table.length >> 1) - 1; + } + table[0] = table[free << 1]; + table[free << 1] = 0; + table[(free << 1) + 1] = rep | T_FLAG; + return free; + }; +} diff --git a/demo/dist/@bytecodealliance/preview2-shim/lib/io/worker-socket-tcp.js b/demo/dist/@bytecodealliance/preview2-shim/lib/io/worker-socket-tcp.js new file mode 100644 index 0000000..afdb29e --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/lib/io/worker-socket-tcp.js @@ -0,0 +1,291 @@ +import { + createFuture, + createReadableStream, + createReadableStreamPollState, + createWritableStream, + futureDispose, + futureTakeValue, + pollStateReady, + verifyPollsDroppedForDrop, +} from "./worker-thread.js"; +import process from "node:process"; +const { TCP, constants: TCPConstants } = process.binding("tcp_wrap"); +import { + convertSocketError, + convertSocketErrorCode, + ipSocketAddress, + isIPv4MappedAddress, + isMulticastIpAddress, + isUnicastIpAddress, + isWildcardAddress, + noLookup, + serializeIpAddress, + SOCKET_STATE_BIND, + SOCKET_STATE_BOUND, + SOCKET_STATE_CLOSED, + SOCKET_STATE_CONNECT, + SOCKET_STATE_CONNECTION, + SOCKET_STATE_INIT, + SOCKET_STATE_LISTEN, + SOCKET_STATE_LISTENER, +} from "./worker-sockets.js"; +import { Socket, Server } from "node:net"; + +const winOrMac = process.platform === 'win32' || process.platform === 'darwin'; + +/** + * @typedef {import("../../types/interfaces/wasi-sockets-network.js").IpSocketAddress} IpSocketAddress + * @typedef {import("../../../types/interfaces/wasi-sockets-tcp.js").IpAddressFamily} IpAddressFamily + * @typedef {import("node:net").Socket} TcpSocket + * + * @typedef {{ + * tcpSocket: number, + * err: Error | null, + * pollState: PollState, + * }} PendingAccept + * + * @typedef {{ + * state: number, + * future: number | null, + * tcpSocket: TcpSocket | null, + * listenBacklogSize: number, + * handle: TCP, + * pendingAccepts: PendingAccept[], + * pollState: PollState, + * }} TcpSocketRecord + */ + +/** + * @type {Map} + */ +export const tcpSockets = new Map(); + +let tcpSocketCnt = 0; + +/** + * @param {IpAddressFamily} addressFamily + */ +export function createTcpSocket() { + const handle = new TCP(TCPConstants.SOCKET); + tcpSockets.set(++tcpSocketCnt, { + state: SOCKET_STATE_INIT, + future: null, + tcpSocket: null, + listenBacklogSize: 128, + handle, + pendingAccepts: [], + pollState: { ready: true, listener: null, polls: [], parentStream: null }, + }); + return tcpSocketCnt; +} + +export function socketTcpFinish(id, fromState, toState) { + const socket = tcpSockets.get(id); + if (socket.state !== fromState) throw "not-in-progress"; + if (!socket.pollState.ready) throw "would-block"; + const { tag, val } = futureTakeValue(socket.future).val; + futureDispose(socket.future, false); + socket.future = null; + if (tag === "err") { + socket.state = SOCKET_STATE_CLOSED; + throw val; + } else { + socket.state = toState; + // for the listener, we must immediately transition back to unresolved + if (toState === SOCKET_STATE_LISTENER) socket.pollState.ready = false; + return val; + } +} + +export function socketTcpBindStart(id, localAddress, family) { + const socket = tcpSockets.get(id); + if (socket.state !== SOCKET_STATE_INIT) throw "invalid-state"; + if ( + family !== localAddress.tag || + !isUnicastIpAddress(localAddress) || + isIPv4MappedAddress(localAddress) + ) + throw "invalid-argument"; + socket.state = SOCKET_STATE_BIND; + const { handle } = socket; + socket.future = createFuture( + (async () => { + const address = serializeIpAddress(localAddress); + const port = localAddress.val.port; + const code = + localAddress.tag === "ipv6" + ? handle.bind6(address, port, TCPConstants.UV_TCP_IPV6ONLY) + : handle.bind(address, port); + if (code !== 0) throw convertSocketErrorCode(-code); + // This is a Node.js / libuv quirk to force the bind error to be thrown + // (specifically address-in-use). + { + const out = {}; + const code = handle.getsockname(out); + if (code !== 0) throw convertSocketErrorCode(-code); + } + })(), + socket.pollState + ); +} + +export function socketTcpConnectStart(id, remoteAddress, family) { + const socket = tcpSockets.get(id); + if (socket.state !== SOCKET_STATE_INIT && socket.state !== SOCKET_STATE_BOUND) + throw "invalid-state"; + if ( + isWildcardAddress(remoteAddress) || + family !== remoteAddress.tag || + !isUnicastIpAddress(remoteAddress) || + isMulticastIpAddress(remoteAddress) || + remoteAddress.val.port === 0 || + isIPv4MappedAddress(remoteAddress) + ) { + throw "invalid-argument"; + } + socket.state = SOCKET_STATE_CONNECT; + socket.future = createFuture( + new Promise((resolve, reject) => { + const tcpSocket = (socket.tcpSocket = new Socket({ + handle: socket.handle, + pauseOnCreate: true, + allowHalfOpen: true, + })); + function handleErr(err) { + tcpSocket.off("connect", handleConnect); + reject(convertSocketError(err)); + } + function handleConnect() { + tcpSocket.off("error", handleErr); + resolve([ + createReadableStream(tcpSocket), + createWritableStream(tcpSocket), + ]); + } + tcpSocket.once("connect", handleConnect); + tcpSocket.once("error", handleErr); + tcpSocket.connect({ + port: remoteAddress.val.port, + host: serializeIpAddress(remoteAddress), + lookup: noLookup, + }); + }), + socket.pollState + ); +} + +export function socketTcpListenStart(id) { + const socket = tcpSockets.get(id); + if (socket.state !== SOCKET_STATE_BOUND) throw "invalid-state"; + const { handle } = socket; + socket.state = SOCKET_STATE_LISTEN; + socket.future = createFuture( + new Promise((resolve, reject) => { + const server = new Server({ pauseOnConnect: true, allowHalfOpen: true }); + function handleErr(err) { + server.off("listening", handleListen); + reject(convertSocketError(err)); + } + function handleListen() { + server.off("error", handleErr); + server.on("connection", (tcpSocket) => { + pollStateReady(socket.pollState); + const pollState = createReadableStreamPollState(tcpSocket); + socket.pendingAccepts.push({ tcpSocket, err: null, pollState }); + }); + server.on("error", (err) => { + pollStateReady(socket.pollState); + socket.pendingAccepts.push({ tcpSocket: null, err, pollState: null }); + }); + resolve(); + } + server.once("listening", handleListen); + server.once("error", handleErr); + server.listen(handle, socket.listenBacklogSize); + }), + socket.pollState + ); +} + +export function socketTcpAccept(id) { + const socket = tcpSockets.get(id); + if (socket.state !== SOCKET_STATE_LISTENER) throw "invalid-state"; + if (socket.pendingAccepts.length === 0) throw "would-block"; + const accept = socket.pendingAccepts.shift(); + if (accept.err) { + socket.state = SOCKET_STATE_CLOSED; + throw convertSocketError(accept.err); + } + if (socket.pendingAccepts.length === 0) socket.pollState.ready = false; + tcpSockets.set(++tcpSocketCnt, { + state: SOCKET_STATE_CONNECTION, + future: null, + tcpSocket: accept.tcpSocket, + listenBacklogSize: 128, + handle: accept.tcpSocket._handle, + pendingAccepts: [], + pollState: accept.pollState, + }); + return [ + tcpSocketCnt, + createReadableStream(accept.tcpSocket, accept.pollState), + createWritableStream(accept.tcpSocket), + ]; +} + +export function socketTcpSetListenBacklogSize(id, backlogSize) { + const socket = tcpSockets.get(id); + if ( + socket.state === SOCKET_STATE_LISTEN || + socket.state === SOCKET_STATE_LISTENER + ) + throw "not-supported"; + if ( + socket.state !== SOCKET_STATE_INIT && + socket.state !== SOCKET_STATE_BIND && + socket.state !== SOCKET_STATE_BOUND + ) + throw "invalid-state"; + socket.listenBacklogSize = Number(backlogSize); +} + +export function socketTcpGetLocalAddress(id) { + const { handle } = tcpSockets.get(id); + const out = {}; + const code = handle.getsockname(out); + if (code !== 0) throw convertSocketErrorCode(-code); + return ipSocketAddress(out.family.toLowerCase(), out.address, out.port); +} + +export function socketTcpGetRemoteAddress(id) { + const { handle } = tcpSockets.get(id); + const out = {}; + const code = handle.getpeername(out); + if (code !== 0) throw convertSocketErrorCode(-code); + return ipSocketAddress(out.family.toLowerCase(), out.address, out.port); +} + +export function socketTcpShutdown(id, _shutdownType) { + const socket = tcpSockets.get(id); + if (socket.state !== SOCKET_STATE_CONNECTION) throw "invalid-state"; + if (winOrMac && socket.tcpSocket.destroySoon) + socket.tcpSocket.destroySoon(); + else + socket.tcpSocket.destroy(); +} + +export function socketTcpSetKeepAlive(id, { keepAlive, keepAliveIdleTime }) { + const { handle } = tcpSockets.get(id); + const code = handle.setKeepAlive( + keepAlive, + Number(keepAliveIdleTime / 1_000_000_000n) + ); + if (code !== 0) throw convertSocketErrorCode(-code); +} + +export function socketTcpDispose(id) { + const socket = tcpSockets.get(id); + verifyPollsDroppedForDrop(socket.pollState, "tcp socket"); + socket.handle.close(); + tcpSockets.delete(id); +} diff --git a/demo/dist/@bytecodealliance/preview2-shim/lib/io/worker-socket-udp.js b/demo/dist/@bytecodealliance/preview2-shim/lib/io/worker-socket-udp.js new file mode 100644 index 0000000..994c1f0 --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/lib/io/worker-socket-udp.js @@ -0,0 +1,576 @@ +import { createSocket } from "node:dgram"; +import { + createFuture, + futureDispose, + futureTakeValue, + pollStateReady, + verifyPollsDroppedForDrop, +} from "./worker-thread.js"; +import { + convertSocketError, + convertSocketErrorCode, + getDefaultReceiveBufferSize, + getDefaultSendBufferSize, + ipSocketAddress, + isIPv4MappedAddress, + isWildcardAddress, + noLookup, + serializeIpAddress, + SOCKET_STATE_BIND, + SOCKET_STATE_BOUND, + SOCKET_STATE_CLOSED, + SOCKET_STATE_CONNECTION, + SOCKET_STATE_INIT, +} from "./worker-sockets.js"; + +// Experimental support for batched UDP sends. Set this to true to enable. +// This is not enabled by default because we need to figure out how to know +// how many datagrams were sent when there is an error in a batch. +// See the err path in "handler" in the "doSendBatch" of socketOutgoingDatagramStreamSend. +const UDP_BATCH_SENDS = false; + +/** + * @typedef {import("../../types/interfaces/wasi-sockets-network.js").IpSocketAddress} IpSocketAddress + * @typedef {import("../../../types/interfaces/wasi-sockets-tcp.js").IpAddressFamily} IpAddressFamily + * + * + * @typedef {{ + * state: number, + * remoteAddress: string | null, + * remotePort: number | null, + * sendBufferSize: number | null, + * receiveBufferSize: number | null, + * unicastHopLimit: number, + * udpSocket: import('node:dgram').Socket, + * future: number | null, + * serializedLocalAddress: string | null, + * pollState: PollState, + * incomingDatagramStream: number | null, + * outgoingDatagramStream: number | null, + * }} UdpSocketRecord + * + * @typedef {{ + * active: bool, + * error: any | null, + * socket: UdpSocketRecord, + * pollState: PollState, + * queue?: Buffer[], + * cleanup: () => void | null, + * }} DatagramStreamRecord + * + */ + +let udpSocketCnt = 0, + datagramStreamCnt = 0; + +/** + * @type {Map} + */ +export const udpSockets = new Map(); + +/** + * @type {Map} + */ +export const datagramStreams = new Map(); + +/** + * @param {IpAddressFamily} addressFamily + * @returns {number} + */ +export function createUdpSocket({ family, unicastHopLimit }) { + const udpSocket = createSocket({ + type: family === "ipv6" ? "udp6" : "udp4", + reuseAddr: false, + ipv6Only: family === "ipv6", + lookup: noLookup, + }); + udpSockets.set(++udpSocketCnt, { + state: SOCKET_STATE_INIT, + remoteAddress: null, + remotePort: null, + sendBufferSize: null, + receiveBufferSize: null, + unicastHopLimit, + udpSocket, + future: null, + serializedLocalAddress: null, + pollState: { ready: true, listener: null, polls: [], parentStream: null }, + incomingDatagramStream: null, + outgoingDatagramStream: null, + }); + return udpSocketCnt; +} + +/** + * @param {UdpSocketRecord} socket + * @returns {DatagramStreamRecord} + */ +function createIncomingDatagramStream(socket) { + const id = ++datagramStreamCnt; + const pollState = { + ready: false, + listener: null, + polls: [], + parentStream: null, + }; + const datagramStream = { + id, + active: true, + error: null, + socket, + queue: [], + cleanup, + pollState, + }; + const { udpSocket } = socket; + datagramStreams.set(id, datagramStream); + function cleanup() { + udpSocket.off("message", onMessage); + udpSocket.off("error", onError); + } + function onMessage(data, rinfo) { + const family = rinfo.family.toLowerCase(); + datagramStream.queue.push({ + data, + remoteAddress: ipSocketAddress(family, rinfo.address, rinfo.port), + }); + if (!pollState.ready) pollStateReady(pollState); + } + function onError(err) { + datagramStream.error = err; + pollStateReady(datagramStream.pollState); + } + udpSocket.on("message", onMessage); + udpSocket.once("error", onError); + return datagramStream; +} + +/** + * @param {UdpSocketRecord} socket + * @returns {DatagramStreamRecord} + */ +function createOutgoingDatagramStream(socket) { + const id = ++datagramStreamCnt; + const datagramStream = { + id, + active: true, + error: null, + socket, + cleanup, + pollState: { ready: true, listener: null, polls: [], parentStream: null }, + }; + const { udpSocket } = socket; + datagramStreams.set(id, datagramStream); + udpSocket.on("error", onError); + function onError(err) { + datagramStream.error = err; + pollStateReady(datagramStream.pollState); + } + function cleanup() { + udpSocket.off("error", onError); + } + return datagramStream; +} + +export function socketUdpBindStart(id, localAddress, family) { + const socket = udpSockets.get(id); + + if (family !== localAddress.tag || isIPv4MappedAddress(localAddress)) + throw "invalid-argument"; + + const serializedLocalAddress = serializeIpAddress(localAddress); + + if (socket.state !== SOCKET_STATE_INIT) throw "invalid-state"; + socket.state = SOCKET_STATE_BIND; + const { udpSocket } = socket; + socket.future = createFuture( + new Promise((resolve, reject) => { + function bindOk() { + resolve(); + udpSocket.off("error", bindErr); + } + function bindErr(err) { + reject(convertSocketError(err)); + udpSocket.off("listening", bindOk); + } + udpSocket.once("listening", bindOk); + udpSocket.once("error", bindErr); + udpSocket.bind(localAddress.val.port, serializedLocalAddress); + }), + socket.pollState + ); +} + +export function socketUdpBindFinish(id) { + const socket = udpSockets.get(id); + if (socket.state !== SOCKET_STATE_BIND) throw "not-in-progress"; + if (!socket.pollState.ready) throw "would-block"; + const { tag, val } = futureTakeValue(socket.future).val; + futureDispose(socket.future, false); + socket.future = null; + if (tag === "err") { + socket.state = SOCKET_STATE_CLOSED; + throw val; + } else { + // once bound, we can now set the options + // since Node.js doesn't support setting them until bound + socket.udpSocket.setTTL(socket.unicastHopLimit); + if (socket.sendBufferSize) + socket.udpSocket.setRecvBufferSize(socket.sendBufferSize); + if (socket.receieveBufferSize) + socket.udpSocket.setSendBufferSize(socket.receiveBufferSize); + socket.state = SOCKET_STATE_BOUND; + return val; + } +} + +/** + * @param {number} id + * @returns {IpSocketAddress} + */ +export function socketUdpGetLocalAddress(id) { + const { udpSocket } = udpSockets.get(id); + let address, family, port; + try { + ({ address, family, port } = udpSocket.address()); + } catch (err) { + throw convertSocketError(err); + } + return ipSocketAddress(family.toLowerCase(), address, port); +} + +/** + * @param {number} id + * @returns {IpSocketAddress} + */ +export function socketUdpGetRemoteAddress(id) { + const { udpSocket } = udpSockets.get(id); + let address, family, port; + try { + ({ address, family, port } = udpSocket.remoteAddress()); + } catch (err) { + throw convertSocketError(err); + } + return ipSocketAddress(family.toLowerCase(), address, port); +} + +export function socketUdpStream(id, remoteAddress) { + const socket = udpSockets.get(id); + const { udpSocket } = socket; + + if ( + socket.state !== SOCKET_STATE_BOUND && + socket.state !== SOCKET_STATE_CONNECTION + ) + throw "invalid-state"; + + if (socket.state === SOCKET_STATE_INIT && !remoteAddress) + throw "invalid-state"; + + if ( + remoteAddress && + (remoteAddress.val.port === 0 || + isWildcardAddress(remoteAddress) || + (remoteAddress.tag === "ipv6" && isIPv4MappedAddress(remoteAddress))) + ) + throw "invalid-argument"; + + if (socket.state === SOCKET_STATE_CONNECTION) { + socketDatagramStreamClear(socket.incomingDatagramStream); + socketDatagramStreamClear(socket.outgoingDatagramStream); + try { + udpSocket.disconnect(); + } catch (e) { + throw convertSocketErrorCode(e); + } + } + + if (remoteAddress) { + const serializedRemoteAddress = serializeIpAddress(remoteAddress); + socket.remoteAddress = serializedRemoteAddress; + socket.remotePort = remoteAddress.val.port; + return new Promise((resolve, reject) => { + function connectOk() { + if (socket.state === SOCKET_STATE_INIT) { + socket.udpSocket.setTTL(socket.unicastHopLimit); + socket.udpSocket.setRecvBufferSize(socket.sendBufferSize); + socket.udpSocket.setSendBufferSize(socket.receiveBufferSize); + } + udpSocket.off("error", connectErr); + socket.state = SOCKET_STATE_CONNECTION; + resolve([ + (socket.incomingDatagramStream = createIncomingDatagramStream(socket)) + .id, + (socket.outgoingDatagramStream = createOutgoingDatagramStream(socket)) + .id, + ]); + } + function connectErr(err) { + udpSocket.off("connect", connectOk); + reject(convertSocketError(err)); + } + udpSocket.once("connect", connectOk); + udpSocket.once("error", connectErr); + udpSocket.connect(remoteAddress.val.port, serializedRemoteAddress); + }); + } else { + socket.state = SOCKET_STATE_BOUND; + socket.remoteAddress = null; + socket.remotePort = null; + return [ + (socket.incomingDatagramStream = createIncomingDatagramStream(socket)).id, + (socket.outgoingDatagramStream = createOutgoingDatagramStream(socket)).id, + ]; + } +} + +export function socketUdpSetReceiveBufferSize(id, bufferSize) { + const socket = udpSockets.get(id); + bufferSize = Number(bufferSize); + if ( + socket.state !== SOCKET_STATE_INIT && + socket.state !== SOCKET_STATE_BIND + ) { + try { + socket.udpSocket.setRecvBufferSize(bufferSize); + } catch (err) { + throw convertSocketError(err); + } + } + socket.receiveBufferSize = bufferSize; +} + +export function socketUdpSetSendBufferSize(id, bufferSize) { + const socket = udpSockets.get(id); + bufferSize = Number(bufferSize); + if ( + socket.state !== SOCKET_STATE_INIT && + socket.state !== SOCKET_STATE_BIND + ) { + try { + socket.udpSocket.setSendBufferSize(bufferSize); + } catch (err) { + throw convertSocketError(err); + } + } + socket.sendBufferSize = bufferSize; +} + +export function socketUdpSetUnicastHopLimit(id, hopLimit) { + const socket = udpSockets.get(id); + if ( + socket.state !== SOCKET_STATE_INIT && + socket.state !== SOCKET_STATE_BIND + ) { + try { + socket.udpSocket.setTTL(hopLimit); + } catch (err) { + throw convertSocketError(err); + } + } + socket.unicastHopLimit = hopLimit; +} + +export async function socketUdpGetReceiveBufferSize(id) { + const socket = udpSockets.get(id); + if (socket.receiveBufferSize) return BigInt(socket.receiveBufferSize); + if ( + socket.state !== SOCKET_STATE_INIT && + socket.state !== SOCKET_STATE_BIND + ) { + try { + return BigInt( + (socket.receiveBufferSize = socket.udpSocket.getRecvBufferSize()) + ); + } catch (err) { + throw convertSocketError(err); + } + } else { + return BigInt( + (socket.receiveBufferSize = await getDefaultReceiveBufferSize()) + ); + } +} + +export async function socketUdpGetSendBufferSize(id) { + const socket = udpSockets.get(id); + if (socket.sendBufferSize) return BigInt(socket.sendBufferSize); + if ( + socket.state !== SOCKET_STATE_INIT && + socket.state !== SOCKET_STATE_BIND + ) { + try { + return BigInt( + (socket.sendBufferSize = socket.udpSocket.getSendBufferSize()) + ); + } catch (err) { + throw convertSocketError(err); + } + } else { + return BigInt((socket.sendBufferSize = await getDefaultSendBufferSize())); + } +} + +export function socketUdpGetUnicastHopLimit(id) { + const { unicastHopLimit } = udpSockets.get(id); + return unicastHopLimit; +} + +export function socketUdpDispose(id) { + const { udpSocket } = udpSockets.get(id); + return new Promise((resolve) => { + udpSocket.close(() => { + udpSockets.delete(id); + resolve(0); + }); + }); +} + +export function socketIncomingDatagramStreamReceive(id, maxResults) { + const datagramStream = datagramStreams.get(id); + if (!datagramStream.active) + throw new Error( + "wasi-io trap: attempt to receive on inactive incoming datagram stream" + ); + if (maxResults === 0n || datagramStream.queue.length === 0) return []; + if (datagramStream.error) throw convertSocketError(datagramStream.error); + return datagramStream.queue.splice(0, Number(maxResults)); +} + +export async function socketOutgoingDatagramStreamSend(id, datagrams) { + const { active, socket } = datagramStreams.get(id); + if (!active) + throw new Error( + "wasi-io trap: writing to inactive outgoing datagram stream" + ); + + const { udpSocket } = socket; + let sendQueue = [], + sendQueueAddress, + sendQueuePort; + let datagramsSent = 0; + for (const { data, remoteAddress } of datagrams) { + const address = remoteAddress + ? serializeIpAddress(remoteAddress) + : socket.remoteAddress; + const port = remoteAddress?.val.port ?? socket.remotePort; + let sendLastBatch = !UDP_BATCH_SENDS; + if (sendQueue.length > 0) { + if (sendQueueAddress === address && sendQueuePort === port) { + sendQueue.push(data); + } else { + sendLastBatch = true; + } + } else { + sendQueueAddress = address; + sendQueuePort = port; + sendQueue.push(data); + } + if (sendLastBatch) { + const err = await doSendBatch(); + if (err) return BigInt(datagramsSent); + if (UDP_BATCH_SENDS) { + sendQueue = [data]; + sendQueuePort = port; + sendQueueAddress = address; + } else { + sendQueue = []; + sendQueuePort = port; + sendQueueAddress = address; + } + } + } + if (sendQueue.length) { + const err = await doSendBatch(); + if (err) return BigInt(datagramsSent); + } + + if (datagramsSent !== datagrams.length) + throw new Error("wasi-io trap: expected to have sent all the datagrams"); + return BigInt(datagramsSent); + + function doSendBatch() { + return new Promise((resolve, reject) => { + if (socket.remoteAddress) { + if (sendQueueAddress !== socket.remoteAddress || sendQueuePort !== socket.remotePort) + return void reject("invalid-argument"); + udpSocket.send(sendQueue, handler); + } else { + if (!sendQueueAddress) + return void reject("invalid-argument"); + udpSocket.send(sendQueue, sendQueuePort, sendQueueAddress, handler); + } + function handler(err, _sentBytes) { + if (err) { + // TODO: update datagramsSent properly on error for multiple sends + // to enable send batching. Perhaps a Node.js PR could + // still set the second sendBytes arg? + if (datagramsSent > 0) resolve(datagramsSent); + else reject(convertSocketError(err)); + return; + } + datagramsSent += sendQueue.length; + resolve(false); + } + }); + } +} + +function checkSend(socket) { + try { + return Math.floor( + (socket.udpSocket.getSendBufferSize() - + socket.udpSocket.getSendQueueSize()) / + 1500 + ); + } catch (err) { + throw convertSocketError(err); + } +} + +function pollSend(socket) { + socket.pollState.ready = false; + // The only way we have of dealing with getting a backpressure + // ready signal in Node.js is to just poll on the queue reducing. + // Ideally this should implement backoff on the poll interval, + // but that work should be done alongside careful benchmarking + // in due course. + setTimeout(() => { + const remaining = checkSend(socket); + if (remaining > 0) { + pollStateReady(socket.pollState); + } else { + pollSend(socket); + } + }); +} + +export function socketOutgoingDatagramStreamCheckSend(id) { + const { active, socket } = datagramStreams.get(id); + if (!active) + throw new Error( + "wasi-io trap: check send on inactive outgoing datagram stream" + ); + const remaining = checkSend(socket); + if (remaining <= 0) pollSend(socket); + return BigInt(remaining); +} + +function socketDatagramStreamClear(datagramStream) { + datagramStream.active = false; + if (datagramStream.cleanup) { + datagramStream.cleanup(); + datagramStream.cleanup = null; + } +} + +export function socketDatagramStreamDispose(id) { + const datagramStream = datagramStreams.get(id); + datagramStream.active = false; + if (datagramStream.cleanup) { + datagramStream.cleanup(); + datagramStream.cleanup = null; + } + verifyPollsDroppedForDrop(datagramStream.pollState, "datagram stream"); + datagramStreams.delete(id); +} diff --git a/demo/dist/@bytecodealliance/preview2-shim/lib/io/worker-sockets.js b/demo/dist/@bytecodealliance/preview2-shim/lib/io/worker-sockets.js new file mode 100644 index 0000000..1ddb308 --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/lib/io/worker-sockets.js @@ -0,0 +1,371 @@ +import { isIP } from "node:net"; +import { lookup } from "node:dns/promises"; +import { Socket } from "node:dgram"; +import { + ALL, + BADFAMILY, + CANCELLED, + CONNREFUSED, + NODATA, + NOMEM, + NONAME, + NOTFOUND, + REFUSED, + SERVFAIL, + TIMEOUT, + V4MAPPED, +} from "node:dns"; +import { + EACCES, + EADDRINUSE, + EADDRNOTAVAIL, + EALREADY, + EBADF, + ECONNABORTED, + ECONNREFUSED, + ECONNRESET, + EINVAL, + ENOBUFS, + ENOMEM, + ENOTCONN, + ENOTSUP, + EPERM, + EWOULDBLOCK, +} from "node:constants"; + +let stateCnt = 0; +export const SOCKET_STATE_INIT = ++stateCnt; +export const SOCKET_STATE_BIND = ++stateCnt; +export const SOCKET_STATE_BOUND = ++stateCnt; +export const SOCKET_STATE_LISTEN = ++stateCnt; +export const SOCKET_STATE_LISTENER = ++stateCnt; +export const SOCKET_STATE_CONNECT = ++stateCnt; +export const SOCKET_STATE_CONNECTION = ++stateCnt; +export const SOCKET_STATE_CLOSED = ++stateCnt; + +const dnsLookupOptions = { + verbatim: true, + all: true, + hints: V4MAPPED | ALL, +}; + +export function noLookup(ip, _opts, cb) { + cb(null, ip); +} + +export function socketResolveAddress(name) { + const isIpNum = isIP( + name[0] === "[" && name[name.length - 1] === "]" ? name.slice(1, -1) : name + ); + if (isIpNum > 0) { + return Promise.resolve([ + { + tag: "ipv" + isIpNum, + val: (isIpNum === 4 ? ipv4ToTuple : ipv6ToTuple)(name), + }, + ]); + } + // verify it is a valid domain name using the URL parser + let parsedUrl = null; + try { + parsedUrl = new URL(`https://${name}`); + if ( + parsedUrl.port.length || + parsedUrl.username.length || + parsedUrl.password.length || + parsedUrl.pathname !== "/" || + parsedUrl.search.length || + parsedUrl.hash.length + ) + parsedUrl = null; + } catch { + // empty + } + if (!parsedUrl) throw "invalid-argument"; + + return lookup(name, dnsLookupOptions).then( + (addresses) => { + return addresses.map(({ address, family }) => { + [ + { + tag: "ipv" + family, + val: (family === 4 ? ipv4ToTuple : ipv6ToTuple)(address), + }, + ]; + }); + }, + (err) => { + switch (err.code) { + // TODO: verify these more carefully + case NODATA: + case BADFAMILY: + case NONAME: + case NOTFOUND: + throw "name-unresolvable"; + case TIMEOUT: + case REFUSED: + case CONNREFUSED: + case SERVFAIL: + case NOMEM: + case CANCELLED: + throw "temporary-resolver-failure"; + default: + throw "permanent-resolver-failure"; + } + } + ); +} + +export function convertSocketError(err) { + switch (err?.code) { + case "EBADF": + case "ENOTCONN": + case "ERR_SOCKET_DGRAM_NOT_CONNECTED": + return "invalid-state"; + case "EACCES": + case "EPERM": + return "access-denied"; + case "ENOTSUP": + return "not-supported"; + case "EINVAL": + return "invalid-argument"; + case "ENOMEM": + case "ENOBUFS": + return "out-of-memory"; + case "EALREADY": + return "concurrency-conflict"; + case "EWOULDBLOCK": + return "would-block"; + // TODO: return "new-socket-limit"; + case "EADDRNOTAVAIL": + return "address-not-bindable"; + case "EADDRINUSE": + return "address-in-use"; + // TODO: return "remote-unreachable"; + case "ECONNREFUSED": + return "connection-refused"; + case "ECONNRESET": + return "connection-reset"; + case "ECONNABORTED": + return "connection-aborted"; + default: + return "unknown"; + } +} + +export function convertSocketErrorCode(code) { + switch (code) { + case 4053: // windows + case 4083: + case ENOTCONN: + case EBADF: + return "invalid-state"; + case EACCES: + case EPERM: + return "access-denied"; + case ENOTSUP: + return "not-supported"; + case EINVAL: + return "invalid-argument"; + case ENOMEM: + case ENOBUFS: + return "out-of-memory"; + case EALREADY: + return "concurrency-conflict"; + case EWOULDBLOCK: + return "would-block"; + // TODO: return "new-socket-limit"; + case 4090: // windows + case EADDRNOTAVAIL: + return "address-not-bindable"; + case 4091: // windows + case EADDRINUSE: + return "address-in-use"; + // TODO: return "remote-unreachable"; + case ECONNREFUSED: + return "connection-refused"; + case ECONNRESET: + return "connection-reset"; + case ECONNABORTED: + return "connection-aborted"; + // TODO: return "datagram-too-large"; + // TODO: return "name-unresolvable"; + // TODO: return "temporary-resolver-failure"; + default: + // process._rawDebug('unknown error code', code); + return "unknown"; + } +} + +/** + * @typedef {import("../../../types/interfaces/wasi-sockets-network.js").IpSocketAddress} IpSocketAddress + * @typedef {import("../../../types/interfaces/wasi-sockets-tcp.js").IpAddressFamily} IpAddressFamily + * @typedef {import("../../../types/interfaces/wasi-sockets-tcp").TcpSocket} TcpSocket + * @typedef {import("../../../types/interfaces/wasi-sockets-udp").UdpSocket} UdpSocket + */ + +export function tupleToIPv6(arr) { + if (arr.length !== 8) { + return null; + } + return arr.map((segment) => segment.toString(16)).join(":"); +} + +export function tupleToIpv4(arr) { + if (arr.length !== 4) { + return null; + } + return arr.map((segment) => segment.toString(10)).join("."); +} + +/** + * @param {IpSocketAddress} ipSocketAddress + * @returns {boolean} + */ +export function isMulticastIpAddress(ipSocketAddress) { + return ( + (ipSocketAddress.tag === "ipv4" && + ipSocketAddress.val.address[0] === 0xe0) || + (ipSocketAddress.tag === "ipv6" && + ipSocketAddress.val.address[0] === 0xff00) + ); +} + +/** + * @param {IpSocketAddress} ipSocketAddress + * @returns {boolean} + */ +export function isIPv4MappedAddress(ipSocketAddress) { + return ( + ipSocketAddress.tag === "ipv6" && ipSocketAddress.val.address[5] === 0xffff + ); +} + +/** + * @param {IpSocketAddress} ipSocketAddress + * @returns {boolean} + */ +export function isUnicastIpAddress(ipSocketAddress) { + return ( + !isMulticastIpAddress(ipSocketAddress) && + !isBroadcastIpAddress(ipSocketAddress) + ); +} + +/** + * @param {IpSocketAddress} isWildcardAddress + * @returns {boolean} + */ +export function isWildcardAddress(ipSocketAddress) { + const { address } = ipSocketAddress.val; + if (ipSocketAddress.tag === "ipv4") + return ( + address[0] === 0 && + address[1] === 0 && + address[2] === 0 && + address[3] === 0 + ); + else + return ( + address[0] === 0 && + address[1] === 0 && + address[2] === 0 && + address[3] === 0 && + address[4] === 0 && + address[5] === 0 && + address[6] === 0 && + address[7] === 0 + ); +} + +/** + * @param {IpSocketAddress} isWildcardAddress + * @returns {boolean} + */ +export function isBroadcastIpAddress(ipSocketAddress) { + const { address } = ipSocketAddress.val; + return ( + ipSocketAddress.tag === "ipv4" && + address[0] === 0xff && + address[1] === 0xff && + address[2] === 0xff && + address[3] === 0xff + ); +} + +/** + * + * @param {IpSocketAddress} addr + * @param {boolean} includePort + * @returns {string} + */ +export function serializeIpAddress(addr) { + if (addr.tag === "ipv4") return tupleToIpv4(addr.val.address); + return tupleToIPv6(addr.val.address); +} + +export function ipv6ToTuple(ipv6) { + const [lhs, rhs = ""] = ipv6.includes("::") ? ipv6.split("::") : [ipv6]; + const lhsParts = lhs === "" ? [] : lhs.split(":"); + const rhsParts = rhs === "" ? [] : rhs.split(":"); + return [ + ...lhsParts, + ...Array(8 - lhsParts.length - rhsParts.length).fill(0), + ...rhsParts, + ].map((segment) => parseInt(segment, 16)); +} + +export function ipv4ToTuple(ipv4) { + return ipv4.split(".").map((segment) => parseInt(segment, 10)); +} + +/** + * + * @param {string} addr + * @param {IpAddressFamily} family + * @returns {IpSocketAddress} + */ +export function ipSocketAddress(family, addr, port) { + if (family === "ipv4") + return { + tag: "ipv4", + val: { + port, + address: ipv4ToTuple(addr) + } + }; + return { + tag: "ipv6", + val: { + port, + flowInfo: 0, + address: ipv6ToTuple(addr), + scopeId: 0 + } + }; +} + +let _recvBufferSize, _sendBufferSize; +async function getDefaultBufferSizes () { + var s = new Socket({ type: 'udp4' }); + s.bind(0); + await new Promise((resolve, reject) => { + s.once('error', reject); + s.once('listening', resolve); + }); + _recvBufferSize = BigInt(s.getRecvBufferSize()); + _sendBufferSize = BigInt(s.getSendBufferSize()); + s.close(); +} + +export async function getDefaultSendBufferSize () { + if (!_sendBufferSize) + await getDefaultBufferSizes(); + return _sendBufferSize; +} + +export async function getDefaultReceiveBufferSize () { + if (!_recvBufferSize) + await getDefaultBufferSizes(); + return _recvBufferSize; +} diff --git a/demo/dist/@bytecodealliance/preview2-shim/lib/io/worker-thread.js b/demo/dist/@bytecodealliance/preview2-shim/lib/io/worker-thread.js new file mode 100644 index 0000000..58beabb --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/lib/io/worker-thread.js @@ -0,0 +1,963 @@ +import { createReadStream, createWriteStream } from "node:fs"; +import { hrtime, stderr, stdout } from "node:process"; +import { PassThrough } from "node:stream"; +import { format } from "node:util"; +import { runAsWorker } from "../synckit/index.js"; +import { + clearOutgoingResponse, + createHttpRequest, + setOutgoingResponse, + startHttpServer, + stopHttpServer, +} from "./worker-http.js"; +import { Readable } from "node:stream"; +import { read } from "node:fs"; +import { nextTick } from "node:process"; +import { + CALL_MASK, + CALL_TYPE_MASK, + CLOCKS_DURATION_SUBSCRIBE, + CLOCKS_INSTANT_SUBSCRIBE, + FILE, + FUTURE_DISPOSE, + FUTURE_SUBSCRIBE, + FUTURE_TAKE_VALUE, + HTTP, + HTTP_CREATE_REQUEST, + HTTP_OUTGOING_BODY_DISPOSE, + HTTP_OUTPUT_STREAM_FINISH, + HTTP_SERVER_CLEAR_OUTGOING_RESPONSE, + HTTP_SERVER_SET_OUTGOING_RESPONSE, + HTTP_SERVER_START, + HTTP_SERVER_STOP, + INPUT_STREAM_BLOCKING_READ, + INPUT_STREAM_BLOCKING_SKIP, + INPUT_STREAM_CREATE, + INPUT_STREAM_DISPOSE, + INPUT_STREAM_READ, + INPUT_STREAM_SKIP, + INPUT_STREAM_SUBSCRIBE, + OUTPUT_STREAM_BLOCKING_FLUSH, + OUTPUT_STREAM_BLOCKING_SPLICE, + OUTPUT_STREAM_BLOCKING_WRITE_AND_FLUSH, + OUTPUT_STREAM_BLOCKING_WRITE_ZEROES_AND_FLUSH, + OUTPUT_STREAM_CHECK_WRITE, + OUTPUT_STREAM_CREATE, + OUTPUT_STREAM_DISPOSE, + OUTPUT_STREAM_FLUSH, + OUTPUT_STREAM_SPLICE, + OUTPUT_STREAM_SUBSCRIBE, + OUTPUT_STREAM_WRITE, + OUTPUT_STREAM_WRITE_ZEROES, + POLL_POLLABLE_BLOCK, + POLL_POLLABLE_DISPOSE, + POLL_POLLABLE_READY, + POLL_POLL_LIST, + SOCKET_RESOLVE_ADDRESS_CREATE_REQUEST, + SOCKET_RESOLVE_ADDRESS_SUBSCRIBE_REQUEST, + SOCKET_RESOLVE_ADDRESS_DISPOSE_REQUEST, + SOCKET_RESOLVE_ADDRESS_TAKE_REQUEST, + SOCKET_GET_DEFAULT_RECEIVE_BUFFER_SIZE, + SOCKET_GET_DEFAULT_SEND_BUFFER_SIZE, + SOCKET_TCP_ACCEPT, + SOCKET_TCP_BIND_FINISH, + SOCKET_TCP_BIND_START, + SOCKET_TCP_CONNECT_FINISH, + SOCKET_TCP_CONNECT_START, + SOCKET_TCP_CREATE_HANDLE, + SOCKET_TCP_DISPOSE, + SOCKET_TCP_GET_LOCAL_ADDRESS, + SOCKET_TCP_GET_REMOTE_ADDRESS, + SOCKET_TCP_IS_LISTENING, + SOCKET_TCP_LISTEN_FINISH, + SOCKET_TCP_LISTEN_START, + SOCKET_TCP_SET_KEEP_ALIVE, + SOCKET_TCP_SET_LISTEN_BACKLOG_SIZE, + SOCKET_TCP_SHUTDOWN, + SOCKET_TCP_SUBSCRIBE, + SOCKET_UDP_BIND_FINISH, + SOCKET_UDP_BIND_START, + SOCKET_UDP_CREATE_HANDLE, + SOCKET_UDP_DISPOSE, + SOCKET_UDP_GET_LOCAL_ADDRESS, + SOCKET_UDP_GET_RECEIVE_BUFFER_SIZE, + SOCKET_UDP_GET_REMOTE_ADDRESS, + SOCKET_UDP_GET_SEND_BUFFER_SIZE, + SOCKET_UDP_GET_UNICAST_HOP_LIMIT, + SOCKET_UDP_SET_RECEIVE_BUFFER_SIZE, + SOCKET_UDP_SET_SEND_BUFFER_SIZE, + SOCKET_UDP_SET_UNICAST_HOP_LIMIT, + SOCKET_UDP_STREAM, + SOCKET_UDP_SUBSCRIBE, + SOCKET_INCOMING_DATAGRAM_STREAM_RECEIVE, + SOCKET_OUTGOING_DATAGRAM_STREAM_CHECK_SEND, + SOCKET_OUTGOING_DATAGRAM_STREAM_SEND, + SOCKET_DATAGRAM_STREAM_SUBSCRIBE, + SOCKET_DATAGRAM_STREAM_DISPOSE, + STDERR, + STDIN, + STDOUT, + reverseMap, +} from "./calls.js"; +import { + SOCKET_STATE_BIND, + SOCKET_STATE_BOUND, + SOCKET_STATE_CONNECT, + SOCKET_STATE_CONNECTION, + SOCKET_STATE_LISTEN, + SOCKET_STATE_LISTENER, + socketResolveAddress, + getDefaultSendBufferSize, + getDefaultReceiveBufferSize, +} from "./worker-sockets.js"; +import { + createTcpSocket, + socketTcpAccept, + socketTcpBindStart, + socketTcpConnectStart, + socketTcpDispose, + socketTcpFinish, + socketTcpGetLocalAddress, + socketTcpGetRemoteAddress, + socketTcpListenStart, + socketTcpSetKeepAlive, + socketTcpSetListenBacklogSize, + socketTcpShutdown, + tcpSockets, +} from "./worker-socket-tcp.js"; +import { + createUdpSocket, + datagramStreams, + socketDatagramStreamDispose, + socketIncomingDatagramStreamReceive, + socketOutgoingDatagramStreamCheckSend, + socketOutgoingDatagramStreamSend, + socketUdpBindFinish, + socketUdpBindStart, + socketUdpDispose, + socketUdpGetLocalAddress, + socketUdpGetReceiveBufferSize, + socketUdpGetRemoteAddress, + socketUdpGetSendBufferSize, + socketUdpGetUnicastHopLimit, + socketUdpSetReceiveBufferSize, + socketUdpSetSendBufferSize, + socketUdpSetUnicastHopLimit, + socketUdpStream, + udpSockets, +} from "./worker-socket-udp.js"; +import process from "node:process"; + +function log(msg) { + if (debug) process._rawDebug(msg); +} + +let pollCnt = 0, + streamCnt = 0, + futureCnt = 0; + +/** + * @typedef {{ + * ready: bool, + * listener: () => void | null, + * polls: number[], + * parentStream: null | NodeJS.ReadableStream + * }} PollState + * + * @typedef {{ + * stream: NodeJS.ReadableStream | NodeJS.WritableStream, + * flushPromise: Promise | null, + * pollState + * }} Stream + * + * @typedef {{ + * future: { + * tag: 'ok' | 'err', + * val: any, + * }, + * pollState + * }} Future + */ + +/** @type {Map} */ +export const polls = new Map(); + +/** @type {Map} */ +export const streams = new Map(); + +/** @type {Map} */ +export const futures = new Map(); + +export function createReadableStreamPollState(nodeStream) { + const pollState = { + ready: true, + listener: null, + polls: [], + parentStream: nodeStream, + }; + function pollDone() { + pollStateReady(pollState); + nodeStream.off("end", pollDone); + nodeStream.off("close", pollDone); + nodeStream.off("error", pollDone); + } + nodeStream.on("end", pollDone); + nodeStream.on("close", pollDone); + nodeStream.on("error", pollDone); + return pollState; +} + +/** + * @param {NodeJS.ReadableStream | NodeJS.WritableStream} stream + */ +export function createReadableStream( + nodeStream, + pollState = createReadableStreamPollState(nodeStream) +) { + const stream = { + stream: nodeStream, + flushPromise: null, + pollState, + }; + streams.set(++streamCnt, stream); + return streamCnt; +} + +export function createWritableStream(nodeStream) { + const pollState = { + ready: true, + listener: null, + polls: [], + parentStream: null, + }; + const stream = { + stream: nodeStream, + flushPromise: null, + pollState, + }; + streams.set(++streamCnt, stream); + function pollReady() { + pollStateReady(pollState); + } + function pollDone() { + pollStateReady(pollState); + nodeStream.off("drain", pollReady); + nodeStream.off("finish", pollDone); + nodeStream.off("error", pollDone); + nodeStream.off("close", pollDone); + } + nodeStream.on("drain", pollReady); + nodeStream.on("finish", pollDone); + nodeStream.on("error", pollDone); + nodeStream.on("close", pollDone); + return streamCnt; +} + +// Stdio +// Stdin created when used +createWritableStream(stdout); +createWritableStream(stderr); + +/** + * @param {number} streamId + * @param {NodeJS.ReadableStream | NodeJS.WritableStream} stream + */ +function streamError(err) { + return { + tag: "last-operation-failed", + val: { code: err.code, message: err.message, stack: err.stack }, + }; +} + +/** + * @param {number} streamId + * @returns {{ stream: NodeJS.ReadableStream | NodeJS.WritableStream, polls: number[] }} + */ +export function getStreamOrThrow(streamId) { + if (!streamId) throw new Error("wasi-io trap: no stream id provided"); + const stream = streams.get(streamId); + // not in unfinished streams <=> closed + if (!stream) throw { tag: "closed" }; + if (stream.stream.errored) throw streamError(stream.stream.errored); + if (stream.stream.closed) { + throw { tag: "closed" }; + } + return stream; +} + +/** + * @param {number} call + * @param {number | null} id + * @param {any} payload + * @returns {Promise} + */ +function handle(call, id, payload) { + if (uncaughtException) throw uncaughtException; + switch (call) { + // Http + case HTTP_CREATE_REQUEST: { + const { + method, + scheme, + authority, + pathWithQuery, + headers, + body, + connectTimeout, + betweenBytesTimeout, + firstByteTimeout, + } = payload; + return createFuture( + createHttpRequest( + method, + scheme, + authority, + pathWithQuery, + headers, + body, + connectTimeout, + betweenBytesTimeout, + firstByteTimeout + ) + ); + } + case OUTPUT_STREAM_CREATE | HTTP: { + const stream = new PassThrough(); + // content length is passed as payload + stream.contentLength = payload; + stream.bytesRemaining = payload; + return createWritableStream(stream); + } + case OUTPUT_STREAM_SUBSCRIBE | HTTP: + case OUTPUT_STREAM_FLUSH | HTTP: + case OUTPUT_STREAM_BLOCKING_WRITE_AND_FLUSH | HTTP: { + // http flush is a noop + const { stream } = getStreamOrThrow(id); + if (call === (OUTPUT_STREAM_BLOCKING_WRITE_AND_FLUSH | HTTP)) { + stream.bytesRemaining -= payload.byteLength; + if (stream.bytesRemaining < 0) { + throw { + tag: "last-operation-failed", + val: { + tag: "HTTP-request-body-size", + val: stream.contentLength - stream.bytesRemaining, + }, + }; + } + } + // otherwise fall through to generic implementation + return handle(call & ~HTTP, id, payload); + } + case OUTPUT_STREAM_WRITE | HTTP: { + const { stream } = getStreamOrThrow(id); + stream.bytesRemaining -= payload.byteLength; + if (stream.bytesRemaining < 0) { + throw { + tag: "last-operation-failed", + val: { + tag: "HTTP-request-body-size", + val: stream.contentLength - stream.bytesRemaining, + }, + }; + } + const output = handle(OUTPUT_STREAM_WRITE, id, payload); + return output; + } + case OUTPUT_STREAM_DISPOSE | HTTP: + throw new Error( + "wasi-io trap: Output stream dispose not implemented as an IO-call for HTTP" + ); + case HTTP_OUTPUT_STREAM_FINISH: { + let stream; + try { + ({ stream } = getStreamOrThrow(id)); + } catch (e) { + if (e.tag === "closed") + throw { tag: "internal-error", val: "stream closed" }; + if (e.tag === "last-operation-failed") + throw { tag: "internal-error", val: e.val.message }; + } + if (stream.bytesRemaining > 0) { + throw { + tag: "HTTP-request-body-size", + val: stream.contentLength - stream.bytesRemaining, + }; + } + if (stream.bytesRemaining < 0) { + throw { + tag: "HTTP-request-body-size", + val: stream.contentLength - stream.bytesRemaining, + }; + } + stream.end(); + return; + } + case HTTP_OUTGOING_BODY_DISPOSE: + if (!streams.delete(id)) + throw new Error("wasi-io trap: stream not found to dispose"); + return; + case HTTP_SERVER_START: + return startHttpServer(id, payload); + case HTTP_SERVER_STOP: + return stopHttpServer(id); + case HTTP_SERVER_SET_OUTGOING_RESPONSE: + return setOutgoingResponse(id, payload); + case HTTP_SERVER_CLEAR_OUTGOING_RESPONSE: + return clearOutgoingResponse(id); + + // Sockets name resolution + case SOCKET_RESOLVE_ADDRESS_CREATE_REQUEST: + return createFuture(socketResolveAddress(payload)); + case SOCKET_RESOLVE_ADDRESS_SUBSCRIBE_REQUEST: + return createPoll(futures.get(id).pollState); + case SOCKET_RESOLVE_ADDRESS_DISPOSE_REQUEST: + return void futureDispose(id, true); + case SOCKET_RESOLVE_ADDRESS_TAKE_REQUEST: { + const val = futureTakeValue(id); + if (val === undefined) throw "would-block"; + // double take avoidance is ensured + return val.val; + } + + // Sockets TCP + case SOCKET_TCP_ACCEPT: + return socketTcpAccept(id); + case SOCKET_TCP_CREATE_HANDLE: + return createTcpSocket(); + case SOCKET_TCP_BIND_START: + return socketTcpBindStart(id, payload.localAddress, payload.family); + case SOCKET_TCP_BIND_FINISH: + return socketTcpFinish(id, SOCKET_STATE_BIND, SOCKET_STATE_BOUND); + case SOCKET_TCP_CONNECT_START: + return socketTcpConnectStart(id, payload.remoteAddress, payload.family); + case SOCKET_TCP_CONNECT_FINISH: + return socketTcpFinish(id, SOCKET_STATE_CONNECT, SOCKET_STATE_CONNECTION); + case SOCKET_TCP_LISTEN_START: + return socketTcpListenStart(id); + case SOCKET_TCP_LISTEN_FINISH: + return socketTcpFinish(id, SOCKET_STATE_LISTEN, SOCKET_STATE_LISTENER); + case SOCKET_TCP_IS_LISTENING: + return tcpSockets.get(id).state === SOCKET_STATE_LISTENER; + case SOCKET_GET_DEFAULT_SEND_BUFFER_SIZE: + return getDefaultSendBufferSize(id); + case SOCKET_GET_DEFAULT_RECEIVE_BUFFER_SIZE: + return getDefaultReceiveBufferSize(id); + case SOCKET_TCP_SET_LISTEN_BACKLOG_SIZE: + return socketTcpSetListenBacklogSize(id); + case SOCKET_TCP_GET_LOCAL_ADDRESS: + return socketTcpGetLocalAddress(id); + case SOCKET_TCP_GET_REMOTE_ADDRESS: + return socketTcpGetRemoteAddress(id); + case SOCKET_TCP_SHUTDOWN: + return socketTcpShutdown(id, payload); + case SOCKET_TCP_SUBSCRIBE: + return createPoll(tcpSockets.get(id).pollState); + case SOCKET_TCP_SET_KEEP_ALIVE: + return socketTcpSetKeepAlive(id, payload); + case SOCKET_TCP_DISPOSE: + return socketTcpDispose(id); + + // Sockets UDP + case SOCKET_UDP_CREATE_HANDLE: + return createUdpSocket(payload); + case SOCKET_UDP_BIND_START: + return socketUdpBindStart(id, payload.localAddress, payload.family); + case SOCKET_UDP_BIND_FINISH: + return socketUdpBindFinish(id); + case SOCKET_UDP_STREAM: + return socketUdpStream(id, payload); + case SOCKET_UDP_SUBSCRIBE: + return createPoll(udpSockets.get(id).pollState); + case SOCKET_UDP_GET_LOCAL_ADDRESS: + return socketUdpGetLocalAddress(id); + case SOCKET_UDP_GET_REMOTE_ADDRESS: + return socketUdpGetRemoteAddress(id); + case SOCKET_UDP_SET_RECEIVE_BUFFER_SIZE: + return socketUdpSetReceiveBufferSize(id, payload); + case SOCKET_UDP_SET_SEND_BUFFER_SIZE: + return socketUdpSetSendBufferSize(id, payload); + case SOCKET_UDP_SET_UNICAST_HOP_LIMIT: + return socketUdpSetUnicastHopLimit(id, payload); + case SOCKET_UDP_GET_RECEIVE_BUFFER_SIZE: + return socketUdpGetReceiveBufferSize(id); + case SOCKET_UDP_GET_SEND_BUFFER_SIZE: + return socketUdpGetSendBufferSize(id); + case SOCKET_UDP_GET_UNICAST_HOP_LIMIT: + return socketUdpGetUnicastHopLimit(id); + case SOCKET_UDP_DISPOSE: + return socketUdpDispose(id); + + case SOCKET_INCOMING_DATAGRAM_STREAM_RECEIVE: + return socketIncomingDatagramStreamReceive(id, payload); + case SOCKET_OUTGOING_DATAGRAM_STREAM_CHECK_SEND: + return socketOutgoingDatagramStreamCheckSend(id); + case SOCKET_OUTGOING_DATAGRAM_STREAM_SEND: + return socketOutgoingDatagramStreamSend(id, payload); + case SOCKET_DATAGRAM_STREAM_SUBSCRIBE: + return createPoll(datagramStreams.get(id).pollState); + case SOCKET_DATAGRAM_STREAM_DISPOSE: + return socketDatagramStreamDispose(id); + + // Stdio + case OUTPUT_STREAM_BLOCKING_FLUSH | STDOUT: + case OUTPUT_STREAM_BLOCKING_FLUSH | STDERR: + // no blocking flush for stdio in Node.js + return; + case OUTPUT_STREAM_DISPOSE | STDOUT: + case OUTPUT_STREAM_DISPOSE | STDERR: + return; + case INPUT_STREAM_CREATE | STDIN: { + return createReadableStream( + new Readable({ + read(n) { + if (n <= 0) return void this.push(null); + let buf = Buffer.allocUnsafeSlow(n); + read(0, buf, 0, n, null, (err, bytesRead) => { + if (err) { + if (err.code === "EAGAIN") { + nextTick(() => void this._read(n)); + return; + } + this.destroy(err); + } else if (bytesRead > 0) { + if (bytesRead !== buf.length) { + const dst = Buffer.allocUnsafeSlow(bytesRead); + buf.copy(dst, 0, 0, bytesRead); + buf = dst; + } + this.push(buf); + } else { + this.push(null); + } + }); + }, + }) + ); + } + + // Clocks + case CLOCKS_DURATION_SUBSCRIBE: + payload = hrtime.bigint() + payload; + // fallthrough + case CLOCKS_INSTANT_SUBSCRIBE: { + const pollState = { + ready: false, + listener: null, + polls: [], + parentStream: null, + }; + subscribeInstant(pollState, payload); + return createPoll(pollState); + } + + // Filesystem + case INPUT_STREAM_CREATE | FILE: { + const { fd, offset } = payload; + const stream = createReadStream(null, { + fd, + autoClose: false, + highWaterMark: 64 * 1024, + start: Number(offset), + }); + return createReadableStream(stream); + } + case OUTPUT_STREAM_CREATE | FILE: { + const { fd, offset } = payload; + const stream = createWriteStream(null, { + fd, + autoClose: false, + emitClose: false, + highWaterMark: 64 * 1024, + start: Number(offset), + }); + return createWritableStream(stream); + } + } + + // Generic call implementations (streams + polls) + switch (call & CALL_MASK) { + case INPUT_STREAM_READ: { + const stream = getStreamOrThrow(id); + if (!stream.pollState.ready) return new Uint8Array(); + const res = stream.stream.read( + Math.min(stream.stream.readableLength, Number(payload)) + ); + if (res) return res; + if (stream.stream.readableEnded) throw { tag: "closed" }; + return new Uint8Array(); + } + case INPUT_STREAM_BLOCKING_READ: { + const { pollState } = streams.get(id); + pollStateCheck(pollState); + if (pollState.ready) + return handle(INPUT_STREAM_READ | (call & CALL_TYPE_MASK), id, payload); + return new Promise((resolve) => void (pollState.listener = resolve)).then( + () => handle(INPUT_STREAM_READ | (call & CALL_TYPE_MASK), id, payload) + ); + } + case INPUT_STREAM_SKIP: + return handle( + INPUT_STREAM_READ | (call & CALL_TYPE_MASK), + id, + new Uint8Array(Number(payload)) + ); + case INPUT_STREAM_BLOCKING_SKIP: + return handle( + INPUT_STREAM_BLOCKING_READ | (call & CALL_TYPE_MASK), + id, + new Uint8Array(Number(payload)) + ); + case INPUT_STREAM_SUBSCRIBE: + return createPoll(streams.get(id).pollState); + case INPUT_STREAM_DISPOSE: { + const stream = streams.get(id); + verifyPollsDroppedForDrop(stream.pollState, "input stream"); + streams.delete(id); + return; + } + case OUTPUT_STREAM_CHECK_WRITE: { + const { stream, pollState } = getStreamOrThrow(id); + const bytes = stream.writableHighWaterMark - stream.writableLength; + if (bytes === 0) pollState.ready = false; + return BigInt(bytes); + } + case OUTPUT_STREAM_WRITE: { + const { stream } = getStreamOrThrow(id); + if ( + payload.byteLength > + stream.writableHighWaterMark - stream.writableLength + ) + throw new Error("wasi-io trap: attempt to write too many bytes"); + return void stream.write(payload); + } + case OUTPUT_STREAM_BLOCKING_WRITE_AND_FLUSH: { + const stream = getStreamOrThrow(id); + // if an existing flush, try again after that + if (stream.flushPromise) + return stream.flushPromise.then(() => handle(call, id, payload)); + if ( + payload.byteLength > + stream.stream.writableHighWaterMark - stream.stream.writableLength + ) { + new Error( + "wasi-io trap: Cannot write more than permitted writable length" + ); + } + stream.pollState.ready = false; + return (stream.flushPromise = new Promise((resolve, reject) => { + stream.stream.write(payload, (err) => { + stream.flushPromise = null; + pollStateReady(stream.pollState); + if (err) return void reject(streamError(err)); + resolve(BigInt(payload.byteLength)); + }); + })); + } + case OUTPUT_STREAM_FLUSH: { + const stream = getStreamOrThrow(id); + if (stream.flushPromise) return; + stream.pollState.ready = false; + return (stream.flushPromise = new Promise((resolve, reject) => { + stream.stream.write(new Uint8Array([]), (err) => { + stream.flushPromise = null; + pollStateReady(stream.pollState); + if (err) return void reject(streamError(err)); + resolve(); + }); + })); + } + case OUTPUT_STREAM_BLOCKING_FLUSH: { + const stream = getStreamOrThrow(id); + if (stream.flushPromise) return stream.flushPromise; + return new Promise((resolve, reject) => { + stream.stream.write(new Uint8Array([]), (err) => + err ? reject(streamError(err)) : resolve() + ); + }); + } + case OUTPUT_STREAM_WRITE_ZEROES: + return handle( + OUTPUT_STREAM_WRITE | (call & CALL_TYPE_MASK), + id, + new Uint8Array(Number(payload)) + ); + case OUTPUT_STREAM_BLOCKING_WRITE_ZEROES_AND_FLUSH: + return handle( + OUTPUT_STREAM_BLOCKING_WRITE_AND_FLUSH | (call & CALL_TYPE_MASK), + id, + new Uint8Array(Number(payload)) + ); + case OUTPUT_STREAM_SPLICE: { + const outputStream = getStreamOrThrow(id); + const inputStream = getStreamOrThrow(payload.src); + let bytesRemaining = Number(payload.len); + let chunk; + while ( + bytesRemaining > 0 && + (chunk = inputStream.stream.read( + Math.min( + outputStream.writableHighWaterMark - outputStream.writableLength, + bytesRemaining + ) + )) + ) { + bytesRemaining -= chunk.byteLength; + outputStream.stream.write(chunk); + } + if (inputStream.stream.errored) + throw streamError(inputStream.stream.errored); + if (outputStream.stream.errored) + throw streamError(outputStream.stream.errored); + return payload.len - BigInt(bytesRemaining); + } + case OUTPUT_STREAM_SUBSCRIBE: + return createPoll(streams.get(id).pollState); + case OUTPUT_STREAM_BLOCKING_SPLICE: { + const outputStream = getStreamOrThrow(id); + let promise = Promise.resolve(); + let resolve, reject; + if (outputStream.stream.writableNeedDrain) { + promise = new Promise((_resolve, _reject) => { + outputStream.stream + .once("drain", (resolve = _resolve)) + .once("error", (reject = _reject)); + }).then( + () => { + outputStream.stream.off("error", reject); + }, + (err) => { + outputStream.stream.off("drain", resolve); + throw streamError(err); + } + ); + } + const inputStream = getStreamOrThrow(payload.src); + if (!inputStream.stream.readable) { + promise = promise.then(() => + new Promise((_resolve, _reject) => { + inputStream.stream + .once("readable", (resolve = _resolve)) + .once("error", (reject = _reject)); + }).then( + () => { + inputStream.stream.off("error", reject); + }, + (err) => { + inputStream.stream.off("readable", resolve); + throw streamError(err); + } + ) + ); + } + return promise.then(() => handle(OUTPUT_STREAM_SPLICE, id, payload)); + } + case OUTPUT_STREAM_DISPOSE: { + const stream = streams.get(id); + verifyPollsDroppedForDrop(stream.pollState, "output stream"); + stream.stream.end(); + streams.delete(id); + return; + } + + case POLL_POLLABLE_READY: + return polls.get(id).ready; + case POLL_POLLABLE_BLOCK: + payload = [id]; + // [intentional case fall-through] + case POLL_POLL_LIST: { + if (payload.length === 0) + throw new Error("wasi-io trap: attempt to poll on empty list"); + const doneList = []; + const pollList = payload.map((pollId) => polls.get(pollId)); + for (const [idx, pollState] of pollList.entries()) { + pollStateCheck(pollState); + if (pollState.ready) doneList.push(idx); + } + if (doneList.length > 0) { + return new Uint32Array(doneList); + } + let readyPromiseResolve; + const readyPromise = new Promise( + (resolve) => void (readyPromiseResolve = resolve) + ); + for (const poll of pollList) { + poll.listener = readyPromiseResolve; + } + return readyPromise.then(() => { + for (const [idx, pollState] of pollList.entries()) { + pollState.listener = null; + if (pollState.ready) doneList.push(idx); + } + return new Uint32Array(doneList); + }); + } + case POLL_POLLABLE_DISPOSE: + if (!polls.delete(id)) + throw new Error( + `wasi-io trap: Disposed a poll ${id} that does not exist` + ); + return; + + case FUTURE_TAKE_VALUE: + return futureTakeValue(id); + + case FUTURE_SUBSCRIBE: { + const { pollState } = futures.get(id); + const pollId = ++pollCnt; + polls.set(pollId, pollState); + return pollId; + } + case FUTURE_DISPOSE: + return void futureDispose(id, true); + default: + throw new Error( + `wasi-io trap: Unknown call ${call} (${reverseMap[call]}) with type ${ + reverseMap[call & CALL_TYPE_MASK] + }` + ); + } +} + +/** + * @param {PollState} pollState + */ +function createPoll(pollState) { + const pollId = ++pollCnt; + pollState.polls.push(pollId); + polls.set(pollId, pollState); + return pollId; +} + +function subscribeInstant(pollState, instant) { + const duration = instant - hrtime.bigint(); + if (duration <= 0) return pollStateReady(pollState); + function cb() { + if (hrtime.bigint() < instant) return subscribeInstant(pollState, instant); + pollStateReady(pollState); + } + if (duration < 10e6) setImmediate(cb); + else setTimeout(cb, Number(duration) / 1e6); +} + +/** + * @param {PollState} pollState + * @param {string} polledResourceDebugName + */ +export function verifyPollsDroppedForDrop(pollState, polledResourceDebugName) { + for (const pollId of pollState.polls) { + const poll = polls.get(pollId); + if (poll) + throw new Error( + `wasi-io trap: Cannot drop ${polledResourceDebugName} as it has a child poll resource which has not yet been dropped` + ); + } +} + +/** + * @param {PollState} pollState + * @param {bool} finished + */ +export function pollStateReady(pollState) { + if (pollState.ready && pollState.listener) { + uncaughtException = new Error( + "wasi-io trap: poll already ready with listener attached" + ); + } + pollState.ready = true; + if (pollState.listener) { + pollState.listener(); + pollState.listener = null; + } +} + +/** + * @param {PollState} pollState + */ +function pollStateCheck(pollState) { + if (pollState.ready && pollState.parentStream) { + // stream ONLY applies to readable streams here + const stream = pollState.parentStream; + const res = stream.read(0); + if (res !== null) { + throw new Error("wasi-io trap: got data for a null read"); + } + if ( + pollState.ready && + stream.readableLength === 0 && + !stream.readableEnded && + !stream.errored + ) { + pollState.ready = false; + stream.once("readable", () => { + pollStateReady(pollState); + }); + } + } +} + +/** + * + * @param {Promise} promise + * @param {PollState | undefined} pollState + * @returns {number} + */ +export function createFuture(promise, pollState) { + const futureId = ++futureCnt; + if (pollState) { + pollState.ready = false; + } else { + pollState = { + ready: false, + listener: null, + polls: [], + parent: null, + }; + } + const future = { tag: "ok", val: null }; + futures.set(futureId, { future, pollState }); + promise.then( + (value) => { + pollStateReady(pollState); + future.val = value; + }, + (value) => { + pollStateReady(pollState); + future.tag = "err"; + future.val = value; + } + ); + return futureId; +} + +/** + * @param {number} id + * @returns {undefined | { tag: 'ok', val: any } | { tag: 'err', val: undefined }} + * @throws {undefined} + */ +export function futureTakeValue(id) { + const future = futures.get(id); + // Not ready = return undefined + if (!future.pollState.ready) return undefined; + // Ready but already taken = return { tag: 'err', val: undefined } + if (!future.future) return { tag: "err", val: undefined }; + const out = { tag: "ok", val: future.future }; + future.future = null; + return out; +} + +export function futureDispose(id, ownsState) { + const { pollState } = futures.get(id); + if (ownsState) verifyPollsDroppedForDrop(pollState, "future"); + return void futures.delete(id); +} + +let uncaughtException; +process.on("uncaughtException", (err) => (uncaughtException = err)); + +// eslint-disable-next-line no-unused-vars +function trace(msg) { + const tmpErr = new Error(format(msg)); + log(tmpErr.stack); +} + +const debug = runAsWorker(handle); diff --git a/demo/dist/@bytecodealliance/preview2-shim/package.json b/demo/dist/@bytecodealliance/preview2-shim/package.json new file mode 100644 index 0000000..77d6137 --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/package.json @@ -0,0 +1,39 @@ +{ + "name": "@bytecodealliance/preview2-shim", + "version": "0.17.0", + "description": "WASI Preview2 shim for JS environments", + "author": "Guy Bedford, Eduardo Rodrigues<16357187+eduardomourar@users.noreply.github.com>", + "type": "module", + "types": "./types/index.d.ts", + "exports": { + ".": { + "types": "./types/index.d.ts", + "node": "./lib/nodejs/index.js", + "default": "./lib/browser/index.js" + }, + "./*": { + "types": "./types/*.d.ts", + "node": "./lib/nodejs/*.js", + "default": "./lib/browser/*.js" + } + }, + "scripts": { + "test": "node --expose-gc ../../node_modules/mocha/bin/mocha.js -u tdd test/test.js --timeout 30000" + }, + "files": [ + "types", + "lib" + ], + "devDependencies": { + "mocha": "^10.2.0" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/bytecodealliance/jco.git" + }, + "license": "(Apache-2.0 WITH LLVM-exception)", + "bugs": { + "url": "https://github.com/bytecodealliance/jco/issues" + }, + "homepage": "https://github.com/bytecodealliance/jco#readme" +} diff --git a/demo/dist/@bytecodealliance/preview2-shim/types/cli.d.ts b/demo/dist/@bytecodealliance/preview2-shim/types/cli.d.ts new file mode 100644 index 0000000..51ab366 --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/types/cli.d.ts @@ -0,0 +1,23 @@ +import type { WasiCliEnvironment } from './interfaces/wasi-cli-environment.d.ts'; +import type { WasiCliExit } from './interfaces/wasi-cli-exit.d.ts'; +import type { WasiCliRun } from './interfaces/wasi-cli-run.d.ts'; +import type { WasiCliStderr } from './interfaces/wasi-cli-stderr.d.ts'; +import type { WasiCliStdin } from './interfaces/wasi-cli-stdin.d.ts'; +import type { WasiCliStdout } from './interfaces/wasi-cli-stdout.d.ts'; +import type { WasiCliTerminalInput } from './interfaces/wasi-cli-terminal-input.d.ts'; +import type { WasiCliTerminalOutput } from './interfaces/wasi-cli-terminal-output.d.ts'; +import type { WasiCliTerminalStderr } from './interfaces/wasi-cli-terminal-stderr.d.ts'; +import type { WasiCliTerminalStdin } from './interfaces/wasi-cli-terminal-stdin.d.ts'; +import type { WasiCliTerminalStdout } from './interfaces/wasi-cli-terminal-stdout.d.ts'; + +export const environment: typeof WasiCliEnvironment; +export const exit: typeof WasiCliExit; +export const run: typeof WasiCliRun; +export const stderr: typeof WasiCliStderr; +export const stdin: typeof WasiCliStdin; +export const stdout: typeof WasiCliStdout; +export const terminalInput: typeof WasiCliTerminalInput; +export const terminalOutput: typeof WasiCliTerminalOutput; +export const terminalStderr: typeof WasiCliTerminalStderr; +export const terminalStdin: typeof WasiCliTerminalStdin; +export const terminalStdout: typeof WasiCliTerminalStdout; diff --git a/demo/dist/@bytecodealliance/preview2-shim/types/clocks.d.ts b/demo/dist/@bytecodealliance/preview2-shim/types/clocks.d.ts new file mode 100644 index 0000000..7d615e4 --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/types/clocks.d.ts @@ -0,0 +1,5 @@ +import type { WasiClocksMonotonicClock } from './interfaces/wasi-clocks-monotonic-clock.d.ts'; +import type { WasiClocksWallClock } from './interfaces/wasi-clocks-wall-clock.d.ts'; + +export const wallClock: typeof WasiClocksWallClock; +export const monotonicClock: typeof WasiClocksMonotonicClock; diff --git a/demo/dist/@bytecodealliance/preview2-shim/types/filesystem.d.ts b/demo/dist/@bytecodealliance/preview2-shim/types/filesystem.d.ts new file mode 100644 index 0000000..732da3d --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/types/filesystem.d.ts @@ -0,0 +1,5 @@ +import type { WasiFilesystemPreopens } from './interfaces/wasi-filesystem-preopens.d.ts'; +import type { WasiFilesystemTypes } from './interfaces/wasi-filesystem-types.d.ts'; + +export const preopens: typeof WasiFilesystemPreopens; +export const types: typeof WasiFilesystemTypes; diff --git a/demo/dist/@bytecodealliance/preview2-shim/types/http.d.ts b/demo/dist/@bytecodealliance/preview2-shim/types/http.d.ts new file mode 100644 index 0000000..c861d75 --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/types/http.d.ts @@ -0,0 +1,7 @@ +import type { WasiHttpIncomingHandler } from './interfaces/wasi-http-incoming-handler.d.ts'; +import type { WasiHttpOutgoingHandler } from './interfaces/wasi-http-outgoing-handler.d.ts'; +import type { WasiHttpTypes } from './interfaces/wasi-http-types.d.ts'; + +export const incomingHandler: typeof WasiHttpIncomingHandler; +export const outgoingHandler: typeof WasiHttpOutgoingHandler; +export const types: typeof WasiHttpTypes; diff --git a/demo/dist/@bytecodealliance/preview2-shim/types/index.d.ts b/demo/dist/@bytecodealliance/preview2-shim/types/index.d.ts new file mode 100644 index 0000000..d3c5f23 --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/types/index.d.ts @@ -0,0 +1,15 @@ +import type * as WasiCli from "./cli.d.ts"; +import type * as WasiClocks from './clocks.d.ts'; +import type * as WasiFilesystem from './filesystem.d.ts'; +import type * as WasiHttp from "./http.d.ts"; +import type * as WasiIo from "./io.d.ts"; +import type * as WasiRandom from "./random.d.ts"; +import type * as WasiSockets from "./sockets.d.ts"; + +export const cli: typeof WasiCli; +export const clocks: typeof WasiClocks; +export const filesystem: typeof WasiFilesystem; +export const http: typeof WasiHttp; +export const io: typeof WasiIo; +export const random: typeof WasiRandom; +export const sockets: typeof WasiSockets; diff --git a/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-cli-environment.d.ts b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-cli-environment.d.ts new file mode 100644 index 0000000..3bdbdfd --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-cli-environment.d.ts @@ -0,0 +1,22 @@ +export namespace WasiCliEnvironment { + /** + * Get the POSIX-style environment variables. + * + * Each environment variable is provided as a pair of string variable names + * and string value. + * + * Morally, these are a value import, but until value imports are available + * in the component model, this import function should return the same + * values each time it is called. + */ + export function getEnvironment(): Array<[string, string]>; + /** + * Get the POSIX-style arguments to the program. + */ + export function getArguments(): Array; + /** + * Return a path that programs should use as their initial current working + * directory, interpreting `.` as shorthand for this. + */ + export function initialCwd(): string | undefined; +} diff --git a/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-cli-exit.d.ts b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-cli-exit.d.ts new file mode 100644 index 0000000..a2dae29 --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-cli-exit.d.ts @@ -0,0 +1,7 @@ +export namespace WasiCliExit { + /** + * Exit the current instance and any linked instances. + */ + export function exit(status: Result): void; +} +export type Result = { tag: 'ok', val: T } | { tag: 'err', val: E }; diff --git a/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-cli-run.d.ts b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-cli-run.d.ts new file mode 100644 index 0000000..9634b76 --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-cli-run.d.ts @@ -0,0 +1,6 @@ +export namespace WasiCliRun { + /** + * Run the program. + */ + export function run(): void; +} diff --git a/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-cli-stderr.d.ts b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-cli-stderr.d.ts new file mode 100644 index 0000000..8b2c03a --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-cli-stderr.d.ts @@ -0,0 +1,5 @@ +export namespace WasiCliStderr { + export function getStderr(): OutputStream; +} +import type { OutputStream } from './wasi-io-streams.js'; +export { OutputStream }; diff --git a/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-cli-stdin.d.ts b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-cli-stdin.d.ts new file mode 100644 index 0000000..4da24cd --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-cli-stdin.d.ts @@ -0,0 +1,5 @@ +export namespace WasiCliStdin { + export function getStdin(): InputStream; +} +import type { InputStream } from './wasi-io-streams.js'; +export { InputStream }; diff --git a/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-cli-stdout.d.ts b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-cli-stdout.d.ts new file mode 100644 index 0000000..17aa5a7 --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-cli-stdout.d.ts @@ -0,0 +1,5 @@ +export namespace WasiCliStdout { + export function getStdout(): OutputStream; +} +import type { OutputStream } from './wasi-io-streams.js'; +export { OutputStream }; diff --git a/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-cli-terminal-input.d.ts b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-cli-terminal-input.d.ts new file mode 100644 index 0000000..3944c2e --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-cli-terminal-input.d.ts @@ -0,0 +1,6 @@ +export namespace WasiCliTerminalInput { + export { TerminalInput }; +} + +export class TerminalInput { +} diff --git a/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-cli-terminal-output.d.ts b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-cli-terminal-output.d.ts new file mode 100644 index 0000000..cb1055f --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-cli-terminal-output.d.ts @@ -0,0 +1,6 @@ +export namespace WasiCliTerminalOutput { + export { TerminalOutput }; +} + +export class TerminalOutput { +} diff --git a/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-cli-terminal-stderr.d.ts b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-cli-terminal-stderr.d.ts new file mode 100644 index 0000000..6bf6c26 --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-cli-terminal-stderr.d.ts @@ -0,0 +1,9 @@ +export namespace WasiCliTerminalStderr { + /** + * If stderr is connected to a terminal, return a `terminal-output` handle + * allowing further interaction with it. + */ + export function getTerminalStderr(): TerminalOutput | undefined; +} +import type { TerminalOutput } from './wasi-cli-terminal-output.js'; +export { TerminalOutput }; diff --git a/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-cli-terminal-stdin.d.ts b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-cli-terminal-stdin.d.ts new file mode 100644 index 0000000..368a100 --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-cli-terminal-stdin.d.ts @@ -0,0 +1,9 @@ +export namespace WasiCliTerminalStdin { + /** + * If stdin is connected to a terminal, return a `terminal-input` handle + * allowing further interaction with it. + */ + export function getTerminalStdin(): TerminalInput | undefined; +} +import type { TerminalInput } from './wasi-cli-terminal-input.js'; +export { TerminalInput }; diff --git a/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-cli-terminal-stdout.d.ts b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-cli-terminal-stdout.d.ts new file mode 100644 index 0000000..f29b8d1 --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-cli-terminal-stdout.d.ts @@ -0,0 +1,9 @@ +export namespace WasiCliTerminalStdout { + /** + * If stdout is connected to a terminal, return a `terminal-output` handle + * allowing further interaction with it. + */ + export function getTerminalStdout(): TerminalOutput | undefined; +} +import type { TerminalOutput } from './wasi-cli-terminal-output.js'; +export { TerminalOutput }; diff --git a/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-clocks-monotonic-clock.d.ts b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-clocks-monotonic-clock.d.ts new file mode 100644 index 0000000..5b5ca2a --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-clocks-monotonic-clock.d.ts @@ -0,0 +1,36 @@ +export namespace WasiClocksMonotonicClock { + /** + * Read the current value of the clock. + * + * The clock is monotonic, therefore calling this function repeatedly will + * produce a sequence of non-decreasing values. + */ + export function now(): Instant; + /** + * Query the resolution of the clock. Returns the duration of time + * corresponding to a clock tick. + */ + export function resolution(): Duration; + /** + * Create a `pollable` which will resolve once the specified instant + * has occurred. + */ + export function subscribeInstant(when: Instant): Pollable; + /** + * Create a `pollable` that will resolve after the specified duration has + * elapsed from the time this function is invoked. + */ + export function subscribeDuration(when: Duration): Pollable; +} +import type { Pollable } from './wasi-io-poll.js'; +export { Pollable }; +/** + * An instant in time, in nanoseconds. An instant is relative to an + * unspecified initial value, and can only be compared to instances from + * the same monotonic-clock. + */ +export type Instant = bigint; +/** + * A duration of time, in nanoseconds. + */ +export type Duration = bigint; diff --git a/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-clocks-wall-clock.d.ts b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-clocks-wall-clock.d.ts new file mode 100644 index 0000000..f72c90c --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-clocks-wall-clock.d.ts @@ -0,0 +1,31 @@ +export namespace WasiClocksWallClock { + /** + * Read the current value of the clock. + * + * This clock is not monotonic, therefore calling this function repeatedly + * will not necessarily produce a sequence of non-decreasing values. + * + * The returned timestamps represent the number of seconds since + * 1970-01-01T00:00:00Z, also known as [POSIX's Seconds Since the Epoch], + * also known as [Unix Time]. + * + * The nanoseconds field of the output is always less than 1000000000. + * + * [POSIX's Seconds Since the Epoch]: https://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xbd_chap04.html#tag_21_04_16 + * [Unix Time]: https://en.wikipedia.org/wiki/Unix_time + */ + export function now(): Datetime; + /** + * Query the resolution of the clock. + * + * The nanoseconds field of the output is always less than 1000000000. + */ + export function resolution(): Datetime; +} +/** + * A time and date in seconds plus nanoseconds. + */ +export interface Datetime { + seconds: bigint, + nanoseconds: number, +} diff --git a/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-filesystem-preopens.d.ts b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-filesystem-preopens.d.ts new file mode 100644 index 0000000..4625a7a --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-filesystem-preopens.d.ts @@ -0,0 +1,8 @@ +export namespace WasiFilesystemPreopens { + /** + * Return the set of preopened directories, and their path. + */ + export function getDirectories(): Array<[Descriptor, string]>; +} +import type { Descriptor } from './wasi-filesystem-types.js'; +export { Descriptor }; diff --git a/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-filesystem-types.d.ts b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-filesystem-types.d.ts new file mode 100644 index 0000000..3005d6e --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-filesystem-types.d.ts @@ -0,0 +1,674 @@ +export namespace WasiFilesystemTypes { + export { Descriptor }; + export { DirectoryEntryStream }; + /** + * Attempts to extract a filesystem-related `error-code` from the stream + * `error` provided. + * + * Stream operations which return `stream-error::last-operation-failed` + * have a payload with more information about the operation that failed. + * This payload can be passed through to this function to see if there's + * filesystem-related information about the error to return. + * + * Note that this function is fallible because not all stream-related + * errors are filesystem-related errors. + */ + export function filesystemErrorCode(err: Error): ErrorCode | undefined; +} +import type { InputStream } from './wasi-io-streams.js'; +export { InputStream }; +import type { OutputStream } from './wasi-io-streams.js'; +export { OutputStream }; +import type { Error } from './wasi-io-streams.js'; +export { Error }; +import type { Datetime } from './wasi-clocks-wall-clock.js'; +export { Datetime }; +/** + * File size or length of a region within a file. + */ +export type Filesize = bigint; +/** + * The type of a filesystem object referenced by a descriptor. + * + * Note: This was called `filetype` in earlier versions of WASI. + * # Variants + * + * ## `"unknown"` + * + * The type of the descriptor or file is unknown or is different from + * any of the other types specified. + * ## `"block-device"` + * + * The descriptor refers to a block device inode. + * ## `"character-device"` + * + * The descriptor refers to a character device inode. + * ## `"directory"` + * + * The descriptor refers to a directory inode. + * ## `"fifo"` + * + * The descriptor refers to a named pipe. + * ## `"symbolic-link"` + * + * The file refers to a symbolic link inode. + * ## `"regular-file"` + * + * The descriptor refers to a regular file inode. + * ## `"socket"` + * + * The descriptor refers to a socket. + */ +export type DescriptorType = 'unknown' | 'block-device' | 'character-device' | 'directory' | 'fifo' | 'symbolic-link' | 'regular-file' | 'socket'; +/** + * Descriptor flags. + * + * Note: This was called `fdflags` in earlier versions of WASI. + */ +export interface DescriptorFlags { + /** + * Read mode: Data can be read. + */ + read?: boolean, + /** + * Write mode: Data can be written to. + */ + write?: boolean, + /** + * Request that writes be performed according to synchronized I/O file + * integrity completion. The data stored in the file and the file's + * metadata are synchronized. This is similar to `O_SYNC` in POSIX. + * + * The precise semantics of this operation have not yet been defined for + * WASI. At this time, it should be interpreted as a request, and not a + * requirement. + */ + fileIntegritySync?: boolean, + /** + * Request that writes be performed according to synchronized I/O data + * integrity completion. Only the data stored in the file is + * synchronized. This is similar to `O_DSYNC` in POSIX. + * + * The precise semantics of this operation have not yet been defined for + * WASI. At this time, it should be interpreted as a request, and not a + * requirement. + */ + dataIntegritySync?: boolean, + /** + * Requests that reads be performed at the same level of integrity + * requested for writes. This is similar to `O_RSYNC` in POSIX. + * + * The precise semantics of this operation have not yet been defined for + * WASI. At this time, it should be interpreted as a request, and not a + * requirement. + */ + requestedWriteSync?: boolean, + /** + * Mutating directories mode: Directory contents may be mutated. + * + * When this flag is unset on a descriptor, operations using the + * descriptor which would create, rename, delete, modify the data or + * metadata of filesystem objects, or obtain another handle which + * would permit any of those, shall fail with `error-code::read-only` if + * they would otherwise succeed. + * + * This may only be set on directories. + */ + mutateDirectory?: boolean, +} +/** + * Flags determining the method of how paths are resolved. + */ +export interface PathFlags { + /** + * As long as the resolved path corresponds to a symbolic link, it is + * expanded. + */ + symlinkFollow?: boolean, +} +/** + * Open flags used by `open-at`. + */ +export interface OpenFlags { + /** + * Create file if it does not exist, similar to `O_CREAT` in POSIX. + */ + create?: boolean, + /** + * Fail if not a directory, similar to `O_DIRECTORY` in POSIX. + */ + directory?: boolean, + /** + * Fail if file already exists, similar to `O_EXCL` in POSIX. + */ + exclusive?: boolean, + /** + * Truncate file to size 0, similar to `O_TRUNC` in POSIX. + */ + truncate?: boolean, +} +/** + * Number of hard links to an inode. + */ +export type LinkCount = bigint; +/** + * File attributes. + * + * Note: This was called `filestat` in earlier versions of WASI. + */ +export interface DescriptorStat { + /** + * File type. + */ + type: DescriptorType, + /** + * Number of hard links to the file. + */ + linkCount: LinkCount, + /** + * For regular files, the file size in bytes. For symbolic links, the + * length in bytes of the pathname contained in the symbolic link. + */ + size: Filesize, + /** + * Last data access timestamp. + * + * If the `option` is none, the platform doesn't maintain an access + * timestamp for this file. + */ + dataAccessTimestamp?: Datetime, + /** + * Last data modification timestamp. + * + * If the `option` is none, the platform doesn't maintain a + * modification timestamp for this file. + */ + dataModificationTimestamp?: Datetime, + /** + * Last file status-change timestamp. + * + * If the `option` is none, the platform doesn't maintain a + * status-change timestamp for this file. + */ + statusChangeTimestamp?: Datetime, +} +/** + * When setting a timestamp, this gives the value to set it to. + */ +export type NewTimestamp = NewTimestampNoChange | NewTimestampNow | NewTimestampTimestamp; +/** + * Leave the timestamp set to its previous value. + */ +export interface NewTimestampNoChange { + tag: 'no-change', +} +/** + * Set the timestamp to the current time of the system clock associated + * with the filesystem. + */ +export interface NewTimestampNow { + tag: 'now', +} +/** + * Set the timestamp to the given value. + */ +export interface NewTimestampTimestamp { + tag: 'timestamp', + val: Datetime, +} +/** + * A directory entry. + */ +export interface DirectoryEntry { + /** + * The type of the file referred to by this directory entry. + */ + type: DescriptorType, + /** + * The name of the object. + */ + name: string, +} +/** + * Error codes returned by functions, similar to `errno` in POSIX. + * Not all of these error codes are returned by the functions provided by this + * API; some are used in higher-level library layers, and others are provided + * merely for alignment with POSIX. + * # Variants + * + * ## `"access"` + * + * Permission denied, similar to `EACCES` in POSIX. + * ## `"would-block"` + * + * Resource unavailable, or operation would block, similar to `EAGAIN` and `EWOULDBLOCK` in POSIX. + * ## `"already"` + * + * Connection already in progress, similar to `EALREADY` in POSIX. + * ## `"bad-descriptor"` + * + * Bad descriptor, similar to `EBADF` in POSIX. + * ## `"busy"` + * + * Device or resource busy, similar to `EBUSY` in POSIX. + * ## `"deadlock"` + * + * Resource deadlock would occur, similar to `EDEADLK` in POSIX. + * ## `"quota"` + * + * Storage quota exceeded, similar to `EDQUOT` in POSIX. + * ## `"exist"` + * + * File exists, similar to `EEXIST` in POSIX. + * ## `"file-too-large"` + * + * File too large, similar to `EFBIG` in POSIX. + * ## `"illegal-byte-sequence"` + * + * Illegal byte sequence, similar to `EILSEQ` in POSIX. + * ## `"in-progress"` + * + * Operation in progress, similar to `EINPROGRESS` in POSIX. + * ## `"interrupted"` + * + * Interrupted function, similar to `EINTR` in POSIX. + * ## `"invalid"` + * + * Invalid argument, similar to `EINVAL` in POSIX. + * ## `"io"` + * + * I/O error, similar to `EIO` in POSIX. + * ## `"is-directory"` + * + * Is a directory, similar to `EISDIR` in POSIX. + * ## `"loop"` + * + * Too many levels of symbolic links, similar to `ELOOP` in POSIX. + * ## `"too-many-links"` + * + * Too many links, similar to `EMLINK` in POSIX. + * ## `"message-size"` + * + * Message too large, similar to `EMSGSIZE` in POSIX. + * ## `"name-too-long"` + * + * Filename too long, similar to `ENAMETOOLONG` in POSIX. + * ## `"no-device"` + * + * No such device, similar to `ENODEV` in POSIX. + * ## `"no-entry"` + * + * No such file or directory, similar to `ENOENT` in POSIX. + * ## `"no-lock"` + * + * No locks available, similar to `ENOLCK` in POSIX. + * ## `"insufficient-memory"` + * + * Not enough space, similar to `ENOMEM` in POSIX. + * ## `"insufficient-space"` + * + * No space left on device, similar to `ENOSPC` in POSIX. + * ## `"not-directory"` + * + * Not a directory or a symbolic link to a directory, similar to `ENOTDIR` in POSIX. + * ## `"not-empty"` + * + * Directory not empty, similar to `ENOTEMPTY` in POSIX. + * ## `"not-recoverable"` + * + * State not recoverable, similar to `ENOTRECOVERABLE` in POSIX. + * ## `"unsupported"` + * + * Not supported, similar to `ENOTSUP` and `ENOSYS` in POSIX. + * ## `"no-tty"` + * + * Inappropriate I/O control operation, similar to `ENOTTY` in POSIX. + * ## `"no-such-device"` + * + * No such device or address, similar to `ENXIO` in POSIX. + * ## `"overflow"` + * + * Value too large to be stored in data type, similar to `EOVERFLOW` in POSIX. + * ## `"not-permitted"` + * + * Operation not permitted, similar to `EPERM` in POSIX. + * ## `"pipe"` + * + * Broken pipe, similar to `EPIPE` in POSIX. + * ## `"read-only"` + * + * Read-only file system, similar to `EROFS` in POSIX. + * ## `"invalid-seek"` + * + * Invalid seek, similar to `ESPIPE` in POSIX. + * ## `"text-file-busy"` + * + * Text file busy, similar to `ETXTBSY` in POSIX. + * ## `"cross-device"` + * + * Cross-device link, similar to `EXDEV` in POSIX. + */ +export type ErrorCode = 'access' | 'would-block' | 'already' | 'bad-descriptor' | 'busy' | 'deadlock' | 'quota' | 'exist' | 'file-too-large' | 'illegal-byte-sequence' | 'in-progress' | 'interrupted' | 'invalid' | 'io' | 'is-directory' | 'loop' | 'too-many-links' | 'message-size' | 'name-too-long' | 'no-device' | 'no-entry' | 'no-lock' | 'insufficient-memory' | 'insufficient-space' | 'not-directory' | 'not-empty' | 'not-recoverable' | 'unsupported' | 'no-tty' | 'no-such-device' | 'overflow' | 'not-permitted' | 'pipe' | 'read-only' | 'invalid-seek' | 'text-file-busy' | 'cross-device'; +/** + * File or memory access pattern advisory information. + * # Variants + * + * ## `"normal"` + * + * The application has no advice to give on its behavior with respect + * to the specified data. + * ## `"sequential"` + * + * The application expects to access the specified data sequentially + * from lower offsets to higher offsets. + * ## `"random"` + * + * The application expects to access the specified data in a random + * order. + * ## `"will-need"` + * + * The application expects to access the specified data in the near + * future. + * ## `"dont-need"` + * + * The application expects that it will not access the specified data + * in the near future. + * ## `"no-reuse"` + * + * The application expects to access the specified data once and then + * not reuse it thereafter. + */ +export type Advice = 'normal' | 'sequential' | 'random' | 'will-need' | 'dont-need' | 'no-reuse'; +/** + * A 128-bit hash value, split into parts because wasm doesn't have a + * 128-bit integer type. + */ +export interface MetadataHashValue { + /** + * 64 bits of a 128-bit hash value. + */ + lower: bigint, + /** + * Another 64 bits of a 128-bit hash value. + */ + upper: bigint, +} + +export class Descriptor { + /** + * Return a stream for reading from a file, if available. + * + * May fail with an error-code describing why the file cannot be read. + * + * Multiple read, write, and append streams may be active on the same open + * file and they do not interfere with each other. + * + * Note: This allows using `read-stream`, which is similar to `read` in POSIX. + */ + readViaStream(offset: Filesize): InputStream; + /** + * Return a stream for writing to a file, if available. + * + * May fail with an error-code describing why the file cannot be written. + * + * Note: This allows using `write-stream`, which is similar to `write` in + * POSIX. + */ + writeViaStream(offset: Filesize): OutputStream; + /** + * Return a stream for appending to a file, if available. + * + * May fail with an error-code describing why the file cannot be appended. + * + * Note: This allows using `write-stream`, which is similar to `write` with + * `O_APPEND` in in POSIX. + */ + appendViaStream(): OutputStream; + /** + * Provide file advisory information on a descriptor. + * + * This is similar to `posix_fadvise` in POSIX. + */ + advise(offset: Filesize, length: Filesize, advice: Advice): void; + /** + * Synchronize the data of a file to disk. + * + * This function succeeds with no effect if the file descriptor is not + * opened for writing. + * + * Note: This is similar to `fdatasync` in POSIX. + */ + syncData(): void; + /** + * Get flags associated with a descriptor. + * + * Note: This returns similar flags to `fcntl(fd, F_GETFL)` in POSIX. + * + * Note: This returns the value that was the `fs_flags` value returned + * from `fdstat_get` in earlier versions of WASI. + */ + getFlags(): DescriptorFlags; + /** + * Get the dynamic type of a descriptor. + * + * Note: This returns the same value as the `type` field of the `fd-stat` + * returned by `stat`, `stat-at` and similar. + * + * Note: This returns similar flags to the `st_mode & S_IFMT` value provided + * by `fstat` in POSIX. + * + * Note: This returns the value that was the `fs_filetype` value returned + * from `fdstat_get` in earlier versions of WASI. + */ + getType(): DescriptorType; + /** + * Adjust the size of an open file. If this increases the file's size, the + * extra bytes are filled with zeros. + * + * Note: This was called `fd_filestat_set_size` in earlier versions of WASI. + */ + setSize(size: Filesize): void; + /** + * Adjust the timestamps of an open file or directory. + * + * Note: This is similar to `futimens` in POSIX. + * + * Note: This was called `fd_filestat_set_times` in earlier versions of WASI. + */ + setTimes(dataAccessTimestamp: NewTimestamp, dataModificationTimestamp: NewTimestamp): void; + /** + * Read from a descriptor, without using and updating the descriptor's offset. + * + * This function returns a list of bytes containing the data that was + * read, along with a bool which, when true, indicates that the end of the + * file was reached. The returned list will contain up to `length` bytes; it + * may return fewer than requested, if the end of the file is reached or + * if the I/O operation is interrupted. + * + * In the future, this may change to return a `stream`. + * + * Note: This is similar to `pread` in POSIX. + */ + read(length: Filesize, offset: Filesize): [Uint8Array, boolean]; + /** + * Write to a descriptor, without using and updating the descriptor's offset. + * + * It is valid to write past the end of a file; the file is extended to the + * extent of the write, with bytes between the previous end and the start of + * the write set to zero. + * + * In the future, this may change to take a `stream`. + * + * Note: This is similar to `pwrite` in POSIX. + */ + write(buffer: Uint8Array, offset: Filesize): Filesize; + /** + * Read directory entries from a directory. + * + * On filesystems where directories contain entries referring to themselves + * and their parents, often named `.` and `..` respectively, these entries + * are omitted. + * + * This always returns a new stream which starts at the beginning of the + * directory. Multiple streams may be active on the same directory, and they + * do not interfere with each other. + */ + readDirectory(): DirectoryEntryStream; + /** + * Synchronize the data and metadata of a file to disk. + * + * This function succeeds with no effect if the file descriptor is not + * opened for writing. + * + * Note: This is similar to `fsync` in POSIX. + */ + sync(): void; + /** + * Create a directory. + * + * Note: This is similar to `mkdirat` in POSIX. + */ + createDirectoryAt(path: string): void; + /** + * Return the attributes of an open file or directory. + * + * Note: This is similar to `fstat` in POSIX, except that it does not return + * device and inode information. For testing whether two descriptors refer to + * the same underlying filesystem object, use `is-same-object`. To obtain + * additional data that can be used do determine whether a file has been + * modified, use `metadata-hash`. + * + * Note: This was called `fd_filestat_get` in earlier versions of WASI. + */ + stat(): DescriptorStat; + /** + * Return the attributes of a file or directory. + * + * Note: This is similar to `fstatat` in POSIX, except that it does not + * return device and inode information. See the `stat` description for a + * discussion of alternatives. + * + * Note: This was called `path_filestat_get` in earlier versions of WASI. + */ + statAt(pathFlags: PathFlags, path: string): DescriptorStat; + /** + * Adjust the timestamps of a file or directory. + * + * Note: This is similar to `utimensat` in POSIX. + * + * Note: This was called `path_filestat_set_times` in earlier versions of + * WASI. + */ + setTimesAt(pathFlags: PathFlags, path: string, dataAccessTimestamp: NewTimestamp, dataModificationTimestamp: NewTimestamp): void; + /** + * Create a hard link. + * + * Note: This is similar to `linkat` in POSIX. + */ + linkAt(oldPathFlags: PathFlags, oldPath: string, newDescriptor: Descriptor, newPath: string): void; + /** + * Open a file or directory. + * + * The returned descriptor is not guaranteed to be the lowest-numbered + * descriptor not currently open/ it is randomized to prevent applications + * from depending on making assumptions about indexes, since this is + * error-prone in multi-threaded contexts. The returned descriptor is + * guaranteed to be less than 2**31. + * + * If `flags` contains `descriptor-flags::mutate-directory`, and the base + * descriptor doesn't have `descriptor-flags::mutate-directory` set, + * `open-at` fails with `error-code::read-only`. + * + * If `flags` contains `write` or `mutate-directory`, or `open-flags` + * contains `truncate` or `create`, and the base descriptor doesn't have + * `descriptor-flags::mutate-directory` set, `open-at` fails with + * `error-code::read-only`. + * + * Note: This is similar to `openat` in POSIX. + */ + openAt(pathFlags: PathFlags, path: string, openFlags: OpenFlags, flags: DescriptorFlags): Descriptor; + /** + * Read the contents of a symbolic link. + * + * If the contents contain an absolute or rooted path in the underlying + * filesystem, this function fails with `error-code::not-permitted`. + * + * Note: This is similar to `readlinkat` in POSIX. + */ + readlinkAt(path: string): string; + /** + * Remove a directory. + * + * Return `error-code::not-empty` if the directory is not empty. + * + * Note: This is similar to `unlinkat(fd, path, AT_REMOVEDIR)` in POSIX. + */ + removeDirectoryAt(path: string): void; + /** + * Rename a filesystem object. + * + * Note: This is similar to `renameat` in POSIX. + */ + renameAt(oldPath: string, newDescriptor: Descriptor, newPath: string): void; + /** + * Create a symbolic link (also known as a "symlink"). + * + * If `old-path` starts with `/`, the function fails with + * `error-code::not-permitted`. + * + * Note: This is similar to `symlinkat` in POSIX. + */ + symlinkAt(oldPath: string, newPath: string): void; + /** + * Unlink a filesystem object that is not a directory. + * + * Return `error-code::is-directory` if the path refers to a directory. + * Note: This is similar to `unlinkat(fd, path, 0)` in POSIX. + */ + unlinkFileAt(path: string): void; + /** + * Test whether two descriptors refer to the same filesystem object. + * + * In POSIX, this corresponds to testing whether the two descriptors have the + * same device (`st_dev`) and inode (`st_ino` or `d_ino`) numbers. + * wasi-filesystem does not expose device and inode numbers, so this function + * may be used instead. + */ + isSameObject(other: Descriptor): boolean; + /** + * Return a hash of the metadata associated with a filesystem object referred + * to by a descriptor. + * + * This returns a hash of the last-modification timestamp and file size, and + * may also include the inode number, device number, birth timestamp, and + * other metadata fields that may change when the file is modified or + * replaced. It may also include a secret value chosen by the + * implementation and not otherwise exposed. + * + * Implementations are encourated to provide the following properties: + * + * - If the file is not modified or replaced, the computed hash value should + * usually not change. + * - If the object is modified or replaced, the computed hash value should + * usually change. + * - The inputs to the hash should not be easily computable from the + * computed hash. + * + * However, none of these is required. + */ + metadataHash(): MetadataHashValue; + /** + * Return a hash of the metadata associated with a filesystem object referred + * to by a directory descriptor and a relative path. + * + * This performs the same hash computation as `metadata-hash`. + */ + metadataHashAt(pathFlags: PathFlags, path: string): MetadataHashValue; +} + +export class DirectoryEntryStream { + /** + * Read a single directory entry from a `directory-entry-stream`. + */ + readDirectoryEntry(): DirectoryEntry | undefined; +} diff --git a/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-http-incoming-handler.d.ts b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-http-incoming-handler.d.ts new file mode 100644 index 0000000..cd927f7 --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-http-incoming-handler.d.ts @@ -0,0 +1,19 @@ +export namespace WasiHttpIncomingHandler { + /** + * This function is invoked with an incoming HTTP Request, and a resource + * `response-outparam` which provides the capability to reply with an HTTP + * Response. The response is sent by calling the `response-outparam.set` + * method, which allows execution to continue after the response has been + * sent. This enables both streaming to the response body, and performing other + * work. + * + * The implementor of this function must write a response to the + * `response-outparam` before returning, or else the caller will respond + * with an error on its behalf. + */ + export function handle(request: IncomingRequest, responseOut: ResponseOutparam): void; +} +import type { IncomingRequest } from './wasi-http-types.js'; +export { IncomingRequest }; +import type { ResponseOutparam } from './wasi-http-types.js'; +export { ResponseOutparam }; diff --git a/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-http-outgoing-handler.d.ts b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-http-outgoing-handler.d.ts new file mode 100644 index 0000000..e86916f --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-http-outgoing-handler.d.ts @@ -0,0 +1,23 @@ +export namespace WasiHttpOutgoingHandler { + /** + * This function is invoked with an outgoing HTTP Request, and it returns + * a resource `future-incoming-response` which represents an HTTP Response + * which may arrive in the future. + * + * The `options` argument accepts optional parameters for the HTTP + * protocol's transport layer. + * + * This function may return an error if the `outgoing-request` is invalid + * or not allowed to be made. Otherwise, protocol errors are reported + * through the `future-incoming-response`. + */ + export function handle(request: OutgoingRequest, options: RequestOptions | undefined): FutureIncomingResponse; +} +import type { OutgoingRequest } from './wasi-http-types.js'; +export { OutgoingRequest }; +import type { RequestOptions } from './wasi-http-types.js'; +export { RequestOptions }; +import type { FutureIncomingResponse } from './wasi-http-types.js'; +export { FutureIncomingResponse }; +import type { ErrorCode } from './wasi-http-types.js'; +export { ErrorCode }; diff --git a/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-http-types.d.ts b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-http-types.d.ts new file mode 100644 index 0000000..6c0f34a --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-http-types.d.ts @@ -0,0 +1,720 @@ +export namespace WasiHttpTypes { + /** + * Attempts to extract a http-related `error` from the wasi:io `error` + * provided. + * + * Stream operations which return + * `wasi:io/stream/stream-error::last-operation-failed` have a payload of + * type `wasi:io/error/error` with more information about the operation + * that failed. This payload can be passed through to this function to see + * if there's http-related information about the error to return. + * + * Note that this function is fallible because not all io-errors are + * http-related errors. + */ + export function httpErrorCode(err: IoError): ErrorCode | undefined; + export { Fields }; + export { IncomingRequest }; + export { OutgoingRequest }; + export { RequestOptions }; + export { ResponseOutparam }; + export { IncomingResponse }; + export { IncomingBody }; + export { FutureTrailers }; + export { OutgoingResponse }; + export { OutgoingBody }; + export { FutureIncomingResponse }; +} +import type { Duration } from './wasi-clocks-monotonic-clock.js'; +export { Duration }; +import type { InputStream } from './wasi-io-streams.js'; +export { InputStream }; +import type { OutputStream } from './wasi-io-streams.js'; +export { OutputStream }; +import type { Error as IoError } from './wasi-io-error.js'; +export { IoError }; +import type { Pollable } from './wasi-io-poll.js'; +export { Pollable }; +/** + * This type corresponds to HTTP standard Methods. + */ +export type Method = MethodGet | MethodHead | MethodPost | MethodPut | MethodDelete | MethodConnect | MethodOptions | MethodTrace | MethodPatch | MethodOther; +export interface MethodGet { + tag: 'get', +} +export interface MethodHead { + tag: 'head', +} +export interface MethodPost { + tag: 'post', +} +export interface MethodPut { + tag: 'put', +} +export interface MethodDelete { + tag: 'delete', +} +export interface MethodConnect { + tag: 'connect', +} +export interface MethodOptions { + tag: 'options', +} +export interface MethodTrace { + tag: 'trace', +} +export interface MethodPatch { + tag: 'patch', +} +export interface MethodOther { + tag: 'other', + val: string, +} +/** + * This type corresponds to HTTP standard Related Schemes. + */ +export type Scheme = SchemeHttp | SchemeHttps | SchemeOther; +export interface SchemeHttp { + tag: 'HTTP', +} +export interface SchemeHttps { + tag: 'HTTPS', +} +export interface SchemeOther { + tag: 'other', + val: string, +} +/** + * Defines the case payload type for `DNS-error` above: + */ +export interface DnsErrorPayload { + rcode?: string, + infoCode?: number, +} +/** + * Defines the case payload type for `TLS-alert-received` above: + */ +export interface TlsAlertReceivedPayload { + alertId?: number, + alertMessage?: string, +} +/** + * Defines the case payload type for `HTTP-response-{header,trailer}-size` above: + */ +export interface FieldSizePayload { + fieldName?: string, + fieldSize?: number, +} +/** + * These cases are inspired by the IANA HTTP Proxy Error Types: + * https://www.iana.org/assignments/http-proxy-status/http-proxy-status.xhtml#table-http-proxy-error-types + */ +export type ErrorCode = ErrorCodeDnsTimeout | ErrorCodeDnsError | ErrorCodeDestinationNotFound | ErrorCodeDestinationUnavailable | ErrorCodeDestinationIpProhibited | ErrorCodeDestinationIpUnroutable | ErrorCodeConnectionRefused | ErrorCodeConnectionTerminated | ErrorCodeConnectionTimeout | ErrorCodeConnectionReadTimeout | ErrorCodeConnectionWriteTimeout | ErrorCodeConnectionLimitReached | ErrorCodeTlsProtocolError | ErrorCodeTlsCertificateError | ErrorCodeTlsAlertReceived | ErrorCodeHttpRequestDenied | ErrorCodeHttpRequestLengthRequired | ErrorCodeHttpRequestBodySize | ErrorCodeHttpRequestMethodInvalid | ErrorCodeHttpRequestUriInvalid | ErrorCodeHttpRequestUriTooLong | ErrorCodeHttpRequestHeaderSectionSize | ErrorCodeHttpRequestHeaderSize | ErrorCodeHttpRequestTrailerSectionSize | ErrorCodeHttpRequestTrailerSize | ErrorCodeHttpResponseIncomplete | ErrorCodeHttpResponseHeaderSectionSize | ErrorCodeHttpResponseHeaderSize | ErrorCodeHttpResponseBodySize | ErrorCodeHttpResponseTrailerSectionSize | ErrorCodeHttpResponseTrailerSize | ErrorCodeHttpResponseTransferCoding | ErrorCodeHttpResponseContentCoding | ErrorCodeHttpResponseTimeout | ErrorCodeHttpUpgradeFailed | ErrorCodeHttpProtocolError | ErrorCodeLoopDetected | ErrorCodeConfigurationError | ErrorCodeInternalError; +export interface ErrorCodeDnsTimeout { + tag: 'DNS-timeout', +} +export interface ErrorCodeDnsError { + tag: 'DNS-error', + val: DnsErrorPayload, +} +export interface ErrorCodeDestinationNotFound { + tag: 'destination-not-found', +} +export interface ErrorCodeDestinationUnavailable { + tag: 'destination-unavailable', +} +export interface ErrorCodeDestinationIpProhibited { + tag: 'destination-IP-prohibited', +} +export interface ErrorCodeDestinationIpUnroutable { + tag: 'destination-IP-unroutable', +} +export interface ErrorCodeConnectionRefused { + tag: 'connection-refused', +} +export interface ErrorCodeConnectionTerminated { + tag: 'connection-terminated', +} +export interface ErrorCodeConnectionTimeout { + tag: 'connection-timeout', +} +export interface ErrorCodeConnectionReadTimeout { + tag: 'connection-read-timeout', +} +export interface ErrorCodeConnectionWriteTimeout { + tag: 'connection-write-timeout', +} +export interface ErrorCodeConnectionLimitReached { + tag: 'connection-limit-reached', +} +export interface ErrorCodeTlsProtocolError { + tag: 'TLS-protocol-error', +} +export interface ErrorCodeTlsCertificateError { + tag: 'TLS-certificate-error', +} +export interface ErrorCodeTlsAlertReceived { + tag: 'TLS-alert-received', + val: TlsAlertReceivedPayload, +} +export interface ErrorCodeHttpRequestDenied { + tag: 'HTTP-request-denied', +} +export interface ErrorCodeHttpRequestLengthRequired { + tag: 'HTTP-request-length-required', +} +export interface ErrorCodeHttpRequestBodySize { + tag: 'HTTP-request-body-size', + val: bigint | undefined, +} +export interface ErrorCodeHttpRequestMethodInvalid { + tag: 'HTTP-request-method-invalid', +} +export interface ErrorCodeHttpRequestUriInvalid { + tag: 'HTTP-request-URI-invalid', +} +export interface ErrorCodeHttpRequestUriTooLong { + tag: 'HTTP-request-URI-too-long', +} +export interface ErrorCodeHttpRequestHeaderSectionSize { + tag: 'HTTP-request-header-section-size', + val: number | undefined, +} +export interface ErrorCodeHttpRequestHeaderSize { + tag: 'HTTP-request-header-size', + val: FieldSizePayload | undefined, +} +export interface ErrorCodeHttpRequestTrailerSectionSize { + tag: 'HTTP-request-trailer-section-size', + val: number | undefined, +} +export interface ErrorCodeHttpRequestTrailerSize { + tag: 'HTTP-request-trailer-size', + val: FieldSizePayload, +} +export interface ErrorCodeHttpResponseIncomplete { + tag: 'HTTP-response-incomplete', +} +export interface ErrorCodeHttpResponseHeaderSectionSize { + tag: 'HTTP-response-header-section-size', + val: number | undefined, +} +export interface ErrorCodeHttpResponseHeaderSize { + tag: 'HTTP-response-header-size', + val: FieldSizePayload, +} +export interface ErrorCodeHttpResponseBodySize { + tag: 'HTTP-response-body-size', + val: bigint | undefined, +} +export interface ErrorCodeHttpResponseTrailerSectionSize { + tag: 'HTTP-response-trailer-section-size', + val: number | undefined, +} +export interface ErrorCodeHttpResponseTrailerSize { + tag: 'HTTP-response-trailer-size', + val: FieldSizePayload, +} +export interface ErrorCodeHttpResponseTransferCoding { + tag: 'HTTP-response-transfer-coding', + val: string | undefined, +} +export interface ErrorCodeHttpResponseContentCoding { + tag: 'HTTP-response-content-coding', + val: string | undefined, +} +export interface ErrorCodeHttpResponseTimeout { + tag: 'HTTP-response-timeout', +} +export interface ErrorCodeHttpUpgradeFailed { + tag: 'HTTP-upgrade-failed', +} +export interface ErrorCodeHttpProtocolError { + tag: 'HTTP-protocol-error', +} +export interface ErrorCodeLoopDetected { + tag: 'loop-detected', +} +export interface ErrorCodeConfigurationError { + tag: 'configuration-error', +} +/** + * This is a catch-all error for anything that doesn't fit cleanly into a + * more specific case. It also includes an optional string for an + * unstructured description of the error. Users should not depend on the + * string for diagnosing errors, as it's not required to be consistent + * between implementations. + */ +export interface ErrorCodeInternalError { + tag: 'internal-error', + val: string | undefined, +} +/** + * This type enumerates the different kinds of errors that may occur when + * setting or appending to a `fields` resource. + */ +export type HeaderError = HeaderErrorInvalidSyntax | HeaderErrorForbidden | HeaderErrorImmutable; +/** + * This error indicates that a `field-key` or `field-value` was + * syntactically invalid when used with an operation that sets headers in a + * `fields`. + */ +export interface HeaderErrorInvalidSyntax { + tag: 'invalid-syntax', +} +/** + * This error indicates that a forbidden `field-key` was used when trying + * to set a header in a `fields`. + */ +export interface HeaderErrorForbidden { + tag: 'forbidden', +} +/** + * This error indicates that the operation on the `fields` was not + * permitted because the fields are immutable. + */ +export interface HeaderErrorImmutable { + tag: 'immutable', +} +/** + * Field keys are always strings. + */ +export type FieldKey = string; +/** + * Field values should always be ASCII strings. However, in + * reality, HTTP implementations often have to interpret malformed values, + * so they are provided as a list of bytes. + */ +export type FieldValue = Uint8Array; +/** + * Headers is an alias for Fields. + */ +export type Headers = Fields; +/** + * Trailers is an alias for Fields. + */ +export type Trailers = Fields; +/** + * This type corresponds to the HTTP standard Status Code. + */ +export type StatusCode = number; +export type Result = { tag: 'ok', val: T } | { tag: 'err', val: E }; + +export class Fields { + /** + * Construct an empty HTTP Fields. + * + * The resulting `fields` is mutable. + */ + constructor() + /** + * Construct an HTTP Fields. + * + * The resulting `fields` is mutable. + * + * The list represents each key-value pair in the Fields. Keys + * which have multiple values are represented by multiple entries in this + * list with the same key. + * + * The tuple is a pair of the field key, represented as a string, and + * Value, represented as a list of bytes. + * + * An error result will be returned if any `field-key` or `field-value` is + * syntactically invalid, or if a field is forbidden. + */ + static fromList(entries: Array<[FieldKey, FieldValue]>): Fields; + /** + * Get all of the values corresponding to a key. If the key is not present + * in this `fields` or is syntactically invalid, an empty list is returned. + * However, if the key is present but empty, this is represented by a list + * with one or more empty field-values present. + */ + get(name: FieldKey): Array; + /** + * Returns `true` when the key is present in this `fields`. If the key is + * syntactically invalid, `false` is returned. + */ + has(name: FieldKey): boolean; + /** + * Set all of the values for a key. Clears any existing values for that + * key, if they have been set. + * + * Fails with `header-error.immutable` if the `fields` are immutable. + * + * Fails with `header-error.invalid-syntax` if the `field-key` or any of + * the `field-value`s are syntactically invalid. + */ + set(name: FieldKey, value: Array): void; + /** + * Delete all values for a key. Does nothing if no values for the key + * exist. + * + * Fails with `header-error.immutable` if the `fields` are immutable. + * + * Fails with `header-error.invalid-syntax` if the `field-key` is + * syntactically invalid. + */ + 'delete'(name: FieldKey): void; + /** + * Append a value for a key. Does not change or delete any existing + * values for that key. + * + * Fails with `header-error.immutable` if the `fields` are immutable. + * + * Fails with `header-error.invalid-syntax` if the `field-key` or + * `field-value` are syntactically invalid. + */ + append(name: FieldKey, value: FieldValue): void; + /** + * Retrieve the full set of keys and values in the Fields. Like the + * constructor, the list represents each key-value pair. + * + * The outer list represents each key-value pair in the Fields. Keys + * which have multiple values are represented by multiple entries in this + * list with the same key. + */ + entries(): Array<[FieldKey, FieldValue]>; + /** + * Make a deep copy of the Fields. Equivalent in behavior to calling the + * `fields` constructor on the return value of `entries`. The resulting + * `fields` is mutable. + */ + clone(): Fields; +} + +export class FutureIncomingResponse { + /** + * Returns a pollable which becomes ready when either the Response has + * been received, or an error has occurred. When this pollable is ready, + * the `get` method will return `some`. + */ + subscribe(): Pollable; + /** + * Returns the incoming HTTP Response, or an error, once one is ready. + * + * The outer `option` represents future readiness. Users can wait on this + * `option` to become `some` using the `subscribe` method. + * + * The outer `result` is used to retrieve the response or error at most + * once. It will be success on the first call in which the outer option + * is `some`, and error on subsequent calls. + * + * The inner `result` represents that either the incoming HTTP Response + * status and headers have received successfully, or that an error + * occurred. Errors may also occur while consuming the response body, + * but those will be reported by the `incoming-body` and its + * `output-stream` child. + */ + get(): Result, void> | undefined; +} + +export class FutureTrailers { + /** + * Returns a pollable which becomes ready when either the trailers have + * been received, or an error has occurred. When this pollable is ready, + * the `get` method will return `some`. + */ + subscribe(): Pollable; + /** + * Returns the contents of the trailers, or an error which occurred, + * once the future is ready. + * + * The outer `option` represents future readiness. Users can wait on this + * `option` to become `some` using the `subscribe` method. + * + * The outer `result` is used to retrieve the trailers or error at most + * once. It will be success on the first call in which the outer option + * is `some`, and error on subsequent calls. + * + * The inner `result` represents that either the HTTP Request or Response + * body, as well as any trailers, were received successfully, or that an + * error occurred receiving them. The optional `trailers` indicates whether + * or not trailers were present in the body. + * + * When some `trailers` are returned by this method, the `trailers` + * resource is immutable, and a child. Use of the `set`, `append`, or + * `delete` methods will return an error, and the resource must be + * dropped before the parent `future-trailers` is dropped. + */ + get(): Result, void> | undefined; +} + +export class IncomingBody { + /** + * Returns the contents of the body, as a stream of bytes. + * + * Returns success on first call: the stream representing the contents + * can be retrieved at most once. Subsequent calls will return error. + * + * The returned `input-stream` resource is a child: it must be dropped + * before the parent `incoming-body` is dropped, or consumed by + * `incoming-body.finish`. + * + * This invariant ensures that the implementation can determine whether + * the user is consuming the contents of the body, waiting on the + * `future-trailers` to be ready, or neither. This allows for network + * backpressure is to be applied when the user is consuming the body, + * and for that backpressure to not inhibit delivery of the trailers if + * the user does not read the entire body. + */ + stream(): InputStream; + /** + * Takes ownership of `incoming-body`, and returns a `future-trailers`. + * This function will trap if the `input-stream` child is still alive. + */ + static finish(this_: IncomingBody): FutureTrailers; +} + +export class IncomingRequest { + /** + * Returns the method of the incoming request. + */ + method(): Method; + /** + * Returns the path with query parameters from the request, as a string. + */ + pathWithQuery(): string | undefined; + /** + * Returns the protocol scheme from the request. + */ + scheme(): Scheme | undefined; + /** + * Returns the authority of the Request's target URI, if present. + */ + authority(): string | undefined; + /** + * Get the `headers` associated with the request. + * + * The returned `headers` resource is immutable: `set`, `append`, and + * `delete` operations will fail with `header-error.immutable`. + * + * The `headers` returned are a child resource: it must be dropped before + * the parent `incoming-request` is dropped. Dropping this + * `incoming-request` before all children are dropped will trap. + */ + headers(): Headers; + /** + * Gives the `incoming-body` associated with this request. Will only + * return success at most once, and subsequent calls will return error. + */ + consume(): IncomingBody; +} + +export class IncomingResponse { + /** + * Returns the status code from the incoming response. + */ + status(): StatusCode; + /** + * Returns the headers from the incoming response. + * + * The returned `headers` resource is immutable: `set`, `append`, and + * `delete` operations will fail with `header-error.immutable`. + * + * This headers resource is a child: it must be dropped before the parent + * `incoming-response` is dropped. + */ + headers(): Headers; + /** + * Returns the incoming body. May be called at most once. Returns error + * if called additional times. + */ + consume(): IncomingBody; +} + +export class OutgoingBody { + /** + * Returns a stream for writing the body contents. + * + * The returned `output-stream` is a child resource: it must be dropped + * before the parent `outgoing-body` resource is dropped (or finished), + * otherwise the `outgoing-body` drop or `finish` will trap. + * + * Returns success on the first call: the `output-stream` resource for + * this `outgoing-body` may be retrieved at most once. Subsequent calls + * will return error. + */ + write(): OutputStream; + /** + * Finalize an outgoing body, optionally providing trailers. This must be + * called to signal that the response is complete. If the `outgoing-body` + * is dropped without calling `outgoing-body.finalize`, the implementation + * should treat the body as corrupted. + * + * Fails if the body's `outgoing-request` or `outgoing-response` was + * constructed with a Content-Length header, and the contents written + * to the body (via `write`) does not match the value given in the + * Content-Length. + */ + static finish(this_: OutgoingBody, trailers: Trailers | undefined): void; +} + +export class OutgoingRequest { + /** + * Construct a new `outgoing-request` with a default `method` of `GET`, and + * `none` values for `path-with-query`, `scheme`, and `authority`. + * + * * `headers` is the HTTP Headers for the Request. + * + * It is possible to construct, or manipulate with the accessor functions + * below, an `outgoing-request` with an invalid combination of `scheme` + * and `authority`, or `headers` which are not permitted to be sent. + * It is the obligation of the `outgoing-handler.handle` implementation + * to reject invalid constructions of `outgoing-request`. + */ + constructor(headers: Headers) + /** + * Returns the resource corresponding to the outgoing Body for this + * Request. + * + * Returns success on the first call: the `outgoing-body` resource for + * this `outgoing-request` can be retrieved at most once. Subsequent + * calls will return error. + */ + body(): OutgoingBody; + /** + * Get the Method for the Request. + */ + method(): Method; + /** + * Set the Method for the Request. Fails if the string present in a + * `method.other` argument is not a syntactically valid method. + */ + setMethod(method: Method): void; + /** + * Get the combination of the HTTP Path and Query for the Request. + * When `none`, this represents an empty Path and empty Query. + */ + pathWithQuery(): string | undefined; + /** + * Set the combination of the HTTP Path and Query for the Request. + * When `none`, this represents an empty Path and empty Query. Fails is the + * string given is not a syntactically valid path and query uri component. + */ + setPathWithQuery(pathWithQuery: string | undefined): void; + /** + * Get the HTTP Related Scheme for the Request. When `none`, the + * implementation may choose an appropriate default scheme. + */ + scheme(): Scheme | undefined; + /** + * Set the HTTP Related Scheme for the Request. When `none`, the + * implementation may choose an appropriate default scheme. Fails if the + * string given is not a syntactically valid uri scheme. + */ + setScheme(scheme: Scheme | undefined): void; + /** + * Get the authority of the Request's target URI. A value of `none` may be used + * with Related Schemes which do not require an authority. The HTTP and + * HTTPS schemes always require an authority. + */ + authority(): string | undefined; + /** + * Set the authority of the Request's target URI. A value of `none` may be used + * with Related Schemes which do not require an authority. The HTTP and + * HTTPS schemes always require an authority. Fails if the string given is + * not a syntactically valid URI authority. + */ + setAuthority(authority: string | undefined): void; + /** + * Get the headers associated with the Request. + * + * The returned `headers` resource is immutable: `set`, `append`, and + * `delete` operations will fail with `header-error.immutable`. + * + * This headers resource is a child: it must be dropped before the parent + * `outgoing-request` is dropped, or its ownership is transferred to + * another component by e.g. `outgoing-handler.handle`. + */ + headers(): Headers; +} + +export class OutgoingResponse { + /** + * Construct an `outgoing-response`, with a default `status-code` of `200`. + * If a different `status-code` is needed, it must be set via the + * `set-status-code` method. + * + * * `headers` is the HTTP Headers for the Response. + */ + constructor(headers: Headers) + /** + * Get the HTTP Status Code for the Response. + */ + statusCode(): StatusCode; + /** + * Set the HTTP Status Code for the Response. Fails if the status-code + * given is not a valid http status code. + */ + setStatusCode(statusCode: StatusCode): void; + /** + * Get the headers associated with the Request. + * + * The returned `headers` resource is immutable: `set`, `append`, and + * `delete` operations will fail with `header-error.immutable`. + * + * This headers resource is a child: it must be dropped before the parent + * `outgoing-request` is dropped, or its ownership is transferred to + * another component by e.g. `outgoing-handler.handle`. + */ + headers(): Headers; + /** + * Returns the resource corresponding to the outgoing Body for this Response. + * + * Returns success on the first call: the `outgoing-body` resource for + * this `outgoing-response` can be retrieved at most once. Subsequent + * calls will return error. + */ + body(): OutgoingBody; +} + +export class RequestOptions { + /** + * Construct a default `request-options` value. + */ + constructor() + /** + * The timeout for the initial connect to the HTTP Server. + */ + connectTimeout(): Duration | undefined; + /** + * Set the timeout for the initial connect to the HTTP Server. An error + * return value indicates that this timeout is not supported. + */ + setConnectTimeout(duration: Duration | undefined): void; + /** + * The timeout for receiving the first byte of the Response body. + */ + firstByteTimeout(): Duration | undefined; + /** + * Set the timeout for receiving the first byte of the Response body. An + * error return value indicates that this timeout is not supported. + */ + setFirstByteTimeout(duration: Duration | undefined): void; + /** + * The timeout for receiving subsequent chunks of bytes in the Response + * body stream. + */ + betweenBytesTimeout(): Duration | undefined; + /** + * Set the timeout for receiving subsequent chunks of bytes in the Response + * body stream. An error return value indicates that this timeout is not + * supported. + */ + setBetweenBytesTimeout(duration: Duration | undefined): void; +} + +export class ResponseOutparam { + /** + * Set the value of the `response-outparam` to either send a response, + * or indicate an error. + * + * This method consumes the `response-outparam` to ensure that it is + * called at most once. If it is never called, the implementation + * will respond with an error. + * + * The user may provide an `error` to `response` to allow the + * implementation determine how to respond with an HTTP error response. + */ + static set(param: ResponseOutparam, response: Result): void; +} diff --git a/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-io-error.d.ts b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-io-error.d.ts new file mode 100644 index 0000000..e0dbb1c --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-io-error.d.ts @@ -0,0 +1,16 @@ +export namespace WasiIoError { + export { Error }; +} + +export class Error { + /** + * Returns a string that is suitable to assist humans in debugging + * this error. + * + * WARNING: The returned string should not be consumed mechanically! + * It may change across platforms, hosts, or other implementation + * details. Parsing this string is a major platform-compatibility + * hazard. + */ + toDebugString(): string; +} diff --git a/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-io-poll.d.ts b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-io-poll.d.ts new file mode 100644 index 0000000..1e8bdb0 --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-io-poll.d.ts @@ -0,0 +1,42 @@ +export namespace WasiIoPoll { + export { Pollable }; + /** + * Poll for completion on a set of pollables. + * + * This function takes a list of pollables, which identify I/O sources of + * interest, and waits until one or more of the events is ready for I/O. + * + * The result `list` contains one or more indices of handles in the + * argument list that is ready for I/O. + * + * This function traps if either: + * - the list is empty, or: + * - the list contains more elements than can be indexed with a `u32` value. + * + * A timeout can be implemented by adding a pollable from the + * wasi-clocks API to the list. + * + * This function does not return a `result`; polling in itself does not + * do any I/O so it doesn't fail. If any of the I/O sources identified by + * the pollables has an error, it is indicated by marking the source as + * being ready for I/O. + */ + export function poll(in_: Array): Uint32Array; +} + +export class Pollable { + /** + * Return the readiness of a pollable. This function never blocks. + * + * Returns `true` when the pollable is ready, and `false` otherwise. + */ + ready(): boolean; + /** + * `block` returns immediately if the pollable is ready, and otherwise + * blocks until ready. + * + * This function is equivalent to calling `poll.poll` on a list + * containing only this pollable. + */ + block(): void; +} diff --git a/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-io-streams.d.ts b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-io-streams.d.ts new file mode 100644 index 0000000..a525576 --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-io-streams.d.ts @@ -0,0 +1,237 @@ +export namespace WasiIoStreams { + export { InputStream }; + export { OutputStream }; +} +import type { Error } from './wasi-io-error.js'; +export { Error }; +import type { Pollable } from './wasi-io-poll.js'; +export { Pollable }; +/** + * An error for input-stream and output-stream operations. + */ +export type StreamError = StreamErrorLastOperationFailed | StreamErrorClosed; +/** + * The last operation (a write or flush) failed before completion. + * + * More information is available in the `error` payload. + */ +export interface StreamErrorLastOperationFailed { + tag: 'last-operation-failed', + val: Error, +} +/** + * The stream is closed: no more input will be accepted by the + * stream. A closed output-stream will return this error on all + * future operations. + */ +export interface StreamErrorClosed { + tag: 'closed', +} + +export class InputStream { + /** + * Perform a non-blocking read from the stream. + * + * When the source of a `read` is binary data, the bytes from the source + * are returned verbatim. When the source of a `read` is known to the + * implementation to be text, bytes containing the UTF-8 encoding of the + * text are returned. + * + * This function returns a list of bytes containing the read data, + * when successful. The returned list will contain up to `len` bytes; + * it may return fewer than requested, but not more. The list is + * empty when no bytes are available for reading at this time. The + * pollable given by `subscribe` will be ready when more bytes are + * available. + * + * This function fails with a `stream-error` when the operation + * encounters an error, giving `last-operation-failed`, or when the + * stream is closed, giving `closed`. + * + * When the caller gives a `len` of 0, it represents a request to + * read 0 bytes. If the stream is still open, this call should + * succeed and return an empty list, or otherwise fail with `closed`. + * + * The `len` parameter is a `u64`, which could represent a list of u8 which + * is not possible to allocate in wasm32, or not desirable to allocate as + * as a return value by the callee. The callee may return a list of bytes + * less than `len` in size while more bytes are available for reading. + */ + read(len: bigint): Uint8Array; + /** + * Read bytes from a stream, after blocking until at least one byte can + * be read. Except for blocking, behavior is identical to `read`. + */ + blockingRead(len: bigint): Uint8Array; + /** + * Skip bytes from a stream. Returns number of bytes skipped. + * + * Behaves identical to `read`, except instead of returning a list + * of bytes, returns the number of bytes consumed from the stream. + */ + skip(len: bigint): bigint; + /** + * Skip bytes from a stream, after blocking until at least one byte + * can be skipped. Except for blocking behavior, identical to `skip`. + */ + blockingSkip(len: bigint): bigint; + /** + * Create a `pollable` which will resolve once either the specified stream + * has bytes available to read or the other end of the stream has been + * closed. + * The created `pollable` is a child resource of the `input-stream`. + * Implementations may trap if the `input-stream` is dropped before + * all derived `pollable`s created with this function are dropped. + */ + subscribe(): Pollable; +} + +export class OutputStream { + /** + * Check readiness for writing. This function never blocks. + * + * Returns the number of bytes permitted for the next call to `write`, + * or an error. Calling `write` with more bytes than this function has + * permitted will trap. + * + * When this function returns 0 bytes, the `subscribe` pollable will + * become ready when this function will report at least 1 byte, or an + * error. + */ + checkWrite(): bigint; + /** + * Perform a write. This function never blocks. + * + * When the destination of a `write` is binary data, the bytes from + * `contents` are written verbatim. When the destination of a `write` is + * known to the implementation to be text, the bytes of `contents` are + * transcoded from UTF-8 into the encoding of the destination and then + * written. + * + * Precondition: check-write gave permit of Ok(n) and contents has a + * length of less than or equal to n. Otherwise, this function will trap. + * + * returns Err(closed) without writing if the stream has closed since + * the last call to check-write provided a permit. + */ + write(contents: Uint8Array): void; + /** + * Perform a write of up to 4096 bytes, and then flush the stream. Block + * until all of these operations are complete, or an error occurs. + * + * This is a convenience wrapper around the use of `check-write`, + * `subscribe`, `write`, and `flush`, and is implemented with the + * following pseudo-code: + * + * ```text + * let pollable = this.subscribe(); + * while !contents.is_empty() { + * // Wait for the stream to become writable + * pollable.block(); + * let Ok(n) = this.check-write(); // eliding error handling + * let len = min(n, contents.len()); + * let (chunk, rest) = contents.split_at(len); + * this.write(chunk ); // eliding error handling + * contents = rest; + * } + * this.flush(); + * // Wait for completion of `flush` + * pollable.block(); + * // Check for any errors that arose during `flush` + * let _ = this.check-write(); // eliding error handling + * ``` + */ + blockingWriteAndFlush(contents: Uint8Array): void; + /** + * Request to flush buffered output. This function never blocks. + * + * This tells the output-stream that the caller intends any buffered + * output to be flushed. the output which is expected to be flushed + * is all that has been passed to `write` prior to this call. + * + * Upon calling this function, the `output-stream` will not accept any + * writes (`check-write` will return `ok(0)`) until the flush has + * completed. The `subscribe` pollable will become ready when the + * flush has completed and the stream can accept more writes. + */ + flush(): void; + /** + * Request to flush buffered output, and block until flush completes + * and stream is ready for writing again. + */ + blockingFlush(): void; + /** + * Create a `pollable` which will resolve once the output-stream + * is ready for more writing, or an error has occurred. When this + * pollable is ready, `check-write` will return `ok(n)` with n>0, or an + * error. + * + * If the stream is closed, this pollable is always ready immediately. + * + * The created `pollable` is a child resource of the `output-stream`. + * Implementations may trap if the `output-stream` is dropped before + * all derived `pollable`s created with this function are dropped. + */ + subscribe(): Pollable; + /** + * Write zeroes to a stream. + * + * This should be used precisely like `write` with the exact same + * preconditions (must use check-write first), but instead of + * passing a list of bytes, you simply pass the number of zero-bytes + * that should be written. + */ + writeZeroes(len: bigint): void; + /** + * Perform a write of up to 4096 zeroes, and then flush the stream. + * Block until all of these operations are complete, or an error + * occurs. + * + * This is a convenience wrapper around the use of `check-write`, + * `subscribe`, `write-zeroes`, and `flush`, and is implemented with + * the following pseudo-code: + * + * ```text + * let pollable = this.subscribe(); + * while num_zeroes != 0 { + * // Wait for the stream to become writable + * pollable.block(); + * let Ok(n) = this.check-write(); // eliding error handling + * let len = min(n, num_zeroes); + * this.write-zeroes(len); // eliding error handling + * num_zeroes -= len; + * } + * this.flush(); + * // Wait for completion of `flush` + * pollable.block(); + * // Check for any errors that arose during `flush` + * let _ = this.check-write(); // eliding error handling + * ``` + */ + blockingWriteZeroesAndFlush(len: bigint): void; + /** + * Read from one stream and write to another. + * + * The behavior of splice is equivalent to: + * 1. calling `check-write` on the `output-stream` + * 2. calling `read` on the `input-stream` with the smaller of the + * `check-write` permitted length and the `len` provided to `splice` + * 3. calling `write` on the `output-stream` with that read data. + * + * Any error reported by the call to `check-write`, `read`, or + * `write` ends the splice and reports that error. + * + * This function returns the number of bytes transferred; it may be less + * than `len`. + */ + splice(src: InputStream, len: bigint): bigint; + /** + * Read from one stream and write to another, with blocking. + * + * This is similar to `splice`, except that it blocks until the + * `output-stream` is ready for writing, and the `input-stream` + * is ready for reading, before performing the `splice`. + */ + blockingSplice(src: InputStream, len: bigint): bigint; + } + \ No newline at end of file diff --git a/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-random-insecure-seed.d.ts b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-random-insecure-seed.d.ts new file mode 100644 index 0000000..816401c --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-random-insecure-seed.d.ts @@ -0,0 +1,22 @@ +export namespace WasiRandomInsecureSeed { + /** + * Return a 128-bit value that may contain a pseudo-random value. + * + * The returned value is not required to be computed from a CSPRNG, and may + * even be entirely deterministic. Host implementations are encouraged to + * provide pseudo-random values to any program exposed to + * attacker-controlled content, to enable DoS protection built into many + * languages' hash-map implementations. + * + * This function is intended to only be called once, by a source language + * to initialize Denial Of Service (DoS) protection in its hash-map + * implementation. + * + * # Expected future evolution + * + * This will likely be changed to a value import, to prevent it from being + * called multiple times and potentially used for purposes other than DoS + * protection. + */ + export function insecureSeed(): [bigint, bigint]; +} diff --git a/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-random-insecure.d.ts b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-random-insecure.d.ts new file mode 100644 index 0000000..a847eb2 --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-random-insecure.d.ts @@ -0,0 +1,20 @@ +export namespace WasiRandomInsecure { + /** + * Return `len` insecure pseudo-random bytes. + * + * This function is not cryptographically secure. Do not use it for + * anything related to security. + * + * There are no requirements on the values of the returned bytes, however + * implementations are encouraged to return evenly distributed values with + * a long period. + */ + export function getInsecureRandomBytes(len: bigint): Uint8Array; + /** + * Return an insecure pseudo-random `u64` value. + * + * This function returns the same type of pseudo-random data as + * `get-insecure-random-bytes`, represented as a `u64`. + */ + export function getInsecureRandomU64(): bigint; +} diff --git a/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-random-random.d.ts b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-random-random.d.ts new file mode 100644 index 0000000..0f4b1e1 --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-random-random.d.ts @@ -0,0 +1,24 @@ +export namespace WasiRandomRandom { + /** + * Return `len` cryptographically-secure random or pseudo-random bytes. + * + * This function must produce data at least as cryptographically secure and + * fast as an adequately seeded cryptographically-secure pseudo-random + * number generator (CSPRNG). It must not block, from the perspective of + * the calling program, under any circumstances, including on the first + * request and on requests for numbers of bytes. The returned data must + * always be unpredictable. + * + * This function must always return fresh data. Deterministic environments + * must omit this function, rather than implementing it with deterministic + * data. + */ + export function getRandomBytes(len: bigint): Uint8Array; + /** + * Return a cryptographically-secure random or pseudo-random `u64` value. + * + * This function returns the same type of data as `get-random-bytes`, + * represented as a `u64`. + */ + export function getRandomU64(): bigint; +} diff --git a/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-sockets-instance-network.d.ts b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-sockets-instance-network.d.ts new file mode 100644 index 0000000..b4ffbe1 --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-sockets-instance-network.d.ts @@ -0,0 +1,8 @@ +export namespace WasiSocketsInstanceNetwork { + /** + * Get a handle to the default network. + */ + export function instanceNetwork(): Network; +} +import type { Network } from './wasi-sockets-network.js'; +export { Network }; diff --git a/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-sockets-ip-name-lookup.d.ts b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-sockets-ip-name-lookup.d.ts new file mode 100644 index 0000000..3b1fb96 --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-sockets-ip-name-lookup.d.ts @@ -0,0 +1,60 @@ +export namespace WasiSocketsIpNameLookup { + /** + * Resolve an internet host name to a list of IP addresses. + * + * Unicode domain names are automatically converted to ASCII using IDNA encoding. + * If the input is an IP address string, the address is parsed and returned + * as-is without making any external requests. + * + * See the wasi-socket proposal README.md for a comparison with getaddrinfo. + * + * This function never blocks. It either immediately fails or immediately + * returns successfully with a `resolve-address-stream` that can be used + * to (asynchronously) fetch the results. + * + * # Typical errors + * - `invalid-argument`: `name` is a syntactically invalid domain name or IP address. + * + * # References: + * - + * - + * - + * - + */ + export function resolveAddresses(network: Network, name: string): ResolveAddressStream; + export { ResolveAddressStream }; +} +import type { Pollable } from './wasi-io-poll.js'; +export { Pollable }; +import type { Network } from './wasi-sockets-network.js'; +export { Network }; +import type { ErrorCode } from './wasi-sockets-network.js'; +export { ErrorCode }; +import type { IpAddress } from './wasi-sockets-network.js'; +export { IpAddress }; + +export class ResolveAddressStream { + /** + * Returns the next address from the resolver. + * + * This function should be called multiple times. On each call, it will + * return the next address in connection order preference. If all + * addresses have been exhausted, this function returns `none`. + * + * This function never returns IPv4-mapped IPv6 addresses. + * + * # Typical errors + * - `name-unresolvable`: Name does not exist or has no suitable associated IP addresses. (EAI_NONAME, EAI_NODATA, EAI_ADDRFAMILY) + * - `temporary-resolver-failure`: A temporary failure in name resolution occurred. (EAI_AGAIN) + * - `permanent-resolver-failure`: A permanent failure in name resolution occurred. (EAI_FAIL) + * - `would-block`: A result is not available yet. (EWOULDBLOCK, EAGAIN) + */ + resolveNextAddress(): IpAddress | undefined; + /** + * Create a `pollable` which will resolve once the stream is ready for I/O. + * + * Note: this function is here for WASI Preview2 only. + * It's planned to be removed when `future` is natively supported in Preview3. + */ + subscribe(): Pollable; +} diff --git a/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-sockets-network.d.ts b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-sockets-network.d.ts new file mode 100644 index 0000000..76547df --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-sockets-network.d.ts @@ -0,0 +1,162 @@ +export namespace WasiSocketsNetwork { + export { Network }; +} +/** + * Error codes. + * + * In theory, every API can return any error code. + * In practice, API's typically only return the errors documented per API + * combined with a couple of errors that are always possible: + * - `unknown` + * - `access-denied` + * - `not-supported` + * - `out-of-memory` + * - `concurrency-conflict` + * + * See each individual API for what the POSIX equivalents are. They sometimes differ per API. + * # Variants + * + * ## `"unknown"` + * + * Unknown error + * ## `"access-denied"` + * + * Access denied. + * + * POSIX equivalent: EACCES, EPERM + * ## `"not-supported"` + * + * The operation is not supported. + * + * POSIX equivalent: EOPNOTSUPP + * ## `"invalid-argument"` + * + * One of the arguments is invalid. + * + * POSIX equivalent: EINVAL + * ## `"out-of-memory"` + * + * Not enough memory to complete the operation. + * + * POSIX equivalent: ENOMEM, ENOBUFS, EAI_MEMORY + * ## `"timeout"` + * + * The operation timed out before it could finish completely. + * ## `"concurrency-conflict"` + * + * This operation is incompatible with another asynchronous operation that is already in progress. + * + * POSIX equivalent: EALREADY + * ## `"not-in-progress"` + * + * Trying to finish an asynchronous operation that: + * - has not been started yet, or: + * - was already finished by a previous `finish-*` call. + * + * Note: this is scheduled to be removed when `future`s are natively supported. + * ## `"would-block"` + * + * The operation has been aborted because it could not be completed immediately. + * + * Note: this is scheduled to be removed when `future`s are natively supported. + * ## `"invalid-state"` + * + * The operation is not valid in the socket's current state. + * ## `"new-socket-limit"` + * + * A new socket resource could not be created because of a system limit. + * ## `"address-not-bindable"` + * + * A bind operation failed because the provided address is not an address that the `network` can bind to. + * ## `"address-in-use"` + * + * A bind operation failed because the provided address is already in use or because there are no ephemeral ports available. + * ## `"remote-unreachable"` + * + * The remote address is not reachable + * ## `"connection-refused"` + * + * The TCP connection was forcefully rejected + * ## `"connection-reset"` + * + * The TCP connection was reset. + * ## `"connection-aborted"` + * + * A TCP connection was aborted. + * ## `"datagram-too-large"` + * + * The size of a datagram sent to a UDP socket exceeded the maximum + * supported size. + * ## `"name-unresolvable"` + * + * Name does not exist or has no suitable associated IP addresses. + * ## `"temporary-resolver-failure"` + * + * A temporary failure in name resolution occurred. + * ## `"permanent-resolver-failure"` + * + * A permanent failure in name resolution occurred. + */ +export type ErrorCode = 'unknown' | 'access-denied' | 'not-supported' | 'invalid-argument' | 'out-of-memory' | 'timeout' | 'concurrency-conflict' | 'not-in-progress' | 'would-block' | 'invalid-state' | 'new-socket-limit' | 'address-not-bindable' | 'address-in-use' | 'remote-unreachable' | 'connection-refused' | 'connection-reset' | 'connection-aborted' | 'datagram-too-large' | 'name-unresolvable' | 'temporary-resolver-failure' | 'permanent-resolver-failure'; +/** + * # Variants + * + * ## `"ipv4"` + * + * Similar to `AF_INET` in POSIX. + * ## `"ipv6"` + * + * Similar to `AF_INET6` in POSIX. + */ +export type IpAddressFamily = 'ipv4' | 'ipv6'; +export type Ipv4Address = [number, number, number, number]; +export type Ipv6Address = [number, number, number, number, number, number, number, number]; +export type IpAddress = IpAddressIpv4 | IpAddressIpv6; +export interface IpAddressIpv4 { + tag: 'ipv4', + val: Ipv4Address, +} +export interface IpAddressIpv6 { + tag: 'ipv6', + val: Ipv6Address, +} +export interface Ipv4SocketAddress { + /** + * sin_port + */ + port: number, + /** + * sin_addr + */ + address: Ipv4Address, +} +export interface Ipv6SocketAddress { + /** + * sin6_port + */ + port: number, + /** + * sin6_flowinfo + */ + flowInfo: number, + /** + * sin6_addr + */ + address: Ipv6Address, + /** + * sin6_scope_id + */ + scopeId: number, +} +export type IpSocketAddress = IpSocketAddressIpv4 | IpSocketAddressIpv6; +export interface IpSocketAddressIpv4 { + tag: 'ipv4', + val: Ipv4SocketAddress, +} +export interface IpSocketAddressIpv6 { + tag: 'ipv6', + val: Ipv6SocketAddress, +} + +export class Network { +} diff --git a/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-sockets-tcp-create-socket.d.ts b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-sockets-tcp-create-socket.d.ts new file mode 100644 index 0000000..33376d3 --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-sockets-tcp-create-socket.d.ts @@ -0,0 +1,33 @@ +export namespace WasiSocketsTcpCreateSocket { + /** + * Create a new TCP socket. + * + * Similar to `socket(AF_INET or AF_INET6, SOCK_STREAM, IPPROTO_TCP)` in POSIX. + * On IPv6 sockets, IPV6_V6ONLY is enabled by default and can't be configured otherwise. + * + * This function does not require a network capability handle. This is considered to be safe because + * at time of creation, the socket is not bound to any `network` yet. Up to the moment `bind`/`connect` + * is called, the socket is effectively an in-memory configuration object, unable to communicate with the outside world. + * + * All sockets are non-blocking. Use the wasi-poll interface to block on asynchronous operations. + * + * # Typical errors + * - `not-supported`: The specified `address-family` is not supported. (EAFNOSUPPORT) + * - `new-socket-limit`: The new socket resource could not be created because of a system limit. (EMFILE, ENFILE) + * + * # References + * - + * - + * - + * - + */ + export function createTcpSocket(addressFamily: IpAddressFamily): TcpSocket; +} +import type { Network } from './wasi-sockets-network.js'; +export { Network }; +import type { ErrorCode } from './wasi-sockets-network.js'; +export { ErrorCode }; +import type { IpAddressFamily } from './wasi-sockets-network.js'; +export { IpAddressFamily }; +import type { TcpSocket } from './wasi-sockets-tcp.js'; +export { TcpSocket }; diff --git a/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-sockets-tcp.d.ts b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-sockets-tcp.d.ts new file mode 100644 index 0000000..b6489bc --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-sockets-tcp.d.ts @@ -0,0 +1,365 @@ +export namespace WasiSocketsTcp { + export { TcpSocket }; +} +import type { InputStream } from './wasi-io-streams.js'; +export { InputStream }; +import type { OutputStream } from './wasi-io-streams.js'; +export { OutputStream }; +import type { Pollable } from './wasi-io-poll.js'; +export { Pollable }; +import type { Duration } from './wasi-clocks-monotonic-clock.js'; +export { Duration }; +import type { Network } from './wasi-sockets-network.js'; +export { Network }; +import type { ErrorCode } from './wasi-sockets-network.js'; +export { ErrorCode }; +import type { IpSocketAddress } from './wasi-sockets-network.js'; +export { IpSocketAddress }; +import type { IpAddressFamily } from './wasi-sockets-network.js'; +export { IpAddressFamily }; +/** + * # Variants + * + * ## `"receive"` + * + * Similar to `SHUT_RD` in POSIX. + * ## `"send"` + * + * Similar to `SHUT_WR` in POSIX. + * ## `"both"` + * + * Similar to `SHUT_RDWR` in POSIX. + */ +export type ShutdownType = 'receive' | 'send' | 'both'; + +export class TcpSocket { + /** + * Bind the socket to a specific network on the provided IP address and port. + * + * If the IP address is zero (`0.0.0.0` in IPv4, `::` in IPv6), it is left to the implementation to decide which + * network interface(s) to bind to. + * If the TCP/UDP port is zero, the socket will be bound to a random free port. + * + * Bind can be attempted multiple times on the same socket, even with + * different arguments on each iteration. But never concurrently and + * only as long as the previous bind failed. Once a bind succeeds, the + * binding can't be changed anymore. + * + * # Typical errors + * - `invalid-argument`: The `local-address` has the wrong address family. (EAFNOSUPPORT, EFAULT on Windows) + * - `invalid-argument`: `local-address` is not a unicast address. (EINVAL) + * - `invalid-argument`: `local-address` is an IPv4-mapped IPv6 address. (EINVAL) + * - `invalid-state`: The socket is already bound. (EINVAL) + * - `address-in-use`: No ephemeral ports available. (EADDRINUSE, ENOBUFS on Windows) + * - `address-in-use`: Address is already in use. (EADDRINUSE) + * - `address-not-bindable`: `local-address` is not an address that the `network` can bind to. (EADDRNOTAVAIL) + * - `not-in-progress`: A `bind` operation is not in progress. + * - `would-block`: Can't finish the operation, it is still in progress. (EWOULDBLOCK, EAGAIN) + * + * # Implementors note + * When binding to a non-zero port, this bind operation shouldn't be affected by the TIME_WAIT + * state of a recently closed socket on the same local address. In practice this means that the SO_REUSEADDR + * socket option should be set implicitly on all platforms, except on Windows where this is the default behavior + * and SO_REUSEADDR performs something different entirely. + * + * Unlike in POSIX, in WASI the bind operation is async. This enables + * interactive WASI hosts to inject permission prompts. Runtimes that + * don't want to make use of this ability can simply call the native + * `bind` as part of either `start-bind` or `finish-bind`. + * + * # References + * - + * - + * - + * - + */ + startBind(network: Network, localAddress: IpSocketAddress): void; + finishBind(): void; + /** + * Connect to a remote endpoint. + * + * On success: + * - the socket is transitioned into the `connected` state. + * - a pair of streams is returned that can be used to read & write to the connection + * + * After a failed connection attempt, the socket will be in the `closed` + * state and the only valid action left is to `drop` the socket. A single + * socket can not be used to connect more than once. + * + * # Typical errors + * - `invalid-argument`: The `remote-address` has the wrong address family. (EAFNOSUPPORT) + * - `invalid-argument`: `remote-address` is not a unicast address. (EINVAL, ENETUNREACH on Linux, EAFNOSUPPORT on MacOS) + * - `invalid-argument`: `remote-address` is an IPv4-mapped IPv6 address. (EINVAL, EADDRNOTAVAIL on Illumos) + * - `invalid-argument`: The IP address in `remote-address` is set to INADDR_ANY (`0.0.0.0` / `::`). (EADDRNOTAVAIL on Windows) + * - `invalid-argument`: The port in `remote-address` is set to 0. (EADDRNOTAVAIL on Windows) + * - `invalid-argument`: The socket is already attached to a different network. The `network` passed to `connect` must be identical to the one passed to `bind`. + * - `invalid-state`: The socket is already in the `connected` state. (EISCONN) + * - `invalid-state`: The socket is already in the `listening` state. (EOPNOTSUPP, EINVAL on Windows) + * - `timeout`: Connection timed out. (ETIMEDOUT) + * - `connection-refused`: The connection was forcefully rejected. (ECONNREFUSED) + * - `connection-reset`: The connection was reset. (ECONNRESET) + * - `connection-aborted`: The connection was aborted. (ECONNABORTED) + * - `remote-unreachable`: The remote address is not reachable. (EHOSTUNREACH, EHOSTDOWN, ENETUNREACH, ENETDOWN, ENONET) + * - `address-in-use`: Tried to perform an implicit bind, but there were no ephemeral ports available. (EADDRINUSE, EADDRNOTAVAIL on Linux, EAGAIN on BSD) + * - `not-in-progress`: A connect operation is not in progress. + * - `would-block`: Can't finish the operation, it is still in progress. (EWOULDBLOCK, EAGAIN) + * + * # Implementors note + * The POSIX equivalent of `start-connect` is the regular `connect` syscall. + * Because all WASI sockets are non-blocking this is expected to return + * EINPROGRESS, which should be translated to `ok()` in WASI. + * + * The POSIX equivalent of `finish-connect` is a `poll` for event `POLLOUT` + * with a timeout of 0 on the socket descriptor. Followed by a check for + * the `SO_ERROR` socket option, in case the poll signaled readiness. + * + * # References + * - + * - + * - + * - + */ + startConnect(network: Network, remoteAddress: IpSocketAddress): void; + finishConnect(): [InputStream, OutputStream]; + /** + * Start listening for new connections. + * + * Transitions the socket into the `listening` state. + * + * Unlike POSIX, the socket must already be explicitly bound. + * + * # Typical errors + * - `invalid-state`: The socket is not bound to any local address. (EDESTADDRREQ) + * - `invalid-state`: The socket is already in the `connected` state. (EISCONN, EINVAL on BSD) + * - `invalid-state`: The socket is already in the `listening` state. + * - `address-in-use`: Tried to perform an implicit bind, but there were no ephemeral ports available. (EADDRINUSE) + * - `not-in-progress`: A listen operation is not in progress. + * - `would-block`: Can't finish the operation, it is still in progress. (EWOULDBLOCK, EAGAIN) + * + * # Implementors note + * Unlike in POSIX, in WASI the listen operation is async. This enables + * interactive WASI hosts to inject permission prompts. Runtimes that + * don't want to make use of this ability can simply call the native + * `listen` as part of either `start-listen` or `finish-listen`. + * + * # References + * - + * - + * - + * - + */ + startListen(): void; + finishListen(): void; + /** + * Accept a new client socket. + * + * The returned socket is bound and in the `connected` state. The following properties are inherited from the listener socket: + * - `address-family` + * - `keep-alive-enabled` + * - `keep-alive-idle-time` + * - `keep-alive-interval` + * - `keep-alive-count` + * - `hop-limit` + * - `receive-buffer-size` + * - `send-buffer-size` + * + * On success, this function returns the newly accepted client socket along with + * a pair of streams that can be used to read & write to the connection. + * + * # Typical errors + * - `invalid-state`: Socket is not in the `listening` state. (EINVAL) + * - `would-block`: No pending connections at the moment. (EWOULDBLOCK, EAGAIN) + * - `connection-aborted`: An incoming connection was pending, but was terminated by the client before this listener could accept it. (ECONNABORTED) + * - `new-socket-limit`: The new socket resource could not be created because of a system limit. (EMFILE, ENFILE) + * + * # References + * - + * - + * - + * - + */ + accept(): [TcpSocket, InputStream, OutputStream]; + /** + * Get the bound local address. + * + * POSIX mentions: + * > If the socket has not been bound to a local name, the value + * > stored in the object pointed to by `address` is unspecified. + * + * WASI is stricter and requires `local-address` to return `invalid-state` when the socket hasn't been bound yet. + * + * # Typical errors + * - `invalid-state`: The socket is not bound to any local address. + * + * # References + * - + * - + * - + * - + */ + localAddress(): IpSocketAddress; + /** + * Get the remote address. + * + * # Typical errors + * - `invalid-state`: The socket is not connected to a remote address. (ENOTCONN) + * + * # References + * - + * - + * - + * - + */ + remoteAddress(): IpSocketAddress; + /** + * Whether the socket is in the `listening` state. + * + * Equivalent to the SO_ACCEPTCONN socket option. + */ + isListening(): boolean; + /** + * Whether this is a IPv4 or IPv6 socket. + * + * Equivalent to the SO_DOMAIN socket option. + */ + addressFamily(): IpAddressFamily; + /** + * Hints the desired listen queue size. Implementations are free to ignore this. + * + * If the provided value is 0, an `invalid-argument` error is returned. + * Any other value will never cause an error, but it might be silently clamped and/or rounded. + * + * # Typical errors + * - `not-supported`: (set) The platform does not support changing the backlog size after the initial listen. + * - `invalid-argument`: (set) The provided value was 0. + * - `invalid-state`: (set) The socket is in the `connect-in-progress` or `connected` state. + */ + setListenBacklogSize(value: bigint): void; + /** + * Enables or disables keepalive. + * + * The keepalive behavior can be adjusted using: + * - `keep-alive-idle-time` + * - `keep-alive-interval` + * - `keep-alive-count` + * These properties can be configured while `keep-alive-enabled` is false, but only come into effect when `keep-alive-enabled` is true. + * + * Equivalent to the SO_KEEPALIVE socket option. + */ + keepAliveEnabled(): boolean; + setKeepAliveEnabled(value: boolean): void; + /** + * Amount of time the connection has to be idle before TCP starts sending keepalive packets. + * + * If the provided value is 0, an `invalid-argument` error is returned. + * Any other value will never cause an error, but it might be silently clamped and/or rounded. + * I.e. after setting a value, reading the same setting back may return a different value. + * + * Equivalent to the TCP_KEEPIDLE socket option. (TCP_KEEPALIVE on MacOS) + * + * # Typical errors + * - `invalid-argument`: (set) The provided value was 0. + */ + keepAliveIdleTime(): Duration; + setKeepAliveIdleTime(value: Duration): void; + /** + * The time between keepalive packets. + * + * If the provided value is 0, an `invalid-argument` error is returned. + * Any other value will never cause an error, but it might be silently clamped and/or rounded. + * I.e. after setting a value, reading the same setting back may return a different value. + * + * Equivalent to the TCP_KEEPINTVL socket option. + * + * # Typical errors + * - `invalid-argument`: (set) The provided value was 0. + */ + keepAliveInterval(): Duration; + setKeepAliveInterval(value: Duration): void; + /** + * The maximum amount of keepalive packets TCP should send before aborting the connection. + * + * If the provided value is 0, an `invalid-argument` error is returned. + * Any other value will never cause an error, but it might be silently clamped and/or rounded. + * I.e. after setting a value, reading the same setting back may return a different value. + * + * Equivalent to the TCP_KEEPCNT socket option. + * + * # Typical errors + * - `invalid-argument`: (set) The provided value was 0. + */ + keepAliveCount(): number; + setKeepAliveCount(value: number): void; + /** + * Equivalent to the IP_TTL & IPV6_UNICAST_HOPS socket options. + * + * If the provided value is 0, an `invalid-argument` error is returned. + * + * # Typical errors + * - `invalid-argument`: (set) The TTL value must be 1 or higher. + */ + hopLimit(): number; + setHopLimit(value: number): void; + /** + * The kernel buffer space reserved for sends/receives on this socket. + * + * If the provided value is 0, an `invalid-argument` error is returned. + * Any other value will never cause an error, but it might be silently clamped and/or rounded. + * I.e. after setting a value, reading the same setting back may return a different value. + * + * Equivalent to the SO_RCVBUF and SO_SNDBUF socket options. + * + * # Typical errors + * - `invalid-argument`: (set) The provided value was 0. + */ + receiveBufferSize(): bigint; + setReceiveBufferSize(value: bigint): void; + sendBufferSize(): bigint; + setSendBufferSize(value: bigint): void; + /** + * Create a `pollable` which can be used to poll for, or block on, + * completion of any of the asynchronous operations of this socket. + * + * When `finish-bind`, `finish-listen`, `finish-connect` or `accept` + * return `error(would-block)`, this pollable can be used to wait for + * their success or failure, after which the method can be retried. + * + * The pollable is not limited to the async operation that happens to be + * in progress at the time of calling `subscribe` (if any). Theoretically, + * `subscribe` only has to be called once per socket and can then be + * (re)used for the remainder of the socket's lifetime. + * + * See + * for more information. + * + * Note: this function is here for WASI Preview2 only. + * It's planned to be removed when `future` is natively supported in Preview3. + */ + subscribe(): Pollable; + /** + * Initiate a graceful shutdown. + * + * - `receive`: The socket is not expecting to receive any data from + * the peer. The `input-stream` associated with this socket will be + * closed. Any data still in the receive queue at time of calling + * this method will be discarded. + * - `send`: The socket has no more data to send to the peer. The `output-stream` + * associated with this socket will be closed and a FIN packet will be sent. + * - `both`: Same effect as `receive` & `send` combined. + * + * This function is idempotent; shutting down a direction more than once + * has no effect and returns `ok`. + * + * The shutdown function does not close (drop) the socket. + * + * # Typical errors + * - `invalid-state`: The socket is not in the `connected` state. (ENOTCONN) + * + * # References + * - + * - + * - + * - + */ + shutdown(shutdownType: ShutdownType): void; +} diff --git a/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-sockets-udp-create-socket.d.ts b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-sockets-udp-create-socket.d.ts new file mode 100644 index 0000000..7e61655 --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-sockets-udp-create-socket.d.ts @@ -0,0 +1,33 @@ +export namespace WasiSocketsUdpCreateSocket { + /** + * Create a new UDP socket. + * + * Similar to `socket(AF_INET or AF_INET6, SOCK_DGRAM, IPPROTO_UDP)` in POSIX. + * On IPv6 sockets, IPV6_V6ONLY is enabled by default and can't be configured otherwise. + * + * This function does not require a network capability handle. This is considered to be safe because + * at time of creation, the socket is not bound to any `network` yet. Up to the moment `bind` is called, + * the socket is effectively an in-memory configuration object, unable to communicate with the outside world. + * + * All sockets are non-blocking. Use the wasi-poll interface to block on asynchronous operations. + * + * # Typical errors + * - `not-supported`: The specified `address-family` is not supported. (EAFNOSUPPORT) + * - `new-socket-limit`: The new socket resource could not be created because of a system limit. (EMFILE, ENFILE) + * + * # References: + * - + * - + * - + * - + */ + export function createUdpSocket(addressFamily: IpAddressFamily): UdpSocket; +} +import type { Network } from './wasi-sockets-network.js'; +export { Network }; +import type { ErrorCode } from './wasi-sockets-network.js'; +export { ErrorCode }; +import type { IpAddressFamily } from './wasi-sockets-network.js'; +export { IpAddressFamily }; +import type { UdpSocket } from './wasi-sockets-udp.js'; +export { UdpSocket }; diff --git a/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-sockets-udp.d.ts b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-sockets-udp.d.ts new file mode 100644 index 0000000..3ee21ef --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/types/interfaces/wasi-sockets-udp.d.ts @@ -0,0 +1,298 @@ +export namespace WasiSocketsUdp { + export { UdpSocket }; + export { IncomingDatagramStream }; + export { OutgoingDatagramStream }; +} +import type { Pollable } from './wasi-io-poll.js'; +export { Pollable }; +import type { Network } from './wasi-sockets-network.js'; +export { Network }; +import type { ErrorCode } from './wasi-sockets-network.js'; +export { ErrorCode }; +import type { IpSocketAddress } from './wasi-sockets-network.js'; +export { IpSocketAddress }; +import type { IpAddressFamily } from './wasi-sockets-network.js'; +export { IpAddressFamily }; +/** + * A received datagram. + */ +export interface IncomingDatagram { + /** + * The payload. + * + * Theoretical max size: ~64 KiB. In practice, typically less than 1500 bytes. + */ + data: Uint8Array, + /** + * The source address. + * + * This field is guaranteed to match the remote address the stream was initialized with, if any. + * + * Equivalent to the `src_addr` out parameter of `recvfrom`. + */ + remoteAddress: IpSocketAddress, +} +/** + * A datagram to be sent out. + */ +export interface OutgoingDatagram { + /** + * The payload. + */ + data: Uint8Array, + /** + * The destination address. + * + * The requirements on this field depend on how the stream was initialized: + * - with a remote address: this field must be None or match the stream's remote address exactly. + * - without a remote address: this field is required. + * + * If this value is None, the send operation is equivalent to `send` in POSIX. Otherwise it is equivalent to `sendto`. + */ + remoteAddress?: IpSocketAddress, +} + +export class IncomingDatagramStream { + /** + * Receive messages on the socket. + * + * This function attempts to receive up to `max-results` datagrams on the socket without blocking. + * The returned list may contain fewer elements than requested, but never more. + * + * This function returns successfully with an empty list when either: + * - `max-results` is 0, or: + * - `max-results` is greater than 0, but no results are immediately available. + * This function never returns `error(would-block)`. + * + * # Typical errors + * - `remote-unreachable`: The remote address is not reachable. (ECONNRESET, ENETRESET on Windows, EHOSTUNREACH, EHOSTDOWN, ENETUNREACH, ENETDOWN, ENONET) + * - `connection-refused`: The connection was refused. (ECONNREFUSED) + * + * # References + * - + * - + * - + * - + * - + * - + * - + * - + */ + receive(maxResults: bigint): Array; + /** + * Create a `pollable` which will resolve once the stream is ready to receive again. + * + * Note: this function is here for WASI Preview2 only. + * It's planned to be removed when `future` is natively supported in Preview3. + */ + subscribe(): Pollable; +} + +export class OutgoingDatagramStream { + /** + * Check readiness for sending. This function never blocks. + * + * Returns the number of datagrams permitted for the next call to `send`, + * or an error. Calling `send` with more datagrams than this function has + * permitted will trap. + * + * When this function returns ok(0), the `subscribe` pollable will + * become ready when this function will report at least ok(1), or an + * error. + * + * Never returns `would-block`. + */ + checkSend(): bigint; + /** + * Send messages on the socket. + * + * This function attempts to send all provided `datagrams` on the socket without blocking and + * returns how many messages were actually sent (or queued for sending). This function never + * returns `error(would-block)`. If none of the datagrams were able to be sent, `ok(0)` is returned. + * + * This function semantically behaves the same as iterating the `datagrams` list and sequentially + * sending each individual datagram until either the end of the list has been reached or the first error occurred. + * If at least one datagram has been sent successfully, this function never returns an error. + * + * If the input list is empty, the function returns `ok(0)`. + * + * Each call to `send` must be permitted by a preceding `check-send`. Implementations must trap if + * either `check-send` was not called or `datagrams` contains more items than `check-send` permitted. + * + * # Typical errors + * - `invalid-argument`: The `remote-address` has the wrong address family. (EAFNOSUPPORT) + * - `invalid-argument`: The IP address in `remote-address` is set to INADDR_ANY (`0.0.0.0` / `::`). (EDESTADDRREQ, EADDRNOTAVAIL) + * - `invalid-argument`: The port in `remote-address` is set to 0. (EDESTADDRREQ, EADDRNOTAVAIL) + * - `invalid-argument`: The socket is in "connected" mode and `remote-address` is `some` value that does not match the address passed to `stream`. (EISCONN) + * - `invalid-argument`: The socket is not "connected" and no value for `remote-address` was provided. (EDESTADDRREQ) + * - `remote-unreachable`: The remote address is not reachable. (ECONNRESET, ENETRESET on Windows, EHOSTUNREACH, EHOSTDOWN, ENETUNREACH, ENETDOWN, ENONET) + * - `connection-refused`: The connection was refused. (ECONNREFUSED) + * - `datagram-too-large`: The datagram is too large. (EMSGSIZE) + * + * # References + * - + * - + * - + * - + * - + * - + * - + * - + */ + send(datagrams: Array): bigint; + /** + * Create a `pollable` which will resolve once the stream is ready to send again. + * + * Note: this function is here for WASI Preview2 only. + * It's planned to be removed when `future` is natively supported in Preview3. + */ + subscribe(): Pollable; +} + +export class UdpSocket { + /** + * Bind the socket to a specific network on the provided IP address and port. + * + * If the IP address is zero (`0.0.0.0` in IPv4, `::` in IPv6), it is left to the implementation to decide which + * network interface(s) to bind to. + * If the port is zero, the socket will be bound to a random free port. + * + * # Typical errors + * - `invalid-argument`: The `local-address` has the wrong address family. (EAFNOSUPPORT, EFAULT on Windows) + * - `invalid-state`: The socket is already bound. (EINVAL) + * - `address-in-use`: No ephemeral ports available. (EADDRINUSE, ENOBUFS on Windows) + * - `address-in-use`: Address is already in use. (EADDRINUSE) + * - `address-not-bindable`: `local-address` is not an address that the `network` can bind to. (EADDRNOTAVAIL) + * - `not-in-progress`: A `bind` operation is not in progress. + * - `would-block`: Can't finish the operation, it is still in progress. (EWOULDBLOCK, EAGAIN) + * + * # Implementors note + * Unlike in POSIX, in WASI the bind operation is async. This enables + * interactive WASI hosts to inject permission prompts. Runtimes that + * don't want to make use of this ability can simply call the native + * `bind` as part of either `start-bind` or `finish-bind`. + * + * # References + * - + * - + * - + * - + */ + startBind(network: Network, localAddress: IpSocketAddress): void; + finishBind(): void; + /** + * Set up inbound & outbound communication channels, optionally to a specific peer. + * + * This function only changes the local socket configuration and does not generate any network traffic. + * On success, the `remote-address` of the socket is updated. The `local-address` may be updated as well, + * based on the best network path to `remote-address`. + * + * When a `remote-address` is provided, the returned streams are limited to communicating with that specific peer: + * - `send` can only be used to send to this destination. + * - `receive` will only return datagrams sent from the provided `remote-address`. + * + * This method may be called multiple times on the same socket to change its association, but + * only the most recently returned pair of streams will be operational. Implementations may trap if + * the streams returned by a previous invocation haven't been dropped yet before calling `stream` again. + * + * The POSIX equivalent in pseudo-code is: + * ```text + * if (was previously connected) { + * connect(s, AF_UNSPEC) + * } + * if (remote_address is Some) { + * connect(s, remote_address) + * } + * ``` + * + * Unlike in POSIX, the socket must already be explicitly bound. + * + * # Typical errors + * - `invalid-argument`: The `remote-address` has the wrong address family. (EAFNOSUPPORT) + * - `invalid-argument`: The IP address in `remote-address` is set to INADDR_ANY (`0.0.0.0` / `::`). (EDESTADDRREQ, EADDRNOTAVAIL) + * - `invalid-argument`: The port in `remote-address` is set to 0. (EDESTADDRREQ, EADDRNOTAVAIL) + * - `invalid-state`: The socket is not bound. + * - `address-in-use`: Tried to perform an implicit bind, but there were no ephemeral ports available. (EADDRINUSE, EADDRNOTAVAIL on Linux, EAGAIN on BSD) + * - `remote-unreachable`: The remote address is not reachable. (ECONNRESET, ENETRESET, EHOSTUNREACH, EHOSTDOWN, ENETUNREACH, ENETDOWN, ENONET) + * - `connection-refused`: The connection was refused. (ECONNREFUSED) + * + * # References + * - + * - + * - + * - + */ + stream(remoteAddress: IpSocketAddress | undefined): [IncomingDatagramStream, OutgoingDatagramStream]; + /** + * Get the current bound address. + * + * POSIX mentions: + * > If the socket has not been bound to a local name, the value + * > stored in the object pointed to by `address` is unspecified. + * + * WASI is stricter and requires `local-address` to return `invalid-state` when the socket hasn't been bound yet. + * + * # Typical errors + * - `invalid-state`: The socket is not bound to any local address. + * + * # References + * - + * - + * - + * - + */ + localAddress(): IpSocketAddress; + /** + * Get the address the socket is currently streaming to. + * + * # Typical errors + * - `invalid-state`: The socket is not streaming to a specific remote address. (ENOTCONN) + * + * # References + * - + * - + * - + * - + */ + remoteAddress(): IpSocketAddress; + /** + * Whether this is a IPv4 or IPv6 socket. + * + * Equivalent to the SO_DOMAIN socket option. + */ + addressFamily(): IpAddressFamily; + /** + * Equivalent to the IP_TTL & IPV6_UNICAST_HOPS socket options. + * + * If the provided value is 0, an `invalid-argument` error is returned. + * + * # Typical errors + * - `invalid-argument`: (set) The TTL value must be 1 or higher. + */ + unicastHopLimit(): number; + setUnicastHopLimit(value: number): void; + /** + * The kernel buffer space reserved for sends/receives on this socket. + * + * If the provided value is 0, an `invalid-argument` error is returned. + * Any other value will never cause an error, but it might be silently clamped and/or rounded. + * I.e. after setting a value, reading the same setting back may return a different value. + * + * Equivalent to the SO_RCVBUF and SO_SNDBUF socket options. + * + * # Typical errors + * - `invalid-argument`: (set) The provided value was 0. + */ + receiveBufferSize(): bigint; + setReceiveBufferSize(value: bigint): void; + sendBufferSize(): bigint; + setSendBufferSize(value: bigint): void; + /** + * Create a `pollable` which will resolve once the socket is ready for I/O. + * + * Note: this function is here for WASI Preview2 only. + * It's planned to be removed when `future` is natively supported in Preview3. + */ + subscribe(): Pollable; + } + \ No newline at end of file diff --git a/demo/dist/@bytecodealliance/preview2-shim/types/io.d.ts b/demo/dist/@bytecodealliance/preview2-shim/types/io.d.ts new file mode 100644 index 0000000..8c99877 --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/types/io.d.ts @@ -0,0 +1,7 @@ +import type { WasiIoError } from './interfaces/wasi-io-error.d.ts'; +import type { WasiIoPoll } from './interfaces/wasi-io-poll.d.ts'; +import type { WasiIoStreams } from './interfaces/wasi-io-streams.d.ts'; + +export const error: typeof WasiIoError; +export const poll: typeof WasiIoPoll; +export const streams: typeof WasiIoStreams; diff --git a/demo/dist/@bytecodealliance/preview2-shim/types/random.d.ts b/demo/dist/@bytecodealliance/preview2-shim/types/random.d.ts new file mode 100644 index 0000000..185ed91 --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/types/random.d.ts @@ -0,0 +1,7 @@ +import type { WasiRandomInsecureSeed } from './interfaces/wasi-random-insecure-seed.d.ts'; +import type { WasiRandomInsecure } from './interfaces/wasi-random-insecure.d.ts'; +import type { WasiRandomRandom } from './interfaces/wasi-random-random.d.ts'; + +export const insecureSeed: typeof WasiRandomInsecureSeed; +export const insecure: typeof WasiRandomInsecure; +export const random: typeof WasiRandomRandom; diff --git a/demo/dist/@bytecodealliance/preview2-shim/types/sockets.d.ts b/demo/dist/@bytecodealliance/preview2-shim/types/sockets.d.ts new file mode 100644 index 0000000..89e7797 --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/types/sockets.d.ts @@ -0,0 +1,15 @@ +import type { WasiSocketsInstanceNetwork } from './interfaces/wasi-sockets-instance-network.d.ts'; +import type { WasiSocketsIpNameLookup } from './interfaces/wasi-sockets-ip-name-lookup.d.ts'; +import type { WasiSocketsNetwork } from './interfaces/wasi-sockets-network.d.ts'; +import type { WasiSocketsTcpCreateSocket } from './interfaces/wasi-sockets-tcp-create-socket.d.ts'; +import type { WasiSocketsTcp } from './interfaces/wasi-sockets-tcp.d.ts'; +import type { WasiSocketsUdpCreateSocket } from './interfaces/wasi-sockets-udp-create-socket.d.ts'; +import type { WasiSocketsUdp } from './interfaces/wasi-sockets-udp.d.ts'; + +export const instanceNetwork: typeof WasiSocketsInstanceNetwork; +export const ipNameLookup: typeof WasiSocketsIpNameLookup; +export const network: typeof WasiSocketsNetwork; +export const tcpCreateSocket: typeof WasiSocketsTcpCreateSocket; +export const tcp: typeof WasiSocketsTcp; +export const udpCreateSocket: typeof WasiSocketsUdpCreateSocket; +export const udp: typeof WasiSocketsUdp; diff --git a/demo/dist/@bytecodealliance/preview2-shim/types/wasi-cli-command.d.ts b/demo/dist/@bytecodealliance/preview2-shim/types/wasi-cli-command.d.ts new file mode 100644 index 0000000..819de54 --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/types/wasi-cli-command.d.ts @@ -0,0 +1,29 @@ +import { WasiCliEnvironment } from './interfaces/wasi-cli-environment.js'; +import { WasiCliExit } from './interfaces/wasi-cli-exit.js'; +import { WasiCliStderr } from './interfaces/wasi-cli-stderr.js'; +import { WasiCliStdin } from './interfaces/wasi-cli-stdin.js'; +import { WasiCliStdout } from './interfaces/wasi-cli-stdout.js'; +import { WasiCliTerminalInput } from './interfaces/wasi-cli-terminal-input.js'; +import { WasiCliTerminalOutput } from './interfaces/wasi-cli-terminal-output.js'; +import { WasiCliTerminalStderr } from './interfaces/wasi-cli-terminal-stderr.js'; +import { WasiCliTerminalStdin } from './interfaces/wasi-cli-terminal-stdin.js'; +import { WasiCliTerminalStdout } from './interfaces/wasi-cli-terminal-stdout.js'; +import { WasiClocksMonotonicClock } from './interfaces/wasi-clocks-monotonic-clock.js'; +import { WasiClocksWallClock } from './interfaces/wasi-clocks-wall-clock.js'; +import { WasiFilesystemPreopens } from './interfaces/wasi-filesystem-preopens.js'; +import { WasiFilesystemTypes } from './interfaces/wasi-filesystem-types.js'; +import { WasiIoError } from './interfaces/wasi-io-error.js'; +import { WasiIoPoll } from './interfaces/wasi-io-poll.js'; +import { WasiIoStreams } from './interfaces/wasi-io-streams.js'; +import { WasiRandomInsecureSeed } from './interfaces/wasi-random-insecure-seed.js'; +import { WasiRandomInsecure } from './interfaces/wasi-random-insecure.js'; +import { WasiRandomRandom } from './interfaces/wasi-random-random.js'; +import { WasiSocketsInstanceNetwork } from './interfaces/wasi-sockets-instance-network.js'; +import { WasiSocketsIpNameLookup } from './interfaces/wasi-sockets-ip-name-lookup.js'; +import { WasiSocketsNetwork } from './interfaces/wasi-sockets-network.js'; +import { WasiSocketsTcpCreateSocket } from './interfaces/wasi-sockets-tcp-create-socket.js'; +import { WasiSocketsTcp } from './interfaces/wasi-sockets-tcp.js'; +import { WasiSocketsUdpCreateSocket } from './interfaces/wasi-sockets-udp-create-socket.js'; +import { WasiSocketsUdp } from './interfaces/wasi-sockets-udp.js'; +import { WasiCliRun } from './interfaces/wasi-cli-run.js'; +export const run: typeof WasiCliRun; diff --git a/demo/dist/@bytecodealliance/preview2-shim/types/wasi-http-proxy.d.ts b/demo/dist/@bytecodealliance/preview2-shim/types/wasi-http-proxy.d.ts new file mode 100644 index 0000000..6c32210 --- /dev/null +++ b/demo/dist/@bytecodealliance/preview2-shim/types/wasi-http-proxy.d.ts @@ -0,0 +1,13 @@ +import { WasiCliStderr } from './interfaces/wasi-cli-stderr.js'; +import { WasiCliStdin } from './interfaces/wasi-cli-stdin.js'; +import { WasiCliStdout } from './interfaces/wasi-cli-stdout.js'; +import { WasiClocksMonotonicClock } from './interfaces/wasi-clocks-monotonic-clock.js'; +import { WasiClocksWallClock } from './interfaces/wasi-clocks-wall-clock.js'; +import { WasiHttpOutgoingHandler } from './interfaces/wasi-http-outgoing-handler.js'; +import { WasiHttpTypes } from './interfaces/wasi-http-types.js'; +import { WasiIoError } from './interfaces/wasi-io-error.js'; +import { WasiIoPoll } from './interfaces/wasi-io-poll.js'; +import { WasiIoStreams } from './interfaces/wasi-io-streams.js'; +import { WasiRandomRandom } from './interfaces/wasi-random-random.js'; +import { WasiHttpIncomingHandler } from './interfaces/wasi-http-incoming-handler.js'; +export const incomingHandler: typeof WasiHttpIncomingHandler; diff --git a/demo/dist/uPlot/uPlot.esm.js b/demo/dist/uPlot/uPlot.esm.js new file mode 100644 index 0000000..cb2965b --- /dev/null +++ b/demo/dist/uPlot/uPlot.esm.js @@ -0,0 +1,6052 @@ +/** +* Copyright (c) 2024, Leon Sorokin +* All rights reserved. (MIT Licensed) +* +* uPlot.js (μPlot) +* A small, fast chart for time series, lines, areas, ohlc & bars +* https://github.com/leeoniya/uPlot (v1.6.31) +*/ + +const FEAT_TIME = true; + +const pre = "u-"; + +const UPLOT = "uplot"; +const ORI_HZ = pre + "hz"; +const ORI_VT = pre + "vt"; +const TITLE = pre + "title"; +const WRAP = pre + "wrap"; +const UNDER = pre + "under"; +const OVER = pre + "over"; +const AXIS = pre + "axis"; +const OFF = pre + "off"; +const SELECT = pre + "select"; +const CURSOR_X = pre + "cursor-x"; +const CURSOR_Y = pre + "cursor-y"; +const CURSOR_PT = pre + "cursor-pt"; +const LEGEND = pre + "legend"; +const LEGEND_LIVE = pre + "live"; +const LEGEND_INLINE = pre + "inline"; +const LEGEND_SERIES = pre + "series"; +const LEGEND_MARKER = pre + "marker"; +const LEGEND_LABEL = pre + "label"; +const LEGEND_VALUE = pre + "value"; + +const WIDTH = "width"; +const HEIGHT = "height"; +const TOP = "top"; +const BOTTOM = "bottom"; +const LEFT = "left"; +const RIGHT = "right"; +const hexBlack = "#000"; +const transparent = hexBlack + "0"; + +const mousemove = "mousemove"; +const mousedown = "mousedown"; +const mouseup = "mouseup"; +const mouseenter = "mouseenter"; +const mouseleave = "mouseleave"; +const dblclick = "dblclick"; +const resize = "resize"; +const scroll = "scroll"; + +const change = "change"; +const dppxchange = "dppxchange"; + +const LEGEND_DISP = "--"; + +const domEnv = typeof window != 'undefined'; + +const doc = domEnv ? document : null; +const win = domEnv ? window : null; +const nav = domEnv ? navigator : null; + +let pxRatio; + +//export const canHover = domEnv && !win.matchMedia('(hover: none)').matches; + +let query; + +function setPxRatio() { + let _pxRatio = devicePixelRatio; + + // during print preview, Chrome fires off these dppx queries even without changes + if (pxRatio != _pxRatio) { + pxRatio = _pxRatio; + + query && off(change, query, setPxRatio); + query = matchMedia(`(min-resolution: ${pxRatio - 0.001}dppx) and (max-resolution: ${pxRatio + 0.001}dppx)`); + on(change, query, setPxRatio); + + win.dispatchEvent(new CustomEvent(dppxchange)); + } +} + +function addClass(el, c) { + if (c != null) { + let cl = el.classList; + !cl.contains(c) && cl.add(c); + } +} + +function remClass(el, c) { + let cl = el.classList; + cl.contains(c) && cl.remove(c); +} + +function setStylePx(el, name, value) { + el.style[name] = value + "px"; +} + +function placeTag(tag, cls, targ, refEl) { + let el = doc.createElement(tag); + + if (cls != null) + addClass(el, cls); + + if (targ != null) + targ.insertBefore(el, refEl); + + return el; +} + +function placeDiv(cls, targ) { + return placeTag("div", cls, targ); +} + +const xformCache = new WeakMap(); + +function elTrans(el, xPos, yPos, xMax, yMax) { + let xform = "translate(" + xPos + "px," + yPos + "px)"; + let xformOld = xformCache.get(el); + + if (xform != xformOld) { + el.style.transform = xform; + xformCache.set(el, xform); + + if (xPos < 0 || yPos < 0 || xPos > xMax || yPos > yMax) + addClass(el, OFF); + else + remClass(el, OFF); + } +} + +const colorCache = new WeakMap(); + +function elColor(el, background, borderColor) { + let newColor = background + borderColor; + let oldColor = colorCache.get(el); + + if (newColor != oldColor) { + colorCache.set(el, newColor); + el.style.background = background; + el.style.borderColor = borderColor; + } +} + +const sizeCache = new WeakMap(); + +function elSize(el, newWid, newHgt, centered) { + let newSize = newWid + "" + newHgt; + let oldSize = sizeCache.get(el); + + if (newSize != oldSize) { + sizeCache.set(el, newSize); + el.style.height = newHgt + "px"; + el.style.width = newWid + "px"; + el.style.marginLeft = centered ? -newWid/2 + "px" : 0; + el.style.marginTop = centered ? -newHgt/2 + "px" : 0; + } +} + +const evOpts = {passive: true}; +const evOpts2 = {...evOpts, capture: true}; + +function on(ev, el, cb, capt) { + el.addEventListener(ev, cb, capt ? evOpts2 : evOpts); +} + +function off(ev, el, cb, capt) { + el.removeEventListener(ev, cb, evOpts); +} + +domEnv && setPxRatio(); + +// binary search for index of closest value +function closestIdx(num, arr, lo, hi) { + let mid; + lo = lo || 0; + hi = hi || arr.length - 1; + let bitwise = hi <= 2147483647; + + while (hi - lo > 1) { + mid = bitwise ? (lo + hi) >> 1 : floor((lo + hi) / 2); + + if (arr[mid] < num) + lo = mid; + else + hi = mid; + } + + if (num - arr[lo] <= arr[hi] - num) + return lo; + + return hi; +} + +function nonNullIdx(data, _i0, _i1, dir) { + for (let i = dir == 1 ? _i0 : _i1; i >= _i0 && i <= _i1; i += dir) { + if (data[i] != null) + return i; + } + + return -1; +} + +function getMinMax(data, _i0, _i1, sorted) { +// console.log("getMinMax()"); + + let _min = inf; + let _max = -inf; + + if (sorted == 1) { + _min = data[_i0]; + _max = data[_i1]; + } + else if (sorted == -1) { + _min = data[_i1]; + _max = data[_i0]; + } + else { + for (let i = _i0; i <= _i1; i++) { + let v = data[i]; + + if (v != null) { + if (v < _min) + _min = v; + if (v > _max) + _max = v; + } + } + } + + return [_min, _max]; +} + +function getMinMaxLog(data, _i0, _i1) { +// console.log("getMinMax()"); + + let _min = inf; + let _max = -inf; + + for (let i = _i0; i <= _i1; i++) { + let v = data[i]; + + if (v != null && v > 0) { + if (v < _min) + _min = v; + if (v > _max) + _max = v; + } + } + + return [_min, _max]; +} + +function rangeLog(min, max, base, fullMags) { + let minSign = sign(min); + let maxSign = sign(max); + + if (min == max) { + if (minSign == -1) { + min *= base; + max /= base; + } + else { + min /= base; + max *= base; + } + } + + let logFn = base == 10 ? log10 : log2; + + let growMinAbs = minSign == 1 ? floor : ceil; + let growMaxAbs = maxSign == 1 ? ceil : floor; + + let minExp = growMinAbs(logFn(abs(min))); + let maxExp = growMaxAbs(logFn(abs(max))); + + let minIncr = pow(base, minExp); + let maxIncr = pow(base, maxExp); + + // fix values like Math.pow(10, -5) === 0.000009999999999999999 + if (base == 10) { + if (minExp < 0) + minIncr = roundDec(minIncr, -minExp); + if (maxExp < 0) + maxIncr = roundDec(maxIncr, -maxExp); + } + + if (fullMags || base == 2) { + min = minIncr * minSign; + max = maxIncr * maxSign; + } + else { + min = incrRoundDn(min, minIncr); + max = incrRoundUp(max, maxIncr); + } + + return [min, max]; +} + +function rangeAsinh(min, max, base, fullMags) { + let minMax = rangeLog(min, max, base, fullMags); + + if (min == 0) + minMax[0] = 0; + + if (max == 0) + minMax[1] = 0; + + return minMax; +} + +const rangePad = 0.1; + +const autoRangePart = { + mode: 3, + pad: rangePad, +}; + +const _eqRangePart = { + pad: 0, + soft: null, + mode: 0, +}; + +const _eqRange = { + min: _eqRangePart, + max: _eqRangePart, +}; + +// this ensures that non-temporal/numeric y-axes get multiple-snapped padding added above/below +// TODO: also account for incrs when snapping to ensure top of axis gets a tick & value +function rangeNum(_min, _max, mult, extra) { + if (isObj(mult)) + return _rangeNum(_min, _max, mult); + + _eqRangePart.pad = mult; + _eqRangePart.soft = extra ? 0 : null; + _eqRangePart.mode = extra ? 3 : 0; + + return _rangeNum(_min, _max, _eqRange); +} + +// nullish coalesce +function ifNull(lh, rh) { + return lh == null ? rh : lh; +} + +// checks if given index range in an array contains a non-null value +// aka a range-bounded Array.some() +function hasData(data, idx0, idx1) { + idx0 = ifNull(idx0, 0); + idx1 = ifNull(idx1, data.length - 1); + + while (idx0 <= idx1) { + if (data[idx0] != null) + return true; + idx0++; + } + + return false; +} + +function _rangeNum(_min, _max, cfg) { + let cmin = cfg.min; + let cmax = cfg.max; + + let padMin = ifNull(cmin.pad, 0); + let padMax = ifNull(cmax.pad, 0); + + let hardMin = ifNull(cmin.hard, -inf); + let hardMax = ifNull(cmax.hard, inf); + + let softMin = ifNull(cmin.soft, inf); + let softMax = ifNull(cmax.soft, -inf); + + let softMinMode = ifNull(cmin.mode, 0); + let softMaxMode = ifNull(cmax.mode, 0); + + let delta = _max - _min; + let deltaMag = log10(delta); + + let scalarMax = max(abs(_min), abs(_max)); + let scalarMag = log10(scalarMax); + + let scalarMagDelta = abs(scalarMag - deltaMag); + + // this handles situations like 89.7, 89.69999999999999 + // by assuming 0.001x deltas are precision errors +// if (delta > 0 && delta < abs(_max) / 1e3) +// delta = 0; + + // treat data as flat if delta is less than 1e-24 + // or range is 11+ orders of magnitude below raw values, e.g. 99999999.99999996 - 100000000.00000004 + if (delta < 1e-24 || scalarMagDelta > 10) { + delta = 0; + + // if soft mode is 2 and all vals are flat at 0, avoid the 0.1 * 1e3 fallback + // this prevents 0,0,0 from ranging to -100,100 when softMin/softMax are -1,1 + if (_min == 0 || _max == 0) { + delta = 1e-24; + + if (softMinMode == 2 && softMin != inf) + padMin = 0; + + if (softMaxMode == 2 && softMax != -inf) + padMax = 0; + } + } + + let nonZeroDelta = delta || scalarMax || 1e3; + let mag = log10(nonZeroDelta); + let base = pow(10, floor(mag)); + + let _padMin = nonZeroDelta * (delta == 0 ? (_min == 0 ? .1 : 1) : padMin); + let _newMin = roundDec(incrRoundDn(_min - _padMin, base/10), 24); + let _softMin = _min >= softMin && (softMinMode == 1 || softMinMode == 3 && _newMin <= softMin || softMinMode == 2 && _newMin >= softMin) ? softMin : inf; + let minLim = max(hardMin, _newMin < _softMin && _min >= _softMin ? _softMin : min(_softMin, _newMin)); + + let _padMax = nonZeroDelta * (delta == 0 ? (_max == 0 ? .1 : 1) : padMax); + let _newMax = roundDec(incrRoundUp(_max + _padMax, base/10), 24); + let _softMax = _max <= softMax && (softMaxMode == 1 || softMaxMode == 3 && _newMax >= softMax || softMaxMode == 2 && _newMax <= softMax) ? softMax : -inf; + let maxLim = min(hardMax, _newMax > _softMax && _max <= _softMax ? _softMax : max(_softMax, _newMax)); + + if (minLim == maxLim && minLim == 0) + maxLim = 100; + + return [minLim, maxLim]; +} + +// alternative: https://stackoverflow.com/a/2254896 +const numFormatter = new Intl.NumberFormat(domEnv ? nav.language : 'en-US'); +const fmtNum = val => numFormatter.format(val); + +const M = Math; + +const PI = M.PI; +const abs = M.abs; +const floor = M.floor; +const round = M.round; +const ceil = M.ceil; +const min = M.min; +const max = M.max; +const pow = M.pow; +const sign = M.sign; +const log10 = M.log10; +const log2 = M.log2; +// TODO: seems like this needs to match asinh impl if the passed v is tweaked? +const sinh = (v, linthresh = 1) => M.sinh(v) * linthresh; +const asinh = (v, linthresh = 1) => M.asinh(v / linthresh); + +const inf = Infinity; + +function numIntDigits(x) { + return (log10((x ^ (x >> 31)) - (x >> 31)) | 0) + 1; +} + +function clamp(num, _min, _max) { + return min(max(num, _min), _max); +} + +function fnOrSelf(v) { + return typeof v == "function" ? v : () => v; +} + +const noop = () => {}; + +const retArg0 = _0 => _0; + +const retArg1 = (_0, _1) => _1; + +const retNull = _ => null; + +const retTrue = _ => true; + +const retEq = (a, b) => a == b; + +const regex6 = /\.\d*?(?=9{6,}|0{6,})/gm; + +// e.g. 17999.204999999998 -> 17999.205 +const fixFloat = val => { + if (isInt(val) || fixedDec.has(val)) + return val; + + const str = `${val}`; + + const match = str.match(regex6); + + if (match == null) + return val; + + let len = match[0].length - 1; + + // e.g. 1.0000000000000001e-24 + if (str.indexOf('e-') != -1) { + let [num, exp] = str.split('e'); + return +`${fixFloat(num)}e${exp}`; + } + + return roundDec(val, len); +}; + +function incrRound(num, incr) { + return fixFloat(roundDec(fixFloat(num/incr))*incr); +} + +function incrRoundUp(num, incr) { + return fixFloat(ceil(fixFloat(num/incr))*incr); +} + +function incrRoundDn(num, incr) { + return fixFloat(floor(fixFloat(num/incr))*incr); +} + +// https://stackoverflow.com/a/48764436 +// rounds half away from zero +function roundDec(val, dec = 0) { + if (isInt(val)) + return val; +// else if (dec == 0) +// return round(val); + + let p = 10 ** dec; + let n = (val * p) * (1 + Number.EPSILON); + return round(n) / p; +} + +const fixedDec = new Map(); + +function guessDec(num) { + return ((""+num).split(".")[1] || "").length; +} + +function genIncrs(base, minExp, maxExp, mults) { + let incrs = []; + + let multDec = mults.map(guessDec); + + for (let exp = minExp; exp < maxExp; exp++) { + let expa = abs(exp); + let mag = roundDec(pow(base, exp), expa); + + for (let i = 0; i < mults.length; i++) { + let _incr = base == 10 ? +`${mults[i]}e${exp}` : mults[i] * mag; + let dec = (exp >= 0 ? 0 : expa) + (exp >= multDec[i] ? 0 : multDec[i]); + let incr = base == 10 ? _incr : roundDec(_incr, dec); + incrs.push(incr); + fixedDec.set(incr, dec); + } + } + + return incrs; +} + +//export const assign = Object.assign; + +const EMPTY_OBJ = {}; +const EMPTY_ARR = []; + +const nullNullTuple = [null, null]; + +const isArr = Array.isArray; +const isInt = Number.isInteger; +const isUndef = v => v === void 0; + +function isStr(v) { + return typeof v == 'string'; +} + +function isObj(v) { + let is = false; + + if (v != null) { + let c = v.constructor; + is = c == null || c == Object; + } + + return is; +} + +function fastIsObj(v) { + return v != null && typeof v == 'object'; +} + +const TypedArray = Object.getPrototypeOf(Uint8Array); + +const __proto__ = "__proto__"; + +function copy(o, _isObj = isObj) { + let out; + + if (isArr(o)) { + let val = o.find(v => v != null); + + if (isArr(val) || _isObj(val)) { + out = Array(o.length); + for (let i = 0; i < o.length; i++) + out[i] = copy(o[i], _isObj); + } + else + out = o.slice(); + } + else if (o instanceof TypedArray) // also (ArrayBuffer.isView(o) && !(o instanceof DataView)) + out = o.slice(); + else if (_isObj(o)) { + out = {}; + for (let k in o) { + if (k != __proto__) + out[k] = copy(o[k], _isObj); + } + } + else + out = o; + + return out; +} + +function assign(targ) { + let args = arguments; + + for (let i = 1; i < args.length; i++) { + let src = args[i]; + + for (let key in src) { + if (key != __proto__) { + if (isObj(targ[key])) + assign(targ[key], copy(src[key])); + else + targ[key] = copy(src[key]); + } + } + } + + return targ; +} + +// nullModes +const NULL_REMOVE = 0; // nulls are converted to undefined (e.g. for spanGaps: true) +const NULL_RETAIN = 1; // nulls are retained, with alignment artifacts set to undefined (default) +const NULL_EXPAND = 2; // nulls are expanded to include any adjacent alignment artifacts + +// sets undefined values to nulls when adjacent to existing nulls (minesweeper) +function nullExpand(yVals, nullIdxs, alignedLen) { + for (let i = 0, xi, lastNullIdx = -1; i < nullIdxs.length; i++) { + let nullIdx = nullIdxs[i]; + + if (nullIdx > lastNullIdx) { + xi = nullIdx - 1; + while (xi >= 0 && yVals[xi] == null) + yVals[xi--] = null; + + xi = nullIdx + 1; + while (xi < alignedLen && yVals[xi] == null) + yVals[lastNullIdx = xi++] = null; + } + } +} + +// nullModes is a tables-matched array indicating how to treat nulls in each series +// output is sorted ASC on the joined field (table[0]) and duplicate join values are collapsed +function join(tables, nullModes) { + if (allHeadersSame(tables)) { + // console.log('cheap join!'); + + let table = tables[0].slice(); + + for (let i = 1; i < tables.length; i++) + table.push(...tables[i].slice(1)); + + if (!isAsc(table[0])) + table = sortCols(table); + + return table; + } + + let xVals = new Set(); + + for (let ti = 0; ti < tables.length; ti++) { + let t = tables[ti]; + let xs = t[0]; + let len = xs.length; + + for (let i = 0; i < len; i++) + xVals.add(xs[i]); + } + + let data = [Array.from(xVals).sort((a, b) => a - b)]; + + let alignedLen = data[0].length; + + let xIdxs = new Map(); + + for (let i = 0; i < alignedLen; i++) + xIdxs.set(data[0][i], i); + + for (let ti = 0; ti < tables.length; ti++) { + let t = tables[ti]; + let xs = t[0]; + + for (let si = 1; si < t.length; si++) { + let ys = t[si]; + + let yVals = Array(alignedLen).fill(undefined); + + let nullMode = nullModes ? nullModes[ti][si] : NULL_RETAIN; + + let nullIdxs = []; + + for (let i = 0; i < ys.length; i++) { + let yVal = ys[i]; + let alignedIdx = xIdxs.get(xs[i]); + + if (yVal === null) { + if (nullMode != NULL_REMOVE) { + yVals[alignedIdx] = yVal; + + if (nullMode == NULL_EXPAND) + nullIdxs.push(alignedIdx); + } + } + else + yVals[alignedIdx] = yVal; + } + + nullExpand(yVals, nullIdxs, alignedLen); + + data.push(yVals); + } + } + + return data; +} + +const microTask = typeof queueMicrotask == "undefined" ? fn => Promise.resolve().then(fn) : queueMicrotask; + +// TODO: https://github.com/dy/sort-ids (~2x faster for 1e5+ arrays) +function sortCols(table) { + let head = table[0]; + let rlen = head.length; + + let idxs = Array(rlen); + for (let i = 0; i < idxs.length; i++) + idxs[i] = i; + + idxs.sort((i0, i1) => head[i0] - head[i1]); + + let table2 = []; + for (let i = 0; i < table.length; i++) { + let row = table[i]; + let row2 = Array(rlen); + + for (let j = 0; j < rlen; j++) + row2[j] = row[idxs[j]]; + + table2.push(row2); + } + + return table2; +} + +// test if we can do cheap join (all join fields same) +function allHeadersSame(tables) { + let vals0 = tables[0][0]; + let len0 = vals0.length; + + for (let i = 1; i < tables.length; i++) { + let vals1 = tables[i][0]; + + if (vals1.length != len0) + return false; + + if (vals1 != vals0) { + for (let j = 0; j < len0; j++) { + if (vals1[j] != vals0[j]) + return false; + } + } + } + + return true; +} + +function isAsc(vals, samples = 100) { + const len = vals.length; + + // empty or single value + if (len <= 1) + return true; + + // skip leading & trailing nullish + let firstIdx = 0; + let lastIdx = len - 1; + + while (firstIdx <= lastIdx && vals[firstIdx] == null) + firstIdx++; + + while (lastIdx >= firstIdx && vals[lastIdx] == null) + lastIdx--; + + // all nullish or one value surrounded by nullish + if (lastIdx <= firstIdx) + return true; + + const stride = max(1, floor((lastIdx - firstIdx + 1) / samples)); + + for (let prevVal = vals[firstIdx], i = firstIdx + stride; i <= lastIdx; i += stride) { + const v = vals[i]; + + if (v != null) { + if (v <= prevVal) + return false; + + prevVal = v; + } + } + + return true; +} + +const months = [ + "January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December", +]; + +const days = [ + "Sunday", + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday", +]; + +function slice3(str) { + return str.slice(0, 3); +} + +const days3 = days.map(slice3); + +const months3 = months.map(slice3); + +const engNames = { + MMMM: months, + MMM: months3, + WWWW: days, + WWW: days3, +}; + +function zeroPad2(int) { + return (int < 10 ? '0' : '') + int; +} + +function zeroPad3(int) { + return (int < 10 ? '00' : int < 100 ? '0' : '') + int; +} + +/* +function suffix(int) { + let mod10 = int % 10; + + return int + ( + mod10 == 1 && int != 11 ? "st" : + mod10 == 2 && int != 12 ? "nd" : + mod10 == 3 && int != 13 ? "rd" : "th" + ); +} +*/ + +const subs = { + // 2019 + YYYY: d => d.getFullYear(), + // 19 + YY: d => (d.getFullYear()+'').slice(2), + // July + MMMM: (d, names) => names.MMMM[d.getMonth()], + // Jul + MMM: (d, names) => names.MMM[d.getMonth()], + // 07 + MM: d => zeroPad2(d.getMonth()+1), + // 7 + M: d => d.getMonth()+1, + // 09 + DD: d => zeroPad2(d.getDate()), + // 9 + D: d => d.getDate(), + // Monday + WWWW: (d, names) => names.WWWW[d.getDay()], + // Mon + WWW: (d, names) => names.WWW[d.getDay()], + // 03 + HH: d => zeroPad2(d.getHours()), + // 3 + H: d => d.getHours(), + // 9 (12hr, unpadded) + h: d => {let h = d.getHours(); return h == 0 ? 12 : h > 12 ? h - 12 : h;}, + // AM + AA: d => d.getHours() >= 12 ? 'PM' : 'AM', + // am + aa: d => d.getHours() >= 12 ? 'pm' : 'am', + // a + a: d => d.getHours() >= 12 ? 'p' : 'a', + // 09 + mm: d => zeroPad2(d.getMinutes()), + // 9 + m: d => d.getMinutes(), + // 09 + ss: d => zeroPad2(d.getSeconds()), + // 9 + s: d => d.getSeconds(), + // 374 + fff: d => zeroPad3(d.getMilliseconds()), +}; + +function fmtDate(tpl, names) { + names = names || engNames; + let parts = []; + + let R = /\{([a-z]+)\}|[^{]+/gi, m; + + while (m = R.exec(tpl)) + parts.push(m[0][0] == '{' ? subs[m[1]] : m[0]); + + return d => { + let out = ''; + + for (let i = 0; i < parts.length; i++) + out += typeof parts[i] == "string" ? parts[i] : parts[i](d, names); + + return out; + } +} + +const localTz = new Intl.DateTimeFormat().resolvedOptions().timeZone; + +// https://stackoverflow.com/questions/15141762/how-to-initialize-a-javascript-date-to-a-particular-time-zone/53652131#53652131 +function tzDate(date, tz) { + let date2; + + // perf optimization + if (tz == 'UTC' || tz == 'Etc/UTC') + date2 = new Date(+date + date.getTimezoneOffset() * 6e4); + else if (tz == localTz) + date2 = date; + else { + date2 = new Date(date.toLocaleString('en-US', {timeZone: tz})); + date2.setMilliseconds(date.getMilliseconds()); + } + + return date2; +} + +//export const series = []; + +// default formatters: + +const onlyWhole = v => v % 1 == 0; + +const allMults = [1,2,2.5,5]; + +// ...0.01, 0.02, 0.025, 0.05, 0.1, 0.2, 0.25, 0.5 +const decIncrs = genIncrs(10, -32, 0, allMults); + +// 1, 2, 2.5, 5, 10, 20, 25, 50... +const oneIncrs = genIncrs(10, 0, 32, allMults); + +// 1, 2, 5, 10, 20, 25, 50... +const wholeIncrs = oneIncrs.filter(onlyWhole); + +const numIncrs = decIncrs.concat(oneIncrs); + +const NL = "\n"; + +const yyyy = "{YYYY}"; +const NLyyyy = NL + yyyy; +const md = "{M}/{D}"; +const NLmd = NL + md; +const NLmdyy = NLmd + "/{YY}"; + +const aa = "{aa}"; +const hmm = "{h}:{mm}"; +const hmmaa = hmm + aa; +const NLhmmaa = NL + hmmaa; +const ss = ":{ss}"; + +const _ = null; + +function genTimeStuffs(ms) { + let s = ms * 1e3, + m = s * 60, + h = m * 60, + d = h * 24, + mo = d * 30, + y = d * 365; + + // min of 1e-3 prevents setting a temporal x ticks too small since Date objects cannot advance ticks smaller than 1ms + let subSecIncrs = ms == 1 ? genIncrs(10, 0, 3, allMults).filter(onlyWhole) : genIncrs(10, -3, 0, allMults); + + let timeIncrs = subSecIncrs.concat([ + // minute divisors (# of secs) + s, + s * 5, + s * 10, + s * 15, + s * 30, + // hour divisors (# of mins) + m, + m * 5, + m * 10, + m * 15, + m * 30, + // day divisors (# of hrs) + h, + h * 2, + h * 3, + h * 4, + h * 6, + h * 8, + h * 12, + // month divisors TODO: need more? + d, + d * 2, + d * 3, + d * 4, + d * 5, + d * 6, + d * 7, + d * 8, + d * 9, + d * 10, + d * 15, + // year divisors (# months, approx) + mo, + mo * 2, + mo * 3, + mo * 4, + mo * 6, + // century divisors + y, + y * 2, + y * 5, + y * 10, + y * 25, + y * 50, + y * 100, + ]); + + // [0]: minimum num secs in the tick incr + // [1]: default tick format + // [2-7]: rollover tick formats + // [8]: mode: 0: replace [1] -> [2-7], 1: concat [1] + [2-7] + const _timeAxisStamps = [ + // tick incr default year month day hour min sec mode + [y, yyyy, _, _, _, _, _, _, 1], + [d * 28, "{MMM}", NLyyyy, _, _, _, _, _, 1], + [d, md, NLyyyy, _, _, _, _, _, 1], + [h, "{h}" + aa, NLmdyy, _, NLmd, _, _, _, 1], + [m, hmmaa, NLmdyy, _, NLmd, _, _, _, 1], + [s, ss, NLmdyy + " " + hmmaa, _, NLmd + " " + hmmaa, _, NLhmmaa, _, 1], + [ms, ss + ".{fff}", NLmdyy + " " + hmmaa, _, NLmd + " " + hmmaa, _, NLhmmaa, _, 1], + ]; + + // the ensures that axis ticks, values & grid are aligned to logical temporal breakpoints and not an arbitrary timestamp + // https://www.timeanddate.com/time/dst/ + // https://www.timeanddate.com/time/dst/2019.html + // https://www.epochconverter.com/timezones + function timeAxisSplits(tzDate) { + return (self, axisIdx, scaleMin, scaleMax, foundIncr, foundSpace) => { + let splits = []; + let isYr = foundIncr >= y; + let isMo = foundIncr >= mo && foundIncr < y; + + // get the timezone-adjusted date + let minDate = tzDate(scaleMin); + let minDateTs = roundDec(minDate * ms, 3); + + // get ts of 12am (this lands us at or before the original scaleMin) + let minMin = mkDate(minDate.getFullYear(), isYr ? 0 : minDate.getMonth(), isMo || isYr ? 1 : minDate.getDate()); + let minMinTs = roundDec(minMin * ms, 3); + + if (isMo || isYr) { + let moIncr = isMo ? foundIncr / mo : 0; + let yrIncr = isYr ? foundIncr / y : 0; + // let tzOffset = scaleMin - minDateTs; // needed? + let split = minDateTs == minMinTs ? minDateTs : roundDec(mkDate(minMin.getFullYear() + yrIncr, minMin.getMonth() + moIncr, 1) * ms, 3); + let splitDate = new Date(round(split / ms)); + let baseYear = splitDate.getFullYear(); + let baseMonth = splitDate.getMonth(); + + for (let i = 0; split <= scaleMax; i++) { + let next = mkDate(baseYear + yrIncr * i, baseMonth + moIncr * i, 1); + let offs = next - tzDate(roundDec(next * ms, 3)); + + split = roundDec((+next + offs) * ms, 3); + + if (split <= scaleMax) + splits.push(split); + } + } + else { + let incr0 = foundIncr >= d ? d : foundIncr; + let tzOffset = floor(scaleMin) - floor(minDateTs); + let split = minMinTs + tzOffset + incrRoundUp(minDateTs - minMinTs, incr0); + splits.push(split); + + let date0 = tzDate(split); + + let prevHour = date0.getHours() + (date0.getMinutes() / m) + (date0.getSeconds() / h); + let incrHours = foundIncr / h; + + let minSpace = self.axes[axisIdx]._space; + let pctSpace = foundSpace / minSpace; + + while (1) { + split = roundDec(split + foundIncr, ms == 1 ? 0 : 3); + + if (split > scaleMax) + break; + + if (incrHours > 1) { + let expectedHour = floor(roundDec(prevHour + incrHours, 6)) % 24; + let splitDate = tzDate(split); + let actualHour = splitDate.getHours(); + + let dstShift = actualHour - expectedHour; + + if (dstShift > 1) + dstShift = -1; + + split -= dstShift * h; + + prevHour = (prevHour + incrHours) % 24; + + // add a tick only if it's further than 70% of the min allowed label spacing + let prevSplit = splits[splits.length - 1]; + let pctIncr = roundDec((split - prevSplit) / foundIncr, 3); + + if (pctIncr * pctSpace >= .7) + splits.push(split); + } + else + splits.push(split); + } + } + + return splits; + } + } + + return [ + timeIncrs, + _timeAxisStamps, + timeAxisSplits, + ]; +} + +const [ timeIncrsMs, _timeAxisStampsMs, timeAxisSplitsMs ] = genTimeStuffs(1); +const [ timeIncrsS, _timeAxisStampsS, timeAxisSplitsS ] = genTimeStuffs(1e-3); + +// base 2 +genIncrs(2, -53, 53, [1]); + +/* +console.log({ + decIncrs, + oneIncrs, + wholeIncrs, + numIncrs, + timeIncrs, + fixedDec, +}); +*/ + +function timeAxisStamps(stampCfg, fmtDate) { + return stampCfg.map(s => s.map((v, i) => + i == 0 || i == 8 || v == null ? v : fmtDate(i == 1 || s[8] == 0 ? v : s[1] + v) + )); +} + +// TODO: will need to accept spaces[] and pull incr into the loop when grid will be non-uniform, eg for log scales. +// currently we ignore this for months since they're *nearly* uniform and the added complexity is not worth it +function timeAxisVals(tzDate, stamps) { + return (self, splits, axisIdx, foundSpace, foundIncr) => { + let s = stamps.find(s => foundIncr >= s[0]) || stamps[stamps.length - 1]; + + // these track boundaries when a full label is needed again + let prevYear; + let prevMnth; + let prevDate; + let prevHour; + let prevMins; + let prevSecs; + + return splits.map(split => { + let date = tzDate(split); + + let newYear = date.getFullYear(); + let newMnth = date.getMonth(); + let newDate = date.getDate(); + let newHour = date.getHours(); + let newMins = date.getMinutes(); + let newSecs = date.getSeconds(); + + let stamp = ( + newYear != prevYear && s[2] || + newMnth != prevMnth && s[3] || + newDate != prevDate && s[4] || + newHour != prevHour && s[5] || + newMins != prevMins && s[6] || + newSecs != prevSecs && s[7] || + s[1] + ); + + prevYear = newYear; + prevMnth = newMnth; + prevDate = newDate; + prevHour = newHour; + prevMins = newMins; + prevSecs = newSecs; + + return stamp(date); + }); + } +} + +// for when axis.values is defined as a static fmtDate template string +function timeAxisVal(tzDate, dateTpl) { + let stamp = fmtDate(dateTpl); + return (self, splits, axisIdx, foundSpace, foundIncr) => splits.map(split => stamp(tzDate(split))); +} + +function mkDate(y, m, d) { + return new Date(y, m, d); +} + +function timeSeriesStamp(stampCfg, fmtDate) { + return fmtDate(stampCfg); +} +const _timeSeriesStamp = '{YYYY}-{MM}-{DD} {h}:{mm}{aa}'; + +function timeSeriesVal(tzDate, stamp) { + return (self, val, seriesIdx, dataIdx) => dataIdx == null ? LEGEND_DISP : stamp(tzDate(val)); +} + +function legendStroke(self, seriesIdx) { + let s = self.series[seriesIdx]; + return s.width ? s.stroke(self, seriesIdx) : s.points.width ? s.points.stroke(self, seriesIdx) : null; +} + +function legendFill(self, seriesIdx) { + return self.series[seriesIdx].fill(self, seriesIdx); +} + +const legendOpts = { + show: true, + live: true, + isolate: false, + mount: noop, + markers: { + show: true, + width: 2, + stroke: legendStroke, + fill: legendFill, + dash: "solid", + }, + idx: null, + idxs: null, + values: [], +}; + +function cursorPointShow(self, si) { + let o = self.cursor.points; + + let pt = placeDiv(); + + let size = o.size(self, si); + setStylePx(pt, WIDTH, size); + setStylePx(pt, HEIGHT, size); + + let mar = size / -2; + setStylePx(pt, "marginLeft", mar); + setStylePx(pt, "marginTop", mar); + + let width = o.width(self, si, size); + width && setStylePx(pt, "borderWidth", width); + + return pt; +} + +function cursorPointFill(self, si) { + let sp = self.series[si].points; + return sp._fill || sp._stroke; +} + +function cursorPointStroke(self, si) { + let sp = self.series[si].points; + return sp._stroke || sp._fill; +} + +function cursorPointSize(self, si) { + let sp = self.series[si].points; + return sp.size; +} + +const moveTuple = [0,0]; + +function cursorMove(self, mouseLeft1, mouseTop1) { + moveTuple[0] = mouseLeft1; + moveTuple[1] = mouseTop1; + return moveTuple; +} + +function filtBtn0(self, targ, handle, onlyTarg = true) { + return e => { + e.button == 0 && (!onlyTarg || e.target == targ) && handle(e); + }; +} + +function filtTarg(self, targ, handle, onlyTarg = true) { + return e => { + (!onlyTarg || e.target == targ) && handle(e); + }; +} + +const cursorOpts = { + show: true, + x: true, + y: true, + lock: false, + move: cursorMove, + points: { + one: false, + show: cursorPointShow, + size: cursorPointSize, + width: 0, + stroke: cursorPointStroke, + fill: cursorPointFill, + }, + + bind: { + mousedown: filtBtn0, + mouseup: filtBtn0, + click: filtBtn0, // legend clicks, not .u-over clicks + dblclick: filtBtn0, + + mousemove: filtTarg, + mouseleave: filtTarg, + mouseenter: filtTarg, + }, + + drag: { + setScale: true, + x: true, + y: false, + dist: 0, + uni: null, + click: (self, e) => { + // e.preventDefault(); + e.stopPropagation(); + e.stopImmediatePropagation(); + }, + _x: false, + _y: false, + }, + + focus: { + dist: (self, seriesIdx, dataIdx, valPos, curPos) => valPos - curPos, + prox: -1, + bias: 0, + }, + + hover: { + skip: [void 0], + prox: null, + bias: 0, + }, + + left: -10, + top: -10, + idx: null, + dataIdx: null, + idxs: null, + + event: null, +}; + +const axisLines = { + show: true, + stroke: "rgba(0,0,0,0.07)", + width: 2, +// dash: [], +}; + +const grid = assign({}, axisLines, { + filter: retArg1, +}); + +const ticks = assign({}, grid, { + size: 10, +}); + +const border = assign({}, axisLines, { + show: false, +}); + +const font = '12px system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"'; +const labelFont = "bold " + font; +const lineGap = 1.5; // font-size multiplier + +const xAxisOpts = { + show: true, + scale: "x", + stroke: hexBlack, + space: 50, + gap: 5, + size: 50, + labelGap: 0, + labelSize: 30, + labelFont, + side: 2, +// class: "x-vals", +// incrs: timeIncrs, +// values: timeVals, +// filter: retArg1, + grid, + ticks, + border, + font, + lineGap, + rotate: 0, +}; + +const numSeriesLabel = "Value"; +const timeSeriesLabel = "Time"; + +const xSeriesOpts = { + show: true, + scale: "x", + auto: false, + sorted: 1, +// label: "Time", +// value: v => stamp(new Date(v * 1e3)), + + // internal caches + min: inf, + max: -inf, + idxs: [], +}; + +function numAxisVals(self, splits, axisIdx, foundSpace, foundIncr) { + return splits.map(v => v == null ? "" : fmtNum(v)); +} + +function numAxisSplits(self, axisIdx, scaleMin, scaleMax, foundIncr, foundSpace, forceMin) { + let splits = []; + + let numDec = fixedDec.get(foundIncr) || 0; + + scaleMin = forceMin ? scaleMin : roundDec(incrRoundUp(scaleMin, foundIncr), numDec); + + for (let val = scaleMin; val <= scaleMax; val = roundDec(val + foundIncr, numDec)) + splits.push(Object.is(val, -0) ? 0 : val); // coalesces -0 + + return splits; +} + +// this doesnt work for sin, which needs to come off from 0 independently in pos and neg dirs +function logAxisSplits(self, axisIdx, scaleMin, scaleMax, foundIncr, foundSpace, forceMin) { + const splits = []; + + const logBase = self.scales[self.axes[axisIdx].scale].log; + + const logFn = logBase == 10 ? log10 : log2; + + const exp = floor(logFn(scaleMin)); + + foundIncr = pow(logBase, exp); + + // boo: 10 ** -24 === 1.0000000000000001e-24 + // this grabs the proper 1e-24 one + if (logBase == 10) + foundIncr = numIncrs[closestIdx(foundIncr, numIncrs)]; + + let split = scaleMin; + let nextMagIncr = foundIncr * logBase; + + if (logBase == 10) + nextMagIncr = numIncrs[closestIdx(nextMagIncr, numIncrs)]; + + do { + splits.push(split); + split = split + foundIncr; + + if (logBase == 10 && !fixedDec.has(split)) + split = roundDec(split, fixedDec.get(foundIncr)); + + if (split >= nextMagIncr) { + foundIncr = split; + nextMagIncr = foundIncr * logBase; + + if (logBase == 10) + nextMagIncr = numIncrs[closestIdx(nextMagIncr, numIncrs)]; + } + } while (split <= scaleMax); + + return splits; +} + +function asinhAxisSplits(self, axisIdx, scaleMin, scaleMax, foundIncr, foundSpace, forceMin) { + let sc = self.scales[self.axes[axisIdx].scale]; + + let linthresh = sc.asinh; + + let posSplits = scaleMax > linthresh ? logAxisSplits(self, axisIdx, max(linthresh, scaleMin), scaleMax, foundIncr) : [linthresh]; + let zero = scaleMax >= 0 && scaleMin <= 0 ? [0] : []; + let negSplits = scaleMin < -linthresh ? logAxisSplits(self, axisIdx, max(linthresh, -scaleMax), -scaleMin, foundIncr): [linthresh]; + + return negSplits.reverse().map(v => -v).concat(zero, posSplits); +} + +const RE_ALL = /./; +const RE_12357 = /[12357]/; +const RE_125 = /[125]/; +const RE_1 = /1/; + +const _filt = (splits, distr, re, keepMod) => splits.map((v, i) => ((distr == 4 && v == 0) || i % keepMod == 0 && re.test(v.toExponential()[v < 0 ? 1 : 0])) ? v : null); + +function log10AxisValsFilt(self, splits, axisIdx, foundSpace, foundIncr) { + let axis = self.axes[axisIdx]; + let scaleKey = axis.scale; + let sc = self.scales[scaleKey]; + +// if (sc.distr == 3 && sc.log == 2) +// return splits; + + let valToPos = self.valToPos; + + let minSpace = axis._space; + + let _10 = valToPos(10, scaleKey); + + let re = ( + valToPos(9, scaleKey) - _10 >= minSpace ? RE_ALL : + valToPos(7, scaleKey) - _10 >= minSpace ? RE_12357 : + valToPos(5, scaleKey) - _10 >= minSpace ? RE_125 : + RE_1 + ); + + if (re == RE_1) { + let magSpace = abs(valToPos(1, scaleKey) - _10); + + if (magSpace < minSpace) + return _filt(splits.slice().reverse(), sc.distr, re, ceil(minSpace / magSpace)).reverse(); // max->min skip + } + + return _filt(splits, sc.distr, re, 1); +} + +function log2AxisValsFilt(self, splits, axisIdx, foundSpace, foundIncr) { + let axis = self.axes[axisIdx]; + let scaleKey = axis.scale; + let minSpace = axis._space; + let valToPos = self.valToPos; + + let magSpace = abs(valToPos(1, scaleKey) - valToPos(2, scaleKey)); + + if (magSpace < minSpace) + return _filt(splits.slice().reverse(), 3, RE_ALL, ceil(minSpace / magSpace)).reverse(); // max->min skip + + return splits; +} + +function numSeriesVal(self, val, seriesIdx, dataIdx) { + return dataIdx == null ? LEGEND_DISP : val == null ? "" : fmtNum(val); +} + +const yAxisOpts = { + show: true, + scale: "y", + stroke: hexBlack, + space: 30, + gap: 5, + size: 50, + labelGap: 0, + labelSize: 30, + labelFont, + side: 3, +// class: "y-vals", +// incrs: numIncrs, +// values: (vals, space) => vals, +// filter: retArg1, + grid, + ticks, + border, + font, + lineGap, + rotate: 0, +}; + +// takes stroke width +function ptDia(width, mult) { + let dia = 3 + (width || 1) * 2; + return roundDec(dia * mult, 3); +} + +function seriesPointsShow(self, si) { + let { scale, idxs } = self.series[0]; + let xData = self._data[0]; + let p0 = self.valToPos(xData[idxs[0]], scale, true); + let p1 = self.valToPos(xData[idxs[1]], scale, true); + let dim = abs(p1 - p0); + + let s = self.series[si]; +// const dia = ptDia(s.width, pxRatio); + let maxPts = dim / (s.points.space * pxRatio); + return idxs[1] - idxs[0] <= maxPts; +} + +const facet = { + scale: null, + auto: true, + sorted: 0, + + // internal caches + min: inf, + max: -inf, +}; + +const gaps = (self, seriesIdx, idx0, idx1, nullGaps) => nullGaps; + +const xySeriesOpts = { + show: true, + auto: true, + sorted: 0, + gaps, + alpha: 1, + facets: [ + assign({}, facet, {scale: 'x'}), + assign({}, facet, {scale: 'y'}), + ], +}; + +const ySeriesOpts = { + scale: "y", + auto: true, + sorted: 0, + show: true, + spanGaps: false, + gaps, + alpha: 1, + points: { + show: seriesPointsShow, + filter: null, + // paths: + // stroke: "#000", + // fill: "#fff", + // width: 1, + // size: 10, + }, +// label: "Value", +// value: v => v, + values: null, + + // internal caches + min: inf, + max: -inf, + idxs: [], + + path: null, + clip: null, +}; + +function clampScale(self, val, scaleMin, scaleMax, scaleKey) { +/* + if (val < 0) { + let cssHgt = self.bbox.height / pxRatio; + let absPos = self.valToPos(abs(val), scaleKey); + let fromBtm = cssHgt - absPos; + return self.posToVal(cssHgt + fromBtm, scaleKey); + } +*/ + return scaleMin / 10; +} + +const xScaleOpts = { + time: FEAT_TIME, + auto: true, + distr: 1, + log: 10, + asinh: 1, + min: null, + max: null, + dir: 1, + ori: 0, +}; + +const yScaleOpts = assign({}, xScaleOpts, { + time: false, + ori: 1, +}); + +const syncs = {}; + +function _sync(key, opts) { + let s = syncs[key]; + + if (!s) { + s = { + key, + plots: [], + sub(plot) { + s.plots.push(plot); + }, + unsub(plot) { + s.plots = s.plots.filter(c => c != plot); + }, + pub(type, self, x, y, w, h, i) { + for (let j = 0; j < s.plots.length; j++) + s.plots[j] != self && s.plots[j].pub(type, self, x, y, w, h, i); + }, + }; + + if (key != null) + syncs[key] = s; + } + + return s; +} + +const BAND_CLIP_FILL = 1 << 0; +const BAND_CLIP_STROKE = 1 << 1; + +function orient(u, seriesIdx, cb) { + const mode = u.mode; + const series = u.series[seriesIdx]; + const data = mode == 2 ? u._data[seriesIdx] : u._data; + const scales = u.scales; + const bbox = u.bbox; + + let dx = data[0], + dy = mode == 2 ? data[1] : data[seriesIdx], + sx = mode == 2 ? scales[series.facets[0].scale] : scales[u.series[0].scale], + sy = mode == 2 ? scales[series.facets[1].scale] : scales[series.scale], + l = bbox.left, + t = bbox.top, + w = bbox.width, + h = bbox.height, + H = u.valToPosH, + V = u.valToPosV; + + return (sx.ori == 0 + ? cb( + series, + dx, + dy, + sx, + sy, + H, + V, + l, + t, + w, + h, + moveToH, + lineToH, + rectH, + arcH, + bezierCurveToH, + ) + : cb( + series, + dx, + dy, + sx, + sy, + V, + H, + t, + l, + h, + w, + moveToV, + lineToV, + rectV, + arcV, + bezierCurveToV, + ) + ); +} + +function bandFillClipDirs(self, seriesIdx) { + let fillDir = 0; + + // 2 bits, -1 | 1 + let clipDirs = 0; + + let bands = ifNull(self.bands, EMPTY_ARR); + + for (let i = 0; i < bands.length; i++) { + let b = bands[i]; + + // is a "from" band edge + if (b.series[0] == seriesIdx) + fillDir = b.dir; + // is a "to" band edge + else if (b.series[1] == seriesIdx) { + if (b.dir == 1) + clipDirs |= 1; + else + clipDirs |= 2; + } + } + + return [ + fillDir, + ( + clipDirs == 1 ? -1 : // neg only + clipDirs == 2 ? 1 : // pos only + clipDirs == 3 ? 2 : // both + 0 // neither + ) + ]; +} + +function seriesFillTo(self, seriesIdx, dataMin, dataMax, bandFillDir) { + let mode = self.mode; + let series = self.series[seriesIdx]; + let scaleKey = mode == 2 ? series.facets[1].scale : series.scale; + let scale = self.scales[scaleKey]; + + return ( + bandFillDir == -1 ? scale.min : + bandFillDir == 1 ? scale.max : + scale.distr == 3 ? ( + scale.dir == 1 ? scale.min : + scale.max + ) : 0 + ); +} + +// creates inverted band clip path (from stroke path -> yMax || yMin) +// clipDir is always inverse of fillDir +// default clip dir is upwards (1), since default band fill is downwards/fillBelowTo (-1) (highIdx -> lowIdx) +function clipBandLine(self, seriesIdx, idx0, idx1, strokePath, clipDir) { + return orient(self, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => { + let pxRound = series.pxRound; + + const dir = scaleX.dir * (scaleX.ori == 0 ? 1 : -1); + const lineTo = scaleX.ori == 0 ? lineToH : lineToV; + + let frIdx, toIdx; + + if (dir == 1) { + frIdx = idx0; + toIdx = idx1; + } + else { + frIdx = idx1; + toIdx = idx0; + } + + // path start + let x0 = pxRound(valToPosX(dataX[frIdx], scaleX, xDim, xOff)); + let y0 = pxRound(valToPosY(dataY[frIdx], scaleY, yDim, yOff)); + // path end x + let x1 = pxRound(valToPosX(dataX[toIdx], scaleX, xDim, xOff)); + // upper or lower y limit + let yLimit = pxRound(valToPosY(clipDir == 1 ? scaleY.max : scaleY.min, scaleY, yDim, yOff)); + + let clip = new Path2D(strokePath); + + lineTo(clip, x1, yLimit); + lineTo(clip, x0, yLimit); + lineTo(clip, x0, y0); + + return clip; + }); +} + +function clipGaps(gaps, ori, plotLft, plotTop, plotWid, plotHgt) { + let clip = null; + + // create clip path (invert gaps and non-gaps) + if (gaps.length > 0) { + clip = new Path2D(); + + const rect = ori == 0 ? rectH : rectV; + + let prevGapEnd = plotLft; + + for (let i = 0; i < gaps.length; i++) { + let g = gaps[i]; + + if (g[1] > g[0]) { + let w = g[0] - prevGapEnd; + + w > 0 && rect(clip, prevGapEnd, plotTop, w, plotTop + plotHgt); + + prevGapEnd = g[1]; + } + } + + let w = plotLft + plotWid - prevGapEnd; + + // hack to ensure we expand the clip enough to avoid cutting off strokes at edges + let maxStrokeWidth = 10; + + w > 0 && rect(clip, prevGapEnd, plotTop - maxStrokeWidth / 2, w, plotTop + plotHgt + maxStrokeWidth); + } + + return clip; +} + +function addGap(gaps, fromX, toX) { + let prevGap = gaps[gaps.length - 1]; + + if (prevGap && prevGap[0] == fromX) // TODO: gaps must be encoded at stroke widths? + prevGap[1] = toX; + else + gaps.push([fromX, toX]); +} + +function findGaps(xs, ys, idx0, idx1, dir, pixelForX, align) { + let gaps = []; + let len = xs.length; + + for (let i = dir == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += dir) { + let yVal = ys[i]; + + if (yVal === null) { + let fr = i, to = i; + + if (dir == 1) { + while (++i <= idx1 && ys[i] === null) + to = i; + } + else { + while (--i >= idx0 && ys[i] === null) + to = i; + } + + let frPx = pixelForX(xs[fr]); + let toPx = to == fr ? frPx : pixelForX(xs[to]); + + // if value adjacent to edge null is same pixel, then it's partially + // filled and gap should start at next pixel + let fri2 = fr - dir; + let frPx2 = align <= 0 && fri2 >= 0 && fri2 < len ? pixelForX(xs[fri2]) : frPx; + // if (frPx2 == frPx) + // frPx++; + // else + frPx = frPx2; + + let toi2 = to + dir; + let toPx2 = align >= 0 && toi2 >= 0 && toi2 < len ? pixelForX(xs[toi2]) : toPx; + // if (toPx2 == toPx) + // toPx--; + // else + toPx = toPx2; + + if (toPx >= frPx) + gaps.push([frPx, toPx]); // addGap + } + } + + return gaps; +} + +function pxRoundGen(pxAlign) { + return pxAlign == 0 ? retArg0 : pxAlign == 1 ? round : v => incrRound(v, pxAlign); +} + +function rect(ori) { + let moveTo = ori == 0 ? + moveToH : + moveToV; + + let arcTo = ori == 0 ? + (p, x1, y1, x2, y2, r) => { p.arcTo(x1, y1, x2, y2, r); } : + (p, y1, x1, y2, x2, r) => { p.arcTo(x1, y1, x2, y2, r); }; + + let rect = ori == 0 ? + (p, x, y, w, h) => { p.rect(x, y, w, h); } : + (p, y, x, h, w) => { p.rect(x, y, w, h); }; + + // TODO (pending better browser support): https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/roundRect + return (p, x, y, w, h, endRad = 0, baseRad = 0) => { + if (endRad == 0 && baseRad == 0) + rect(p, x, y, w, h); + else { + endRad = min(endRad, w / 2, h / 2); + baseRad = min(baseRad, w / 2, h / 2); + + // adapted from https://stackoverflow.com/questions/1255512/how-to-draw-a-rounded-rectangle-using-html-canvas/7838871#7838871 + moveTo(p, x + endRad, y); + arcTo(p, x + w, y, x + w, y + h, endRad); + arcTo(p, x + w, y + h, x, y + h, baseRad); + arcTo(p, x, y + h, x, y, baseRad); + arcTo(p, x, y, x + w, y, endRad); + p.closePath(); + } + }; +} + +// orientation-inverting canvas functions +const moveToH = (p, x, y) => { p.moveTo(x, y); }; +const moveToV = (p, y, x) => { p.moveTo(x, y); }; +const lineToH = (p, x, y) => { p.lineTo(x, y); }; +const lineToV = (p, y, x) => { p.lineTo(x, y); }; +const rectH = rect(0); +const rectV = rect(1); +const arcH = (p, x, y, r, startAngle, endAngle) => { p.arc(x, y, r, startAngle, endAngle); }; +const arcV = (p, y, x, r, startAngle, endAngle) => { p.arc(x, y, r, startAngle, endAngle); }; +const bezierCurveToH = (p, bp1x, bp1y, bp2x, bp2y, p2x, p2y) => { p.bezierCurveTo(bp1x, bp1y, bp2x, bp2y, p2x, p2y); }; +const bezierCurveToV = (p, bp1y, bp1x, bp2y, bp2x, p2y, p2x) => { p.bezierCurveTo(bp1x, bp1y, bp2x, bp2y, p2x, p2y); }; + +// TODO: drawWrap(seriesIdx, drawPoints) (save, restore, translate, clip) +function points(opts) { + return (u, seriesIdx, idx0, idx1, filtIdxs) => { + // log("drawPoints()", arguments); + + return orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => { + let { pxRound, points } = series; + + let moveTo, arc; + + if (scaleX.ori == 0) { + moveTo = moveToH; + arc = arcH; + } + else { + moveTo = moveToV; + arc = arcV; + } + + const width = roundDec(points.width * pxRatio, 3); + + let rad = (points.size - points.width) / 2 * pxRatio; + let dia = roundDec(rad * 2, 3); + + let fill = new Path2D(); + let clip = new Path2D(); + + let { left: lft, top: top, width: wid, height: hgt } = u.bbox; + + rectH(clip, + lft - dia, + top - dia, + wid + dia * 2, + hgt + dia * 2, + ); + + const drawPoint = pi => { + if (dataY[pi] != null) { + let x = pxRound(valToPosX(dataX[pi], scaleX, xDim, xOff)); + let y = pxRound(valToPosY(dataY[pi], scaleY, yDim, yOff)); + + moveTo(fill, x + rad, y); + arc(fill, x, y, rad, 0, PI * 2); + } + }; + + if (filtIdxs) + filtIdxs.forEach(drawPoint); + else { + for (let pi = idx0; pi <= idx1; pi++) + drawPoint(pi); + } + + return { + stroke: width > 0 ? fill : null, + fill, + clip, + flags: BAND_CLIP_FILL | BAND_CLIP_STROKE, + }; + }); + }; +} + +function _drawAcc(lineTo) { + return (stroke, accX, minY, maxY, inY, outY) => { + if (minY != maxY) { + if (inY != minY && outY != minY) + lineTo(stroke, accX, minY); + if (inY != maxY && outY != maxY) + lineTo(stroke, accX, maxY); + + lineTo(stroke, accX, outY); + } + }; +} + +const drawAccH = _drawAcc(lineToH); +const drawAccV = _drawAcc(lineToV); + +function linear(opts) { + const alignGaps = ifNull(opts?.alignGaps, 0); + + return (u, seriesIdx, idx0, idx1) => { + return orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => { + let pxRound = series.pxRound; + + let pixelForX = val => pxRound(valToPosX(val, scaleX, xDim, xOff)); + let pixelForY = val => pxRound(valToPosY(val, scaleY, yDim, yOff)); + + let lineTo, drawAcc; + + if (scaleX.ori == 0) { + lineTo = lineToH; + drawAcc = drawAccH; + } + else { + lineTo = lineToV; + drawAcc = drawAccV; + } + + const dir = scaleX.dir * (scaleX.ori == 0 ? 1 : -1); + + const _paths = {stroke: new Path2D(), fill: null, clip: null, band: null, gaps: null, flags: BAND_CLIP_FILL}; + const stroke = _paths.stroke; + + let minY = inf, + maxY = -inf, + inY, outY, drawnAtX; + + let accX = pixelForX(dataX[dir == 1 ? idx0 : idx1]); + + // data edges + let lftIdx = nonNullIdx(dataY, idx0, idx1, 1 * dir); + let rgtIdx = nonNullIdx(dataY, idx0, idx1, -1 * dir); + let lftX = pixelForX(dataX[lftIdx]); + let rgtX = pixelForX(dataX[rgtIdx]); + + let hasGap = false; + + for (let i = dir == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += dir) { + let x = pixelForX(dataX[i]); + let yVal = dataY[i]; + + if (x == accX) { + if (yVal != null) { + outY = pixelForY(yVal); + + if (minY == inf) { + lineTo(stroke, x, outY); + inY = outY; + } + + minY = min(outY, minY); + maxY = max(outY, maxY); + } + else { + if (yVal === null) + hasGap = true; + } + } + else { + if (minY != inf) { + drawAcc(stroke, accX, minY, maxY, inY, outY); + drawnAtX = accX; + } + + if (yVal != null) { + outY = pixelForY(yVal); + lineTo(stroke, x, outY); + minY = maxY = inY = outY; + } + else { + minY = inf; + maxY = -inf; + + if (yVal === null) + hasGap = true; + } + + accX = x; + } + } + + if (minY != inf && minY != maxY && drawnAtX != accX) + drawAcc(stroke, accX, minY, maxY, inY, outY); + + let [ bandFillDir, bandClipDir ] = bandFillClipDirs(u, seriesIdx); + + if (series.fill != null || bandFillDir != 0) { + let fill = _paths.fill = new Path2D(stroke); + + let fillToVal = series.fillTo(u, seriesIdx, series.min, series.max, bandFillDir); + let fillToY = pixelForY(fillToVal); + + lineTo(fill, rgtX, fillToY); + lineTo(fill, lftX, fillToY); + } + + if (!series.spanGaps) { + // console.time('gaps'); + let gaps = []; + + hasGap && gaps.push(...findGaps(dataX, dataY, idx0, idx1, dir, pixelForX, alignGaps)); + + // console.timeEnd('gaps'); + + // console.log('gaps', JSON.stringify(gaps)); + + _paths.gaps = gaps = series.gaps(u, seriesIdx, idx0, idx1, gaps); + + _paths.clip = clipGaps(gaps, scaleX.ori, xOff, yOff, xDim, yDim); + } + + if (bandClipDir != 0) { + _paths.band = bandClipDir == 2 ? [ + clipBandLine(u, seriesIdx, idx0, idx1, stroke, -1), + clipBandLine(u, seriesIdx, idx0, idx1, stroke, 1), + ] : clipBandLine(u, seriesIdx, idx0, idx1, stroke, bandClipDir); + } + + return _paths; + }); + }; +} + +// BUG: align: -1 behaves like align: 1 when scale.dir: -1 +function stepped(opts) { + const align = ifNull(opts.align, 1); + // whether to draw ascenders/descenders at null/gap bondaries + const ascDesc = ifNull(opts.ascDesc, false); + const alignGaps = ifNull(opts.alignGaps, 0); + const extend = ifNull(opts.extend, false); + + return (u, seriesIdx, idx0, idx1) => { + return orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => { + let pxRound = series.pxRound; + + let { left, width } = u.bbox; + + let pixelForX = val => pxRound(valToPosX(val, scaleX, xDim, xOff)); + let pixelForY = val => pxRound(valToPosY(val, scaleY, yDim, yOff)); + + let lineTo = scaleX.ori == 0 ? lineToH : lineToV; + + const _paths = {stroke: new Path2D(), fill: null, clip: null, band: null, gaps: null, flags: BAND_CLIP_FILL}; + const stroke = _paths.stroke; + + const dir = scaleX.dir * (scaleX.ori == 0 ? 1 : -1); + + idx0 = nonNullIdx(dataY, idx0, idx1, 1); + idx1 = nonNullIdx(dataY, idx0, idx1, -1); + + let prevYPos = pixelForY(dataY[dir == 1 ? idx0 : idx1]); + let firstXPos = pixelForX(dataX[dir == 1 ? idx0 : idx1]); + let prevXPos = firstXPos; + + let firstXPosExt = firstXPos; + + if (extend && align == -1) { + firstXPosExt = left; + lineTo(stroke, firstXPosExt, prevYPos); + } + + lineTo(stroke, firstXPos, prevYPos); + + for (let i = dir == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += dir) { + let yVal1 = dataY[i]; + + if (yVal1 == null) + continue; + + let x1 = pixelForX(dataX[i]); + let y1 = pixelForY(yVal1); + + if (align == 1) + lineTo(stroke, x1, prevYPos); + else + lineTo(stroke, prevXPos, y1); + + lineTo(stroke, x1, y1); + + prevYPos = y1; + prevXPos = x1; + } + + let prevXPosExt = prevXPos; + + if (extend && align == 1) { + prevXPosExt = left + width; + lineTo(stroke, prevXPosExt, prevYPos); + } + + let [ bandFillDir, bandClipDir ] = bandFillClipDirs(u, seriesIdx); + + if (series.fill != null || bandFillDir != 0) { + let fill = _paths.fill = new Path2D(stroke); + + let fillTo = series.fillTo(u, seriesIdx, series.min, series.max, bandFillDir); + let fillToY = pixelForY(fillTo); + + lineTo(fill, prevXPosExt, fillToY); + lineTo(fill, firstXPosExt, fillToY); + } + + if (!series.spanGaps) { + // console.time('gaps'); + let gaps = []; + + gaps.push(...findGaps(dataX, dataY, idx0, idx1, dir, pixelForX, alignGaps)); + + // console.timeEnd('gaps'); + + // console.log('gaps', JSON.stringify(gaps)); + + // expand/contract clips for ascenders/descenders + let halfStroke = (series.width * pxRatio) / 2; + let startsOffset = (ascDesc || align == 1) ? halfStroke : -halfStroke; + let endsOffset = (ascDesc || align == -1) ? -halfStroke : halfStroke; + + gaps.forEach(g => { + g[0] += startsOffset; + g[1] += endsOffset; + }); + + _paths.gaps = gaps = series.gaps(u, seriesIdx, idx0, idx1, gaps); + + _paths.clip = clipGaps(gaps, scaleX.ori, xOff, yOff, xDim, yDim); + } + + if (bandClipDir != 0) { + _paths.band = bandClipDir == 2 ? [ + clipBandLine(u, seriesIdx, idx0, idx1, stroke, -1), + clipBandLine(u, seriesIdx, idx0, idx1, stroke, 1), + ] : clipBandLine(u, seriesIdx, idx0, idx1, stroke, bandClipDir); + } + + return _paths; + }); + }; +} + +function findColWidth(dataX, dataY, valToPosX, scaleX, xDim, xOff, colWid = inf) { + if (dataX.length > 1) { + // prior index with non-undefined y data + let prevIdx = null; + + // scan full dataset for smallest adjacent delta + // will not work properly for non-linear x scales, since does not do expensive valToPosX calcs till end + for (let i = 0, minDelta = Infinity; i < dataX.length; i++) { + if (dataY[i] !== undefined) { + if (prevIdx != null) { + let delta = abs(dataX[i] - dataX[prevIdx]); + + if (delta < minDelta) { + minDelta = delta; + colWid = abs(valToPosX(dataX[i], scaleX, xDim, xOff) - valToPosX(dataX[prevIdx], scaleX, xDim, xOff)); + } + } + + prevIdx = i; + } + } + } + + return colWid; +} + +function bars(opts) { + opts = opts || EMPTY_OBJ; + const size = ifNull(opts.size, [0.6, inf, 1]); + const align = opts.align || 0; + const _extraGap = (opts.gap || 0); + + let ro = opts.radius; + + ro = + // [valueRadius, baselineRadius] + ro == null ? [0, 0] : + typeof ro == 'number' ? [ro, 0] : ro; + + const radiusFn = fnOrSelf(ro); + + const gapFactor = 1 - size[0]; + const _maxWidth = ifNull(size[1], inf); + const _minWidth = ifNull(size[2], 1); + + const disp = ifNull(opts.disp, EMPTY_OBJ); + const _each = ifNull(opts.each, _ => {}); + + const { fill: dispFills, stroke: dispStrokes } = disp; + + return (u, seriesIdx, idx0, idx1) => { + return orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => { + let pxRound = series.pxRound; + let _align = align; + + let extraGap = _extraGap * pxRatio; + let maxWidth = _maxWidth * pxRatio; + let minWidth = _minWidth * pxRatio; + + let valRadius, baseRadius; + + if (scaleX.ori == 0) + [valRadius, baseRadius] = radiusFn(u, seriesIdx); + else + [baseRadius, valRadius] = radiusFn(u, seriesIdx); + + const _dirX = scaleX.dir * (scaleX.ori == 0 ? 1 : -1); + // const _dirY = scaleY.dir * (scaleY.ori == 1 ? 1 : -1); + + let rect = scaleX.ori == 0 ? rectH : rectV; + + let each = scaleX.ori == 0 ? _each : (u, seriesIdx, i, top, lft, hgt, wid) => { + _each(u, seriesIdx, i, lft, top, wid, hgt); + }; + + // band where this series is the "from" edge + let band = ifNull(u.bands, EMPTY_ARR).find(b => b.series[0] == seriesIdx); + + let fillDir = band != null ? band.dir : 0; + let fillTo = series.fillTo(u, seriesIdx, series.min, series.max, fillDir); + let fillToY = pxRound(valToPosY(fillTo, scaleY, yDim, yOff)); + + // barWid is to center of stroke + let xShift, barWid, fullGap, colWid = xDim; + + let strokeWidth = pxRound(series.width * pxRatio); + + let multiPath = false; + + let fillColors = null; + let fillPaths = null; + let strokeColors = null; + let strokePaths = null; + + if (dispFills != null && (strokeWidth == 0 || dispStrokes != null)) { + multiPath = true; + + fillColors = dispFills.values(u, seriesIdx, idx0, idx1); + fillPaths = new Map(); + (new Set(fillColors)).forEach(color => { + if (color != null) + fillPaths.set(color, new Path2D()); + }); + + if (strokeWidth > 0) { + strokeColors = dispStrokes.values(u, seriesIdx, idx0, idx1); + strokePaths = new Map(); + (new Set(strokeColors)).forEach(color => { + if (color != null) + strokePaths.set(color, new Path2D()); + }); + } + } + + let { x0, size } = disp; + + if (x0 != null && size != null) { + _align = 1; + dataX = x0.values(u, seriesIdx, idx0, idx1); + + if (x0.unit == 2) + dataX = dataX.map(pct => u.posToVal(xOff + pct * xDim, scaleX.key, true)); + + // assumes uniform sizes, for now + let sizes = size.values(u, seriesIdx, idx0, idx1); + + if (size.unit == 2) + barWid = sizes[0] * xDim; + else + barWid = valToPosX(sizes[0], scaleX, xDim, xOff) - valToPosX(0, scaleX, xDim, xOff); // assumes linear scale (delta from 0) + + colWid = findColWidth(dataX, dataY, valToPosX, scaleX, xDim, xOff, colWid); + + let gapWid = colWid - barWid; + fullGap = gapWid + extraGap; + } + else { + colWid = findColWidth(dataX, dataY, valToPosX, scaleX, xDim, xOff, colWid); + + let gapWid = colWid * gapFactor; + + fullGap = gapWid + extraGap; + barWid = colWid - fullGap; + } + + if (fullGap < 1) + fullGap = 0; + + if (strokeWidth >= barWid / 2) + strokeWidth = 0; + + // for small gaps, disable pixel snapping since gap inconsistencies become noticible and annoying + if (fullGap < 5) + pxRound = retArg0; + + let insetStroke = fullGap > 0; + + let rawBarWid = colWid - fullGap - (insetStroke ? strokeWidth : 0); + + barWid = pxRound(clamp(rawBarWid, minWidth, maxWidth)); + + xShift = (_align == 0 ? barWid / 2 : _align == _dirX ? 0 : barWid) - _align * _dirX * ((_align == 0 ? extraGap / 2 : 0) + (insetStroke ? strokeWidth / 2 : 0)); + + + const _paths = {stroke: null, fill: null, clip: null, band: null, gaps: null, flags: 0}; // disp, geom + + const stroke = multiPath ? null : new Path2D(); + + let dataY0 = null; + + if (band != null) + dataY0 = u.data[band.series[1]]; + else { + let { y0, y1 } = disp; + + if (y0 != null && y1 != null) { + dataY = y1.values(u, seriesIdx, idx0, idx1); + dataY0 = y0.values(u, seriesIdx, idx0, idx1); + } + } + + let radVal = valRadius * barWid; + let radBase = baseRadius * barWid; + + for (let i = _dirX == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += _dirX) { + let yVal = dataY[i]; + + if (yVal == null) + continue; + + if (dataY0 != null) { + let yVal0 = dataY0[i] ?? 0; + + if (yVal - yVal0 == 0) + continue; + + fillToY = valToPosY(yVal0, scaleY, yDim, yOff); + } + + let xVal = scaleX.distr != 2 || disp != null ? dataX[i] : i; + + // TODO: all xPos can be pre-computed once for all series in aligned set + let xPos = valToPosX(xVal, scaleX, xDim, xOff); + let yPos = valToPosY(ifNull(yVal, fillTo), scaleY, yDim, yOff); + + let lft = pxRound(xPos - xShift); + let btm = pxRound(max(yPos, fillToY)); + let top = pxRound(min(yPos, fillToY)); + // this includes the stroke + let barHgt = btm - top; + + if (yVal != null) { // && yVal != fillTo (0 height bar) + let rv = yVal < 0 ? radBase : radVal; + let rb = yVal < 0 ? radVal : radBase; + + if (multiPath) { + if (strokeWidth > 0 && strokeColors[i] != null) + rect(strokePaths.get(strokeColors[i]), lft, top + floor(strokeWidth / 2), barWid, max(0, barHgt - strokeWidth), rv, rb); + + if (fillColors[i] != null) + rect(fillPaths.get(fillColors[i]), lft, top + floor(strokeWidth / 2), barWid, max(0, barHgt - strokeWidth), rv, rb); + } + else + rect(stroke, lft, top + floor(strokeWidth / 2), barWid, max(0, barHgt - strokeWidth), rv, rb); + + each(u, seriesIdx, i, + lft - strokeWidth / 2, + top, + barWid + strokeWidth, + barHgt, + ); + } + } + + if (strokeWidth > 0) + _paths.stroke = multiPath ? strokePaths : stroke; + else if (!multiPath) { + _paths._fill = series.width == 0 ? series._fill : series._stroke ?? series._fill; + _paths.width = 0; + } + + _paths.fill = multiPath ? fillPaths : stroke; + + return _paths; + }); + }; +} + +function splineInterp(interp, opts) { + const alignGaps = ifNull(opts?.alignGaps, 0); + + return (u, seriesIdx, idx0, idx1) => { + return orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => { + let pxRound = series.pxRound; + + let pixelForX = val => pxRound(valToPosX(val, scaleX, xDim, xOff)); + let pixelForY = val => pxRound(valToPosY(val, scaleY, yDim, yOff)); + + let moveTo, bezierCurveTo, lineTo; + + if (scaleX.ori == 0) { + moveTo = moveToH; + lineTo = lineToH; + bezierCurveTo = bezierCurveToH; + } + else { + moveTo = moveToV; + lineTo = lineToV; + bezierCurveTo = bezierCurveToV; + } + + const dir = scaleX.dir * (scaleX.ori == 0 ? 1 : -1); + + idx0 = nonNullIdx(dataY, idx0, idx1, 1); + idx1 = nonNullIdx(dataY, idx0, idx1, -1); + + let firstXPos = pixelForX(dataX[dir == 1 ? idx0 : idx1]); + let prevXPos = firstXPos; + + let xCoords = []; + let yCoords = []; + + for (let i = dir == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += dir) { + let yVal = dataY[i]; + + if (yVal != null) { + let xVal = dataX[i]; + let xPos = pixelForX(xVal); + + xCoords.push(prevXPos = xPos); + yCoords.push(pixelForY(dataY[i])); + } + } + + const _paths = {stroke: interp(xCoords, yCoords, moveTo, lineTo, bezierCurveTo, pxRound), fill: null, clip: null, band: null, gaps: null, flags: BAND_CLIP_FILL}; + const stroke = _paths.stroke; + + let [ bandFillDir, bandClipDir ] = bandFillClipDirs(u, seriesIdx); + + if (series.fill != null || bandFillDir != 0) { + let fill = _paths.fill = new Path2D(stroke); + + let fillTo = series.fillTo(u, seriesIdx, series.min, series.max, bandFillDir); + let fillToY = pixelForY(fillTo); + + lineTo(fill, prevXPos, fillToY); + lineTo(fill, firstXPos, fillToY); + } + + if (!series.spanGaps) { + // console.time('gaps'); + let gaps = []; + + gaps.push(...findGaps(dataX, dataY, idx0, idx1, dir, pixelForX, alignGaps)); + + // console.timeEnd('gaps'); + + // console.log('gaps', JSON.stringify(gaps)); + + _paths.gaps = gaps = series.gaps(u, seriesIdx, idx0, idx1, gaps); + + _paths.clip = clipGaps(gaps, scaleX.ori, xOff, yOff, xDim, yDim); + } + + if (bandClipDir != 0) { + _paths.band = bandClipDir == 2 ? [ + clipBandLine(u, seriesIdx, idx0, idx1, stroke, -1), + clipBandLine(u, seriesIdx, idx0, idx1, stroke, 1), + ] : clipBandLine(u, seriesIdx, idx0, idx1, stroke, bandClipDir); + } + + return _paths; + + // if FEAT_PATHS: false in rollup.config.js + // u.ctx.save(); + // u.ctx.beginPath(); + // u.ctx.rect(u.bbox.left, u.bbox.top, u.bbox.width, u.bbox.height); + // u.ctx.clip(); + // u.ctx.strokeStyle = u.series[sidx].stroke; + // u.ctx.stroke(stroke); + // u.ctx.fillStyle = u.series[sidx].fill; + // u.ctx.fill(fill); + // u.ctx.restore(); + // return null; + }); + }; +} + +function monotoneCubic(opts) { + return splineInterp(_monotoneCubic, opts); +} + +// Monotone Cubic Spline interpolation, adapted from the Chartist.js implementation: +// https://github.com/gionkunz/chartist-js/blob/e7e78201bffe9609915e5e53cfafa29a5d6c49f9/src/scripts/interpolation.js#L240-L369 +function _monotoneCubic(xs, ys, moveTo, lineTo, bezierCurveTo, pxRound) { + const n = xs.length; + + if (n < 2) + return null; + + const path = new Path2D(); + + moveTo(path, xs[0], ys[0]); + + if (n == 2) + lineTo(path, xs[1], ys[1]); + else { + let ms = Array(n), + ds = Array(n - 1), + dys = Array(n - 1), + dxs = Array(n - 1); + + // calc deltas and derivative + for (let i = 0; i < n - 1; i++) { + dys[i] = ys[i + 1] - ys[i]; + dxs[i] = xs[i + 1] - xs[i]; + ds[i] = dys[i] / dxs[i]; + } + + // determine desired slope (m) at each point using Fritsch-Carlson method + // http://math.stackexchange.com/questions/45218/implementation-of-monotone-cubic-interpolation + ms[0] = ds[0]; + + for (let i = 1; i < n - 1; i++) { + if (ds[i] === 0 || ds[i - 1] === 0 || (ds[i - 1] > 0) !== (ds[i] > 0)) + ms[i] = 0; + else { + ms[i] = 3 * (dxs[i - 1] + dxs[i]) / ( + (2 * dxs[i] + dxs[i - 1]) / ds[i - 1] + + (dxs[i] + 2 * dxs[i - 1]) / ds[i] + ); + + if (!isFinite(ms[i])) + ms[i] = 0; + } + } + + ms[n - 1] = ds[n - 2]; + + for (let i = 0; i < n - 1; i++) { + bezierCurveTo( + path, + xs[i] + dxs[i] / 3, + ys[i] + ms[i] * dxs[i] / 3, + xs[i + 1] - dxs[i] / 3, + ys[i + 1] - ms[i + 1] * dxs[i] / 3, + xs[i + 1], + ys[i + 1], + ); + } + } + + return path; +} + +const cursorPlots = new Set(); + +function invalidateRects() { + for (let u of cursorPlots) + u.syncRect(true); +} + +if (domEnv) { + on(resize, win, invalidateRects); + on(scroll, win, invalidateRects, true); + on(dppxchange, win, () => { uPlot.pxRatio = pxRatio; }); +} + +const linearPath = linear() ; +const pointsPath = points() ; + +function setDefaults(d, xo, yo, initY) { + let d2 = initY ? [d[0], d[1]].concat(d.slice(2)) : [d[0]].concat(d.slice(1)); + return d2.map((o, i) => setDefault(o, i, xo, yo)); +} + +function setDefaults2(d, xyo) { + return d.map((o, i) => i == 0 ? {} : assign({}, xyo, o)); // todo: assign() will not merge facet arrays +} + +function setDefault(o, i, xo, yo) { + return assign({}, (i == 0 ? xo : yo), o); +} + +function snapNumX(self, dataMin, dataMax) { + return dataMin == null ? nullNullTuple : [dataMin, dataMax]; +} + +const snapTimeX = snapNumX; + +// this ensures that non-temporal/numeric y-axes get multiple-snapped padding added above/below +// TODO: also account for incrs when snapping to ensure top of axis gets a tick & value +function snapNumY(self, dataMin, dataMax) { + return dataMin == null ? nullNullTuple : rangeNum(dataMin, dataMax, rangePad, true); +} + +function snapLogY(self, dataMin, dataMax, scale) { + return dataMin == null ? nullNullTuple : rangeLog(dataMin, dataMax, self.scales[scale].log, false); +} + +const snapLogX = snapLogY; + +function snapAsinhY(self, dataMin, dataMax, scale) { + return dataMin == null ? nullNullTuple : rangeAsinh(dataMin, dataMax, self.scales[scale].log, false); +} + +const snapAsinhX = snapAsinhY; + +// dim is logical (getClientBoundingRect) pixels, not canvas pixels +function findIncr(minVal, maxVal, incrs, dim, minSpace) { + let intDigits = max(numIntDigits(minVal), numIntDigits(maxVal)); + + let delta = maxVal - minVal; + + let incrIdx = closestIdx((minSpace / dim) * delta, incrs); + + do { + let foundIncr = incrs[incrIdx]; + let foundSpace = dim * foundIncr / delta; + + if (foundSpace >= minSpace && intDigits + (foundIncr < 5 ? fixedDec.get(foundIncr) : 0) <= 17) + return [foundIncr, foundSpace]; + } while (++incrIdx < incrs.length); + + return [0, 0]; +} + +function pxRatioFont(font) { + let fontSize, fontSizeCss; + font = font.replace(/(\d+)px/, (m, p1) => (fontSize = round((fontSizeCss = +p1) * pxRatio)) + 'px'); + return [font, fontSize, fontSizeCss]; +} + +function syncFontSize(axis) { + if (axis.show) { + [axis.font, axis.labelFont].forEach(f => { + let size = roundDec(f[2] * pxRatio, 1); + f[0] = f[0].replace(/[0-9.]+px/, size + 'px'); + f[1] = size; + }); + } +} + +function uPlot(opts, data, then) { + const self = { + mode: ifNull(opts.mode, 1), + }; + + const mode = self.mode; + + // TODO: cache denoms & mins scale.cache = {r, min, } + function getValPct(val, scale) { + let _val = ( + scale.distr == 3 ? log10(val > 0 ? val : scale.clamp(self, val, scale.min, scale.max, scale.key)) : + scale.distr == 4 ? asinh(val, scale.asinh) : + scale.distr == 100 ? scale.fwd(val) : + val + ); + + return (_val - scale._min) / (scale._max - scale._min); + } + + function getHPos(val, scale, dim, off) { + let pct = getValPct(val, scale); + return off + dim * (scale.dir == -1 ? (1 - pct) : pct); + } + + function getVPos(val, scale, dim, off) { + let pct = getValPct(val, scale); + return off + dim * (scale.dir == -1 ? pct : (1 - pct)); + } + + function getPos(val, scale, dim, off) { + return scale.ori == 0 ? getHPos(val, scale, dim, off) : getVPos(val, scale, dim, off); + } + + self.valToPosH = getHPos; + self.valToPosV = getVPos; + + let ready = false; + self.status = 0; + + const root = self.root = placeDiv(UPLOT); + + if (opts.id != null) + root.id = opts.id; + + addClass(root, opts.class); + + if (opts.title) { + let title = placeDiv(TITLE, root); + title.textContent = opts.title; + } + + const can = placeTag("canvas"); + const ctx = self.ctx = can.getContext("2d"); + + const wrap = placeDiv(WRAP, root); + + on("click", wrap, e => { + if (e.target === over) { + let didDrag = mouseLeft1 != mouseLeft0 || mouseTop1 != mouseTop0; + didDrag && drag.click(self, e); + } + }, true); + + const under = self.under = placeDiv(UNDER, wrap); + wrap.appendChild(can); + const over = self.over = placeDiv(OVER, wrap); + + opts = copy(opts); + + const pxAlign = +ifNull(opts.pxAlign, 1); + + const pxRound = pxRoundGen(pxAlign); + + (opts.plugins || []).forEach(p => { + if (p.opts) + opts = p.opts(self, opts) || opts; + }); + + const ms = opts.ms || 1e-3; + + const series = self.series = mode == 1 ? + setDefaults(opts.series || [], xSeriesOpts, ySeriesOpts, false) : + setDefaults2(opts.series || [null], xySeriesOpts); + const axes = self.axes = setDefaults(opts.axes || [], xAxisOpts, yAxisOpts, true); + const scales = self.scales = {}; + const bands = self.bands = opts.bands || []; + + bands.forEach(b => { + b.fill = fnOrSelf(b.fill || null); + b.dir = ifNull(b.dir, -1); + }); + + const xScaleKey = mode == 2 ? series[1].facets[0].scale : series[0].scale; + + const drawOrderMap = { + axes: drawAxesGrid, + series: drawSeries, + }; + + const drawOrder = (opts.drawOrder || ["axes", "series"]).map(key => drawOrderMap[key]); + + function initScale(scaleKey) { + let sc = scales[scaleKey]; + + if (sc == null) { + let scaleOpts = (opts.scales || EMPTY_OBJ)[scaleKey] || EMPTY_OBJ; + + if (scaleOpts.from != null) { + // ensure parent is initialized + initScale(scaleOpts.from); + // dependent scales inherit + scales[scaleKey] = assign({}, scales[scaleOpts.from], scaleOpts, {key: scaleKey}); + } + else { + sc = scales[scaleKey] = assign({}, (scaleKey == xScaleKey ? xScaleOpts : yScaleOpts), scaleOpts); + + sc.key = scaleKey; + + let isTime = sc.time; + + let rn = sc.range; + + let rangeIsArr = isArr(rn); + + if (scaleKey != xScaleKey || (mode == 2 && !isTime)) { + // if range array has null limits, it should be auto + if (rangeIsArr && (rn[0] == null || rn[1] == null)) { + rn = { + min: rn[0] == null ? autoRangePart : { + mode: 1, + hard: rn[0], + soft: rn[0], + }, + max: rn[1] == null ? autoRangePart : { + mode: 1, + hard: rn[1], + soft: rn[1], + }, + }; + rangeIsArr = false; + } + + if (!rangeIsArr && isObj(rn)) { + let cfg = rn; + // this is similar to snapNumY + rn = (self, dataMin, dataMax) => dataMin == null ? nullNullTuple : rangeNum(dataMin, dataMax, cfg); + } + } + + sc.range = fnOrSelf(rn || (isTime ? snapTimeX : scaleKey == xScaleKey ? + (sc.distr == 3 ? snapLogX : sc.distr == 4 ? snapAsinhX : snapNumX) : + (sc.distr == 3 ? snapLogY : sc.distr == 4 ? snapAsinhY : snapNumY) + )); + + sc.auto = fnOrSelf(rangeIsArr ? false : sc.auto); + + sc.clamp = fnOrSelf(sc.clamp || clampScale); + + // caches for expensive ops like asinh() & log() + sc._min = sc._max = null; + } + } + } + + initScale("x"); + initScale("y"); + + // TODO: init scales from facets in mode: 2 + if (mode == 1) { + series.forEach(s => { + initScale(s.scale); + }); + } + + axes.forEach(a => { + initScale(a.scale); + }); + + for (let k in opts.scales) + initScale(k); + + const scaleX = scales[xScaleKey]; + + const xScaleDistr = scaleX.distr; + + let valToPosX, valToPosY; + + if (scaleX.ori == 0) { + addClass(root, ORI_HZ); + valToPosX = getHPos; + valToPosY = getVPos; + /* + updOriDims = () => { + xDimCan = plotWid; + xOffCan = plotLft; + yDimCan = plotHgt; + yOffCan = plotTop; + + xDimCss = plotWidCss; + xOffCss = plotLftCss; + yDimCss = plotHgtCss; + yOffCss = plotTopCss; + }; + */ + } + else { + addClass(root, ORI_VT); + valToPosX = getVPos; + valToPosY = getHPos; + /* + updOriDims = () => { + xDimCan = plotHgt; + xOffCan = plotTop; + yDimCan = plotWid; + yOffCan = plotLft; + + xDimCss = plotHgtCss; + xOffCss = plotTopCss; + yDimCss = plotWidCss; + yOffCss = plotLftCss; + }; + */ + } + + const pendScales = {}; + + // explicitly-set initial scales + for (let k in scales) { + let sc = scales[k]; + + if (sc.min != null || sc.max != null) { + pendScales[k] = {min: sc.min, max: sc.max}; + sc.min = sc.max = null; + } + } + +// self.tz = opts.tz || Intl.DateTimeFormat().resolvedOptions().timeZone; + const _tzDate = (opts.tzDate || (ts => new Date(round(ts / ms)))); + const _fmtDate = (opts.fmtDate || fmtDate); + + const _timeAxisSplits = (ms == 1 ? timeAxisSplitsMs(_tzDate) : timeAxisSplitsS(_tzDate)); + const _timeAxisVals = timeAxisVals(_tzDate, timeAxisStamps((ms == 1 ? _timeAxisStampsMs : _timeAxisStampsS), _fmtDate)); + const _timeSeriesVal = timeSeriesVal(_tzDate, timeSeriesStamp(_timeSeriesStamp, _fmtDate)); + + const activeIdxs = []; + + const legend = (self.legend = assign({}, legendOpts, opts.legend)); + const showLegend = legend.show; + const markers = legend.markers; + + { + legend.idxs = activeIdxs; + + markers.width = fnOrSelf(markers.width); + markers.dash = fnOrSelf(markers.dash); + markers.stroke = fnOrSelf(markers.stroke); + markers.fill = fnOrSelf(markers.fill); + } + + let legendTable; + let legendHead; + let legendBody; + let legendRows = []; + let legendCells = []; + let legendCols; + let multiValLegend = false; + let NULL_LEGEND_VALUES = {}; + + if (legend.live) { + const getMultiVals = series[1] ? series[1].values : null; + multiValLegend = getMultiVals != null; + legendCols = multiValLegend ? getMultiVals(self, 1, 0) : {_: 0}; + + for (let k in legendCols) + NULL_LEGEND_VALUES[k] = LEGEND_DISP; + } + + if (showLegend) { + legendTable = placeTag("table", LEGEND, root); + legendBody = placeTag("tbody", null, legendTable); + + // allows legend to be moved out of root + legend.mount(self, legendTable); + + if (multiValLegend) { + legendHead = placeTag("thead", null, legendTable, legendBody); + + let head = placeTag("tr", null, legendHead); + placeTag("th", null, head); + + for (var key in legendCols) + placeTag("th", LEGEND_LABEL, head).textContent = key; + } + else { + addClass(legendTable, LEGEND_INLINE); + legend.live && addClass(legendTable, LEGEND_LIVE); + } + } + + const son = {show: true}; + const soff = {show: false}; + + function initLegendRow(s, i) { + if (i == 0 && (multiValLegend || !legend.live || mode == 2)) + return nullNullTuple; + + let cells = []; + + let row = placeTag("tr", LEGEND_SERIES, legendBody, legendBody.childNodes[i]); + + addClass(row, s.class); + + if (!s.show) + addClass(row, OFF); + + let label = placeTag("th", null, row); + + if (markers.show) { + let indic = placeDiv(LEGEND_MARKER, label); + + if (i > 0) { + let width = markers.width(self, i); + + if (width) + indic.style.border = width + "px " + markers.dash(self, i) + " " + markers.stroke(self, i); + + indic.style.background = markers.fill(self, i); + } + } + + let text = placeDiv(LEGEND_LABEL, label); + text.textContent = s.label; + + if (i > 0) { + if (!markers.show) + text.style.color = s.width > 0 ? markers.stroke(self, i) : markers.fill(self, i); + + onMouse("click", label, e => { + if (cursor._lock) + return; + + setCursorEvent(e); + + let seriesIdx = series.indexOf(s); + + if ((e.ctrlKey || e.metaKey) != legend.isolate) { + // if any other series is shown, isolate this one. else show all + let isolate = series.some((s, i) => i > 0 && i != seriesIdx && s.show); + + series.forEach((s, i) => { + i > 0 && setSeries(i, isolate ? (i == seriesIdx ? son : soff) : son, true, syncOpts.setSeries); + }); + } + else + setSeries(seriesIdx, {show: !s.show}, true, syncOpts.setSeries); + }, false); + + if (cursorFocus) { + onMouse(mouseenter, label, e => { + if (cursor._lock) + return; + + setCursorEvent(e); + + setSeries(series.indexOf(s), FOCUS_TRUE, true, syncOpts.setSeries); + }, false); + } + } + + for (var key in legendCols) { + let v = placeTag("td", LEGEND_VALUE, row); + v.textContent = "--"; + cells.push(v); + } + + return [row, cells]; + } + + const mouseListeners = new Map(); + + function onMouse(ev, targ, fn, onlyTarg = true) { + const targListeners = mouseListeners.get(targ) || {}; + const listener = cursor.bind[ev](self, targ, fn, onlyTarg); + + if (listener) { + on(ev, targ, targListeners[ev] = listener); + mouseListeners.set(targ, targListeners); + } + } + + function offMouse(ev, targ, fn) { + const targListeners = mouseListeners.get(targ) || {}; + + for (let k in targListeners) { + if (ev == null || k == ev) { + off(k, targ, targListeners[k]); + delete targListeners[k]; + } + } + + if (ev == null) + mouseListeners.delete(targ); + } + + let fullWidCss = 0; + let fullHgtCss = 0; + + let plotWidCss = 0; + let plotHgtCss = 0; + + // plot margins to account for axes + let plotLftCss = 0; + let plotTopCss = 0; + + // previous values for diffing + let _plotLftCss = plotLftCss; + let _plotTopCss = plotTopCss; + let _plotWidCss = plotWidCss; + let _plotHgtCss = plotHgtCss; + + + let plotLft = 0; + let plotTop = 0; + let plotWid = 0; + let plotHgt = 0; + + self.bbox = {}; + + let shouldSetScales = false; + let shouldSetSize = false; + let shouldConvergeSize = false; + let shouldSetCursor = false; + let shouldSetSelect = false; + let shouldSetLegend = false; + + function _setSize(width, height, force) { + if (force || (width != self.width || height != self.height)) + calcSize(width, height); + + resetYSeries(false); + + shouldConvergeSize = true; + shouldSetSize = true; + + commit(); + } + + function calcSize(width, height) { + // log("calcSize()", arguments); + + self.width = fullWidCss = plotWidCss = width; + self.height = fullHgtCss = plotHgtCss = height; + plotLftCss = plotTopCss = 0; + + calcPlotRect(); + calcAxesRects(); + + let bb = self.bbox; + + plotLft = bb.left = incrRound(plotLftCss * pxRatio, 0.5); + plotTop = bb.top = incrRound(plotTopCss * pxRatio, 0.5); + plotWid = bb.width = incrRound(plotWidCss * pxRatio, 0.5); + plotHgt = bb.height = incrRound(plotHgtCss * pxRatio, 0.5); + + // updOriDims(); + } + + // ensures size calc convergence + const CYCLE_LIMIT = 3; + + function convergeSize() { + let converged = false; + + let cycleNum = 0; + + while (!converged) { + cycleNum++; + + let axesConverged = axesCalc(cycleNum); + let paddingConverged = paddingCalc(cycleNum); + + converged = cycleNum == CYCLE_LIMIT || (axesConverged && paddingConverged); + + if (!converged) { + calcSize(self.width, self.height); + shouldSetSize = true; + } + } + } + + function setSize({width, height}) { + _setSize(width, height); + } + + self.setSize = setSize; + + // accumulate axis offsets, reduce canvas width + function calcPlotRect() { + // easements for edge labels + let hasTopAxis = false; + let hasBtmAxis = false; + let hasRgtAxis = false; + let hasLftAxis = false; + + axes.forEach((axis, i) => { + if (axis.show && axis._show) { + let {side, _size} = axis; + let isVt = side % 2; + let labelSize = axis.label != null ? axis.labelSize : 0; + + let fullSize = _size + labelSize; + + if (fullSize > 0) { + if (isVt) { + plotWidCss -= fullSize; + + if (side == 3) { + plotLftCss += fullSize; + hasLftAxis = true; + } + else + hasRgtAxis = true; + } + else { + plotHgtCss -= fullSize; + + if (side == 0) { + plotTopCss += fullSize; + hasTopAxis = true; + } + else + hasBtmAxis = true; + } + } + } + }); + + sidesWithAxes[0] = hasTopAxis; + sidesWithAxes[1] = hasRgtAxis; + sidesWithAxes[2] = hasBtmAxis; + sidesWithAxes[3] = hasLftAxis; + + // hz padding + plotWidCss -= _padding[1] + _padding[3]; + plotLftCss += _padding[3]; + + // vt padding + plotHgtCss -= _padding[2] + _padding[0]; + plotTopCss += _padding[0]; + } + + function calcAxesRects() { + // will accum + + let off1 = plotLftCss + plotWidCss; + let off2 = plotTopCss + plotHgtCss; + // will accum - + let off3 = plotLftCss; + let off0 = plotTopCss; + + function incrOffset(side, size) { + switch (side) { + case 1: off1 += size; return off1 - size; + case 2: off2 += size; return off2 - size; + case 3: off3 -= size; return off3 + size; + case 0: off0 -= size; return off0 + size; + } + } + + axes.forEach((axis, i) => { + if (axis.show && axis._show) { + let side = axis.side; + + axis._pos = incrOffset(side, axis._size); + + if (axis.label != null) + axis._lpos = incrOffset(side, axis.labelSize); + } + }); + } + + const cursor = self.cursor = assign({}, cursorOpts, {drag: {y: mode == 2}}, opts.cursor); + + if (cursor.dataIdx == null) { + let hov = cursor.hover; + + let skip = hov.skip = new Set(hov.skip ?? []); + skip.add(void 0); // alignment artifacts + let prox = hov.prox = fnOrSelf(hov.prox); + let bias = hov.bias ??= 0; + + // TODO: only scan between in-view idxs (i0, i1) + cursor.dataIdx = (self, seriesIdx, cursorIdx, valAtPosX) => { + if (seriesIdx == 0) + return cursorIdx; + + let idx2 = cursorIdx; + + let _prox = prox(self, seriesIdx, cursorIdx, valAtPosX) ?? inf; + let withProx = _prox >= 0 && _prox < inf; + let xDim = scaleX.ori == 0 ? plotWidCss : plotHgtCss; + let cursorLft = cursor.left; + + let xValues = data[0]; + let yValues = data[seriesIdx]; + + if (skip.has(yValues[cursorIdx])) { + idx2 = null; + + let nonNullLft = null, + nonNullRgt = null, + j; + + if (bias == 0 || bias == -1) { + j = cursorIdx; + while (nonNullLft == null && j-- > 0) { + if (!skip.has(yValues[j])) + nonNullLft = j; + } + } + + if (bias == 0 || bias == 1) { + j = cursorIdx; + while (nonNullRgt == null && j++ < yValues.length) { + if (!skip.has(yValues[j])) + nonNullRgt = j; + } + } + + if (nonNullLft != null || nonNullRgt != null) { + if (withProx) { + let lftPos = nonNullLft == null ? -Infinity : valToPosX(xValues[nonNullLft], scaleX, xDim, 0); + let rgtPos = nonNullRgt == null ? Infinity : valToPosX(xValues[nonNullRgt], scaleX, xDim, 0); + + let lftDelta = cursorLft - lftPos; + let rgtDelta = rgtPos - cursorLft; + + if (lftDelta <= rgtDelta) { + if (lftDelta <= _prox) + idx2 = nonNullLft; + } else { + if (rgtDelta <= _prox) + idx2 = nonNullRgt; + } + } + else { + idx2 = + nonNullRgt == null ? nonNullLft : + nonNullLft == null ? nonNullRgt : + cursorIdx - nonNullLft <= nonNullRgt - cursorIdx ? nonNullLft : nonNullRgt; + } + } + } + else if (withProx) { + let dist = abs(cursorLft - valToPosX(xValues[cursorIdx], scaleX, xDim, 0)); + + if (dist > _prox) + idx2 = null; + } + + return idx2; + }; + } + + const setCursorEvent = e => { cursor.event = e; }; + + cursor.idxs = activeIdxs; + + cursor._lock = false; + + let points = cursor.points; + + points.show = fnOrSelf(points.show); + points.size = fnOrSelf(points.size); + points.stroke = fnOrSelf(points.stroke); + points.width = fnOrSelf(points.width); + points.fill = fnOrSelf(points.fill); + + const focus = self.focus = assign({}, opts.focus || {alpha: 0.3}, cursor.focus); + + const cursorFocus = focus.prox >= 0; + const cursorOnePt = cursorFocus && points.one; + + // series-intersection markers + let cursorPts = []; + // position caches in CSS pixels + let cursorPtsLft = []; + let cursorPtsTop = []; + + function initCursorPt(s, si) { + let pt = points.show(self, si); + + if (pt) { + addClass(pt, CURSOR_PT); + addClass(pt, s.class); + elTrans(pt, -10, -10, plotWidCss, plotHgtCss); + over.insertBefore(pt, cursorPts[si]); + + return pt; + } + } + + function initSeries(s, i) { + if (mode == 1 || i > 0) { + let isTime = mode == 1 && scales[s.scale].time; + + let sv = s.value; + s.value = isTime ? (isStr(sv) ? timeSeriesVal(_tzDate, timeSeriesStamp(sv, _fmtDate)) : sv || _timeSeriesVal) : sv || numSeriesVal; + s.label = s.label || (isTime ? timeSeriesLabel : numSeriesLabel); + } + + if (cursorOnePt || i > 0) { + s.width = s.width == null ? 1 : s.width; + s.paths = s.paths || linearPath || retNull; + s.fillTo = fnOrSelf(s.fillTo || seriesFillTo); + s.pxAlign = +ifNull(s.pxAlign, pxAlign); + s.pxRound = pxRoundGen(s.pxAlign); + + s.stroke = fnOrSelf(s.stroke || null); + s.fill = fnOrSelf(s.fill || null); + s._stroke = s._fill = s._paths = s._focus = null; + + let _ptDia = ptDia(max(1, s.width), 1); + let points = s.points = assign({}, { + size: _ptDia, + width: max(1, _ptDia * .2), + stroke: s.stroke, + space: _ptDia * 2, + paths: pointsPath, + _stroke: null, + _fill: null, + }, s.points); + points.show = fnOrSelf(points.show); + points.filter = fnOrSelf(points.filter); + points.fill = fnOrSelf(points.fill); + points.stroke = fnOrSelf(points.stroke); + points.paths = fnOrSelf(points.paths); + points.pxAlign = s.pxAlign; + } + + if (showLegend) { + let rowCells = initLegendRow(s, i); + legendRows.splice(i, 0, rowCells[0]); + legendCells.splice(i, 0, rowCells[1]); + legend.values.push(null); // NULL_LEGEND_VALS not yet avil here :( + } + + if (cursor.show) { + activeIdxs.splice(i, 0, null); + + let pt = null; + + if (cursorOnePt) { + if (i == 0) + pt = initCursorPt(s, i); + } + else if (i > 0) + pt = initCursorPt(s, i); + + cursorPts.splice(i, 0, pt); + cursorPtsLft.splice(i, 0, 0); + cursorPtsTop.splice(i, 0, 0); + } + + fire("addSeries", i); + } + + function addSeries(opts, si) { + si = si == null ? series.length : si; + + opts = mode == 1 ? setDefault(opts, si, xSeriesOpts, ySeriesOpts) : setDefault(opts, si, {}, xySeriesOpts); + + series.splice(si, 0, opts); + initSeries(series[si], si); + } + + self.addSeries = addSeries; + + function delSeries(i) { + series.splice(i, 1); + + if (showLegend) { + legend.values.splice(i, 1); + + legendCells.splice(i, 1); + let tr = legendRows.splice(i, 1)[0]; + offMouse(null, tr.firstChild); + tr.remove(); + } + + if (cursor.show) { + activeIdxs.splice(i, 1); + cursorPts.splice(i, 1)[0].remove(); + cursorPtsLft.splice(i, 1); + cursorPtsTop.splice(i, 1); + } + + // TODO: de-init no-longer-needed scales? + + fire("delSeries", i); + } + + self.delSeries = delSeries; + + const sidesWithAxes = [false, false, false, false]; + + function initAxis(axis, i) { + axis._show = axis.show; + + if (axis.show) { + let isVt = axis.side % 2; + + let sc = scales[axis.scale]; + + // this can occur if all series specify non-default scales + if (sc == null) { + axis.scale = isVt ? series[1].scale : xScaleKey; + sc = scales[axis.scale]; + } + + // also set defaults for incrs & values based on axis distr + let isTime = sc.time; + + axis.size = fnOrSelf(axis.size); + axis.space = fnOrSelf(axis.space); + axis.rotate = fnOrSelf(axis.rotate); + + if (isArr(axis.incrs)) { + axis.incrs.forEach(incr => { + !fixedDec.has(incr) && fixedDec.set(incr, guessDec(incr)); + }); + } + + axis.incrs = fnOrSelf(axis.incrs || ( sc.distr == 2 ? wholeIncrs : (isTime ? (ms == 1 ? timeIncrsMs : timeIncrsS) : numIncrs))); + axis.splits = fnOrSelf(axis.splits || (isTime && sc.distr == 1 ? _timeAxisSplits : sc.distr == 3 ? logAxisSplits : sc.distr == 4 ? asinhAxisSplits : numAxisSplits)); + + axis.stroke = fnOrSelf(axis.stroke); + axis.grid.stroke = fnOrSelf(axis.grid.stroke); + axis.ticks.stroke = fnOrSelf(axis.ticks.stroke); + axis.border.stroke = fnOrSelf(axis.border.stroke); + + let av = axis.values; + + axis.values = ( + // static array of tick values + isArr(av) && !isArr(av[0]) ? fnOrSelf(av) : + // temporal + isTime ? ( + // config array of fmtDate string tpls + isArr(av) ? + timeAxisVals(_tzDate, timeAxisStamps(av, _fmtDate)) : + // fmtDate string tpl + isStr(av) ? + timeAxisVal(_tzDate, av) : + av || _timeAxisVals + ) : av || numAxisVals + ); + + axis.filter = fnOrSelf(axis.filter || ( sc.distr >= 3 && sc.log == 10 ? log10AxisValsFilt : sc.distr == 3 && sc.log == 2 ? log2AxisValsFilt : retArg1)); + + axis.font = pxRatioFont(axis.font); + axis.labelFont = pxRatioFont(axis.labelFont); + + axis._size = axis.size(self, null, i, 0); + + axis._space = + axis._rotate = + axis._incrs = + axis._found = // foundIncrSpace + axis._splits = + axis._values = null; + + if (axis._size > 0) { + sidesWithAxes[i] = true; + axis._el = placeDiv(AXIS, wrap); + } + + // debug + // axis._el.style.background = "#" + Math.floor(Math.random()*16777215).toString(16) + '80'; + } + } + + function autoPadSide(self, side, sidesWithAxes, cycleNum) { + let [hasTopAxis, hasRgtAxis, hasBtmAxis, hasLftAxis] = sidesWithAxes; + + let ori = side % 2; + let size = 0; + + if (ori == 0 && (hasLftAxis || hasRgtAxis)) + size = (side == 0 && !hasTopAxis || side == 2 && !hasBtmAxis ? round(xAxisOpts.size / 3) : 0); + if (ori == 1 && (hasTopAxis || hasBtmAxis)) + size = (side == 1 && !hasRgtAxis || side == 3 && !hasLftAxis ? round(yAxisOpts.size / 2) : 0); + + return size; + } + + const padding = self.padding = (opts.padding || [autoPadSide,autoPadSide,autoPadSide,autoPadSide]).map(p => fnOrSelf(ifNull(p, autoPadSide))); + const _padding = self._padding = padding.map((p, i) => p(self, i, sidesWithAxes, 0)); + + let dataLen; + + // rendered data window + let i0 = null; + let i1 = null; + const idxs = mode == 1 ? series[0].idxs : null; + + let data0 = null; + + let viaAutoScaleX = false; + + function setData(_data, _resetScales) { + data = _data == null ? [] : _data; + + self.data = self._data = data; + + if (mode == 2) { + dataLen = 0; + for (let i = 1; i < series.length; i++) + dataLen += data[i][0].length; + } + else { + if (data.length == 0) + self.data = self._data = data = [[]]; + + data0 = data[0]; + dataLen = data0.length; + + let scaleData = data; + + if (xScaleDistr == 2) { + scaleData = data.slice(); + + let _data0 = scaleData[0] = Array(dataLen); + for (let i = 0; i < dataLen; i++) + _data0[i] = i; + } + + self._data = data = scaleData; + } + + resetYSeries(true); + + fire("setData"); + + // forces x axis tick values to re-generate when neither x scale nor y scale changes + // in ordinal mode, scale range is by index, so will not change if new data has same length, but tick values are from data + if (xScaleDistr == 2) { + shouldConvergeSize = true; + + /* or somewhat cheaper, and uglier: + if (ready) { + // logic extracted from axesCalc() + let i = 0; + let axis = axes[i]; + let _splits = axis._splits.map(i => data0[i]); + let [_incr, _space] = axis._found; + let incr = data0[_splits[1]] - data0[_splits[0]]; + axis._values = axis.values(self, axis.filter(self, _splits, i, _space, incr), i, _space, incr); + } + */ + } + + if (_resetScales !== false) { + let xsc = scaleX; + + if (xsc.auto(self, viaAutoScaleX)) + autoScaleX(); + else + _setScale(xScaleKey, xsc.min, xsc.max); + + shouldSetCursor = shouldSetCursor || cursor.left >= 0; + shouldSetLegend = true; + commit(); + } + } + + self.setData = setData; + + function autoScaleX() { + viaAutoScaleX = true; + + let _min, _max; + + if (mode == 1) { + if (dataLen > 0) { + i0 = idxs[0] = 0; + i1 = idxs[1] = dataLen - 1; + + _min = data[0][i0]; + _max = data[0][i1]; + + if (xScaleDistr == 2) { + _min = i0; + _max = i1; + } + else if (_min == _max) { + if (xScaleDistr == 3) + [_min, _max] = rangeLog(_min, _min, scaleX.log, false); + else if (xScaleDistr == 4) + [_min, _max] = rangeAsinh(_min, _min, scaleX.log, false); + else if (scaleX.time) + _max = _min + round(86400 / ms); + else + [_min, _max] = rangeNum(_min, _max, rangePad, true); + } + } + else { + i0 = idxs[0] = _min = null; + i1 = idxs[1] = _max = null; + } + } + + _setScale(xScaleKey, _min, _max); + } + + let ctxStroke, ctxFill, ctxWidth, ctxDash, ctxJoin, ctxCap, ctxFont, ctxAlign, ctxBaseline; + let ctxAlpha; + + function setCtxStyle(stroke, width, dash, cap, fill, join) { + stroke ??= transparent; + dash ??= EMPTY_ARR; + cap ??= "butt"; // (‿|‿) + fill ??= transparent; + join ??= "round"; + + if (stroke != ctxStroke) + ctx.strokeStyle = ctxStroke = stroke; + if (fill != ctxFill) + ctx.fillStyle = ctxFill = fill; + if (width != ctxWidth) + ctx.lineWidth = ctxWidth = width; + if (join != ctxJoin) + ctx.lineJoin = ctxJoin = join; + if (cap != ctxCap) + ctx.lineCap = ctxCap = cap; + if (dash != ctxDash) + ctx.setLineDash(ctxDash = dash); + } + + function setFontStyle(font, fill, align, baseline) { + if (fill != ctxFill) + ctx.fillStyle = ctxFill = fill; + if (font != ctxFont) + ctx.font = ctxFont = font; + if (align != ctxAlign) + ctx.textAlign = ctxAlign = align; + if (baseline != ctxBaseline) + ctx.textBaseline = ctxBaseline = baseline; + } + + function accScale(wsc, psc, facet, data, sorted = 0) { + if (data.length > 0 && wsc.auto(self, viaAutoScaleX) && (psc == null || psc.min == null)) { + let _i0 = ifNull(i0, 0); + let _i1 = ifNull(i1, data.length - 1); + + // only run getMinMax() for invalidated series data, else reuse + let minMax = facet.min == null ? (wsc.distr == 3 ? getMinMaxLog(data, _i0, _i1) : getMinMax(data, _i0, _i1, sorted)) : [facet.min, facet.max]; + + // initial min/max + wsc.min = min(wsc.min, facet.min = minMax[0]); + wsc.max = max(wsc.max, facet.max = minMax[1]); + } + } + + const AUTOSCALE = {min: null, max: null}; + + function setScales() { + // log("setScales()", arguments); + + // implicitly add auto scales, and unranged scales + for (let k in scales) { + let sc = scales[k]; + + if (pendScales[k] == null && + ( + // scales that have never been set (on init) + sc.min == null || + // or auto scales when the x scale was explicitly set + pendScales[xScaleKey] != null && sc.auto(self, viaAutoScaleX) + ) + ) { + pendScales[k] = AUTOSCALE; + } + } + + // implicitly add dependent scales + for (let k in scales) { + let sc = scales[k]; + + if (pendScales[k] == null && sc.from != null && pendScales[sc.from] != null) + pendScales[k] = AUTOSCALE; + } + + // explicitly setting the x-scale invalidates everything (acts as redraw) + if (pendScales[xScaleKey] != null) + resetYSeries(true); // TODO: only reset series on auto scales? + + let wipScales = {}; + + for (let k in pendScales) { + let psc = pendScales[k]; + + if (psc != null) { + let wsc = wipScales[k] = copy(scales[k], fastIsObj); + + if (psc.min != null) + assign(wsc, psc); + else if (k != xScaleKey || mode == 2) { + if (dataLen == 0 && wsc.from == null) { + let minMax = wsc.range(self, null, null, k); + wsc.min = minMax[0]; + wsc.max = minMax[1]; + } + else { + wsc.min = inf; + wsc.max = -inf; + } + } + } + } + + if (dataLen > 0) { + // pre-range y-scales from y series' data values + series.forEach((s, i) => { + if (mode == 1) { + let k = s.scale; + let psc = pendScales[k]; + + if (psc == null) + return; + + let wsc = wipScales[k]; + + if (i == 0) { + let minMax = wsc.range(self, wsc.min, wsc.max, k); + + wsc.min = minMax[0]; + wsc.max = minMax[1]; + + i0 = closestIdx(wsc.min, data[0]); + i1 = closestIdx(wsc.max, data[0]); + + // don't try to contract same or adjacent idxs + if (i1 - i0 > 1) { + // closest indices can be outside of view + if (data[0][i0] < wsc.min) + i0++; + if (data[0][i1] > wsc.max) + i1--; + } + + s.min = data0[i0]; + s.max = data0[i1]; + } + else if (s.show && s.auto) + accScale(wsc, psc, s, data[i], s.sorted); + + s.idxs[0] = i0; + s.idxs[1] = i1; + } + else { + if (i > 0) { + if (s.show && s.auto) { + // TODO: only handles, assumes and requires facets[0] / 'x' scale, and facets[1] / 'y' scale + let [ xFacet, yFacet ] = s.facets; + let xScaleKey = xFacet.scale; + let yScaleKey = yFacet.scale; + let [ xData, yData ] = data[i]; + + let wscx = wipScales[xScaleKey]; + let wscy = wipScales[yScaleKey]; + + // null can happen when only x is zoomed, but y has static range and doesnt get auto-added to pending + wscx != null && accScale(wscx, pendScales[xScaleKey], xFacet, xData, xFacet.sorted); + wscy != null && accScale(wscy, pendScales[yScaleKey], yFacet, yData, yFacet.sorted); + + // temp + s.min = yFacet.min; + s.max = yFacet.max; + } + } + } + }); + + // range independent scales + for (let k in wipScales) { + let wsc = wipScales[k]; + let psc = pendScales[k]; + + if (wsc.from == null && (psc == null || psc.min == null)) { + let minMax = wsc.range( + self, + wsc.min == inf ? null : wsc.min, + wsc.max == -inf ? null : wsc.max, + k + ); + wsc.min = minMax[0]; + wsc.max = minMax[1]; + } + } + } + + // range dependent scales + for (let k in wipScales) { + let wsc = wipScales[k]; + + if (wsc.from != null) { + let base = wipScales[wsc.from]; + + if (base.min == null) + wsc.min = wsc.max = null; + else { + let minMax = wsc.range(self, base.min, base.max, k); + wsc.min = minMax[0]; + wsc.max = minMax[1]; + } + } + } + + let changed = {}; + let anyChanged = false; + + for (let k in wipScales) { + let wsc = wipScales[k]; + let sc = scales[k]; + + if (sc.min != wsc.min || sc.max != wsc.max) { + sc.min = wsc.min; + sc.max = wsc.max; + + let distr = sc.distr; + + sc._min = distr == 3 ? log10(sc.min) : distr == 4 ? asinh(sc.min, sc.asinh) : distr == 100 ? sc.fwd(sc.min) : sc.min; + sc._max = distr == 3 ? log10(sc.max) : distr == 4 ? asinh(sc.max, sc.asinh) : distr == 100 ? sc.fwd(sc.max) : sc.max; + + changed[k] = anyChanged = true; + } + } + + if (anyChanged) { + // invalidate paths of all series on changed scales + series.forEach((s, i) => { + if (mode == 2) { + if (i > 0 && changed.y) + s._paths = null; + } + else { + if (changed[s.scale]) + s._paths = null; + } + }); + + for (let k in changed) { + shouldConvergeSize = true; + fire("setScale", k); + } + + if (cursor.show && cursor.left >= 0) + shouldSetCursor = shouldSetLegend = true; + } + + for (let k in pendScales) + pendScales[k] = null; + } + + // grabs the nearest indices with y data outside of x-scale limits + function getOuterIdxs(ydata) { + let _i0 = clamp(i0 - 1, 0, dataLen - 1); + let _i1 = clamp(i1 + 1, 0, dataLen - 1); + + while (ydata[_i0] == null && _i0 > 0) + _i0--; + + while (ydata[_i1] == null && _i1 < dataLen - 1) + _i1++; + + return [_i0, _i1]; + } + + function drawSeries() { + if (dataLen > 0) { + series.forEach((s, i) => { + if (i > 0 && s.show) { + cacheStrokeFill(i, false); + cacheStrokeFill(i, true); + + if (s._paths == null) { + if (ctxAlpha != s.alpha) + ctx.globalAlpha = ctxAlpha = s.alpha; + + let _idxs = mode == 2 ? [0, data[i][0].length - 1] : getOuterIdxs(data[i]); + s._paths = s.paths(self, i, _idxs[0], _idxs[1]); + + if (ctxAlpha != 1) + ctx.globalAlpha = ctxAlpha = 1; + } + } + }); + + series.forEach((s, i) => { + if (i > 0 && s.show) { + if (ctxAlpha != s.alpha) + ctx.globalAlpha = ctxAlpha = s.alpha; + + s._paths != null && drawPath(i, false); + + { + let _gaps = s._paths != null ? s._paths.gaps : null; + + let show = s.points.show(self, i, i0, i1, _gaps); + let idxs = s.points.filter(self, i, show, _gaps); + + if (show || idxs) { + s.points._paths = s.points.paths(self, i, i0, i1, idxs); + drawPath(i, true); + } + } + + if (ctxAlpha != 1) + ctx.globalAlpha = ctxAlpha = 1; + + fire("drawSeries", i); + } + }); + } + } + + function cacheStrokeFill(si, _points) { + let s = _points ? series[si].points : series[si]; + + s._stroke = s.stroke(self, si); + s._fill = s.fill(self, si); + } + + function drawPath(si, _points) { + let s = _points ? series[si].points : series[si]; + + let { + stroke, + fill, + clip: gapsClip, + flags, + + _stroke: strokeStyle = s._stroke, + _fill: fillStyle = s._fill, + _width: width = s.width, + } = s._paths; + + width = roundDec(width * pxRatio, 3); + + let boundsClip = null; + let offset = (width % 2) / 2; + + if (_points && fillStyle == null) + fillStyle = width > 0 ? "#fff" : strokeStyle; + + let _pxAlign = s.pxAlign == 1 && offset > 0; + + _pxAlign && ctx.translate(offset, offset); + + if (!_points) { + let lft = plotLft - width / 2, + top = plotTop - width / 2, + wid = plotWid + width, + hgt = plotHgt + width; + + boundsClip = new Path2D(); + boundsClip.rect(lft, top, wid, hgt); + } + + // the points pathbuilder's gapsClip is its boundsClip, since points dont need gaps clipping, and bounds depend on point size + if (_points) + strokeFill(strokeStyle, width, s.dash, s.cap, fillStyle, stroke, fill, flags, gapsClip); + else + fillStroke(si, strokeStyle, width, s.dash, s.cap, fillStyle, stroke, fill, flags, boundsClip, gapsClip); + + _pxAlign && ctx.translate(-offset, -offset); + } + + function fillStroke(si, strokeStyle, lineWidth, lineDash, lineCap, fillStyle, strokePath, fillPath, flags, boundsClip, gapsClip) { + let didStrokeFill = false; + + // for all bands where this series is the top edge, create upwards clips using the bottom edges + // and apply clips + fill with band fill or dfltFill + flags != 0 && bands.forEach((b, bi) => { + // isUpperEdge? + if (b.series[0] == si) { + let lowerEdge = series[b.series[1]]; + let lowerData = data[b.series[1]]; + + let bandClip = (lowerEdge._paths || EMPTY_OBJ).band; + + if (isArr(bandClip)) + bandClip = b.dir == 1 ? bandClip[0] : bandClip[1]; + + let gapsClip2; + + let _fillStyle = null; + + // hasLowerEdge? + if (lowerEdge.show && bandClip && hasData(lowerData, i0, i1)) { + _fillStyle = b.fill(self, bi) || fillStyle; + gapsClip2 = lowerEdge._paths.clip; + } + else + bandClip = null; + + strokeFill(strokeStyle, lineWidth, lineDash, lineCap, _fillStyle, strokePath, fillPath, flags, boundsClip, gapsClip, gapsClip2, bandClip); + + didStrokeFill = true; + } + }); + + if (!didStrokeFill) + strokeFill(strokeStyle, lineWidth, lineDash, lineCap, fillStyle, strokePath, fillPath, flags, boundsClip, gapsClip); + } + + const CLIP_FILL_STROKE = BAND_CLIP_FILL | BAND_CLIP_STROKE; + + function strokeFill(strokeStyle, lineWidth, lineDash, lineCap, fillStyle, strokePath, fillPath, flags, boundsClip, gapsClip, gapsClip2, bandClip) { + setCtxStyle(strokeStyle, lineWidth, lineDash, lineCap, fillStyle); + + if (boundsClip || gapsClip || bandClip) { + ctx.save(); + boundsClip && ctx.clip(boundsClip); + gapsClip && ctx.clip(gapsClip); + } + + if (bandClip) { + if ((flags & CLIP_FILL_STROKE) == CLIP_FILL_STROKE) { + ctx.clip(bandClip); + gapsClip2 && ctx.clip(gapsClip2); + doFill(fillStyle, fillPath); + doStroke(strokeStyle, strokePath, lineWidth); + } + else if (flags & BAND_CLIP_STROKE) { + doFill(fillStyle, fillPath); + ctx.clip(bandClip); + doStroke(strokeStyle, strokePath, lineWidth); + } + else if (flags & BAND_CLIP_FILL) { + ctx.save(); + ctx.clip(bandClip); + gapsClip2 && ctx.clip(gapsClip2); + doFill(fillStyle, fillPath); + ctx.restore(); + doStroke(strokeStyle, strokePath, lineWidth); + } + } + else { + doFill(fillStyle, fillPath); + doStroke(strokeStyle, strokePath, lineWidth); + } + + if (boundsClip || gapsClip || bandClip) + ctx.restore(); + } + + function doStroke(strokeStyle, strokePath, lineWidth) { + if (lineWidth > 0) { + if (strokePath instanceof Map) { + strokePath.forEach((strokePath, strokeStyle) => { + ctx.strokeStyle = ctxStroke = strokeStyle; + ctx.stroke(strokePath); + }); + } + else + strokePath != null && strokeStyle && ctx.stroke(strokePath); + } + } + + function doFill(fillStyle, fillPath) { + if (fillPath instanceof Map) { + fillPath.forEach((fillPath, fillStyle) => { + ctx.fillStyle = ctxFill = fillStyle; + ctx.fill(fillPath); + }); + } + else + fillPath != null && fillStyle && ctx.fill(fillPath); + } + + function getIncrSpace(axisIdx, min, max, fullDim) { + let axis = axes[axisIdx]; + + let incrSpace; + + if (fullDim <= 0) + incrSpace = [0, 0]; + else { + let minSpace = axis._space = axis.space(self, axisIdx, min, max, fullDim); + let incrs = axis._incrs = axis.incrs(self, axisIdx, min, max, fullDim, minSpace); + incrSpace = findIncr(min, max, incrs, fullDim, minSpace); + } + + return (axis._found = incrSpace); + } + + function drawOrthoLines(offs, filts, ori, side, pos0, len, width, stroke, dash, cap) { + let offset = (width % 2) / 2; + + pxAlign == 1 && ctx.translate(offset, offset); + + setCtxStyle(stroke, width, dash, cap, stroke); + + ctx.beginPath(); + + let x0, y0, x1, y1, pos1 = pos0 + (side == 0 || side == 3 ? -len : len); + + if (ori == 0) { + y0 = pos0; + y1 = pos1; + } + else { + x0 = pos0; + x1 = pos1; + } + + for (let i = 0; i < offs.length; i++) { + if (filts[i] != null) { + if (ori == 0) + x0 = x1 = offs[i]; + else + y0 = y1 = offs[i]; + + ctx.moveTo(x0, y0); + ctx.lineTo(x1, y1); + } + } + + ctx.stroke(); + + pxAlign == 1 && ctx.translate(-offset, -offset); + } + + function axesCalc(cycleNum) { + // log("axesCalc()", arguments); + + let converged = true; + + axes.forEach((axis, i) => { + if (!axis.show) + return; + + let scale = scales[axis.scale]; + + if (scale.min == null) { + if (axis._show) { + converged = false; + axis._show = false; + resetYSeries(false); + } + return; + } + else { + if (!axis._show) { + converged = false; + axis._show = true; + resetYSeries(false); + } + } + + let side = axis.side; + let ori = side % 2; + + let {min, max} = scale; // // should this toggle them ._show = false + + let [_incr, _space] = getIncrSpace(i, min, max, ori == 0 ? plotWidCss : plotHgtCss); + + if (_space == 0) + return; + + // if we're using index positions, force first tick to match passed index + let forceMin = scale.distr == 2; + + let _splits = axis._splits = axis.splits(self, i, min, max, _incr, _space, forceMin); + + // tick labels + // BOO this assumes a specific data/series + let splits = scale.distr == 2 ? _splits.map(i => data0[i]) : _splits; + let incr = scale.distr == 2 ? data0[_splits[1]] - data0[_splits[0]] : _incr; + + let values = axis._values = axis.values(self, axis.filter(self, splits, i, _space, incr), i, _space, incr); + + // rotating of labels only supported on bottom x axis + axis._rotate = side == 2 ? axis.rotate(self, values, i, _space) : 0; + + let oldSize = axis._size; + + axis._size = ceil(axis.size(self, values, i, cycleNum)); + + if (oldSize != null && axis._size != oldSize) // ready && ? + converged = false; + }); + + return converged; + } + + function paddingCalc(cycleNum) { + let converged = true; + + padding.forEach((p, i) => { + let _p = p(self, i, sidesWithAxes, cycleNum); + + if (_p != _padding[i]) + converged = false; + + _padding[i] = _p; + }); + + return converged; + } + + function drawAxesGrid() { + for (let i = 0; i < axes.length; i++) { + let axis = axes[i]; + + if (!axis.show || !axis._show) + continue; + + let side = axis.side; + let ori = side % 2; + + let x, y; + + let fillStyle = axis.stroke(self, i); + + let shiftDir = side == 0 || side == 3 ? -1 : 1; + + // axis label + if (axis.label) { + let shiftAmt = axis.labelGap * shiftDir; + let baseLpos = round((axis._lpos + shiftAmt) * pxRatio); + + setFontStyle(axis.labelFont[0], fillStyle, "center", side == 2 ? TOP : BOTTOM); + + ctx.save(); + + if (ori == 1) { + x = y = 0; + + ctx.translate( + baseLpos, + round(plotTop + plotHgt / 2), + ); + ctx.rotate((side == 3 ? -PI : PI) / 2); + + } + else { + x = round(plotLft + plotWid / 2); + y = baseLpos; + } + + ctx.fillText(axis.label, x, y); + + ctx.restore(); + } + + let [_incr, _space] = axis._found; + + if (_space == 0) + continue; + + let scale = scales[axis.scale]; + + let plotDim = ori == 0 ? plotWid : plotHgt; + let plotOff = ori == 0 ? plotLft : plotTop; + + let axisGap = round(axis.gap * pxRatio); + + let _splits = axis._splits; + + // tick labels + // BOO this assumes a specific data/series + let splits = scale.distr == 2 ? _splits.map(i => data0[i]) : _splits; + let incr = scale.distr == 2 ? data0[_splits[1]] - data0[_splits[0]] : _incr; + + let ticks = axis.ticks; + let border = axis.border; + let tickSize = ticks.show ? round(ticks.size * pxRatio) : 0; + + // rotating of labels only supported on bottom x axis + let angle = axis._rotate * -PI/180; + + let basePos = pxRound(axis._pos * pxRatio); + let shiftAmt = (tickSize + axisGap) * shiftDir; + let finalPos = basePos + shiftAmt; + y = ori == 0 ? finalPos : 0; + x = ori == 1 ? finalPos : 0; + + let font = axis.font[0]; + let textAlign = axis.align == 1 ? LEFT : + axis.align == 2 ? RIGHT : + angle > 0 ? LEFT : + angle < 0 ? RIGHT : + ori == 0 ? "center" : side == 3 ? RIGHT : LEFT; + let textBaseline = angle || + ori == 1 ? "middle" : side == 2 ? TOP : BOTTOM; + + setFontStyle(font, fillStyle, textAlign, textBaseline); + + let lineHeight = axis.font[1] * axis.lineGap; + + let canOffs = _splits.map(val => pxRound(getPos(val, scale, plotDim, plotOff))); + + let _values = axis._values; + + for (let i = 0; i < _values.length; i++) { + let val = _values[i]; + + if (val != null) { + if (ori == 0) + x = canOffs[i]; + else + y = canOffs[i]; + + val = "" + val; + + let _parts = val.indexOf("\n") == -1 ? [val] : val.split(/\n/gm); + + for (let j = 0; j < _parts.length; j++) { + let text = _parts[j]; + + if (angle) { + ctx.save(); + ctx.translate(x, y + j * lineHeight); // can this be replaced with position math? + ctx.rotate(angle); // can this be done once? + ctx.fillText(text, 0, 0); + ctx.restore(); + } + else + ctx.fillText(text, x, y + j * lineHeight); + } + } + } + + // ticks + if (ticks.show) { + drawOrthoLines( + canOffs, + ticks.filter(self, splits, i, _space, incr), + ori, + side, + basePos, + tickSize, + roundDec(ticks.width * pxRatio, 3), + ticks.stroke(self, i), + ticks.dash, + ticks.cap, + ); + } + + // grid + let grid = axis.grid; + + if (grid.show) { + drawOrthoLines( + canOffs, + grid.filter(self, splits, i, _space, incr), + ori, + ori == 0 ? 2 : 1, + ori == 0 ? plotTop : plotLft, + ori == 0 ? plotHgt : plotWid, + roundDec(grid.width * pxRatio, 3), + grid.stroke(self, i), + grid.dash, + grid.cap, + ); + } + + if (border.show) { + drawOrthoLines( + [basePos], + [1], + ori == 0 ? 1 : 0, + ori == 0 ? 1 : 2, + ori == 1 ? plotTop : plotLft, + ori == 1 ? plotHgt : plotWid, + roundDec(border.width * pxRatio, 3), + border.stroke(self, i), + border.dash, + border.cap, + ); + } + } + + fire("drawAxes"); + } + + function resetYSeries(minMax) { + // log("resetYSeries()", arguments); + + series.forEach((s, i) => { + if (i > 0) { + s._paths = null; + + if (minMax) { + if (mode == 1) { + s.min = null; + s.max = null; + } + else { + s.facets.forEach(f => { + f.min = null; + f.max = null; + }); + } + } + } + }); + } + + let queuedCommit = false; + let deferHooks = false; + let hooksQueue = []; + + function flushHooks() { + deferHooks = false; + + for (let i = 0; i < hooksQueue.length; i++) + fire(...hooksQueue[i]); + + hooksQueue.length = 0; + } + + function commit() { + if (!queuedCommit) { + microTask(_commit); + queuedCommit = true; + } + } + + // manual batching (aka immediate mode), skips microtask queue + function batch(fn, _deferHooks = false) { + queuedCommit = true; + deferHooks = _deferHooks; + + fn(self); + _commit(); + + if (_deferHooks && hooksQueue.length > 0) + queueMicrotask(flushHooks); + } + + self.batch = batch; + + function _commit() { + // log("_commit()", arguments); + + if (shouldSetScales) { + setScales(); + shouldSetScales = false; + } + + if (shouldConvergeSize) { + convergeSize(); + shouldConvergeSize = false; + } + + if (shouldSetSize) { + setStylePx(under, LEFT, plotLftCss); + setStylePx(under, TOP, plotTopCss); + setStylePx(under, WIDTH, plotWidCss); + setStylePx(under, HEIGHT, plotHgtCss); + + setStylePx(over, LEFT, plotLftCss); + setStylePx(over, TOP, plotTopCss); + setStylePx(over, WIDTH, plotWidCss); + setStylePx(over, HEIGHT, plotHgtCss); + + setStylePx(wrap, WIDTH, fullWidCss); + setStylePx(wrap, HEIGHT, fullHgtCss); + + // NOTE: mutating this during print preview in Chrome forces transparent + // canvas pixels to white, even when followed up with clearRect() below + can.width = round(fullWidCss * pxRatio); + can.height = round(fullHgtCss * pxRatio); + + axes.forEach(({ _el, _show, _size, _pos, side }) => { + if (_el != null) { + if (_show) { + let posOffset = (side === 3 || side === 0 ? _size : 0); + let isVt = side % 2 == 1; + + setStylePx(_el, isVt ? "left" : "top", _pos - posOffset); + setStylePx(_el, isVt ? "width" : "height", _size); + setStylePx(_el, isVt ? "top" : "left", isVt ? plotTopCss : plotLftCss); + setStylePx(_el, isVt ? "height" : "width", isVt ? plotHgtCss : plotWidCss); + + remClass(_el, OFF); + } + else + addClass(_el, OFF); + } + }); + + // invalidate ctx style cache + ctxStroke = ctxFill = ctxWidth = ctxJoin = ctxCap = ctxFont = ctxAlign = ctxBaseline = ctxDash = null; + ctxAlpha = 1; + + syncRect(true); + + if ( + plotLftCss != _plotLftCss || + plotTopCss != _plotTopCss || + plotWidCss != _plotWidCss || + plotHgtCss != _plotHgtCss + ) { + resetYSeries(false); + + let pctWid = plotWidCss / _plotWidCss; + let pctHgt = plotHgtCss / _plotHgtCss; + + if (cursor.show && !shouldSetCursor && cursor.left >= 0) { + cursor.left *= pctWid; + cursor.top *= pctHgt; + + vCursor && elTrans(vCursor, round(cursor.left), 0, plotWidCss, plotHgtCss); + hCursor && elTrans(hCursor, 0, round(cursor.top), plotWidCss, plotHgtCss); + + for (let i = 0; i < cursorPts.length; i++) { + let pt = cursorPts[i]; + + if (pt != null) { + cursorPtsLft[i] *= pctWid; + cursorPtsTop[i] *= pctHgt; + elTrans(pt, ceil(cursorPtsLft[i]), ceil(cursorPtsTop[i]), plotWidCss, plotHgtCss); + } + } + } + + if (select.show && !shouldSetSelect && select.left >= 0 && select.width > 0) { + select.left *= pctWid; + select.width *= pctWid; + select.top *= pctHgt; + select.height *= pctHgt; + + for (let prop in _hideProps) + setStylePx(selectDiv, prop, select[prop]); + } + + _plotLftCss = plotLftCss; + _plotTopCss = plotTopCss; + _plotWidCss = plotWidCss; + _plotHgtCss = plotHgtCss; + } + + fire("setSize"); + + shouldSetSize = false; + } + + if (fullWidCss > 0 && fullHgtCss > 0) { + ctx.clearRect(0, 0, can.width, can.height); + fire("drawClear"); + drawOrder.forEach(fn => fn()); + fire("draw"); + } + + if (select.show && shouldSetSelect) { + setSelect(select); + shouldSetSelect = false; + } + + if (cursor.show && shouldSetCursor) { + updateCursor(null, true, false); + shouldSetCursor = false; + } + + if (legend.show && legend.live && shouldSetLegend) { + setLegend(); + shouldSetLegend = false; // redundant currently + } + + if (!ready) { + ready = true; + self.status = 1; + + fire("ready"); + } + + viaAutoScaleX = false; + + queuedCommit = false; + } + + self.redraw = (rebuildPaths, recalcAxes) => { + shouldConvergeSize = recalcAxes || false; + + if (rebuildPaths !== false) + _setScale(xScaleKey, scaleX.min, scaleX.max); + else + commit(); + }; + + // redraw() => setScale('x', scales.x.min, scales.x.max); + + // explicit, never re-ranged (is this actually true? for x and y) + function setScale(key, opts) { + let sc = scales[key]; + + if (sc.from == null) { + if (dataLen == 0) { + let minMax = sc.range(self, opts.min, opts.max, key); + opts.min = minMax[0]; + opts.max = minMax[1]; + } + + if (opts.min > opts.max) { + let _min = opts.min; + opts.min = opts.max; + opts.max = _min; + } + + if (dataLen > 1 && opts.min != null && opts.max != null && opts.max - opts.min < 1e-16) + return; + + if (key == xScaleKey) { + if (sc.distr == 2 && dataLen > 0) { + opts.min = closestIdx(opts.min, data[0]); + opts.max = closestIdx(opts.max, data[0]); + + if (opts.min == opts.max) + opts.max++; + } + } + + // log("setScale()", arguments); + + pendScales[key] = opts; + + shouldSetScales = true; + commit(); + } + } + + self.setScale = setScale; + +// INTERACTION + + let xCursor; + let yCursor; + let vCursor; + let hCursor; + + // starting position before cursor.move + let rawMouseLeft0; + let rawMouseTop0; + + // starting position + let mouseLeft0; + let mouseTop0; + + // current position before cursor.move + let rawMouseLeft1; + let rawMouseTop1; + + // current position + let mouseLeft1; + let mouseTop1; + + let dragging = false; + + const drag = cursor.drag; + + let dragX = drag.x; + let dragY = drag.y; + + if (cursor.show) { + if (cursor.x) + xCursor = placeDiv(CURSOR_X, over); + if (cursor.y) + yCursor = placeDiv(CURSOR_Y, over); + + if (scaleX.ori == 0) { + vCursor = xCursor; + hCursor = yCursor; + } + else { + vCursor = yCursor; + hCursor = xCursor; + } + + mouseLeft1 = cursor.left; + mouseTop1 = cursor.top; + } + + const select = self.select = assign({ + show: true, + over: true, + left: 0, + width: 0, + top: 0, + height: 0, + }, opts.select); + + const selectDiv = select.show ? placeDiv(SELECT, select.over ? over : under) : null; + + function setSelect(opts, _fire) { + if (select.show) { + for (let prop in opts) { + select[prop] = opts[prop]; + + if (prop in _hideProps) + setStylePx(selectDiv, prop, opts[prop]); + } + + _fire !== false && fire("setSelect"); + } + } + + self.setSelect = setSelect; + + function toggleDOM(i, onOff) { + let s = series[i]; + let label = showLegend ? legendRows[i] : null; + + if (s.show) + label && remClass(label, OFF); + else { + label && addClass(label, OFF); + let pt = cursorOnePt ? cursorPts[0] : cursorPts[i]; + elTrans(pt, -10, -10, plotWidCss, plotHgtCss); + } + } + + function _setScale(key, min, max) { + setScale(key, {min, max}); + } + + function setSeries(i, opts, _fire, _pub) { + // log("setSeries()", arguments); + + if (opts.focus != null) + setFocus(i); + + if (opts.show != null) { + series.forEach((s, si) => { + if (si > 0 && (i == si || i == null)) { + s.show = opts.show; + toggleDOM(si, opts.show); + + if (mode == 2) { + _setScale(s.facets[0].scale, null, null); + _setScale(s.facets[1].scale, null, null); + } + else + _setScale(s.scale, null, null); + + commit(); + } + }); + } + + _fire !== false && fire("setSeries", i, opts); + + _pub && pubSync("setSeries", self, i, opts); + } + + self.setSeries = setSeries; + + function setBand(bi, opts) { + assign(bands[bi], opts); + } + + function addBand(opts, bi) { + opts.fill = fnOrSelf(opts.fill || null); + opts.dir = ifNull(opts.dir, -1); + bi = bi == null ? bands.length : bi; + bands.splice(bi, 0, opts); + } + + function delBand(bi) { + if (bi == null) + bands.length = 0; + else + bands.splice(bi, 1); + } + + self.addBand = addBand; + self.setBand = setBand; + self.delBand = delBand; + + function setAlpha(i, value) { + series[i].alpha = value; + + if (cursor.show && cursorPts[i]) + cursorPts[i].style.opacity = value; + + if (showLegend && legendRows[i]) + legendRows[i].style.opacity = value; + } + + // y-distance + let closestDist; + let closestSeries; + let focusedSeries; + const FOCUS_TRUE = {focus: true}; + + function setFocus(i) { + if (i != focusedSeries) { + // log("setFocus()", arguments); + + let allFocused = i == null; + + let _setAlpha = focus.alpha != 1; + + series.forEach((s, i2) => { + if (mode == 1 || i2 > 0) { + let isFocused = allFocused || i2 == 0 || i2 == i; + s._focus = allFocused ? null : isFocused; + _setAlpha && setAlpha(i2, isFocused ? 1 : focus.alpha); + } + }); + + focusedSeries = i; + _setAlpha && commit(); + } + } + + if (showLegend && cursorFocus) { + onMouse(mouseleave, legendTable, e => { + if (cursor._lock) + return; + + setCursorEvent(e); + + if (focusedSeries != null) + setSeries(null, FOCUS_TRUE, true, syncOpts.setSeries); + }); + } + + function posToVal(pos, scale, can) { + let sc = scales[scale]; + + if (can) + pos = pos / pxRatio - (sc.ori == 1 ? plotTopCss : plotLftCss); + + let dim = plotWidCss; + + if (sc.ori == 1) { + dim = plotHgtCss; + pos = dim - pos; + } + + if (sc.dir == -1) + pos = dim - pos; + + let _min = sc._min, + _max = sc._max, + pct = pos / dim; + + let sv = _min + (_max - _min) * pct; + + let distr = sc.distr; + + return ( + distr == 3 ? pow(10, sv) : + distr == 4 ? sinh(sv, sc.asinh) : + distr == 100 ? sc.bwd(sv) : + sv + ); + } + + function closestIdxFromXpos(pos, can) { + let v = posToVal(pos, xScaleKey, can); + return closestIdx(v, data[0], i0, i1); + } + + self.valToIdx = val => closestIdx(val, data[0]); + self.posToIdx = closestIdxFromXpos; + self.posToVal = posToVal; + self.valToPos = (val, scale, can) => ( + scales[scale].ori == 0 ? + getHPos(val, scales[scale], + can ? plotWid : plotWidCss, + can ? plotLft : 0, + ) : + getVPos(val, scales[scale], + can ? plotHgt : plotHgtCss, + can ? plotTop : 0, + ) + ); + + self.setCursor = (opts, _fire, _pub) => { + mouseLeft1 = opts.left; + mouseTop1 = opts.top; + // assign(cursor, opts); + updateCursor(null, _fire, _pub); + }; + + function setSelH(off, dim) { + setStylePx(selectDiv, LEFT, select.left = off); + setStylePx(selectDiv, WIDTH, select.width = dim); + } + + function setSelV(off, dim) { + setStylePx(selectDiv, TOP, select.top = off); + setStylePx(selectDiv, HEIGHT, select.height = dim); + } + + let setSelX = scaleX.ori == 0 ? setSelH : setSelV; + let setSelY = scaleX.ori == 1 ? setSelH : setSelV; + + function syncLegend() { + if (showLegend && legend.live) { + for (let i = mode == 2 ? 1 : 0; i < series.length; i++) { + if (i == 0 && multiValLegend) + continue; + + let vals = legend.values[i]; + + let j = 0; + + for (let k in vals) + legendCells[i][j++].firstChild.nodeValue = vals[k]; + } + } + } + + function setLegend(opts, _fire) { + if (opts != null) { + if (opts.idxs) { + opts.idxs.forEach((didx, sidx) => { + activeIdxs[sidx] = didx; + }); + } + else if (!isUndef(opts.idx)) + activeIdxs.fill(opts.idx); + + legend.idx = activeIdxs[0]; + } + + if (showLegend && legend.live) { + for (let sidx = 0; sidx < series.length; sidx++) { + if (sidx > 0 || mode == 1 && !multiValLegend) + setLegendValues(sidx, activeIdxs[sidx]); + } + + syncLegend(); + } + + shouldSetLegend = false; + + _fire !== false && fire("setLegend"); + } + + self.setLegend = setLegend; + + function setLegendValues(sidx, idx) { + let s = series[sidx]; + let src = sidx == 0 && xScaleDistr == 2 ? data0 : data[sidx]; + let val; + + if (multiValLegend) + val = s.values(self, sidx, idx) ?? NULL_LEGEND_VALUES; + else { + val = s.value(self, idx == null ? null : src[idx], sidx, idx); + val = val == null ? NULL_LEGEND_VALUES : {_: val}; + } + + legend.values[sidx] = val; + } + + function updateCursor(src, _fire, _pub) { + // ts == null && log("updateCursor()", arguments); + + rawMouseLeft1 = mouseLeft1; + rawMouseTop1 = mouseTop1; + + [mouseLeft1, mouseTop1] = cursor.move(self, mouseLeft1, mouseTop1); + + cursor.left = mouseLeft1; + cursor.top = mouseTop1; + + if (cursor.show) { + vCursor && elTrans(vCursor, round(mouseLeft1), 0, plotWidCss, plotHgtCss); + hCursor && elTrans(hCursor, 0, round(mouseTop1), plotWidCss, plotHgtCss); + } + + let idx; + + // when zooming to an x scale range between datapoints the binary search + // for nearest min/max indices results in this condition. cheap hack :D + let noDataInRange = i0 > i1; // works for mode 1 only + + closestDist = inf; + closestSeries = null; + + // TODO: extract + let xDim = scaleX.ori == 0 ? plotWidCss : plotHgtCss; + let yDim = scaleX.ori == 1 ? plotWidCss : plotHgtCss; + + // if cursor hidden, hide points & clear legend vals + if (mouseLeft1 < 0 || dataLen == 0 || noDataInRange) { + idx = cursor.idx = null; + + for (let i = 0; i < series.length; i++) { + let pt = cursorPts[i]; + pt != null && elTrans(pt, -10, -10, plotWidCss, plotHgtCss); + } + + if (cursorFocus) + setSeries(null, FOCUS_TRUE, true, src == null && syncOpts.setSeries); + + if (legend.live) { + activeIdxs.fill(idx); + shouldSetLegend = true; + } + } + else { + // let pctY = 1 - (y / rect.height); + + let mouseXPos, valAtPosX, xPos; + + if (mode == 1) { + mouseXPos = scaleX.ori == 0 ? mouseLeft1 : mouseTop1; + valAtPosX = posToVal(mouseXPos, xScaleKey); + idx = cursor.idx = closestIdx(valAtPosX, data[0], i0, i1); + xPos = valToPosX(data[0][idx], scaleX, xDim, 0); + } + + // closest pt values + let _ptLft = -10; + let _ptTop = -10; + let _ptWid = 0; + let _ptHgt = 0; + let _centered = true; + let _ptFill = ''; + let _ptStroke = ''; + + for (let i = mode == 2 ? 1 : 0; i < series.length; i++) { + let s = series[i]; + + let idx1 = activeIdxs[i]; + let yVal1 = idx1 == null ? null : (mode == 1 ? data[i][idx1] : data[i][1][idx1]); + + let idx2 = cursor.dataIdx(self, i, idx, valAtPosX); + let yVal2 = idx2 == null ? null : (mode == 1 ? data[i][idx2] : data[i][1][idx2]); + + shouldSetLegend = shouldSetLegend || yVal2 != yVal1 || idx2 != idx1; + + activeIdxs[i] = idx2; + + let xPos2 = idx2 == idx ? xPos : valToPosX(mode == 1 ? data[0][idx2] : data[i][0][idx2], scaleX, xDim, 0); + + if (i > 0 && s.show) { + // this doesnt really work for state timeline, heatmap, status history (where the value maps to color, not y coords) + let yPos = yVal2 == null ? -10 : valToPosY(yVal2, mode == 1 ? scales[s.scale] : scales[s.facets[1].scale], yDim, 0); + + if (cursorFocus && yVal2 != null) { + let mouseYPos = scaleX.ori == 1 ? mouseLeft1 : mouseTop1; + let dist = abs(focus.dist(self, i, idx2, yPos, mouseYPos)); + + if (dist < closestDist) { + let bias = focus.bias; + + if (bias != 0) { + let mouseYVal = posToVal(mouseYPos, s.scale); + + let seriesYValSign = yVal2 >= 0 ? 1 : -1; + let mouseYValSign = mouseYVal >= 0 ? 1 : -1; + + // with a focus bias, we will never cross zero when prox testing + // it's either closest towards zero, or closest away from zero + if (mouseYValSign == seriesYValSign && ( + mouseYValSign == 1 ? + (bias == 1 ? yVal2 >= mouseYVal : yVal2 <= mouseYVal) : // >= 0 + (bias == 1 ? yVal2 <= mouseYVal : yVal2 >= mouseYVal) // < 0 + )) { + closestDist = dist; + closestSeries = i; + } + } + else { + closestDist = dist; + closestSeries = i; + } + } + } + + if (shouldSetLegend || cursorOnePt) { + let hPos, vPos; + + if (scaleX.ori == 0) { + hPos = xPos2; + vPos = yPos; + } + else { + hPos = yPos; + vPos = xPos2; + } + + let ptWid, ptHgt, ptLft, ptTop, + ptStroke, ptFill, + centered = true, + getBBox = points.bbox; + + if (getBBox != null) { + centered = false; + + let bbox = getBBox(self, i); + + ptLft = bbox.left; + ptTop = bbox.top; + ptWid = bbox.width; + ptHgt = bbox.height; + } + else { + ptLft = hPos; + ptTop = vPos; + ptWid = ptHgt = points.size(self, i); + } + + ptFill = points.fill(self, i); + ptStroke = points.stroke(self, i); + + if (cursorOnePt) { + if (i == closestSeries && closestDist <= focus.prox) { + _ptLft = ptLft; + _ptTop = ptTop; + _ptWid = ptWid; + _ptHgt = ptHgt; + _centered = centered; + _ptFill = ptFill; + _ptStroke = ptStroke; + } + } + else { + let pt = cursorPts[i]; + + if (pt != null) { + cursorPtsLft[i] = ptLft; + cursorPtsTop[i] = ptTop; + + elSize(pt, ptWid, ptHgt, centered); + elColor(pt, ptFill, ptStroke); + elTrans(pt, ceil(ptLft), ceil(ptTop), plotWidCss, plotHgtCss); + } + } + } + } + } + + // if only using single hover point (at cursorPts[0]) + // we have trigger styling at last visible series (once closestSeries is settled) + if (cursorOnePt) { + // some of this logic is similar to series focus below, since it matches the behavior by design + + let p = focus.prox; + + let focusChanged = focusedSeries == null ? closestDist <= p : (closestDist > p || closestSeries != focusedSeries); + + if (shouldSetLegend || focusChanged) { + let pt = cursorPts[0]; + + cursorPtsLft[0] = _ptLft; + cursorPtsTop[0] = _ptTop; + + elSize(pt, _ptWid, _ptHgt, _centered); + elColor(pt, _ptFill, _ptStroke); + elTrans(pt, ceil(_ptLft), ceil(_ptTop), plotWidCss, plotHgtCss); + } + } + } + + // nit: cursor.drag.setSelect is assumed always true + if (select.show && dragging) { + if (src != null) { + let [xKey, yKey] = syncOpts.scales; + let [matchXKeys, matchYKeys] = syncOpts.match; + let [xKeySrc, yKeySrc] = src.cursor.sync.scales; + + // match the dragX/dragY implicitness/explicitness of src + let sdrag = src.cursor.drag; + dragX = sdrag._x; + dragY = sdrag._y; + + if (dragX || dragY) { + let { left, top, width, height } = src.select; + + let sori = src.scales[xKeySrc].ori; + let sPosToVal = src.posToVal; + + let sOff, sDim, sc, a, b; + + let matchingX = xKey != null && matchXKeys(xKey, xKeySrc); + let matchingY = yKey != null && matchYKeys(yKey, yKeySrc); + + if (matchingX && dragX) { + if (sori == 0) { + sOff = left; + sDim = width; + } + else { + sOff = top; + sDim = height; + } + + sc = scales[xKey]; + + a = valToPosX(sPosToVal(sOff, xKeySrc), sc, xDim, 0); + b = valToPosX(sPosToVal(sOff + sDim, xKeySrc), sc, xDim, 0); + + setSelX(min(a,b), abs(b-a)); + } + else + setSelX(0, xDim); + + if (matchingY && dragY) { + if (sori == 1) { + sOff = left; + sDim = width; + } + else { + sOff = top; + sDim = height; + } + + sc = scales[yKey]; + + a = valToPosY(sPosToVal(sOff, yKeySrc), sc, yDim, 0); + b = valToPosY(sPosToVal(sOff + sDim, yKeySrc), sc, yDim, 0); + + setSelY(min(a,b), abs(b-a)); + } + else + setSelY(0, yDim); + } + else + hideSelect(); + } + else { + let rawDX = abs(rawMouseLeft1 - rawMouseLeft0); + let rawDY = abs(rawMouseTop1 - rawMouseTop0); + + if (scaleX.ori == 1) { + let _rawDX = rawDX; + rawDX = rawDY; + rawDY = _rawDX; + } + + dragX = drag.x && rawDX >= drag.dist; + dragY = drag.y && rawDY >= drag.dist; + + let uni = drag.uni; + + if (uni != null) { + // only calc drag status if they pass the dist thresh + if (dragX && dragY) { + dragX = rawDX >= uni; + dragY = rawDY >= uni; + + // force unidirectionality when both are under uni limit + if (!dragX && !dragY) { + if (rawDY > rawDX) + dragY = true; + else + dragX = true; + } + } + } + else if (drag.x && drag.y && (dragX || dragY)) + // if omni with no uni then both dragX / dragY should be true if either is true + dragX = dragY = true; + + let p0, p1; + + if (dragX) { + if (scaleX.ori == 0) { + p0 = mouseLeft0; + p1 = mouseLeft1; + } + else { + p0 = mouseTop0; + p1 = mouseTop1; + } + + setSelX(min(p0, p1), abs(p1 - p0)); + + if (!dragY) + setSelY(0, yDim); + } + + if (dragY) { + if (scaleX.ori == 1) { + p0 = mouseLeft0; + p1 = mouseLeft1; + } + else { + p0 = mouseTop0; + p1 = mouseTop1; + } + + setSelY(min(p0, p1), abs(p1 - p0)); + + if (!dragX) + setSelX(0, xDim); + } + + // the drag didn't pass the dist requirement + if (!dragX && !dragY) { + setSelX(0, 0); + setSelY(0, 0); + } + } + } + + drag._x = dragX; + drag._y = dragY; + + if (src == null) { + if (_pub) { + if (syncKey != null) { + let [xSyncKey, ySyncKey] = syncOpts.scales; + + syncOpts.values[0] = xSyncKey != null ? posToVal(scaleX.ori == 0 ? mouseLeft1 : mouseTop1, xSyncKey) : null; + syncOpts.values[1] = ySyncKey != null ? posToVal(scaleX.ori == 1 ? mouseLeft1 : mouseTop1, ySyncKey) : null; + } + + pubSync(mousemove, self, mouseLeft1, mouseTop1, plotWidCss, plotHgtCss, idx); + } + + if (cursorFocus) { + let shouldPub = _pub && syncOpts.setSeries; + let p = focus.prox; + + if (focusedSeries == null) { + if (closestDist <= p) + setSeries(closestSeries, FOCUS_TRUE, true, shouldPub); + } + else { + if (closestDist > p) + setSeries(null, FOCUS_TRUE, true, shouldPub); + else if (closestSeries != focusedSeries) + setSeries(closestSeries, FOCUS_TRUE, true, shouldPub); + } + } + } + + if (shouldSetLegend) { + legend.idx = idx; + setLegend(); + } + + _fire !== false && fire("setCursor"); + } + + let rect = null; + + Object.defineProperty(self, 'rect', { + get() { + if (rect == null) + syncRect(false); + + return rect; + }, + }); + + function syncRect(defer = false) { + if (defer) + rect = null; + else { + rect = over.getBoundingClientRect(); + fire("syncRect", rect); + } + } + + function mouseMove(e, src, _l, _t, _w, _h, _i) { + if (cursor._lock) + return; + + // Chrome on Windows has a bug which triggers a stray mousemove event after an initial mousedown event + // when clicking into a plot as part of re-focusing the browser window. + // we gotta ignore it to avoid triggering a phantom drag / setSelect + // However, on touch-only devices Chrome-based browsers trigger a 0-distance mousemove before mousedown + // so we don't ignore it when mousedown has set the dragging flag + if (dragging && e != null && e.movementX == 0 && e.movementY == 0) + return; + + cacheMouse(e, src, _l, _t, _w, _h, _i, false, e != null); + + if (e != null) + updateCursor(null, true, true); + else + updateCursor(src, true, false); + } + + function cacheMouse(e, src, _l, _t, _w, _h, _i, initial, snap) { + if (rect == null) + syncRect(false); + + setCursorEvent(e); + + if (e != null) { + _l = e.clientX - rect.left; + _t = e.clientY - rect.top; + } + else { + if (_l < 0 || _t < 0) { + mouseLeft1 = -10; + mouseTop1 = -10; + return; + } + + let [xKey, yKey] = syncOpts.scales; + + let syncOptsSrc = src.cursor.sync; + let [xValSrc, yValSrc] = syncOptsSrc.values; + let [xKeySrc, yKeySrc] = syncOptsSrc.scales; + let [matchXKeys, matchYKeys] = syncOpts.match; + + let rotSrc = src.axes[0].side % 2 == 1; + + let xDim = scaleX.ori == 0 ? plotWidCss : plotHgtCss, + yDim = scaleX.ori == 1 ? plotWidCss : plotHgtCss, + _xDim = rotSrc ? _h : _w, + _yDim = rotSrc ? _w : _h, + _xPos = rotSrc ? _t : _l, + _yPos = rotSrc ? _l : _t; + + if (xKeySrc != null) + _l = matchXKeys(xKey, xKeySrc) ? getPos(xValSrc, scales[xKey], xDim, 0) : -10; + else + _l = xDim * (_xPos/_xDim); + + if (yKeySrc != null) + _t = matchYKeys(yKey, yKeySrc) ? getPos(yValSrc, scales[yKey], yDim, 0) : -10; + else + _t = yDim * (_yPos/_yDim); + + if (scaleX.ori == 1) { + let __l = _l; + _l = _t; + _t = __l; + } + } + + if (snap) { + if (_l <= 1 || _l >= plotWidCss - 1) + _l = incrRound(_l, plotWidCss); + + if (_t <= 1 || _t >= plotHgtCss - 1) + _t = incrRound(_t, plotHgtCss); + } + + if (initial) { + rawMouseLeft0 = _l; + rawMouseTop0 = _t; + + [mouseLeft0, mouseTop0] = cursor.move(self, _l, _t); + } + else { + mouseLeft1 = _l; + mouseTop1 = _t; + } + } + + const _hideProps = { + width: 0, + height: 0, + left: 0, + top: 0, + }; + + function hideSelect() { + setSelect(_hideProps, false); + } + + let downSelectLeft; + let downSelectTop; + let downSelectWidth; + let downSelectHeight; + + function mouseDown(e, src, _l, _t, _w, _h, _i) { + dragging = true; + dragX = dragY = drag._x = drag._y = false; + + cacheMouse(e, src, _l, _t, _w, _h, _i, true, false); + + if (e != null) { + onMouse(mouseup, doc, mouseUp, false); + pubSync(mousedown, self, mouseLeft0, mouseTop0, plotWidCss, plotHgtCss, null); + } + + let { left, top, width, height } = select; + + downSelectLeft = left; + downSelectTop = top; + downSelectWidth = width; + downSelectHeight = height; + + // hideSelect(); + } + + function mouseUp(e, src, _l, _t, _w, _h, _i) { + dragging = drag._x = drag._y = false; + + cacheMouse(e, src, _l, _t, _w, _h, _i, false, true); + + let { left, top, width, height } = select; + + let hasSelect = width > 0 || height > 0; + let chgSelect = ( + downSelectLeft != left || + downSelectTop != top || + downSelectWidth != width || + downSelectHeight != height + ); + + hasSelect && chgSelect && setSelect(select); + + if (drag.setScale && hasSelect && chgSelect) { + // if (syncKey != null) { + // dragX = drag.x; + // dragY = drag.y; + // } + + let xOff = left, + xDim = width, + yOff = top, + yDim = height; + + if (scaleX.ori == 1) { + xOff = top, + xDim = height, + yOff = left, + yDim = width; + } + + if (dragX) { + _setScale(xScaleKey, + posToVal(xOff, xScaleKey), + posToVal(xOff + xDim, xScaleKey) + ); + } + + if (dragY) { + for (let k in scales) { + let sc = scales[k]; + + if (k != xScaleKey && sc.from == null && sc.min != inf) { + _setScale(k, + posToVal(yOff + yDim, k), + posToVal(yOff, k) + ); + } + } + } + + hideSelect(); + } + else if (cursor.lock) { + cursor._lock = !cursor._lock; + updateCursor(null, true, false); + } + + if (e != null) { + offMouse(mouseup, doc); + pubSync(mouseup, self, mouseLeft1, mouseTop1, plotWidCss, plotHgtCss, null); + } + } + + function mouseLeave(e, src, _l, _t, _w, _h, _i) { + if (cursor._lock) + return; + + setCursorEvent(e); + + let _dragging = dragging; + + if (dragging) { + // handle case when mousemove aren't fired all the way to edges by browser + let snapH = true; + let snapV = true; + let snapProx = 10; + + let dragH, dragV; + + if (scaleX.ori == 0) { + dragH = dragX; + dragV = dragY; + } + else { + dragH = dragY; + dragV = dragX; + } + + if (dragH && dragV) { + // maybe omni corner snap + snapH = mouseLeft1 <= snapProx || mouseLeft1 >= plotWidCss - snapProx; + snapV = mouseTop1 <= snapProx || mouseTop1 >= plotHgtCss - snapProx; + } + + if (dragH && snapH) + mouseLeft1 = mouseLeft1 < mouseLeft0 ? 0 : plotWidCss; + + if (dragV && snapV) + mouseTop1 = mouseTop1 < mouseTop0 ? 0 : plotHgtCss; + + updateCursor(null, true, true); + + dragging = false; + } + + mouseLeft1 = -10; + mouseTop1 = -10; + + // passing a non-null timestamp to force sync/mousemove event + updateCursor(null, true, true); + + if (_dragging) + dragging = _dragging; + } + + function dblClick(e, src, _l, _t, _w, _h, _i) { + if (cursor._lock) + return; + + setCursorEvent(e); + + autoScaleX(); + + hideSelect(); + + if (e != null) + pubSync(dblclick, self, mouseLeft1, mouseTop1, plotWidCss, plotHgtCss, null); + } + + function syncPxRatio() { + axes.forEach(syncFontSize); + _setSize(self.width, self.height, true); + } + + on(dppxchange, win, syncPxRatio); + + // internal pub/sub + const events = {}; + + events.mousedown = mouseDown; + events.mousemove = mouseMove; + events.mouseup = mouseUp; + events.dblclick = dblClick; + events["setSeries"] = (e, src, idx, opts) => { + let seriesIdxMatcher = syncOpts.match[2]; + idx = seriesIdxMatcher(self, src, idx); + idx != -1 && setSeries(idx, opts, true, false); + }; + + if (cursor.show) { + onMouse(mousedown, over, mouseDown); + onMouse(mousemove, over, mouseMove); + onMouse(mouseenter, over, e => { + setCursorEvent(e); + syncRect(false); + }); + onMouse(mouseleave, over, mouseLeave); + + onMouse(dblclick, over, dblClick); + + cursorPlots.add(self); + + self.syncRect = syncRect; + } + + // external on/off + const hooks = self.hooks = opts.hooks || {}; + + function fire(evName, a1, a2) { + if (deferHooks) + hooksQueue.push([evName, a1, a2]); + else { + if (evName in hooks) { + hooks[evName].forEach(fn => { + fn.call(null, self, a1, a2); + }); + } + } + } + + (opts.plugins || []).forEach(p => { + for (let evName in p.hooks) + hooks[evName] = (hooks[evName] || []).concat(p.hooks[evName]); + }); + + const seriesIdxMatcher = (self, src, srcSeriesIdx) => srcSeriesIdx; + + const syncOpts = assign({ + key: null, + setSeries: false, + filters: { + pub: retTrue, + sub: retTrue, + }, + scales: [xScaleKey, series[1] ? series[1].scale : null], + match: [retEq, retEq, seriesIdxMatcher], + values: [null, null], + }, cursor.sync); + + if (syncOpts.match.length == 2) + syncOpts.match.push(seriesIdxMatcher); + + cursor.sync = syncOpts; + + const syncKey = syncOpts.key; + + const sync = _sync(syncKey); + + function pubSync(type, src, x, y, w, h, i) { + if (syncOpts.filters.pub(type, src, x, y, w, h, i)) + sync.pub(type, src, x, y, w, h, i); + } + + sync.sub(self); + + function pub(type, src, x, y, w, h, i) { + if (syncOpts.filters.sub(type, src, x, y, w, h, i)) + events[type](null, src, x, y, w, h, i); + } + + self.pub = pub; + + function destroy() { + sync.unsub(self); + cursorPlots.delete(self); + mouseListeners.clear(); + off(dppxchange, win, syncPxRatio); + root.remove(); + legendTable?.remove(); // in case mounted outside of root + fire("destroy"); + } + + self.destroy = destroy; + + function _init() { + fire("init", opts, data); + + setData(data || opts.data, false); + + if (pendScales[xScaleKey]) + setScale(xScaleKey, pendScales[xScaleKey]); + else + autoScaleX(); + + shouldSetSelect = select.show && (select.width > 0 || select.height > 0); + shouldSetCursor = shouldSetLegend = true; + + _setSize(opts.width, opts.height); + } + + series.forEach(initSeries); + + axes.forEach(initAxis); + + if (then) { + if (then instanceof HTMLElement) { + then.appendChild(root); + _init(); + } + else + then(self, _init); + } + else + _init(); + + return self; +} + +uPlot.assign = assign; +uPlot.fmtNum = fmtNum; +uPlot.rangeNum = rangeNum; +uPlot.rangeLog = rangeLog; +uPlot.rangeAsinh = rangeAsinh; +uPlot.orient = orient; +uPlot.pxRatio = pxRatio; + +{ + uPlot.join = join; +} + +{ + uPlot.fmtDate = fmtDate; + uPlot.tzDate = tzDate; +} + +uPlot.sync = _sync; + +{ + uPlot.addGap = addGap; + uPlot.clipGaps = clipGaps; + + let paths = uPlot.paths = { + points, + }; + + (paths.linear = linear); + (paths.stepped = stepped); + (paths.bars = bars); + (paths.spline = monotoneCubic); +} + +export { uPlot as default }; diff --git a/demo/dist/uPlot/uPlot.min.css b/demo/dist/uPlot/uPlot.min.css new file mode 100644 index 0000000..a030d63 --- /dev/null +++ b/demo/dist/uPlot/uPlot.min.css @@ -0,0 +1 @@ +.uplot, .uplot *, .uplot *::before, .uplot *::after {box-sizing: border-box;}.uplot {font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";line-height: 1.5;width: min-content;}.u-title {text-align: center;font-size: 18px;font-weight: bold;}.u-wrap {position: relative;user-select: none;}.u-over, .u-under {position: absolute;}.u-under {overflow: hidden;}.uplot canvas {display: block;position: relative;width: 100%;height: 100%;}.u-axis {position: absolute;}.u-legend {font-size: 14px;margin: auto;text-align: center;}.u-inline {display: block;}.u-inline * {display: inline-block;}.u-inline tr {margin-right: 16px;}.u-legend th {font-weight: 600;}.u-legend th > * {vertical-align: middle;display: inline-block;}.u-legend .u-marker {width: 1em;height: 1em;margin-right: 4px;background-clip: padding-box !important;}.u-inline.u-live th::after {content: ":";vertical-align: middle;}.u-inline:not(.u-live) .u-value {display: none;}.u-series > * {padding: 4px;}.u-series th {cursor: pointer;}.u-legend .u-off > * {opacity: 0.3;}.u-select {background: rgba(0,0,0,0.07);position: absolute;pointer-events: none;}.u-cursor-x, .u-cursor-y {position: absolute;left: 0;top: 0;pointer-events: none;will-change: transform;}.u-hz .u-cursor-x, .u-vt .u-cursor-y {height: 100%;border-right: 1px dashed #607D8B;}.u-hz .u-cursor-y, .u-vt .u-cursor-x {width: 100%;border-bottom: 1px dashed #607D8B;}.u-cursor-pt {position: absolute;top: 0;left: 0;border-radius: 50%;border: 0 solid;pointer-events: none;will-change: transform;/*this has to be !important since we set inline "background" shorthand */background-clip: padding-box !important;}.u-axis.u-off, .u-select.u-off, .u-cursor-x.u-off, .u-cursor-y.u-off, .u-cursor-pt.u-off {display: none;} \ No newline at end of file diff --git a/demo/dist/worker-with-import-map/EventHandler.js b/demo/dist/worker-with-import-map/EventHandler.js new file mode 100644 index 0000000..332c93c --- /dev/null +++ b/demo/dist/worker-with-import-map/EventHandler.js @@ -0,0 +1,32 @@ +class EventHandler { + /** @type {Function|null} */ + onclick = null; + /** @type {Function|null} */ + onmessage = null; + /** @type {Record>} */ + events = {}; + /** + * @param {string} type - The event type. + * @param {Function} cb - The callback. + */ + addEventListener(type, cb) { + this.events[type] ??= new Set(); + this.events[type].add(cb); + } + /** + * @param {string} type - The event type. + * @param {Function} cb - The callback. + */ + removeEventListener(type, cb) { + this.events[type]?.delete(cb); + } + /** + * @param {Event} event - The event. + */ + dispatchEvent(event) { + const {type} = event; + this['on' + type]?.(event); + this.events[type]?.forEach(listener => listener(event)); + } +} +export {EventHandler}; diff --git a/demo/dist/worker-with-import-map/Worker.js b/demo/dist/worker-with-import-map/Worker.js new file mode 100644 index 0000000..fd53734 --- /dev/null +++ b/demo/dist/worker-with-import-map/Worker.js @@ -0,0 +1,2 @@ +import {WorkerWithImportMapViaBedfordsShim as Worker} from './WorkerWithImportMapViaBedfordsShim.js'; +export {Worker}; diff --git a/demo/dist/worker-with-import-map/WorkerWithImportMapViaBedfordsShim.js b/demo/dist/worker-with-import-map/WorkerWithImportMapViaBedfordsShim.js new file mode 100644 index 0000000..5801e78 --- /dev/null +++ b/demo/dist/worker-with-import-map/WorkerWithImportMapViaBedfordsShim.js @@ -0,0 +1,24 @@ +import {getImportMap} from "./getImportMap.js"; +class WorkerWithImportMapViaBedfordsShim extends Worker { + /** + * @param {string | URL} scriptURL - The URL. + * @param {WorkerOptions & {importMap?: 'inherit', debug?: boolean}} [options] - The options. + */ + constructor(scriptURL, options = {}) { + if (!options.importMap || options.importMap === 'inherit') { + const shimURL = new URL('./WorkerWithImportMapViaBedfordsShim.worker.js', import.meta.url) + ""; + super(shimURL); + const importMap = getImportMap(); + const baseURL = document.baseURI.split('/').slice(0, -1).join('/'); + if (options.debug) { + console.log("WorkerWithImportMapViaBedfordsShim debug information", {importMap, shimURL, baseURL, options}); + } + // Prevent error: URL object could not be cloned. + scriptURL += ''; + this.postMessage({type: 'init-worker-with-import-map', importMap, scriptURL, baseURL, options}); + } else { + super(scriptURL, options); + } + } +} +export {WorkerWithImportMapViaBedfordsShim}; diff --git a/demo/dist/worker-with-import-map/WorkerWithImportMapViaBedfordsShim.worker.js b/demo/dist/worker-with-import-map/WorkerWithImportMapViaBedfordsShim.worker.js new file mode 100644 index 0000000..5521704 --- /dev/null +++ b/demo/dist/worker-with-import-map/WorkerWithImportMapViaBedfordsShim.worker.js @@ -0,0 +1,50 @@ +const shimCodeUrl = "https://ga.jspm.io/npm:es-module-shims@1.6.2/dist/es-module-shims.wasm.js"; +/** + * @param {string} baseURL - The base URL based on `document.baseURI` + * @param {string} path - The path that may be relative. + * @param {boolean} debug - Whether to print debug output. + * @returns {string} - The new absolute path. + */ +function makeRelativePath(baseURL, path, debug) { + if (path[0] !== '.') { + return path; + } + const ret = baseURL + '/' + path; + if (debug) { + console.log(`makeRelativePath> Update path from ${path} to ${ret}`); + } + return ret; +} +self.addEventListener('message', function(e) { + if (e.data.type && e.data.type === 'init-worker-with-import-map') { + const {scriptURL, importMap, baseURL, options} = e.data; + if (options.debug) { + console.log('Got init-worker-with-import-map message'); + } + /** @param {string} path - Relative path */ + const fixPath = (path) => makeRelativePath(baseURL, path, options.debug); + if (importMap?.imports) { + const {imports} = importMap; + for (const key in imports) { + imports[key] = fixPath(imports[key]); + } + } + importScripts(shimCodeUrl); + importShim.addImportMap(importMap); + const absoluteScriptURL = fixPath(scriptURL); + importShim(absoluteScriptURL) + .then(() => { + if (options.debug) { + console.log(`${absoluteScriptURL} worker has been loaded`); + } + }) + .catch(e => { + if (options.debug) { + debugger; + } + setTimeout(() => { + throw e; + }) + }); + } +}); diff --git a/demo/dist/worker-with-import-map/WorkerWithImportMapViaInlineFrame.js b/demo/dist/worker-with-import-map/WorkerWithImportMapViaInlineFrame.js new file mode 100644 index 0000000..4a6297e --- /dev/null +++ b/demo/dist/worker-with-import-map/WorkerWithImportMapViaInlineFrame.js @@ -0,0 +1,72 @@ +import {EventHandler} from './EventHandler.js'; +import {getImportMap} from './getImportMap.js'; +window.workersReady = {}; +class WorkerWithImportMapViaInlineFrame extends EventHandler { + debug = false; + iframe = document.createElement('iframe'); + callbackId = `cb${Math.floor(Math.random()*1000000000)}`; + terminateId = `tm${Math.floor(Math.random()*1000000000)}`; + /** + * @param {URL | string} script - The worker URL. + * @param {object} [options] - The options. + * @param {object|'inherit'} [options.importMap] - The import map or simply `inherit`. + * @returns + */ + constructor(script, options = {}) { + super(); + const {iframe, callbackId, terminateId} = this; + if (options.importMap === 'inherit') { + options.importMap = getImportMap(); + } + if (!options.importMap) { + return new window.Worker(script, options); + } + window.workersReady[terminateId] = function(window) { + iframe.remove(); + }; + this.ready = new Promise((resolve, reject) => { + window.workersReady[callbackId] = function(window) { + resolve(); + }; + }); + const html = ` + + + + + + + + +`; + if (!this.debug) { + iframe.style.display = 'none'; + } + document.body.appendChild(iframe); + iframe.contentWindow.document.open(); + iframe.contentWindow.document.write(html); + iframe.contentWindow.document.close(); + window.onmessage = (e) => { + this.dispatchEvent(e); + }; + } + postMessage(data) { + this.iframe.contentWindow.postMessage(data, '*'); + } + terminate() { + window.workersReady[this.terminateId](); + } +} +export {WorkerWithImportMapViaInlineFrame}; diff --git a/demo/dist/worker-with-import-map/getImportMap.js b/demo/dist/worker-with-import-map/getImportMap.js new file mode 100644 index 0000000..d72d54b --- /dev/null +++ b/demo/dist/worker-with-import-map/getImportMap.js @@ -0,0 +1,12 @@ +/** + * @returns {object | undefined} + */ +function getImportMap() { + /** @type {HTMLScriptElement|null} */ + const e = document.querySelector('script[type="importmap"]'); + if (!e?.textContent) { + return; + } + return JSON.parse(e.textContent); +} +export {getImportMap}; diff --git a/demo/dist/worker-with-import-map/index.js b/demo/dist/worker-with-import-map/index.js new file mode 100644 index 0000000..72f0000 --- /dev/null +++ b/demo/dist/worker-with-import-map/index.js @@ -0,0 +1,5 @@ +export * from './EventHandler.js'; +export * from './getImportMap.js'; +export * from './Worker.js'; +export * from './WorkerWithImportMapViaInlineFrame.js'; +export * from './WorkerWithImportMapViaBedfordsShim.js'; diff --git a/demo/dist/worker-with-import-map/node.js b/demo/dist/worker-with-import-map/node.js new file mode 100644 index 0000000..294326e --- /dev/null +++ b/demo/dist/worker-with-import-map/node.js @@ -0,0 +1,21 @@ +import {isBrowser, isJsDom} from 'browser-or-node'; +import * as mod from 'module'; +let internalRequire = null; +const ensureRequire = () => (!internalRequire) && ( + internalRequire = mod.createRequire(import.meta.url) +); +let ThisWorker = null; +if (isBrowser || isJsDom) { + ThisWorker = (await import('./WorkerFrame.js')).WorkerFrame; +} else { + ensureRequire(); + const NodeWorker = internalRequire('web-worker'); + function Worker(incomingPath, options = {}) { + const filePath = incomingPath[0] === '.' + ? new URL(incomingPath, options.root || import.meta.url).pathname + : incomingPath; + return new NodeWorker(filePath, options); + }; + ThisWorker = Worker; +} +export const Worker = ThisWorker; diff --git a/demo/helpers.js b/demo/helpers.js new file mode 100644 index 0000000..eba3858 --- /dev/null +++ b/demo/helpers.js @@ -0,0 +1,6 @@ +export function getSize() { + return { + width: Math.min(window.innerWidth - 100, 1100), + height: window.innerHeight / 4, + }; +} diff --git a/demo/index.html b/demo/index.html new file mode 100644 index 0000000..112d635 --- /dev/null +++ b/demo/index.html @@ -0,0 +1,284 @@ + + + + + + + augurs demo + + + + + + + +

augurs demo

+
+

+ augurs is a time series analysis library for Rust with bindings for JavaScript. It provides a set of tools for + analyzing time series data, including clustering, outlier detection, forecasting, and changepoint detection. +

+

+ Visit the documentation for more information. + Alternatively, give augurs a star on GitHub! +

+
+
+ + +
+

+ Clustering with DBSCAN - calculating... +

+

+ augurs can be used to identify groups of series that behave similarly through time. This can be slow for large + number of series but can be parallelized! +

+
+
+
+ + + +
+ +
+
+ + + +
+ +
+
+ + + +
+
+
+
+ + +
+

+ Outlier detection with DBSCAN - calculating... +

+

+ A similar but easier problem is to identify series that are outliers: those which behave differently to the + majority of series. There are several algorithms; this demo shows the DBSCAN algorithm. +

+
+
+
+ + + +
+
+
+
+ + +
+

Forecasting with MSTL - calculating...

+

+ augurs contains several forecasting algorithms, including MSTL, which is a seasonal-trend decomposition + procedure + for modelling multiple seasonalities, based on LOESS. +

+
+
+
+ + + +
+
+
+
+ + +
+

+ Forecasting with Prophet - calculating... +

+

+ augurs also contains an implementation of the Prophet + forecasting algorithm, which is a decomposable time series model with three main components: trend, + seasonality, + and holidays. +

+
+
+
+ + + +
+
+
+
+ + +
+

+ Changepoint detection with a Bayesian Normal Gamma - calculating... +

+

+ augurs also exposes functionality from the excellent changepoint crate, which provides a Bayesian + approach to detecting changepoints in time series data. + Here, each changepoint is highlighted in the plot. +

+
+
+
+ + + \ No newline at end of file diff --git a/demo/index.js b/demo/index.js new file mode 100644 index 0000000..19dc6b0 --- /dev/null +++ b/demo/index.js @@ -0,0 +1,11 @@ +import runChangepoint from "./changepoint.js"; +import runClustering from "./clustering.js"; +import runMSTL from "./mstl.js"; +import runOutlier from "./outlier.js"; +import runProphet from "./prophet.js"; + +runChangepoint(); +runClustering(); +runMSTL(); +runOutlier(); +runProphet(); diff --git a/demo/mstl.js b/demo/mstl.js new file mode 100644 index 0000000..37010a1 --- /dev/null +++ b/demo/mstl.js @@ -0,0 +1,1333 @@ +import uPlot from "./dist/uPlot/uPlot.esm.js"; + +import { getSize } from "./helpers.js"; +import { legendAsTooltipPlugin } from "./plugins.js"; + +const df = { + ds: [ + 1197244800, 1197331200, 1197417600, 1197504000, 1197590400, 1197676800, + 1197763200, 1197849600, 1197936000, 1198022400, 1198108800, 1198195200, + 1198281600, 1198368000, 1198454400, 1198540800, 1198627200, 1198713600, + 1198800000, 1198886400, 1198972800, 1199059200, 1199145600, 1199232000, + 1199318400, 1199404800, 1199491200, 1199577600, 1199664000, 1199750400, + 1199836800, 1199923200, 1200009600, 1200096000, 1200182400, 1200268800, + 1200355200, 1200441600, 1200528000, 1200614400, 1200700800, 1200787200, + 1200873600, 1200960000, 1201046400, 1201132800, 1201219200, 1201305600, + 1201392000, 1201478400, 1201564800, 1201651200, 1201824000, 1201910400, + 1201996800, 1202083200, 1202169600, 1202256000, 1202342400, 1202428800, + 1202515200, 1202601600, 1202688000, 1202774400, 1202860800, 1202947200, + 1203033600, 1203120000, 1203206400, 1203292800, 1203379200, 1203465600, + 1203552000, 1203638400, 1203724800, 1203811200, 1203897600, 1203984000, + 1204070400, 1204243200, 1204416000, 1204675200, 1204761600, 1204848000, + 1204934400, 1205020800, 1205107200, 1205193600, 1205280000, 1205366400, + 1205452800, 1205539200, 1205625600, 1205712000, 1205798400, 1205884800, + 1205971200, 1206057600, 1206144000, 1206230400, 1206316800, 1206403200, + 1206489600, 1206576000, 1206662400, 1206748800, 1206835200, 1206921600, + 1207008000, 1207094400, 1207180800, 1207267200, 1207353600, 1207440000, + 1207526400, 1207612800, 1207699200, 1207785600, 1207872000, 1207958400, + 1208044800, 1208131200, 1208217600, 1208304000, 1208390400, 1208476800, + 1208563200, 1208649600, 1208736000, 1208822400, 1208908800, 1208995200, + 1209081600, 1209168000, 1209254400, 1209340800, 1209427200, 1209513600, + 1209600000, 1209686400, 1209772800, 1209859200, 1209945600, 1210032000, + 1210118400, 1210204800, 1210291200, 1210377600, 1210464000, 1210550400, + 1210636800, 1210723200, 1210809600, 1210896000, 1210982400, 1211068800, + 1211155200, 1211241600, 1211328000, 1211414400, 1211500800, 1211587200, + 1211673600, 1211760000, 1211846400, 1211932800, 1212019200, 1212105600, + 1212192000, 1212451200, 1212537600, 1212624000, 1212710400, 1212796800, + 1212883200, 1212969600, 1213056000, 1213142400, 1213228800, 1213315200, + 1213401600, 1213488000, 1213574400, 1213660800, 1213747200, 1213833600, + 1213920000, 1214006400, 1214092800, 1214179200, 1214265600, 1214352000, + 1214438400, 1214524800, 1214611200, 1214697600, 1214784000, 1214956800, + 1215043200, 1215129600, 1215216000, 1215302400, 1215388800, 1215475200, + 1215561600, 1215648000, 1215734400, 1215820800, 1217548800, 1217635200, + 1217721600, 1217808000, 1217894400, 1217980800, 1218067200, 1218153600, + 1218240000, 1218326400, 1218412800, 1218499200, 1218585600, 1218672000, + 1218758400, 1218844800, 1218931200, 1219017600, 1219104000, 1219190400, + 1219276800, 1219363200, 1219449600, 1219536000, 1219622400, 1219708800, + 1219795200, 1219881600, 1219968000, 1220054400, 1220140800, 1220227200, + 1220313600, 1220400000, 1220486400, 1220572800, 1220659200, 1220745600, + 1220832000, 1220918400, 1221004800, 1221091200, 1221177600, 1221264000, + 1221350400, 1221436800, 1221523200, 1221609600, 1221696000, 1221782400, + 1221868800, 1221955200, 1222041600, 1222128000, 1222214400, 1222300800, + 1222387200, 1222473600, 1222560000, 1222646400, 1222732800, 1222819200, + 1222905600, 1222992000, 1223078400, 1223164800, 1223251200, 1223337600, + 1223424000, 1223510400, 1223596800, 1223683200, 1223769600, 1223856000, + 1223942400, 1224028800, 1224115200, 1224201600, 1224288000, 1224374400, + 1224460800, 1224720000, 1224806400, 1224892800, 1224979200, 1225065600, + 1225152000, 1225238400, 1225324800, 1225411200, 1225497600, 1225584000, + 1225670400, 1225756800, 1225843200, 1225929600, 1226016000, 1226102400, + 1226188800, 1226275200, 1226361600, 1226448000, 1226534400, 1226620800, + 1226707200, 1226793600, 1226880000, 1226966400, 1227052800, 1227139200, + 1227225600, 1227312000, 1227398400, 1227484800, 1227571200, 1227657600, + 1227744000, 1227830400, 1227916800, 1228003200, 1228089600, 1228176000, + 1228262400, 1228348800, 1228435200, 1228521600, 1228608000, 1228694400, + 1228780800, 1228867200, 1228953600, 1229040000, 1229126400, 1229212800, + 1229299200, 1229385600, 1229472000, 1229558400, 1229644800, 1229731200, + 1229817600, 1229904000, 1229990400, 1230076800, 1230163200, 1230249600, + 1230336000, 1230422400, 1230508800, 1230595200, 1230681600, 1230768000, + 1230854400, 1230940800, 1231027200, 1231113600, 1231200000, 1231286400, + 1231372800, 1231459200, 1231545600, 1231632000, 1231718400, 1231804800, + 1231891200, 1231977600, 1232064000, 1232150400, 1232236800, 1232323200, + 1232409600, 1232496000, 1232582400, 1232668800, 1232755200, 1232841600, + 1232928000, 1233014400, 1233100800, 1233187200, 1233273600, 1233360000, + 1233446400, 1233532800, 1233619200, 1233705600, 1233792000, 1233878400, + 1233964800, 1234051200, 1234137600, 1234224000, 1234310400, 1234396800, + 1234483200, 1234569600, 1234656000, 1234742400, 1234828800, 1234915200, + 1235001600, 1235088000, 1235174400, 1235260800, 1235347200, 1235433600, + 1235520000, 1235606400, 1235692800, 1235779200, 1235865600, 1235952000, + 1236038400, 1236124800, 1236211200, 1236297600, 1236384000, 1236470400, + 1236556800, 1236643200, 1236729600, 1236816000, 1236902400, 1236988800, + 1237075200, 1237161600, 1237248000, 1237334400, 1237420800, 1237507200, + 1237593600, 1237680000, 1237766400, 1237852800, 1237939200, 1238025600, + 1238112000, 1238198400, 1238284800, 1238371200, 1238457600, 1238544000, + 1238630400, 1238716800, 1238803200, 1238889600, 1238976000, 1239062400, + 1239148800, 1239235200, 1239321600, 1239408000, 1239494400, 1239580800, + 1239667200, 1239753600, 1239840000, 1239926400, 1240012800, 1240099200, + 1240185600, 1240272000, 1240358400, 1240444800, 1240531200, 1240617600, + 1240704000, 1240790400, 1240876800, 1240963200, 1241049600, 1241136000, + 1241222400, 1241308800, 1241395200, 1241481600, 1241568000, 1241654400, + 1241740800, 1241827200, 1241913600, 1242000000, 1242086400, 1242172800, + 1242259200, 1242345600, 1242432000, 1242518400, 1242604800, 1242691200, + 1242777600, 1242864000, 1242950400, 1243036800, 1243123200, 1243209600, + 1243296000, 1243382400, 1243468800, 1243555200, 1243641600, 1243728000, + 1243814400, 1243900800, 1243987200, 1244073600, 1244160000, 1244246400, + 1244332800, 1244419200, 1244505600, 1244592000, 1244678400, 1244764800, + 1244851200, 1244937600, 1245024000, 1245110400, 1245196800, 1245283200, + 1245369600, 1245456000, 1245542400, 1245628800, 1245715200, 1245801600, + 1245888000, 1245974400, 1246060800, 1246147200, 1246233600, 1246320000, + 1246406400, 1246492800, 1246579200, 1246665600, 1246752000, 1246838400, + 1246924800, 1247011200, 1247097600, 1247184000, 1247270400, 1247356800, + 1247443200, 1247529600, 1247616000, 1247702400, 1247788800, 1247875200, + 1247961600, 1248048000, 1248134400, 1248220800, 1248307200, 1248393600, + 1248480000, 1248566400, 1248652800, 1248739200, 1248825600, 1248912000, + 1248998400, 1249084800, 1249171200, 1249257600, 1249344000, 1249430400, + 1249516800, 1249603200, 1249689600, 1249776000, 1249862400, 1249948800, + 1250035200, 1250121600, 1250208000, 1250294400, 1250380800, 1250467200, + 1250553600, 1250640000, 1250726400, 1250812800, 1250899200, 1250985600, + 1251072000, 1251158400, 1251244800, 1251331200, 1251417600, 1251504000, + 1251590400, 1251676800, 1251763200, 1251849600, 1251936000, 1252022400, + 1252108800, 1252195200, 1252281600, 1252368000, 1252454400, 1252540800, + 1252627200, 1252713600, 1252800000, 1252886400, 1252972800, 1253059200, + 1253145600, 1253232000, 1253318400, 1253404800, 1253491200, 1253577600, + 1253750400, 1254096000, 1254182400, 1254268800, 1254355200, 1254441600, + 1254528000, 1254614400, 1254700800, 1254787200, 1254873600, 1254960000, + 1255046400, 1255132800, 1255219200, 1255305600, 1255392000, 1255737600, + 1255824000, 1255910400, 1255996800, 1256083200, 1256169600, 1256256000, + 1256342400, 1256428800, 1256515200, 1256601600, 1256688000, 1256774400, + 1256860800, 1256947200, 1257033600, 1257120000, 1257206400, 1257292800, + 1257379200, 1257465600, 1257552000, 1257638400, 1257724800, 1257811200, + 1257897600, 1257984000, 1258070400, 1258156800, 1258329600, 1258416000, + 1258502400, 1258588800, 1258675200, 1258761600, 1258934400, 1259020800, + 1259107200, 1259193600, 1259280000, 1259366400, 1259452800, 1259539200, + 1259625600, 1259712000, 1259798400, 1259884800, 1259971200, 1260057600, + 1260144000, 1260230400, 1260316800, 1260403200, 1260489600, 1260576000, + 1260662400, 1260748800, 1260835200, 1260921600, 1261008000, 1261094400, + 1261180800, 1261267200, 1261353600, 1261440000, 1261526400, 1261612800, + 1261699200, 1261785600, 1261872000, 1261958400, 1262044800, 1262131200, + 1262217600, 1262304000, 1262390400, 1262476800, 1262563200, 1262649600, + 1262736000, 1262822400, 1262908800, 1262995200, 1263081600, 1263168000, + 1263254400, 1263340800, 1263427200, 1263513600, 1263600000, 1263686400, + 1263772800, 1263859200, 1263945600, 1264032000, 1264118400, 1264377600, + 1264464000, 1264550400, 1264636800, 1264723200, 1264809600, 1264896000, + 1264982400, 1265068800, 1265155200, 1265241600, 1265328000, 1265414400, + 1265500800, 1265673600, 1265760000, 1265846400, 1265932800, 1266019200, + 1266105600, 1266192000, 1266278400, 1266364800, 1266451200, 1266537600, + 1266624000, 1266710400, 1266796800, 1266969600, 1267056000, 1267142400, + 1267228800, 1267315200, 1267401600, 1267488000, 1267574400, 1267660800, + 1267747200, 1267833600, 1267920000, 1268006400, 1268092800, 1268179200, + 1268265600, 1268352000, 1268438400, 1268524800, 1268611200, 1268697600, + 1268784000, 1268870400, 1268956800, 1269043200, 1269129600, 1269216000, + 1269302400, 1269388800, 1269475200, 1269561600, 1269648000, 1269734400, + 1269820800, 1269907200, 1269993600, 1270080000, 1270166400, 1270252800, + 1270339200, 1270425600, 1270512000, 1270598400, 1270684800, 1270771200, + 1270857600, 1270944000, 1271030400, 1271116800, 1271203200, 1271289600, + 1271376000, 1271462400, 1271548800, 1271635200, 1271721600, 1271808000, + 1271894400, 1271980800, 1272067200, 1272153600, 1272240000, 1272326400, + 1272412800, 1272499200, 1272585600, 1272672000, 1272758400, 1272844800, + 1272931200, 1273017600, 1273104000, 1273190400, 1273276800, 1273363200, + 1273449600, 1273536000, 1273622400, 1273708800, 1273795200, 1273881600, + 1273968000, 1274054400, 1274140800, 1274227200, 1274313600, 1274400000, + 1274486400, 1274572800, 1274659200, 1274745600, 1274832000, 1274918400, + 1275004800, 1275091200, 1275177600, 1275264000, 1275350400, 1275436800, + 1275523200, 1275609600, 1275696000, 1275782400, 1275868800, 1275955200, + 1276041600, 1276128000, 1276214400, 1276300800, 1276387200, 1276473600, + 1276560000, 1276646400, 1276732800, 1276819200, 1276905600, 1276992000, + 1277078400, 1277164800, 1277251200, 1277337600, 1277424000, 1277596800, + 1277769600, 1277856000, 1277942400, 1278028800, 1278115200, 1278201600, + 1278374400, 1278806400, 1278892800, 1278979200, 1279065600, 1279152000, + 1279238400, 1279324800, 1279411200, 1279497600, 1279584000, 1279670400, + 1279756800, 1279843200, 1279929600, 1280016000, 1280102400, 1280188800, + 1280275200, 1280361600, 1280448000, 1280534400, 1280620800, 1280707200, + 1280793600, 1280880000, 1280966400, 1281052800, 1281139200, 1281225600, + 1281312000, 1281398400, 1281484800, 1281571200, 1281657600, 1281744000, + 1281830400, 1281916800, 1282003200, 1282089600, 1282176000, 1282262400, + 1282348800, 1282435200, 1282521600, 1282608000, 1282694400, 1282780800, + 1282867200, 1282953600, 1283040000, 1283126400, 1283212800, 1283299200, + 1283385600, 1283472000, 1283558400, 1283644800, 1283731200, 1283817600, + 1283904000, 1283990400, 1284076800, 1284163200, 1284249600, 1284336000, + 1284422400, 1284508800, 1284595200, 1284681600, 1284768000, 1284854400, + 1284940800, 1285027200, 1285113600, 1285200000, 1285286400, 1285372800, + 1285459200, 1285545600, 1285632000, 1285718400, 1285804800, 1285891200, + 1285977600, 1286064000, 1286150400, 1286236800, 1286323200, 1286409600, + 1286496000, 1286582400, 1286668800, 1286755200, 1286841600, 1286928000, + 1287014400, 1287100800, 1287187200, 1287273600, 1287360000, 1287446400, + 1287532800, 1287619200, 1287705600, 1287792000, 1287878400, 1287964800, + 1288051200, 1288137600, 1288224000, 1288310400, 1288396800, 1288483200, + 1288569600, 1288656000, 1288742400, 1288828800, 1288915200, 1289001600, + 1289088000, 1289174400, 1289260800, 1289347200, 1289433600, 1289520000, + 1289606400, 1289692800, 1289779200, 1289865600, 1289952000, 1290038400, + 1290124800, 1290211200, 1290297600, 1290384000, 1290470400, 1290556800, + 1290643200, 1290729600, 1290816000, 1290902400, 1290988800, 1291075200, + 1291161600, 1291248000, 1291334400, 1291420800, 1291507200, 1291593600, + 1291680000, 1291766400, 1291852800, 1291939200, 1292025600, 1292112000, + 1292198400, 1292284800, 1292371200, 1292457600, 1292544000, 1292630400, + 1292716800, 1292803200, 1292889600, 1292976000, 1293062400, 1293148800, + 1293235200, 1293321600, 1293408000, 1293494400, 1293580800, 1293667200, + 1293753600, 1293840000, 1293926400, 1294012800, 1294099200, 1294185600, + 1294272000, 1294358400, 1294444800, 1294531200, 1294617600, 1294704000, + 1294790400, 1294876800, 1294963200, 1295049600, 1295136000, 1295222400, + 1295308800, 1295395200, 1295481600, 1295568000, 1295654400, 1295740800, + 1295827200, 1295913600, 1296000000, 1296086400, 1296172800, 1296259200, + 1296345600, 1296432000, 1296518400, 1296604800, 1296691200, 1296777600, + 1296864000, 1296950400, 1297036800, 1297123200, 1297209600, 1297296000, + 1297382400, 1297468800, 1297555200, 1297641600, 1297728000, 1297814400, + 1297900800, 1297987200, 1298073600, 1298160000, 1298246400, 1298332800, + 1298419200, 1298505600, 1298592000, 1298678400, 1298764800, 1298851200, + 1298937600, 1299024000, 1299110400, 1299196800, 1299283200, 1299369600, + 1299456000, 1299542400, 1299628800, 1299715200, 1299801600, 1299888000, + 1299974400, 1300060800, 1300147200, 1300233600, 1300320000, 1300406400, + 1300492800, 1300579200, 1300665600, 1300752000, 1300838400, 1300924800, + 1301011200, 1301097600, 1301184000, 1301270400, 1301356800, 1301443200, + 1301529600, 1301616000, 1301702400, 1301788800, 1301875200, 1301961600, + 1302048000, 1302134400, 1302220800, 1302307200, 1302393600, 1302480000, + 1302566400, 1302652800, 1302739200, 1302825600, 1302912000, 1302998400, + 1303084800, 1303171200, 1303257600, 1303344000, 1303430400, 1303516800, + 1303603200, 1303689600, 1303776000, 1303862400, 1303948800, 1304035200, + 1304121600, 1304208000, 1304294400, 1304380800, 1304467200, 1304553600, + 1304640000, 1304726400, 1304812800, 1304899200, 1304985600, 1305072000, + 1305158400, 1305244800, 1305331200, 1305417600, 1305504000, 1305590400, + 1305676800, 1305763200, 1305849600, 1305936000, 1306022400, 1306108800, + 1306195200, 1306281600, 1306368000, 1306454400, 1306540800, 1306627200, + 1306713600, 1306800000, 1306886400, 1306972800, 1307059200, 1307145600, + 1307232000, 1307318400, 1307404800, 1307491200, 1307577600, 1307664000, + 1307750400, 1307836800, 1307923200, 1308009600, 1308096000, 1308182400, + 1308268800, 1308355200, 1308441600, 1308528000, 1308614400, 1308700800, + 1308787200, 1308873600, 1308960000, 1309046400, 1309132800, 1309219200, + 1309305600, 1309392000, 1309478400, 1309564800, 1309651200, 1309737600, + 1309824000, 1309910400, 1309996800, 1310083200, 1310169600, 1310256000, + 1310342400, 1310428800, 1310515200, 1310601600, 1310688000, 1310774400, + 1310860800, 1310947200, 1311033600, 1311120000, 1311206400, 1311292800, + 1311379200, 1311465600, 1311552000, 1311638400, 1311724800, 1311811200, + 1311897600, 1311984000, 1312070400, 1312156800, 1312243200, 1312329600, + 1312416000, 1312502400, 1312588800, 1312675200, 1312761600, 1312848000, + 1312934400, 1313020800, 1313107200, 1313193600, 1313280000, 1313366400, + 1313452800, 1313539200, 1313625600, 1313712000, 1313798400, 1313884800, + 1313971200, 1314057600, 1314144000, 1314230400, 1314316800, 1314403200, + 1314489600, 1314576000, 1314662400, 1314748800, 1314835200, 1315008000, + 1315094400, 1315180800, 1315267200, 1315353600, 1315440000, 1315526400, + 1315612800, 1315699200, 1315785600, 1315872000, 1315958400, 1316044800, + 1316131200, 1316217600, 1316304000, 1316390400, 1316476800, 1316563200, + 1316649600, 1316736000, 1316822400, 1316908800, 1316995200, 1317081600, + 1317168000, 1317254400, 1317340800, 1317427200, 1317513600, 1317600000, + 1317686400, 1317772800, 1317859200, 1317945600, 1318032000, 1318118400, + 1318204800, 1318291200, 1318377600, 1318464000, 1318550400, 1318636800, + 1318723200, 1318809600, 1318896000, 1318982400, 1319155200, 1319241600, + 1319328000, 1319414400, 1319500800, 1319587200, 1319673600, 1319760000, + 1319846400, 1319932800, 1320019200, 1320105600, 1320192000, 1320278400, + 1320364800, 1320451200, 1320537600, 1320624000, 1320710400, 1320796800, + 1320883200, 1320969600, 1321056000, 1321142400, 1321228800, 1321315200, + 1321401600, 1321488000, 1321574400, 1321660800, 1321747200, 1321833600, + 1321920000, 1322006400, 1322092800, 1322179200, 1322265600, 1322352000, + 1322438400, 1322524800, 1322611200, 1322697600, 1322784000, 1322870400, + 1322956800, 1323043200, 1323129600, 1323216000, 1323302400, 1323388800, + 1323475200, 1323561600, 1323648000, 1323734400, 1323820800, 1323907200, + 1323993600, 1324080000, 1324166400, 1324252800, 1324339200, 1324425600, + 1324512000, 1324598400, 1324857600, 1324944000, 1325030400, 1325116800, + 1325203200, 1325289600, 1325376000, 1325462400, 1325548800, 1325635200, + 1325721600, 1325808000, 1325894400, 1325980800, 1326067200, 1326153600, + 1326240000, 1326326400, 1326412800, 1326499200, 1326585600, 1326672000, + 1326758400, 1326844800, 1326931200, 1327017600, 1327104000, 1327190400, + 1327276800, 1327363200, 1327449600, 1327536000, 1327622400, 1327708800, + 1327795200, 1327881600, 1327968000, 1328054400, 1328140800, 1328227200, + 1328313600, 1328400000, 1328486400, 1328572800, 1328659200, 1328745600, + 1328832000, 1328918400, 1329004800, 1329091200, 1329177600, 1329264000, + 1329350400, 1329436800, 1329523200, 1329609600, 1329696000, 1329782400, + 1329868800, 1329955200, 1330041600, 1330128000, 1330214400, 1330300800, + 1330387200, 1330473600, 1330560000, 1330646400, 1330732800, 1330819200, + 1330905600, 1330992000, 1331078400, 1331164800, 1331251200, 1331337600, + 1331424000, 1331510400, 1331596800, 1331683200, 1331769600, 1331856000, + 1331942400, 1332028800, 1332115200, 1332201600, 1332288000, 1332374400, + 1332460800, 1332547200, 1332633600, 1332720000, 1332806400, 1332892800, + 1332979200, 1333065600, 1333152000, 1333238400, 1333324800, 1333411200, + 1333497600, 1333584000, 1333670400, 1333756800, 1333843200, 1333929600, + 1334016000, 1334102400, 1334188800, 1334275200, 1334361600, 1334448000, + 1334534400, 1334620800, 1334707200, 1334793600, 1334880000, 1334966400, + 1335052800, 1335139200, 1335225600, 1335312000, 1335398400, 1335484800, + 1335571200, 1335657600, 1335830400, 1335916800, 1336003200, 1336089600, + 1336176000, 1336262400, 1336348800, 1336435200, 1336521600, 1336608000, + 1336694400, 1336780800, 1336867200, 1336953600, 1337040000, 1337126400, + 1337212800, 1337299200, 1337385600, 1337472000, 1337558400, 1337644800, + 1337731200, 1337817600, 1337904000, 1337990400, 1338076800, 1338163200, + 1338249600, 1338336000, 1338422400, 1338508800, 1338595200, 1338681600, + 1338768000, 1338854400, 1338940800, 1339027200, 1339113600, 1339200000, + 1339286400, 1339372800, 1339459200, 1339545600, 1339632000, 1339718400, + 1339804800, 1339891200, 1339977600, 1340064000, 1340150400, 1340236800, + 1340323200, 1340409600, 1340496000, 1340582400, 1340668800, 1340755200, + 1340841600, 1340928000, 1341014400, 1341100800, 1341187200, 1341273600, + 1341360000, 1341446400, 1341532800, 1341619200, 1341705600, 1341792000, + 1341878400, 1341964800, 1342051200, 1342137600, 1342224000, 1342310400, + 1342396800, 1342483200, 1342569600, 1342656000, 1342742400, 1342828800, + 1342915200, 1343001600, 1343088000, 1343174400, 1343260800, 1343347200, + 1343433600, 1343520000, 1343606400, 1343692800, 1343779200, 1343865600, + 1343952000, 1344038400, 1344124800, 1344211200, 1344297600, 1344384000, + 1344470400, 1344556800, 1344643200, 1344729600, 1344816000, 1344902400, + 1344988800, 1345075200, 1345161600, 1345248000, 1345334400, 1345420800, + 1345507200, 1345593600, 1345680000, 1345766400, 1345852800, 1345939200, + 1346025600, 1346112000, 1346198400, 1346284800, 1346371200, 1346457600, + 1346544000, 1346630400, 1346716800, 1346803200, 1346889600, 1346976000, + 1347062400, 1347148800, 1347235200, 1347321600, 1347408000, 1347494400, + 1347580800, 1347667200, 1347753600, 1347840000, 1347926400, 1348012800, + 1348099200, 1348185600, 1348272000, 1348358400, 1348444800, 1348531200, + 1348617600, 1348704000, 1348790400, 1348876800, 1348963200, 1349049600, + 1349136000, 1349222400, 1349308800, 1349395200, 1349481600, 1349568000, + 1349654400, 1349740800, 1349827200, 1349913600, 1350000000, 1350086400, + 1350172800, 1350259200, 1350345600, 1350432000, 1350518400, 1350604800, + 1350691200, 1350777600, 1350864000, 1350950400, 1351036800, 1351123200, + 1351209600, 1351296000, 1351382400, 1351468800, 1351555200, 1351641600, + 1351728000, 1351814400, 1351900800, 1351987200, 1352073600, 1352160000, + 1352246400, 1352332800, 1352419200, 1352505600, 1352592000, 1352678400, + 1352764800, 1352851200, 1352937600, 1353024000, 1353110400, 1353196800, + 1353283200, 1353369600, 1353456000, 1353542400, 1353628800, 1353715200, + 1353801600, 1353888000, 1353974400, 1354060800, 1354147200, 1354233600, + 1354320000, 1354406400, 1354492800, 1354579200, 1354665600, 1354752000, + 1354838400, 1354924800, 1355011200, 1355097600, 1355184000, 1355270400, + 1355356800, 1355443200, 1355529600, 1355616000, 1355702400, 1355788800, + 1355875200, 1355961600, 1356048000, 1356134400, 1356220800, 1356307200, + 1356393600, 1356480000, 1356566400, 1356652800, 1356739200, 1356825600, + 1356912000, 1356998400, 1357084800, 1357171200, 1357257600, 1357344000, + 1357430400, 1357516800, 1357603200, 1357689600, 1357776000, 1357862400, + 1357948800, 1358035200, 1358121600, 1358208000, 1358294400, 1358380800, + 1358467200, 1358553600, 1358640000, 1358726400, 1358812800, 1358899200, + 1358985600, 1359072000, 1359158400, 1359244800, 1359331200, 1359417600, + 1359504000, 1359590400, 1359676800, 1359763200, 1359849600, 1359936000, + 1360022400, 1360108800, 1360195200, 1360281600, 1360368000, 1360454400, + 1360540800, 1360627200, 1360713600, 1360800000, 1360886400, 1360972800, + 1361059200, 1361145600, 1361232000, 1361318400, 1361404800, 1361491200, + 1361577600, 1361664000, 1361750400, 1361836800, 1361923200, 1362009600, + 1362096000, 1362182400, 1362268800, 1362355200, 1362441600, 1362528000, + 1362614400, 1362700800, 1362787200, 1362873600, 1362960000, 1363046400, + 1363132800, 1363219200, 1363305600, 1363392000, 1363478400, 1363564800, + 1363651200, 1363737600, 1363824000, 1363910400, 1363996800, 1364083200, + 1364169600, 1364256000, 1364342400, 1364428800, 1364515200, 1364601600, + 1364688000, 1364774400, 1364860800, 1364947200, 1365033600, 1365120000, + 1365206400, 1365292800, 1365379200, 1365465600, 1365552000, 1365638400, + 1365724800, 1365811200, 1365897600, 1365984000, 1366070400, 1366156800, + 1366243200, 1366329600, 1366416000, 1366502400, 1366588800, 1366675200, + 1366761600, 1366848000, 1366934400, 1367020800, 1367107200, 1367193600, + 1367280000, 1367366400, 1367452800, 1367539200, 1367625600, 1367712000, + 1367798400, 1367884800, 1367971200, 1368057600, 1368144000, 1368230400, + 1368316800, 1368403200, 1368489600, 1368576000, 1368662400, 1368748800, + 1368835200, 1368921600, 1369008000, 1369094400, 1369180800, 1369267200, + 1369353600, 1369440000, 1369526400, 1369612800, 1369699200, 1369785600, + 1369872000, 1369958400, 1370044800, 1370131200, 1370217600, 1370304000, + 1370390400, 1370476800, 1370563200, 1370649600, 1370736000, 1370822400, + 1370908800, 1370995200, 1371081600, 1371168000, 1371254400, 1371340800, + 1371427200, 1371513600, 1371600000, 1371686400, 1371772800, 1371859200, + 1371945600, 1372032000, 1372118400, 1372204800, 1372291200, 1372377600, + 1372464000, 1372550400, 1372636800, 1372723200, 1372809600, 1372896000, + 1372982400, 1373068800, 1373155200, 1373241600, 1373328000, 1373414400, + 1373500800, 1373587200, 1373673600, 1373760000, 1373846400, 1373932800, + 1374019200, 1374105600, 1374192000, 1374278400, 1374364800, 1374451200, + 1374624000, 1374710400, 1374796800, 1374883200, 1374969600, 1375056000, + 1375142400, 1375228800, 1375315200, 1375401600, 1375488000, 1375574400, + 1375660800, 1375747200, 1375833600, 1375920000, 1376006400, 1376092800, + 1376179200, 1376265600, 1376352000, 1376438400, 1376524800, 1376611200, + 1376697600, 1376784000, 1376870400, 1376956800, 1377043200, 1377129600, + 1377216000, 1377302400, 1377388800, 1377475200, 1377561600, 1377648000, + 1377734400, 1377820800, 1377907200, 1377993600, 1378080000, 1378166400, + 1378252800, 1378339200, 1378425600, 1378512000, 1378598400, 1378684800, + 1378771200, 1378857600, 1378944000, 1379030400, 1379116800, 1379203200, + 1379289600, 1379376000, 1379462400, 1379548800, 1379635200, 1379721600, + 1379808000, 1379894400, 1379980800, 1380067200, 1380153600, 1380240000, + 1380326400, 1380412800, 1380499200, 1380585600, 1380672000, 1380758400, + 1380844800, 1380931200, 1381017600, 1381104000, 1381190400, 1381276800, + 1381363200, 1381449600, 1381536000, 1381622400, 1381708800, 1381795200, + 1381881600, 1381968000, 1382054400, 1382140800, 1382227200, 1382313600, + 1382400000, 1382486400, 1382572800, 1382659200, 1382745600, 1382832000, + 1382918400, 1383004800, 1383091200, 1383177600, 1383264000, 1383350400, + 1383436800, 1383523200, 1383609600, 1383696000, 1383782400, 1383868800, + 1383955200, 1384041600, 1384128000, 1384214400, 1384300800, 1384387200, + 1384473600, 1384560000, 1384646400, 1384732800, 1384819200, 1384905600, + 1384992000, 1385078400, 1385164800, 1385251200, 1385337600, 1385424000, + 1385510400, 1385596800, 1385683200, 1385769600, 1385856000, 1385942400, + 1386028800, 1386115200, 1386201600, 1386288000, 1386374400, 1386460800, + 1386547200, 1386633600, 1386720000, 1386806400, 1386892800, 1386979200, + 1387065600, 1387152000, 1387238400, 1387324800, 1387411200, 1387497600, + 1387584000, 1387670400, 1387756800, 1387843200, 1387929600, 1388016000, + 1388102400, 1388188800, 1388275200, 1388361600, 1388448000, 1388534400, + 1388620800, 1388707200, 1388793600, 1388880000, 1389052800, 1389139200, + 1389225600, 1389312000, 1389398400, 1389484800, 1389571200, 1389657600, + 1389744000, 1389830400, 1389916800, 1390003200, 1390089600, 1390176000, + 1390262400, 1390348800, 1390435200, 1390521600, 1390608000, 1390694400, + 1390780800, 1390867200, 1390953600, 1391040000, 1391126400, 1391212800, + 1391299200, 1391385600, 1391472000, 1391558400, 1391644800, 1391731200, + 1391817600, 1391904000, 1391990400, 1392076800, 1392163200, 1392249600, + 1392336000, 1392422400, 1392508800, 1392595200, 1392681600, 1392768000, + 1392854400, 1392940800, 1393027200, 1393113600, 1393200000, 1393286400, + 1393372800, 1393459200, 1393545600, 1393632000, 1393718400, 1393804800, + 1393891200, 1393977600, 1394064000, 1394150400, 1394236800, 1394323200, + 1394409600, 1394496000, 1394582400, 1394668800, 1394755200, 1394841600, + 1394928000, 1395014400, 1395100800, 1395187200, 1395273600, 1395360000, + 1395446400, 1395532800, 1395619200, 1395705600, 1395792000, 1395878400, + 1395964800, 1396051200, 1396137600, 1396224000, 1396310400, 1396396800, + 1396483200, 1396569600, 1396656000, 1396742400, 1396828800, 1396915200, + 1397001600, 1397088000, 1397174400, 1397260800, 1397347200, 1397433600, + 1397520000, 1397606400, 1397692800, 1397779200, 1397865600, 1397952000, + 1398038400, 1398124800, 1398211200, 1398297600, 1398384000, 1398470400, + 1398556800, 1398643200, 1398729600, 1398816000, 1398902400, 1398988800, + 1399075200, 1399161600, 1399248000, 1399334400, 1399420800, 1399507200, + 1399593600, 1399680000, 1399766400, 1399852800, 1399939200, 1400025600, + 1400112000, 1400198400, 1400284800, 1400371200, 1400457600, 1400544000, + 1400630400, 1400716800, 1400803200, 1400889600, 1400976000, 1401062400, + 1401148800, 1401235200, 1401321600, 1401408000, 1401494400, 1401580800, + 1401667200, 1401753600, 1401840000, 1401926400, 1402012800, 1402099200, + 1402185600, 1402272000, 1402358400, 1402444800, 1402531200, 1402617600, + 1402704000, 1402790400, 1402876800, 1402963200, 1403049600, 1403136000, + 1403222400, 1403308800, 1403395200, 1403481600, 1403568000, 1403654400, + 1403740800, 1403827200, 1403913600, 1404000000, 1404086400, 1404172800, + 1404259200, 1404345600, 1404432000, 1404518400, 1404604800, 1404691200, + 1404777600, 1404864000, 1404950400, 1405036800, 1405123200, 1405209600, + 1405296000, 1405382400, 1405468800, 1405555200, 1405641600, 1405728000, + 1405814400, 1405900800, 1405987200, 1406073600, 1406160000, 1406246400, + 1406332800, 1406419200, 1406505600, 1406592000, 1406678400, 1406764800, + 1406851200, 1406937600, 1407024000, 1407110400, 1407196800, 1407283200, + 1407369600, 1407456000, 1407542400, 1407628800, 1407715200, 1407801600, + 1407888000, 1407974400, 1408060800, 1408147200, 1408233600, 1408320000, + 1408406400, 1408492800, 1408579200, 1408665600, 1408752000, 1408838400, + 1408924800, 1409011200, 1409097600, 1409270400, 1409356800, 1409443200, + 1409529600, 1409616000, 1409702400, 1409788800, 1409875200, 1409961600, + 1410048000, 1410134400, 1410220800, 1410307200, 1410393600, 1410480000, + 1410566400, 1410652800, 1410739200, 1410825600, 1410912000, 1410998400, + 1411084800, 1411171200, 1411257600, 1411344000, 1411430400, 1411516800, + 1411603200, 1411689600, 1411776000, 1411862400, 1411948800, 1412035200, + 1412121600, 1412208000, 1412294400, 1412380800, 1412467200, 1412553600, + 1412640000, 1412726400, 1412812800, 1412899200, 1412985600, 1413072000, + 1413158400, 1413244800, 1413331200, 1413417600, 1413504000, 1413590400, + 1413676800, 1413763200, 1413849600, 1413936000, 1414022400, 1414108800, + 1414195200, 1414281600, 1414368000, 1414454400, 1414540800, 1414627200, + 1414713600, 1414800000, 1414886400, 1414972800, 1415059200, 1415145600, + 1415232000, 1415318400, 1415404800, 1415491200, 1415577600, 1415664000, + 1415750400, 1415836800, 1415923200, 1416009600, 1416096000, 1416182400, + 1416268800, 1416355200, 1416441600, 1416528000, 1416614400, 1416700800, + 1416787200, 1416873600, 1416960000, 1417046400, 1417132800, 1417219200, + 1417305600, 1417392000, 1417478400, 1417564800, 1417651200, 1417737600, + 1417824000, 1417910400, 1417996800, 1418083200, 1418169600, 1418256000, + 1418342400, 1418428800, 1418515200, 1418601600, 1418688000, 1418774400, + 1418860800, 1418947200, 1419033600, 1419120000, 1419206400, 1419292800, + 1419379200, 1419465600, 1419552000, 1419638400, 1419724800, 1419811200, + 1419897600, 1419984000, 1420070400, 1420156800, 1420243200, 1420329600, + 1420416000, 1420502400, 1420588800, 1420675200, 1420761600, 1420848000, + 1420934400, 1421020800, 1421107200, 1421193600, 1421280000, 1421366400, + 1421452800, 1421539200, 1421625600, 1421712000, 1421798400, 1421884800, + 1421971200, 1422057600, 1422144000, 1422230400, 1422316800, 1422403200, + 1422489600, 1422576000, 1422662400, 1422748800, 1422835200, 1422921600, + 1423008000, 1423180800, 1423267200, 1423353600, 1423440000, 1423526400, + 1423612800, 1423699200, 1423785600, 1423872000, 1423958400, 1424044800, + 1424131200, 1424217600, 1424304000, 1424390400, 1424476800, 1424563200, + 1424649600, 1424736000, 1424822400, 1424908800, 1424995200, 1425081600, + 1425168000, 1425254400, 1425340800, 1425427200, 1425513600, 1425600000, + 1425686400, 1425772800, 1425859200, 1425945600, 1426032000, 1426118400, + 1426204800, 1426291200, 1426377600, 1426464000, 1426550400, 1426636800, + 1426723200, 1426809600, 1426896000, 1426982400, 1427068800, 1427155200, + 1427241600, 1427328000, 1427414400, 1427500800, 1427587200, 1427673600, + 1427760000, 1427846400, 1427932800, 1428019200, 1428105600, 1428192000, + 1428278400, 1428364800, 1428451200, 1428537600, 1428624000, 1428710400, + 1428796800, 1428883200, 1428969600, 1429056000, 1429142400, 1429228800, + 1429315200, 1429401600, 1429488000, 1429574400, 1429660800, 1429747200, + 1429833600, 1429920000, 1430006400, 1430092800, 1430179200, 1430265600, + 1430352000, 1430438400, 1430524800, 1430611200, 1430697600, 1430784000, + 1430870400, 1430956800, 1431043200, 1431129600, 1431216000, 1431302400, + 1431388800, 1431475200, 1431561600, 1431648000, 1431734400, 1431820800, + 1431907200, 1431993600, 1432080000, 1432166400, 1432252800, 1432339200, + 1432425600, 1432512000, 1432598400, 1432684800, 1432771200, 1432857600, + 1432944000, 1433030400, 1433116800, 1433203200, 1433289600, 1433376000, + 1433462400, 1433548800, 1433635200, 1433721600, 1433808000, 1433894400, + 1433980800, 1434067200, 1434153600, 1434240000, 1434326400, 1434412800, + 1434499200, 1434585600, 1434672000, 1434758400, 1434844800, 1434931200, + 1435017600, 1435104000, 1435190400, 1435276800, 1435363200, 1435449600, + 1435536000, 1435622400, 1435708800, 1435795200, 1435881600, 1435968000, + 1436054400, 1436140800, 1436227200, 1436313600, 1436400000, 1436486400, + 1436572800, 1436659200, 1436745600, 1436832000, 1436918400, 1437004800, + 1437091200, 1437177600, 1437264000, 1437350400, 1437436800, 1437523200, + 1437609600, 1437696000, 1437782400, 1437868800, 1437955200, 1438041600, + 1438128000, 1438214400, 1438300800, 1438387200, 1438473600, 1438560000, + 1438646400, 1438732800, 1438819200, 1438905600, 1438992000, 1439078400, + 1439164800, 1439251200, 1439337600, 1439424000, 1439510400, 1439596800, + 1439683200, 1439769600, 1439856000, 1439942400, 1440028800, 1440115200, + 1440201600, 1440288000, 1440374400, 1440460800, 1440547200, 1440633600, + 1440720000, 1440806400, 1440892800, 1440979200, 1441065600, 1441152000, + 1441238400, 1441324800, 1441411200, 1441497600, 1441584000, 1441670400, + 1441756800, 1441843200, 1441929600, 1442016000, 1442102400, 1442188800, + 1442275200, 1442361600, 1442448000, 1442534400, 1442620800, 1442707200, + 1442793600, 1442880000, 1442966400, 1443052800, 1443139200, 1443225600, + 1443312000, 1443398400, 1443484800, 1443571200, 1443657600, 1443744000, + 1443830400, 1443916800, 1444003200, 1444089600, 1444176000, 1444262400, + 1444348800, 1444435200, 1444521600, 1444694400, 1444780800, 1444867200, + 1444953600, 1445040000, 1445126400, 1445212800, 1445299200, 1445385600, + 1445472000, 1445558400, 1445644800, 1445731200, 1445817600, 1445904000, + 1445990400, 1446076800, 1446163200, 1446249600, 1446336000, 1446422400, + 1446508800, 1446595200, 1446681600, 1446768000, 1446854400, 1446940800, + 1447027200, 1447113600, 1447200000, 1447286400, 1447372800, 1447459200, + 1447545600, 1447632000, 1447718400, 1447804800, 1447891200, 1447977600, + 1448064000, 1448150400, 1448236800, 1448323200, 1448409600, 1448496000, + 1448582400, 1448668800, 1448755200, 1448841600, 1448928000, 1449014400, + 1449100800, 1449187200, 1449273600, 1449360000, 1449446400, 1449532800, + 1449619200, 1449705600, 1449792000, 1449878400, 1449964800, 1450051200, + 1450137600, 1450224000, 1450310400, 1450396800, 1450483200, 1450569600, + 1450656000, 1450742400, 1450828800, 1450915200, 1451001600, 1451088000, + 1451174400, 1451260800, 1451347200, 1451433600, 1451520000, 1451606400, + 1451692800, 1451779200, 1451865600, 1451952000, 1452038400, 1452124800, + 1452211200, 1452297600, 1452384000, 1452470400, 1452556800, 1452643200, + 1452729600, 1452816000, 1452902400, 1452988800, 1453075200, 1453161600, + 1453248000, + ], + y: [ + 9.59076113897809, 8.51959031601596, 8.18367658262066, 8.07246736935477, + 7.8935720735049, 7.78364059622125, 8.41405243249672, 8.82922635473185, + 8.38251828808963, 8.06965530688617, 7.87929148508227, 7.76174498465891, + 7.52940645783701, 8.38526052015541, 8.62011072542292, 7.85243908535751, + 7.85399308722424, 8.0519780789023, 7.92660259918138, 7.83834331555712, + 9.70314458114435, 9.38597294061934, 8.29379960884682, 8.43468076984177, + 8.26204284396694, 8.10681603894705, 7.95014988765202, 9.50925907635395, + 8.84678466694523, 8.43054538469057, 8.2482674474469, 8.28172399041139, + 8.29279885820037, 8.19918935907807, 9.99652241850332, 10.1270710070787, + 8.93379604393486, 8.56617381363786, 8.54772239645106, 8.39976009452414, + 8.22309055116153, 8.83898679349679, 10.8972021813751, 9.44493807333551, + 8.92332474406756, 8.5434455625603, 8.49556089128912, 8.41737285613403, + 8.57262789830434, 8.73648935100155, 8.63408694288774, 8.67351294567119, + 8.82423661734664, 8.53797573059877, 9.69806112202708, 12.0974568371517, + 10.6352783566883, 9.69171658751689, 9.31560088263368, 8.97081334141145, + 8.58914169072882, 8.61740045183326, 8.61631428228404, 8.21554741194707, + 8.06495089174914, 8.11342663994365, 7.79934339821592, 7.6275443904885, + 7.55590509361135, 7.71154897962915, 7.78862606562503, 7.70841066725737, + 7.76853330092603, 7.69530313496357, 7.37838371299671, 7.91059061225648, + 7.62657020629066, 7.57353126274595, 7.56786260546388, 7.5522372875608, + 7.33693691370762, 8.12474302038557, 7.88758403166028, 7.81963630236759, + 7.38398945797851, 7.81439963380449, 7.5422134631934, 7.54855597916987, + 7.6889133368648, 7.4770384723197, 7.35883089834235, 7.03262426102801, + 7.11801620446533, 7.34987370473834, 7.32646561384032, 7.36391350140582, + 7.27793857294566, 7.25134498337221, 7.00215595440362, 7.16394668434255, + 7.7591874385078, 7.51860721681525, 7.41397029019044, 7.44249272279444, + 7.2283884515736, 6.99117688712121, 7.2115567333138, 7.31121838441963, + 7.34923082461333, 7.51425465281641, 7.39326309476384, 7.28619171470238, + 7.27309259599952, 7.16857989726403, 7.61134771740362, 7.61775957660851, + 7.42595365707754, 8.18200013629341, 7.39939808333135, 7.1066061377273, + 7.08086789669078, 7.42117752859539, 7.49164547360513, 7.38585107812521, + 7.68294316987829, 7.6889133368648, 7.2591161280971, 8.14496941708788, + 8.71391062849392, 8.09101504171053, 7.84031298332016, 7.64873978895624, + 8.02092771898158, 7.83002808253384, 7.72753511047545, 7.83597458172157, + 7.62657020629066, 7.64444076155657, 7.54855597916987, 7.44073370738926, + 7.07326971745971, 7.02642680869964, 7.39203156751459, 7.29301767977278, + 7.36137542897735, 7.51261754467451, 7.46049030582534, 7.11476944836646, + 7.12528309151071, 7.45587668749182, 7.31721240835984, 7.41034709782102, + 7.40245152081824, 7.29437729928882, 6.98933526597456, 6.99301512293296, + 7.4312996751559, 7.36201055125973, 7.454719949364, 7.36833968631138, + 7.14361760270412, 6.8351845861473, 6.89060912014717, 6.97447891102505, + 7.26612877955645, 7.27031288607902, 7.26542972325395, 7.15773548424991, + 6.86589107488344, 7.15383380157884, 7.21670948670946, 7.20191631753163, + 7.21229446850034, 7.18614430452233, 6.82001636467413, 6.88243747099785, + 7.18311170174328, 7.24279792279376, 7.1929342212158, 7.18387071506245, + 6.97073007814353, 6.9177056098353, 7.22256601882217, 7.35691824235602, + 7.24279792279376, 7.22329567956231, 7.16317239084664, 7.24136628332232, + 6.98656645940643, 6.96318998587024, 7.25063551189868, 7.1608459066643, + 7.13249755166004, 7.09174211509515, 7.01211529430638, 6.85751406254539, + 6.82762923450285, 7.13009851012558, 7.27724772663148, 7.03878354138854, + 6.89060912014717, 6.95749737087695, 7.29573507274928, 7.49720722320332, + 7.31055015853442, 7.20489251020467, 7.22256601882217, 7.25770767716004, + 7.42595365707754, 7.11720550316434, 7.24992553671799, 8.27690348126706, + 7.60638738977265, 7.64396194900253, 8.01234963932779, 7.93020620668468, + 7.50878717063428, 7.52131798019924, 7.58984151218266, 7.50052948539529, + 7.37023064180708, 7.38523092306657, 7.30249642372733, 7.27517231945277, + 7.39203156751459, 7.51697722460432, 7.90912218321141, 7.72312009226633, + 7.67042852219069, 7.62900388965296, 7.43070708254597, 7.57967882309046, + 7.9483852851119, 7.79564653633459, 8.00736706798333, 7.79069603117474, + 7.83280751652486, 7.51479976048867, 7.6275443904885, 7.85515700588134, + 7.96485088744731, 7.74586822979227, 8.08085641964099, 8.25997565976828, + 7.7698009960039, 8.17751582384608, 9.28173036806286, 8.33854487998858, + 7.83042561782033, 7.8087293067444, 7.81681996576455, 7.55485852104068, + 8.55506684384432, 8.20794694104862, 8.08363720314155, 7.79110951061003, + 7.67089483136212, 7.64012317269536, 7.55013534248843, 8.24931374626064, + 8.3039999709552, 8.12681372072611, 7.70616297019958, 7.66387725870347, + 7.52671756135271, 7.92588031673756, 7.92153563213355, 8.03398273468322, + 7.72577144158795, 7.69439280262942, 7.44949800538285, 7.39141523467536, + 7.34601020991329, 8.10137467122858, 8.15651022607997, 7.97108575350561, + 7.87283617502572, 7.63530388625941, 7.58781721999343, 7.34213173058472, + 8.17751582384608, 8.34093322600088, 8.47657950853094, 7.87359778968554, + 7.71735127218533, 7.49052940206071, 7.37588214821501, 8.07558263667172, + 8.16536363247398, 7.58528107863913, 7.60738142563979, 7.26752542782817, + 8.04012466444838, 8.10922495308995, 8.80687326653069, 7.74716496652033, + 7.48099216286952, 7.34665516317654, 7.24708058458576, 7.93808872689695, + 9.03562977818356, 8.04109100370863, 7.40610338123702, 7.97384437594469, + 7.76811037852599, 7.4713630881871, 8.03008409426756, 8.72939712269206, + 7.93701748951545, 7.66528471847135, 7.58018941794454, 7.7106533235012, + 7.26122509197192, 8.04654935728308, 8.09346227450118, 7.76726399675731, + 7.49665243816828, 7.5522372875608, 7.49720722320332, 7.3125534981026, + 7.93880224815448, 9.05870319731322, 8.19422930481982, 7.51914995766982, + 7.55118686729615, 7.71378461659875, 7.60589000105312, 8.49902922078857, + 8.29179710504873, 7.89469085042562, 7.79028238070348, 7.65539064482615, + 7.61035761831284, 7.53101633207792, 8.23137604557397, 8.00670084544037, + 7.85864065562079, 7.69712131728263, 7.59588991771854, 7.73587031995257, + 7.35115822643069, 8.03138533062553, 8.39434736141739, 7.82364593083495, + 8.08671792030391, 7.77148876011762, 8.68895923427068, 7.74716496652033, + 7.96067260838812, 8.62461158818351, 7.99665387546261, 7.62070508683826, + 7.4318919168078, 7.46278915741245, 7.4489161025442, 8.25140306538056, + 8.55525939222269, 8.31581113188354, 8.30992298925832, 7.75876054415766, + 8.80821966511841, 9.12194622121359, 10.1538181636943, 9.26785427817679, + 8.43424627059531, 8.13768818497761, 8.04494704961772, 8.22897764335831, + 8.14118979345769, 9.21562637640542, 8.73278832497312, 8.51016857647927, + 8.10409905614358, 7.95014988765202, 7.85205020726589, 7.65633716643018, + 8.04430540699064, 8.80101783354071, 7.82963038915019, 7.77737360265786, + 7.93522953981691, 7.67229245562876, 7.38832785957711, 7.51152464839087, + 7.66340766489348, 7.78945456608667, 7.80791662892641, 7.82484569102686, + 7.90654723236804, 7.70210434005105, 8.47762041629641, 9.14952823257943, + 8.06211758275474, 8.06652149046999, 8.05959232888755, 8.04942705711069, + 7.7621706071382, 8.09773057366422, 8.01829613851552, 7.61677580869837, + 7.84267147497946, 7.76853330092603, 7.53047999524554, 7.33236920592906, + 7.22402480828583, 7.41637847919293, 7.42714413340862, 7.39756153552405, + 7.49554194388426, 7.39939808333135, 7.00850518208228, 7.11801620446533, + 7.48380668766583, 7.57147364885127, 7.64826303090192, 7.47420480649612, + 7.47250074473756, 7.2115567333138, 7.34342622914737, 7.48211892355212, + 7.41095187558364, 7.40306109109009, 7.45298232946546, 7.42356844425917, + 7.08506429395255, 7.21081845347222, 7.35627987655075, 7.30451594646016, + 7.46565531013406, 7.86901937649902, 7.24850407237061, 7.07834157955767, + 7.2211050981825, 7.33432935030054, 7.29233717617388, 7.2991214627108, + 7.28344822875663, 7.30182234213793, 7.06219163228656, 7.18159194461187, + 7.50549227473742, 7.87473912517181, 7.57865685059476, 7.36707705988101, + 7.25700270709207, 7.05617528410041, 7.50273821075485, 7.44307837434852, + 7.48155570190952, 7.48211892355212, 7.51914995766982, 7.65964295456468, + 7.24422751560335, 7.23273313617761, 7.34213173058472, 7.42117752859539, + 7.49220304261874, 7.31521838975297, 7.14124512235049, 7.00940893270864, + 7.08757370555797, 7.30451594646016, 7.37462901521894, 7.51261754467451, + 7.51752085060303, 7.37400185935016, 7.14124512235049, 7.16162200293919, + 7.48493028328966, 7.51261754467451, 7.44483327389219, 7.47420480649612, + 7.67182679787878, 7.84227877911735, 7.92407232492342, 7.82843635915759, + 7.58680353516258, 7.62997570702779, 7.70975686445416, 7.52671756135271, + 7.19368581839511, 7.25770767716004, 7.45414107814668, 7.48155570190952, + 7.55903825544338, 7.44483327389219, 7.3375877435386, 7.13568734702814, + 7.08506429395255, 7.27239839257005, 7.5109777520141, 7.49886973397693, + 7.44424864949671, 7.40306109109009, 6.91671502035361, 6.97728134163075, + 7.48268182815465, 7.41397029019044, 7.37211802833779, 7.33367639565768, + 7.39510754656249, 7.03614849375054, 6.87419849545329, 6.98471632011827, + 7.45587668749182, 7.49498623395053, 7.33106030521863, 7.10496544826984, + 6.99393297522319, 6.93049476595163, 7.21817683840341, 7.4759059693674, + 7.36454701425564, 7.23993259132047, 7.30921236569276, 7.13886699994552, + 6.97260625130175, 7.18841273649695, 7.33498187887181, 7.33432935030054, + 7.43248380791712, 7.39141523467536, 6.96129604591017, 7.02197642307216, + 7.21376830811864, 7.50988306115491, 7.32843735289516, 7.49665243816828, + 7.20042489294496, 7.08422642209792, 7.14913159855741, 7.25629723969068, + 7.19818357710194, 7.28892769452126, 7.12849594568004, 7.0825485693553, + 6.82219739062049, 6.94793706861497, 7.11232744471091, 7.19967834569117, + 7.31721240835984, 7.09837563859079, 7.04490511712937, 7.30451594646016, + 7.79358680337158, 7.80547462527086, 7.48324441607385, 7.35691824235602, + 7.50714107972761, 7.37525577800975, 7.19668657083435, 7.22329567956231, + 7.35244110024358, 7.31721240835984, 7.44424864949671, 7.35564110297425, + 7.32448997934853, 7.21450441415114, 7.2841348061952, 7.54009032014532, + 7.47477218239787, 7.82923253754359, 7.68109900153636, 7.72973533138505, + 7.3031700512368, 7.28207365809346, 7.48549160803075, 7.61874237767041, + 7.69393732550927, 7.53955882930103, 7.43838353004431, 7.27378631784489, + 7.35564110297425, 7.65822752616135, 7.84345640437612, 8.36846113761584, + 8.1721644521119, 7.81156848934518, 7.57507169950756, 7.6586995582683, + 7.86633892304654, 7.78113850984502, 7.75491027202143, 7.70885960104718, + 8.20712916807133, 7.71154897962915, 7.73455884435476, 7.96762673933382, + 8.40380050406115, 8.29279885820037, 7.98548435673382, 8.67180090964268, + 7.78239033558746, 7.78696700261487, 7.94661756324447, 8.17357548663415, + 7.80954132465341, 7.80302664363222, 8.05134093329298, 7.97315543344413, + 7.86901937649902, 8.16251625014018, 8.04012466444838, 7.96346006663897, + 7.83834331555712, 7.91315518592807, 7.95331834656043, 8.07620452723903, + 7.98241634682773, 8.1285852003745, 7.95472333449791, 8.1101268019411, + 8.21365270303, 8.04686951095958, 8.9242570208881, 8.61721950548336, + 8.51959031601596, 8.01433573729942, 8.05769419481559, 8.10440130792161, + 7.99395754757357, 8.43185314424922, 9.73820008829795, 10.1799822793473, + 8.36194190614495, 9.94884325425692, 8.75904072752422, 8.25166392360559, + 8.07868822922987, 8.17357548663415, 7.88908440703551, 9.09985563880091, + 9.40656483393913, 9.16440114003474, 8.48735234940522, 8.43141741439483, + 8.2776661608515, 8.31213510764841, 8.79011689289247, 10.2800386504796, + 9.07577987858049, 8.69918135930895, 9.08658956454001, 8.86149186428691, + 8.54441917766983, 8.44762872803033, 8.25270667656764, 8.10982627601848, + 8.13681086367554, 8.7268056084461, 9.38269576445829, 8.57828829077605, + 8.23880116587155, 8.12237124340655, 8.05515773181968, 7.83241092718792, + 8.89754559870933, 8.72566970568704, 8.56407677731509, 8.2190566610606, + 8.14757773620177, 8.0013550258267, 7.78945456608667, 8.81195017753998, + 9.00220857828241, 8.59304250369967, 8.28197705886776, 8.46505743699571, + 8.49474306257865, 8.40514368760761, 10.558699193753, 9.12456459495478, + 8.73182058296211, 8.52892411429194, 8.50512061018197, 8.27639470486331, + 9.1239106439778, 8.58597270681106, 8.31556648356428, 8.66112036022288, + 8.92572027356022, 8.44139147799996, 9.2277872855799, 9.26473385580652, + 9.27491014262548, 8.39298958795693, 8.58522560180806, 8.42376124662369, + 8.33782726244791, 9.05975001334368, 9.29825967001407, 8.76186337327473, + 8.50754681436443, 8.39931015075952, 8.52357279838028, 8.37953902611744, + 9.09110628405248, 9.76198159024195, 8.92956770782534, 8.53070154144103, + 8.58709231879591, 9.79784922051313, 8.66475075577385, 9.17232692977797, + 9.20140053040671, 9.33052053223229, 8.68457030082437, 8.50248556254396, + 8.28878581042693, 8.29804166137157, 9.16293424957891, 9.54795481317617, + 9.01724094201035, 8.78492762605832, 8.38662882139512, 8.33447155460094, + 8.53601494565683, 8.70863965598719, 8.73004395324502, 8.37562962709445, + 8.31898612539206, 8.46442512587758, 8.5972974356579, 8.92279162396964, + 9.49167735686812, 9.21014035197352, 8.67795057029435, 8.60226936377136, + 8.61450137388324, 8.65886634973238, 8.77940359789435, 11.0079327963967, + 9.75324588920559, 9.22513045744882, 9.0177260256968, 8.93695560422523, + 9.00932517273497, 11.4840629202851, 10.2642341958449, 9.69443180053954, + 9.44041981429151, 9.35374783527091, 9.22847494217167, 9.30392178559771, + 10.2401740519157, 9.91595945403145, 10.1115174660403, 9.85859478364539, + 10.1190020766858, 10.0005688901867, 11.1914521795828, 10.4633318857817, + 9.65406419220144, 9.11975899374495, 8.79573360595074, 8.44848599340645, + 8.2666784433059, 8.21851757748959, 8.24249315318763, 8.00803284696931, + 8.0452677166078, 7.9287663216267, 7.74500280351584, 7.86633892304654, + 7.94165125293056, 8.31041499418829, 7.82803803212583, 7.87359778968554, + 7.75705114203201, 7.72621265050753, 7.77527584648686, 7.79523492900217, + 7.74975340627444, 8.06808962627824, 8.72583205652757, 7.65444322647011, + 7.60339933974067, 7.75319426988434, 7.77022320415879, 7.63143166457691, + 7.54380286750151, 7.60439634879634, 7.58426481838906, 7.5109777520141, + 7.67461749736436, 7.71289096149013, 7.70165236264223, 7.63819824428578, + 7.56268124672188, 7.40367029001237, 7.46622755621548, 7.61233683716775, + 7.80180040190897, 8.02878116248715, 7.73017479524622, 7.63964228785801, + 7.56320059235807, 7.48661331313996, 7.5076900778199, 7.65396918047877, + 7.61283103040736, 7.45414107814668, 7.36707705988101, 7.45298232946546, + 7.47873482556787, 7.98514393119862, 7.82164312623998, 7.66058546170326, + 7.5595594960077, 7.57660976697304, 7.4500795698075, 7.49886973397693, + 7.51588908521513, 7.60837447438078, 7.58629630715272, 7.68063742756094, + 7.7848892956551, 7.5522372875608, 7.59890045687141, 7.64826303090192, + 7.66996199547358, 7.85554467791566, 8.09651291750159, 8.92105701815743, + 8.3986348552921, 7.98820359702258, 8.00269416228394, 8.07309119969315, + 7.98309894071089, 7.84619881549743, 7.78655180642871, 7.44483327389219, + 7.5422134631934, 7.6425241342329, 7.6511201757027, 7.51152464839087, + 7.67693714581808, 7.9912539298402, 7.44190672805162, 7.38398945797851, + 7.60589000105312, 7.58680353516258, 7.62119516280984, 7.29573507274928, + 7.48885295573346, 7.27309259599952, 7.34665516317654, 7.47363710849621, + 7.35564110297425, 7.2283884515736, 7.39694860262101, 7.47533923656674, + 7.40974195408092, 7.34601020991329, 7.4079243225596, 7.38398945797851, + 7.38087903556412, 7.20637729147225, 7.09340462586877, 7.10987946307227, + 7.05531284333975, 7.11639414409346, 7.19218205871325, 7.24921505711439, + 7.41938058291869, 7.56216163122565, 7.43307534889858, 7.28550654852279, + 7.9355873855892, 9.01954299670119, 7.22548147278229, 7.02731451403978, + 6.7990558620588, 5.44673737166631, 5.32300997913841, 5.26269018890489, + 6.30627528694802, 6.65286302935335, 7.21964204013074, 7.38832785957711, + 7.13886699994552, 7.04315991598834, 7.20637729147225, 7.02997291170639, + 7.00760061395185, 6.91869521902047, 6.88448665204278, 6.13772705408623, + 7.20637729147225, 7.13727843726039, 7.05444965813294, 7.11232744471091, + 6.92657703322272, 6.81454289725996, 7.35500192110526, 7.13169851046691, + 7.07749805356923, 7.24208235925696, 7.24708058458576, 7.646353722446, + 7.45645455517621, 7.30988148582479, 7.23777819192344, 7.27517231945277, + 7.46908388492123, 7.45066079621154, 8.12740456269308, 7.77485576666552, + 7.52131798019924, 7.54960916515453, 7.94979721616185, 7.79770203551669, + 7.79975331828725, 7.9002660367677, 7.85825418218603, 7.94165125293056, + 7.67136092319064, 8.13534694890671, 8.68777949199177, 8.45318786144033, + 8.06463647577422, 8.00936307663004, 7.87739718635329, 7.85515700588134, + 8.14089846060785, 7.92117272158701, 7.9707403900071, 7.96519829061218, + 8.13476078241865, 7.79852305362521, 8.30770596654951, 8.28071107566285, + 8.74448811385292, 8.59137258959049, 8.44052810648075, 8.50976567558744, + 8.35514473946184, 8.28096440055337, 8.44052810648075, 8.31385226739821, + 8.08085641964099, 8.18590748148232, 8.85680335672838, 8.07309119969315, + 8.14148104145742, 8.18785544369562, 8.11522197256233, 8.15908865466791, + 8.20439841814938, 8.28500889544988, 8.08271113423758, 8.24564690087386, + 8.2220164372022, 8.45126704130007, 8.5519810169019, 8.62515033292133, + 9.13194630454817, 8.33997857199043, 9.86620096775011, 9.27077674078001, + 8.77183540978982, 8.49474306257865, 8.61631428228404, 8.94780609305705, + 9.07577987858049, 9.50046944807102, 11.4261031610143, 9.29550838434606, + 8.61721950548336, 8.47699600166482, 8.32772616646141, 8.30375241556341, + 9.330431852234, 9.41613428495528, 8.92292493064183, 8.44591198941127, + 8.31115254800169, 8.27052509505507, 8.20166019080868, 9.00981411052738, + 9.30909914399945, 9.12847934549586, 8.44741429680832, 8.25426877009018, + 8.32482129876878, 8.10288913464087, 9.15957325492253, 8.85109068766498, + 9.54057893384188, 8.49043845410742, 8.56464913257253, 8.352318548226, + 8.10440130792161, 9.15334665045606, 10.0752957033132, 8.71800933084636, + 8.34474275441755, 8.2630748358026, 8.25608813381491, 8.00869818298853, + 8.52971447196991, 8.861350110796, 9.78914235075127, 8.50025047068593, + 8.40559101483493, 8.9441588309704, 8.866581653304, 9.01456876745782, + 9.13010597926558, 10.2465097200211, 8.58969988220299, 8.65067458279072, + 8.78124833323686, 8.33302993974291, 9.06762406977459, 9.52332462729018, + 8.70996000607173, 8.37101068123816, 8.37770121259764, 8.40043463080604, + 8.18283871076603, 8.8750074860484, 9.21034037197618, 8.71456755083648, + 8.31752199628717, 8.55929436743487, 8.60465446718623, 8.73375513136489, + 9.54057893384188, 10.1616893196654, 8.8167050156216, 8.31409733540581, + 8.7106195279423, 8.74369111054302, 8.39231000926955, 9.23073106162392, + 10.2561143136283, 8.9138193508572, 8.65032450401942, 8.39004140575575, + 8.3091845276863, 8.22228507387272, 9.28238192484115, 9.92260366972836, + 9.16889318206201, 8.74830491237962, 8.81507308884446, 9.76330552193627, + 8.56883642456808, 8.92611897115338, 9.12891337328045, 9.7195647143752, + 8.78124833323686, 8.48838210956212, 8.53640741034004, 8.14409846333852, + 9.10664513563742, 9.11569996782206, 9.68421151274841, 8.80011394676631, + 8.54752839121231, 8.3221510702129, 8.09529377684465, 8.92345797969497, + 9.37974553683691, 8.90327158572421, 8.87556669199055, 8.44139147799996, + 8.59674347017425, 9.00969189848934, 9.39897529082673, 9.99392223000734, + 9.06149227523977, 8.97119446318447, 8.94689552388845, 9.18696938565294, + 9.0980671294934, 10.8781037947059, 9.38269576445829, 9.19897604189713, + 8.62119278143472, 8.61323037961318, 8.69517199877606, 8.72029728739272, + 9.50031980347665, 9.34757739028127, 8.78370269863522, 8.70217786562968, + 8.6821990260005, 8.48363640788739, 8.40916244720253, 8.97309789628247, + 9.55030649785165, 8.78630387828258, 8.60813018640834, 8.49494758246892, + 8.44870019497094, 8.19174002127746, 8.38091517312361, 9.07394774707063, + 8.35608503102148, 8.3485378253861, 8.53503310954457, 8.43489794868941, + 8.5354259596773, 8.99168672593482, 9.77713036365961, 8.63887970967284, + 8.28324144138542, 8.27333659850449, 8.15908865466791, 7.91352101728389, + 7.8407064517494, 8.02486215028641, 7.97143099776935, 8.47782846789396, + 7.95787735848981, 8.02355239240435, 7.54908271081229, 7.51969240411654, + 7.87169266432365, 7.68156036255954, 7.73236922228439, 7.78239033558746, + 7.65633716643018, 7.48324441607385, 7.59890045687141, 7.78613643778307, + 7.75061473277041, 7.76472054477148, 7.70481192293259, 7.6586995582683, + 7.34729970074316, 7.54433210805369, 7.74716496652033, 7.6889133368648, + 7.77064523412918, 7.61184239958042, 7.48773376143644, 7.55747290161475, + 7.56837926783652, 7.52563997504154, 7.66199755890189, 7.41637847919293, + 7.44366368311559, 7.31654817718298, 7.17472430983638, 7.24779258176785, + 7.41397029019044, 7.52940645783701, 7.63964228785801, 8.26975694753298, + 8.33134542484572, 7.78447323573647, 7.48099216286952, 7.58781721999343, + 7.67182679787878, 7.59739632021279, 7.67740043051481, 7.48436864328613, + 7.26122509197192, 7.39203156751459, 7.42833319419081, 7.55747290161475, + 7.48885295573346, 7.42714413340862, 8.21527695893663, 8.49371983523059, + 8.14322675036744, 8.12177741916107, 8.20794694104862, 8.5197898172635, + 8.57470709761684, 8.04782935745784, 7.48773376143644, 7.56631101477246, + 7.9976631270201, 8.00836557031292, 7.91498300584839, 7.8804263442924, + 7.84893372636407, 7.50823877467866, 7.66058546170326, 8.02747653086048, + 8.10046489102936, 8.18088094199639, 8.33351070898294, 8.64100247714252, + 8.46315930292375, 8.01201823915906, 7.79564653633459, 7.70571282389443, + 7.77863014732581, 7.81237820598861, 7.56164174558878, 7.26332961747684, + 7.35564110297425, 7.47477218239787, 7.53422832627409, 7.62997570702779, + 7.62608275807238, 7.44483327389219, 7.11963563801764, 7.37023064180708, + 7.54115245513631, 7.5137092478397, 7.59034694560257, 7.54802896993501, + 7.36833968631138, 7.11314210870709, 7.23705902612474, 7.48717369421374, + 7.61233683716775, 8.21716859576607, 7.66669020008009, 7.32646561384032, + 7.09340462586877, 7.13966033596492, 7.40367029001237, 7.42595365707754, + 7.43779512167193, 7.55328660560042, 7.32184971378836, 7.10332206252611, + 7.11069612297883, 7.48211892355212, 7.54591815120932, 7.32778053842163, + 7.21964204013074, 7.36327958696304, 7.18841273649695, 7.25063551189868, + 7.4500795698075, 7.19743535409659, 7.41938058291869, 7.37963215260955, + 7.40306109109009, 7.51588908521513, 7.63723438878947, 7.52617891334615, + 7.3185395485679, 7.38212436573751, 7.74975340627444, 7.67600993202889, + 7.26612877955645, 7.58324752430336, 7.56682847920833, 7.56008046502183, + 7.63288550539513, 7.50052948539529, 7.42356844425917, 7.39018142822643, + 7.21007962817079, 7.94555542825349, 7.5999019592085, 7.56268124672188, + 7.61184239958042, 8.99998964246073, 8.73793385811414, 8.26796230533871, + 7.77904864492556, 7.57865685059476, 7.60539236481493, 8.29179710504873, + 7.61775957660851, 7.35883089834235, 7.68662133494462, 7.75362354655975, + 7.77904864492556, 8.05706068196577, 7.8984110928116, 7.79729127354747, + 7.51534457118044, 7.48268182815465, 7.88683299895506, 8.39728289474368, + 8.26770566476243, 8.23615566168312, 8.38890517111471, 9.0788640091878, + 9.63299030483845, 8.94780609305705, 8.53934599605737, 8.3478273457825, + 8.32530602975258, 8.25556865328375, 8.09712193091871, 8.13593277200489, + 8.01895468315572, 8.0861025356691, 8.13329386122263, 8.04974629095219, + 8.19063168090354, 8.04334217044161, 8.43814998407578, 8.10741881171997, + 8.16876982367527, 8.17470288246946, 8.29129585190541, 8.3059782109673, + 8.42310226801664, 8.75621009188674, 8.72583205652757, 8.70748291785937, + 8.51077262361331, 8.70217786562968, 8.580543506917, 9.22542600939422, + 8.41116578677071, 8.45190772471761, 8.77183540978982, 8.23880116587155, + 8.15708378502887, 8.03915739047324, 8.1185050675871, 9.18563775933581, + 9.15239341202133, 9.02617712030286, 9.74226190403691, 10.0828463914793, + 9.11107237031751, 9.73878978049572, 9.614938437645, 9.34801317710126, + 8.55429627936774, 8.44955654270043, 8.43054538469057, 8.60538720215215, + 9.219894584781, 9.50076867009599, 9.52230033688749, 8.47886807709457, + 8.28349412616251, 8.26898820950666, 8.28324144138542, 9.03013657115323, + 10.2525586604481, 9.16659744902826, 8.27537637483641, 8.3466420902212, + 8.42156296040099, 8.19450550976564, 8.87766093359367, 8.9941724343984, + 9.55676293945056, 8.4144957931779, 8.31139827843664, 8.365672383775, + 8.14902386805177, 8.96826881077645, 8.88322423027899, 8.70450228972123, + 8.23297179059344, 8.17301131172497, 8.13446757027756, 8.83433697401764, + 9.08975340898706, 9.0107912695156, 8.71751837264977, 8.42200300441249, + 8.20712916807133, 8.05484022110102, 8.83156587912106, 10.1827467519768, + 8.80986280537906, 8.76013937002663, 8.88502565805085, 8.56159277871292, + 8.2495751500002, 9.35660287895444, 9.12750209366718, 8.79102985704596, + 8.65347080970879, 8.74337213127397, 8.86742743852498, 8.44009614103127, + 9.37568530456302, 9.74102744483773, 8.83622857152601, 8.46104603079324, + 8.21635833238616, 8.22844388300403, 8.0471895621705, 9.07234187381889, + 9.46761478200654, 8.98669669562029, 8.43923164994653, 8.42398080969406, + 8.58802437217683, 8.25400859056484, 8.74512525946224, 9.49514330367712, + 8.72469504674049, 8.35960327084147, 8.76374072050946, 8.7279402223939, + 8.38548870041881, 9.3130774494273, 9.3061958576197, 9.84675845829004, + 8.79679268767466, 8.64611397148308, 8.9398431242785, 8.84375938191798, + 9.7005142080113, 9.53914039514886, 8.9082888855571, 9.02183976410551, + 9.10963566785455, 8.87164566750187, 8.38228942895144, 9.23229753932823, + 9.85287823470959, 8.84707231256781, 8.53346016388011, 8.58802437217683, + 8.48549610467298, 8.18979961872823, 9.49687178267057, 9.46280968867222, + 8.84347078162738, 8.36310917603352, 8.60575336839572, 6.58617165485467, + 7.63578686139558, 9.24879155835043, 8.88072457615146, 8.69617584694468, + 8.45382731579442, 8.14467918344776, 9.07635173197287, 10.2446985435045, + 9.85828095969805, 9.18758338485357, 8.76248954737158, 8.5016733797582, + 8.65521448931361, 10.0388921895423, 9.46436224293533, 8.97309789628247, + 8.95557714628151, 8.91945316857545, 8.72631895096224, 8.73921611506174, + 10.26196586942, 10.5694947531438, 9.56120848888113, 9.60400276796519, + 10.0861007334703, 9.72841962445348, 9.41205597587677, 9.84357829978222, + 11.5721750241742, 10.2817184876905, 10.1697672187275, 9.68290322361684, + 9.89550578279447, 9.37627844951961, 9.58217975243469, 10.3414521187349, + 10.3339704236196, 10.2182252970113, 9.73406247747719, 10.1874627630566, + 9.88857693980037, 11.075086947327, 12.6735418157462, 10.9246967023573, + 10.1815358690196, 9.86339445896968, 9.92573816147095, 9.40153907670774, + 9.33441468707811, 9.14750706280461, 8.91395385889425, 9.1801903950253, + 9.05718919248201, 8.71275997496021, 8.40312823512826, 8.29479935899257, + 9.11591979635669, 8.95156964301882, 8.3513747067213, 8.65381978894806, + 8.6429443967218, 8.71620797115185, 8.36497397843873, 8.37378460812088, + 8.51719319141624, 8.31825432879885, 8.39547743273214, 8.3228800217699, + 8.24564690087386, 8.63194942871443, 8.31066090590723, 8.43294163896865, + 11.6448305358502, 11.3632879189498, 10.6929444132335, 10.3343929611261, + 9.98608085083998, 10.2820952064744, 10.1943645158844, 10.0954706196007, + 10.1468650106811, 10.140888975597, 10.2095373998461, 10.033682134194, + 11.0828346170357, 11.1744832892926, 10.7792895676801, 9.9475044379529, + 9.37602428761711, 8.99776577201121, 8.83287946027762, 8.89822898560123, + 8.76467807411661, 8.54110501146255, 8.39615486303918, 8.31238059678675, + 8.34117174717076, 8.1300590399928, 8.35819745992578, 8.35561499576018, + 8.18172045512811, 8.10952565975287, 8.06463647577422, 7.82324569068552, + 7.85476918349913, 8.10167774745457, 8.09040229659332, 7.98989937494294, + 8.09894674894334, 8.65381978894806, 8.04109100370863, 8.04974629095219, + 8.22147894726719, 8.17075142375753, 8.3354314778808, 8.25660734462616, + 8.05769419481559, 7.70796153183549, 7.91717198884578, 8.2602342916073, + 8.28803156777646, 8.36869318309779, 8.63355299253243, 9.27246974344173, + 8.67556352738768, 8.48342956126343, 8.17188200612782, 8.20658361432075, + 8.18896686364888, 8.03073492409854, 8.05484022110102, 9.15514473650823, + 8.83331693749932, 8.34972083747249, 8.18339736999843, 7.95647679803678, + 7.86940171257709, 7.70930833338587, 7.81923445385907, 7.83241092718792, + 7.88683299895506, 8.03786623470962, 7.952615111651, 7.76768727718691, + 7.47816969415979, 7.539027055824, 7.99799931797973, 8.30967689598773, + 8.02878116248715, 7.79028238070348, 7.76174498465891, 7.47647238116391, + 7.63964228785801, 7.65586401761606, 7.81963630236759, 7.81359155295243, + 7.99057688174392, 7.81278281857758, 7.65775527113487, 7.69439280262942, + 7.84149292446001, 7.93343838762749, 7.6511201757027, 7.72356247227797, + 7.88004820097158, 7.94093976232779, 7.75876054415766, 7.63336964967958, + 7.84854348245668, 7.89729647259588, 7.72223474470961, 7.71244383427499, + 7.53955882930103, 7.91169052070834, 7.80139132029149, 8.4013333053217, + 8.18144069571937, 7.86288203464149, 7.92407232492342, 7.56682847920833, + 7.51914995766982, 7.64873978895624, 7.77064523412918, 7.60986220091355, + 7.59186171488993, 7.539027055824, 7.34536484041687, 7.46336304552002, + 7.51479976048867, 7.6425241342329, 7.67600993202889, 7.55799495853081, + 7.6889133368648, 7.60638738977265, 7.58222919427646, 7.74196789982069, + 7.78239033558746, 8.00636756765025, 8.65102453904976, 8.40357646462927, + 8.3850322878139, 8.02812905943176, 7.95787735848981, 7.99530662029082, + 7.99226864327075, 7.9359451033537, 7.98786409608569, 7.78364059622125, + 7.8087293067444, 8.0532511535491, 7.97590836016554, 8.12237124340655, + 8.55986946569667, 8.9274468162562, 8.28576542051433, 8.28399930424853, + 8.16337131645991, 7.91425227874244, 7.86441990499457, 8.07215530818825, + 8.0802374162167, 8.12088602109284, 8.11312710422178, 8.14438886554762, + 8.06463647577422, 7.944846711002, 8.24143968982973, 9.00736702745136, + 8.66233195708248, 8.80056599227992, 8.3742461820963, 8.56407677731509, + 8.38434727808281, 8.12651816878071, 8.39072252736229, 8.3351915834332, + 8.9278448262117, 9.0079793598445, 8.37816098272068, 8.20330402679528, + 8.38571682862785, 8.31115254800169, 8.74145611599836, 9.44295889365291, + 9.14590851181679, 8.58951385299586, 8.46484671104403, 8.36590507720246, + 8.56541176368671, 8.4724050086261, 8.96648377906443, 8.56006109164341, + 8.4690528160883, 8.74385056203024, 10.0138206842205, 8.69114649853968, + 8.78094111357239, 9.83900236330972, 11.614940390377, 9.62865589206317, + 8.78293635634926, 8.68118104152169, 9.00097644407034, 8.74623928838306, + 9.8072519446553, 9.61266722758384, 10.5920994642943, 8.75542238014849, + 8.56063574925907, 9.40516674990861, 8.45807992692373, 9.54959444997195, + 9.60602446822924, 8.67726913926287, 8.17103418920548, 8.24143968982973, + 8.51097389160232, 8.32360844234357, 9.25922576970599, 9.84966474583862, + 8.83317113302287, 8.49780647761605, 8.63408694288774, 9.04227668692893, + 8.55004752828718, 9.81809304951918, 9.9020865716205, 8.91637191488169, + 8.33206770728955, 8.23668532271246, 8.40178233990491, 8.24170315972982, + 9.03562977818356, 9.10409057213347, 10.8321415433937, 8.7787879291047, + 8.48011418317482, 8.48941081040379, 8.25062008217469, 9.54344981789221, + 9.09717167387054, 8.66939912430557, 8.34924780056679, 8.34069464792507, + 8.49474306257865, 8.53326337159373, 9.21979553074694, 10.4442990717924, + 8.87696334026227, 8.68185981297147, 8.49821422481843, 8.56845648535378, + 8.45871626165726, 9.71818154670121, 9.68700923909068, 8.83010431791379, + 8.38799525294456, 8.4984180360899, 8.84721610435754, 8.28096440055337, + 9.26492324974647, 9.11173476822206, 8.70682132339263, 8.33182700443606, + 8.36660283278374, 8.27690348126706, 8.12946976478423, 9.17915925449261, + 9.68558026801716, 8.65521448931361, 8.29454951514368, 8.6522484224091, + 8.92970011431345, 8.3959291039232, 9.46753746341524, 9.88979422540413, + 8.84922702143852, 8.61431990214696, 8.48156601377309, 8.74909824839902, + 8.65364531455174, 9.3482745580655, 9.67683786189263, 9.64290170574605, + 8.72891172506098, 8.77894188184151, 9.96057651952026, 8.73777346032728, + 9.25263328416643, 9.26624800391448, 9.42730487221368, 8.79300509129753, + 8.70300863746445, 8.43944784279138, 8.29104513108173, 9.31325790598287, + 9.34792603492875, 8.791486026749, 8.51899157335762, 8.41294317004244, + 8.29679586577005, 8.21256839823415, 9.25655579577315, 9.65226597708712, + 8.63746202380718, 8.60776488960062, 8.96533457380484, 8.68372406230387, + 8.53267276226462, 9.49016666846238, 10.142858720955, 9.11162439903702, + 9.08500388066489, 9.05508908670489, 9.33626792857397, 9.23960786965675, + 10.1327324527083, 9.49122438992696, 9.1122864315008, 9.06357899058078, + 8.97297111339799, 9.14548179962769, 10.5418617072488, 11.5075208865114, + 10.1931676276506, 9.27995971385624, 8.84635304331433, 8.73262709966039, + 8.65504025810836, 8.45446636150793, 8.96367227561502, 10.0210927946104, + 9.00565049932022, 8.86092472971904, 8.58522560180806, 8.536211197252, + 8.45850419506756, 8.53444354482276, 10.1042218823372, 8.65067458279072, + 8.51218064959269, 8.48549610467298, 8.57791192645094, 8.54985397365579, + 9.60622641363735, 10.0261917925116, 8.87024156729927, 8.52793528794814, + 8.38343320123671, 8.20083725837985, 8.09285102753838, 8.03883475778775, + 8.08641027532378, 8.03657340970731, 7.97522083865341, 7.84267147497946, + 7.8935720735049, 7.81762544305337, 7.82284529027977, 7.9672801789422, + 8.00670084544037, 7.91132401896335, 7.85166117788927, 7.87207397986687, + 7.75362354655975, 7.68294316987829, 7.84384863815247, 8.19146305132693, + 7.97831096986772, 7.92334821193015, 7.87131120332341, 7.74370325817375, + 7.77863014732581, 7.83518375526675, 7.83834331555712, 7.84619881549743, + 7.92044650514261, 7.75790620835175, 7.58629630715272, 7.51479976048867, + 7.75790620835175, 7.80343505695217, 8.07899825868515, 8.38068594676157, + 8.0643219609108, 7.85282781228174, 7.90396563403217, 7.84463264446468, + 7.88945914940452, 8.22550309756692, 8.54071438645758, 8.01928379291679, + 7.83122021460429, 8.43315919580623, 8.09620827165004, 7.86633892304654, + 7.77904864492556, 7.77359446736019, 7.77275271646874, 7.76811037852599, + 7.48099216286952, 7.74370325817375, 7.5963923040642, 7.68063742756094, + 7.53849499941346, 7.4500795698075, 7.44307837434852, 7.54855597916987, + 7.64060382639363, 7.67647364638916, 7.56734567601324, 8.07682603129881, + 7.70120018085745, 7.36833968631138, 7.3664451483276, 7.48661331313996, + 7.5740450053722, 7.568895663407, 7.63964228785801, 7.85321638815607, + 7.31188616407716, 7.53636393840451, 7.68248244653451, 7.73193072194849, + 8.01201823915906, 7.98036576511125, 8.17131687471973, 7.97796809312855, + 7.79482315217939, 8.30424746507847, 8.05642676752298, 7.77779262633883, + 8.22897764335831, 7.900636613018, 7.46164039220858, 7.54908271081229, + 7.81681996576455, 7.72223474470961, 7.71556953452021, 7.72621265050753, + 7.58171964012531, 7.26542972325395, 7.30114780585603, 7.47420480649612, + 7.58882987830781, 7.61085279039525, 7.64778604544093, 7.60190195987517, + 7.25417784645652, 7.1800698743028, 7.37713371283395, 7.57507169950756, + 7.50714107972761, 7.58578882173203, 7.40731771046942, 7.03085747611612, + 7.15070145759253, 7.25417784645652, 7.45066079621154, 7.55118686729615, + 7.61332497954064, 7.42714413340862, 7.350516171834, 7.28824440102012, + 7.434847875212, 7.53743003658651, 7.35244110024358, 7.28207365809346, + 7.3031700512368, 7.29369772060144, 7.22983877815125, 7.57507169950756, + 7.97418866928601, 7.61579107203583, 7.47420480649612, 7.33432935030054, + 7.31920245876785, 7.40488757561612, 7.42476176182321, 7.47022413589997, + 7.36770857237437, 7.2841348061952, 7.32580750259577, 7.29097477814298, + 7.19142933003638, 7.28961052145117, 7.33236920592906, 7.39572160860205, + 7.56734567601324, 7.62119516280984, 7.26892012819372, 7.26961674960817, + 7.30787278076371, 7.28138566357028, 7.32118855673948, 7.51207124583547, + 7.50052948539529, 7.11314210870709, 7.1420365747068, 7.32383056620232, + 7.42892719480227, 7.52886925664225, 7.41997992366183, 7.4730690880322, + 7.3375877435386, 7.35436233042148, 7.58273848891441, 7.62608275807238, + 7.7596141506969, 7.94058382710424, 7.59085212368858, 7.41818082272679, + 7.41155628781116, 7.59789795052178, 6.63594655568665, 7.64730883235624, + 7.82763954636642, 7.63385355968177, 8.53030683056162, 8.52951694110507, + 7.85127199710988, 7.79564653633459, 7.58222919427646, 7.43897159239586, + 7.63867982387611, 7.52725591937378, 7.72488843932307, 7.91352101728389, + 8.65956043270316, 8.29579811063615, 8.13241267450091, 7.92551897978693, + 7.82843635915759, 7.84424071814181, 7.77695440332244, 7.76684053708551, + 7.78986855905471, 7.69393732550927, 7.71556953452021, 8.15277405274407, + 8.2529671950008, 7.94129557090653, 7.80954132465341, 7.81923445385907, + 7.81237820598861, 7.54538974961182, 8.47428569040496, 7.79193595693806, + 7.66809370908241, 7.80547462527086, 7.9672801789422, 7.99429498641598, + 7.80954132465341, 8.70317470904168, 7.9672801789422, 8.09620827165004, + 8.03786623470962, 8.58016799057763, 10.8718582692757, 9.19248185367487, + 9.15069651904867, 9.82319898130729, 8.76888532613486, 8.50855599802057, + 8.72972059026726, 8.92145757894788, 8.52991196382401, 10.4159817834027, + 10.3369892693381, 9.14644164612595, 8.50875771259514, 8.38617292897783, + 8.36100710822691, 8.12976444579417, 8.73198193834769, 8.73584667745758, + 10.8196982812101, 10.6590929669357, 9.84945366404364, 8.88820487145502, + 8.92771217382708, 9.66738540005753, 10.1635029066262, 9.3379417165699, + 9.17719715338293, 8.87905466204227, 8.57866451350434, 8.73004395324502, + 9.9533247873833, 10.2387447656008, 9.20311432688444, 8.74719318352693, + 8.77554943448619, 9.2098402469345, 8.52813313145457, 9.05765528431053, + 9.42294862137501, 9.02917814290207, 9.09773142759353, 9.44809663565824, + 9.11250701162742, 8.80267284031282, 9.20843856468659, 11.0470891404358, + 9.32758993202642, 8.67880170661265, 8.57659353469768, 8.43598313599069, + 8.19007704971905, 9.06044728240157, 9.27030595314362, 8.5016733797582, + 8.18729927015515, 8.0959035329611, 8.04334217044161, 7.952615111651, + 8.39908510293591, 8.79102985704596, 8.3030093814735, 8.11910083763749, + 8.23031079913502, 8.15765701519647, 7.82923253754359, 8.57395152523485, + 9.61132880805727, 8.92385758009988, 8.3654396361887, 8.31188955823036, + 8.63141433550626, 8.45382731579442, 8.90585118120802, 10.8674821444793, + 9.15514473650823, 8.43944784279138, 8.44354665124794, 8.57262789830434, + 8.372398606513, 8.73600738456922, 10.3885029394023, 8.70880479511728, + 8.19533366716287, 8.22147894726719, 8.27512163021651, 8.16990264735914, + 8.82232217747174, 9.80543361206074, 9.38907215991958, 8.98130449495713, + 8.57922858233569, 8.48776438072542, 8.72192834304709, 8.9182485910357, + 9.65162297294974, 8.86474666090541, 8.50936261230105, 8.63177109612367, + 9.20271134481169, 8.90381521172292, 9.02653771890043, 9.23766366762507, + 8.89508153175417, 8.6429443967218, 8.12976444579417, 8.29179710504873, + 8.09803475617607, 9.51878049751247, 9.90468683311161, 8.93734984826739, + 8.57885257180297, 8.71588010229646, 8.48899945704546, 8.50572771330696, + 9.30008966411979, 10.1461591836579, 9.17709377818255, 8.83564692253477, + 8.83287946027762, 8.92305821954573, 8.89329814421792, 8.60263667323371, + 8.99143781491923, 8.80687326653069, 8.85409390765552, 8.93102321585603, + 8.85280791762332, 10.6933076203563, 11.3075604350077, 9.83745458193169, + 9.60508151672137, 9.74537068443899, 9.67564548044036, 9.43468320386588, + 11.5036223246441, 11.9767789709185, 10.5425744562461, 10.004282662571, + 9.73281784848262, 9.86646043169905, 9.37092743662413, 9.490544554572, + 10.139152384404, 9.99984264077889, 10.0327159505439, 10.3803736928726, + 10.453053004618, 10.2401383446439, 11.7605196483804, 12.846746888829, + 10.7668837086558, 9.84522264440415, 9.29035230994557, 9.10331179921766, + 8.79573360595074, 8.62335338724463, 8.41825644355621, 8.31090675716845, + 8.23615566168312, 8.13123654969612, 7.92768504561578, 7.7591874385078, + 7.72665366484764, 7.83518375526675, 7.88419993367604, 7.91461770904068, + 7.92551897978693, 7.75319426988434, 7.50878717063428, 7.55747290161475, + 7.80261806344267, 7.68386398025643, 7.9844627322622, 7.85166117788927, + 7.68478394352278, 7.3375877435386, 7.40367029001237, 7.86787149039632, + 7.8984110928116, 7.58426481838906, 7.71423114484909, 7.88945914940452, + 7.32580750259577, 7.48885295573346, 7.55381085200823, 7.66996199547358, + 7.98820359702258, 8.00436556497957, 7.6511201757027, 7.48661331313996, + 7.44949800538285, 7.59538727885397, 7.60986220091355, 7.54802896993501, + 7.61775957660851, 7.59538727885397, 7.34665516317654, 7.40123126441302, + 8.09315669772264, 7.92371033396924, 7.69074316354187, 8.43901541035221, + 7.78239033558746, 7.30854279753919, 7.26192709270275, 7.43720636687129, + 7.54009032014532, 7.58528107863913, 7.60887062919126, 7.46450983463653, + 7.15695636461564, 7.48773376143644, 7.4489161025442, 7.47022413589997, + 7.43602781635185, 7.52185925220163, 7.41034709782102, 7.15617663748062, + 7.13807303404435, 7.36264527041782, 7.51697722460432, 7.61726781362835, + 7.49554194388426, 7.39203156751459, 7.17472430983638, 8.09132127353041, + 7.51534457118044, 7.8458075026378, 7.69120009752286, 7.83478810738819, + 7.67740043051481, 7.24850407237061, 7.40245152081824, 7.69439280262942, + 7.82604401351897, 7.61184239958042, 7.5137092478397, 7.67600993202889, + 7.24064969425547, 7.65539064482615, 8.13944052187461, 8.37493814383537, + 7.90174751852014, 8.02387999273488, 8.75020786252571, 8.081784206935, + 7.70436116791031, 7.86825426552061, 7.81963630236759, 7.76089319585102, + 7.66715825531915, 7.63433723562832, 7.35115822643069, 7.58933582317062, + 7.91022370709734, 7.85476918349913, 7.64683139143048, 7.49164547360513, + 7.5234813125735, 7.0352685992811, 7.06561336359772, 7.22983877815125, + 7.50823877467866, 8.31164394850298, 8.01400499477946, 7.49720722320332, + 7.83161727635261, 7.15148546390474, 7.41095187558364, 7.63094658089046, + 7.4759059693674, 7.58832367733522, 7.24636808010246, 7.10332206252611, + 7.10414409298753, 7.1929342212158, 7.40123126441302, 7.43955930913332, + 7.70796153183549, 7.350516171834, 7.32251043399739, 7.28550654852279, + 7.36770857237437, 7.26752542782817, 7.22475340576797, 7.22256601882217, + 7.35179986905778, 6.97541392745595, 7.04315991598834, 7.48099216286952, + 7.20340552108309, 7.22402480828583, 7.11314210870709, 7.07918439460967, + 6.88550967003482, 6.87419849545329, 7.72312009226633, 7.49665243816828, + 7.22402480828583, 7.27239839257005, 7.07918439460967, 6.85435450225502, + 6.93049476595163, 7.15617663748062, 7.31455283232408, 7.22693601849329, + 7.65681009148038, 7.54009032014532, 7.21007962817079, 7.24992553671799, + 7.29437729928882, 7.51914995766982, 7.42237370098682, 8.22362717580548, + 7.49276030092238, 7.22475340576797, 7.25629723969068, 7.4489161025442, + 7.65539064482615, 7.67136092319064, 7.92407232492342, 7.80098207125774, + 7.45645455517621, 7.36264527041782, 8.21311069759668, 8.23642052726539, + 7.92153563213355, 7.74500280351584, 7.57814547241947, 7.56682847920833, + 7.65822752616135, 8.27078101316267, 7.80302664363222, 7.6226639513236, + 7.70029520342012, 8.05864371221562, 7.64108424917491, 7.83636976054512, + 8.37355374121463, 8.60940767540405, 8.17723488551019, 8.03689677268507, + 7.95331834656043, 7.7848892956551, 8.07371464110986, 8.28045768658256, + 8.19918935907807, 8.00034949532468, 7.88720858581393, 7.83715965000168, + 7.97968130238774, 8.51839247199172, 8.35631996582815, 7.93236215433975, + 7.83676478326407, 8.53719187792293, 8.02649693894541, 7.9728107841214, + 8.37447688921464, 8.25322764558177, 8.44591198941127, 8.49269555981584, + 8.83913175254611, 8.07589363029886, 8.75020786252571, 10.702412661625, + 10.0599783492956, 8.79315687091382, 8.71440336070394, 9.05625635659347, + 8.62155320674048, 9.96142621745657, 9.70856696016566, 9.19644426678407, + 8.61431990214696, 8.88903257187474, 9.01627006814768, 8.19918935907807, + 9.16219999664825, 9.60750445504496, 8.44290058683438, 8.15737044118677, + 8.18451375303372, 8.83898679349679, 8.21283958467648, 8.33615081612066, + 8.59044365315583, 8.70134640303916, 8.26642147298455, 8.27461194620955, + 8.36637030168165, 8.03527891114467, 9.23151460720759, 9.96467672084855, + 8.84548923675327, 8.67299964255444, 8.40065937516029, 8.58035576637388, + 8.02059914989697, 9.1075321519945, 9.43835205468725, 8.50126704086598, + 8.3133619511344, 8.3255483071614, 8.47637119689598, 8.20111164444276, + 8.70051424854327, 11.2744652095441, 9.60757167515724, 8.87863674743007, + 8.76592651372944, 9.85639594500228, 8.43424627059531, 8.8034242116007, + 9.38176948760371, 8.76029622047005, 8.55506684384432, 8.46884293047519, + 8.53129331579502, 8.04558828080353, 9.0902045707362, 9.45414892373398, + 9.0590522577624, 8.25945819533241, 8.18952211074809, 8.19533366716287, + 7.69393732550927, 8.29004161870449, 9.03288694657909, 8.38274709486331, + 8.21797820315073, 8.12474302038557, 8.04686951095958, 7.57301725605255, + 8.3986348552921, 8.71144331907547, 8.25114213909075, 7.99226864327075, + 8.00536706731666, 8.08085641964099, 7.52833176670725, 8.20248244657654, + 9.07440609473535, 8.2147358333823, 7.96797317966293, 8.12829017160705, + 7.9536697786498, 7.66669020008009, 7.96554557312999, 9.14216859187285, + 8.28702502516506, 8.28324144138542, 8.30102525383845, 8.38799525294456, + 7.70975686445416, 8.11102783819368, 8.74560285240295, 8.39140318535794, + 8.11969625295725, 8.2358907259285, 8.10681603894705, 7.71199650704767, + 8.4252971767117, 8.84937050375457, 8.49310539588715, 8.17413934342947, + 8.10228362448007, 7.8336002236611, 7.52294091807237, 7.91022370709734, + 8.3654396361887, 9.06056344665796, 8.17919979842309, 8.01631789850341, + 8.10319175228579, 7.81439963380449, 8.38799525294456, 8.74814616962193, + 8.31287139434261, 7.92334821193015, 7.84658997529119, 8.3020178097512, + 8.43620003220671, 8.93458687038968, 8.88861880730088, 8.66423293406555, + 8.50004703258127, 8.41825644355621, 8.4721958254855, 8.30721262662831, + 9.88659568486591, 10.694985739443, 9.76019438270965, 9.11007795003779, + 8.79951090136887, 8.7830896717961, 8.42989086301344, 8.87877607170755, + 9.75938620856187, 8.9520876435484, 8.66112036022288, 8.58485183989005, + 8.39660622842712, 7.92371033396924, 8.08548677210285, 8.35890061242164, + 8.30350479887278, 8.27792025817214, 8.36357570275064, 8.59822003005861, + 8.08116577772543, 9.03443816698441, 10.2832245120716, 9.27322127001538, + 8.71407489954152, 8.23350314023399, 7.88419993367604, 7.81278281857758, + 7.93128476152589, 8.4144957931779, 8.15651022607997, 7.85709386490249, + 7.9098566672694, 7.80913539812054, 7.5076900778199, 8.20385137218388, + 7.82164312623998, 7.80384330353877, 7.76089319585102, 7.70345904786717, + 8.06117135969092, 7.350516171834, 7.48380668766583, 7.54062152865715, + 7.69666708152646, 7.50384074669895, 7.39817409297047, 7.04228617193974, + 7.05272104923232, 7.36264527041782, 7.6231530684769, 7.79523492900217, + 8.42683075133585, 7.9168074909376, 7.23633934275434, 7.20637729147225, + 7.55642796944025, 7.58273848891441, 7.68294316987829, 7.60688453121963, + 7.70345904786717, 7.15148546390474, 7.04053639021596, 7.33888813383888, + 7.48436864328613, 7.35179986905778, 7.42356844425917, 7.29165620917446, + 6.81673588059497, 6.91075078796194, 7.32118855673948, 7.99159228206809, + 7.71289096149013, 7.28276117960559, 7.30586003268401, 6.90575327631146, + 7.87321705486274, 7.08590146436561, 7.27100853828099, 7.21376830811864, + 7.16626597413364, 7.21303165983487, 6.82979373751242, 6.80128303447162, + 7.15773548424991, 7.04577657687951, 7.09174211509515, 7.23417717974985, + 7.28000825288419, 6.69703424766648, 7.028201432058, 7.17472430983638, + 7.22329567956231, 7.33693691370762, 7.36201055125973, 7.26332961747684, + 6.81124437860129, 7.3185395485679, 7.64012317269536, 7.40549566319947, + 7.57250298502038, 7.48549160803075, 7.33302301438648, 7.20563517641036, + 7.09090982207998, 7.32646561384032, 7.35564110297425, 7.46336304552002, + 7.56734567601324, 7.74975340627444, 7.14440718032114, 6.89972310728487, + 7.33106030521863, 7.2211050981825, 7.7376162828579, 7.36327958696304, + 7.29097477814298, 7.03878354138854, 6.93244789157251, 7.30586003268401, + 7.68616230349291, 7.47929963778283, 7.26961674960817, 7.30921236569276, + 6.74051935960622, 6.80572255341699, 7.14282740116162, 7.18690102041163, + 7.14045304310116, 8.76155013912964, 8.27944348771267, 7.43720636687129, + 7.16006920759613, 7.04141166379481, 7.17472430983638, 7.41276401742656, + 7.25629723969068, 7.2848209125686, 6.72623340235875, 6.93244789157251, + 7.07411681619736, 7.20266119652324, 7.16472037877186, 7.06731984865348, + 6.90675477864855, 6.67708346124714, 6.51767127291227, 7.04315991598834, + 7.04315991598834, 6.9177056098353, 7.05789793741186, 6.85540879860993, + 6.64378973314767, 6.52502965784346, 6.89060912014717, 6.92657703322272, + 7.00488198971286, 6.87316383421252, 6.89060912014717, 6.4425401664682, + 6.8351845861473, 7.27239839257005, 7.07749805356923, 7.34407285057307, + 7.29165620917446, 7.27170370688737, 7.454719949364, 6.69208374250663, + 6.96318998587024, 7.01660968389422, 6.79122146272619, 6.82001636467413, + 6.61873898351722, 6.47389069635227, 6.49978704065585, 6.8596149036542, + 6.88141130364254, 6.99759598298193, 7.15226885603254, 7.19668657083435, + 6.70808408385307, 6.98286275146894, 7.12849594568004, 7.08924315502751, + 7.19893124068817, 8.090708716084, 7.39387829010776, 7.05012252026906, + 7.19518732017871, 7.44132038971762, 7.41758040241454, 7.47420480649612, + 7.39264752072162, 7.18538701558042, 6.86484777797086, 6.83410873881384, + 7.28756064030972, 7.22402480828583, 7.24422751560335, 7.30653139893951, + 7.31721240835984, 6.95844839329766, 6.82546003625531, 7.18159194461187, + 7.27655640271871, 7.27100853828099, 7.82444593087762, 7.41938058291869, + 7.00760061395185, 7.07326971745971, 7.26542972325395, 7.60240133566582, + 7.55747290161475, 7.58222919427646, 7.28961052145117, 7.3304052118444, + 7.2211050981825, 7.4312996751559, 7.75018416225784, 7.62997570702779, + 7.73061406606374, 7.82404601085629, 7.22620901010067, 7.4770384723197, + 7.86326672400957, 7.94909149983052, 7.7698009960039, 7.57967882309046, + 7.54908271081229, 7.29165620917446, 7.78986855905471, 7.65681009148038, + 7.53476265703754, 7.66528471847135, 8.06652149046999, 8.14931284363534, + 7.72533003791713, 7.71735127218533, 7.67786350067821, 7.89506349809157, + 8.07992777075827, 8.1934002319521, 8.66509582133973, 7.84463264446468, + 8.77909581088053, 9.05870319731322, 8.42178300661158, 8.07215530818825, + 8.40469616018909, 9.72184576464693, 8.11402544235676, 8.43076346341785, + 8.54888563814873, 8.3228800217699, 8.00836557031292, 8.11999382772511, + 8.58260632996447, 7.60986220091355, 8.41205487329293, 9.5410100922274, + 8.55948610360649, 8.14438886554762, 7.9912539298402, 7.88532923927319, + 7.4599147662411, 8.37516869138682, 8.7268056084461, 8.07527154629746, + 7.80057265467065, 7.74975340627444, 7.91971976092457, 7.35627987655075, + 8.17301131172497, 8.26100978602383, 7.84658997529119, 7.74022952476318, + 7.83042561782033, 7.36137542897735, 8.2987883944492, 8.7417757069247, + 8.39705739017626, 7.77821147451249, 7.93379687481541, 7.86018505747217, + 7.94236223767433, 8.19808924895612, 8.42901750051251, 8.05674377497531, + 7.81116338502528, 7.78655180642871, 8.1086232683546, 7.62119516280984, + 8.09285102753838, 9.39224517527379, 8.45318786144033, 8.09437844497296, + 7.9912539298402, 8.32820949174873, 7.64108424917491, 8.48632152774915, + 9.16356318041725, 8.18841130807903, 7.82644313545601, 7.96067260838812, + 7.67229245562876, 7.16317239084664, 7.90211754627645, 9.63430006272051, + 8.84822206837138, 8.38320455141292, 8.16451026874704, 8.05293303679757, + 7.56112158953024, 8.25634777291802, 8.67282848294769, 8.30647216010058, + 8.05896001776942, 7.87245515006398, 8.19533366716287, 7.59135704669855, + 8.02158453345511, 12.1496715918794, 11.5230440984914, 8.71177264560569, + 8.05610965954506, 8.08147504013705, 7.45876269238096, 8.01400499477946, + 8.49678638163858, 7.98104975966596, 7.77779262633883, 8.2602342916073, + 7.86633892304654, 7.31055015853442, 7.71824095195932, 8.31947369244219, + 8.23668532271246, 7.80751004221619, 7.59186171488993, 7.52886925664225, + 7.17165682276851, 7.89133075766189, 8.36007143564403, 8.11042723757502, + 7.77527584648686, 7.34729970074316, 7.30182234213793, 7.12044437239249, + 8.87877607170755, 9.25061821847475, 9.24792513230345, 8.39140318535794, + 8.00469951054955, 7.58933582317062, 7.82524529143177, 8.24931374626064, + 9.29514097366865, 8.56826646160024, 8.35255436947459, 8.29579811063615, + 8.29029259122431, 7.78572089653462, 8.28172399041139, 8.4707303170059, + 8.13505390861157, 8.06714903991011, 8.02355239240435, 8.02191277898571, + 7.81722278550817, 9.27387839278017, 10.3337753460756, 9.12587121534973, + 8.89137400948464, + ], +}; + +class MSTLWorker { + constructor() { + this.worker = new Worker("./mstl.worker.js", { + type: "module", + }); + } + + static create = () => { + return new Promise((resolve, reject) => { + const worker = new MSTLWorker(); + worker.worker.onmessage = (e) => { + if (e.data === "ready") { + resolve(worker); + } else { + reject(); + } + } + }) + } + + fitPredict = async (data, opts) => { + return new Promise((resolve, reject) => { + const start = performance.now(); + this.worker.postMessage({ data, opts }); + this.worker.onmessage = (e) => { + const elapsed = (performance.now() - start).toFixed(0); + resolve({ predictions: e.data, elapsed }); + } + }) + } +} + +async function main() { + const uPlotOpts = { + series: [ + {}, + { + label: "y", + stroke: "red", + width: 1, + }, + ], + plugins: [legendAsTooltipPlugin()], + }; + + let data = [df.ds, df.y]; + const u = new uPlot( + { ...uPlotOpts, ...getSize() }, + data, + document.getElementById("mstl-plot"), + ); + window.addEventListener("resize", () => { + u.setSize(getSize()); + }); + + const worker = await MSTLWorker.create(); + + let start; + + async function runMSTL(opts) { + const { predictions, elapsed } = await worker.fitPredict(df, opts); + if (data.length > 2) { + data = data.slice(0, 2); + } + data.push(predictions.point) + if (predictions.intervals) { + data.push(predictions.intervals.lower, predictions.intervals.upper); + } + if (u.series.length === 2) { + const newSeries = [ + { + label: "yhat", + stroke: "green", + width: 1, + }, + { + label: "lower", + stroke: "blue", + width: 0, + }, + { + label: "upper", + stroke: "blue", + width: 0, + }, + ]; + + const band = { + series: [3, 4], + fill: "rgba(0, 0, 255, .2)", + dir: 1, + }; + + newSeries.forEach((s, i) => u.addSeries(s, i + 2)); + u.addBand(band); + } + u.setData(data); + document.getElementById("mstl-title").innerText = + `Forecasting with MSTL - done in ${elapsed}ms`; + } + runMSTL(undefined); + document.getElementById("mstl-interval-width").addEventListener("change", function() { + const intervalWidth = parseFloat(this.value); + runMSTL({ intervalWidth }); + }) +} + + +export default main; diff --git a/demo/mstl.worker.js b/demo/mstl.worker.js new file mode 100644 index 0000000..764e2a6 --- /dev/null +++ b/demo/mstl.worker.js @@ -0,0 +1,17 @@ +import initMstl, { MSTL } from "./dist/@bsull/augurs/mstl.js"; +import initSeasonality, { + seasonalities, +} from "./dist/@bsull/augurs/seasons.js"; + +await Promise.all([initMstl(), initSeasonality()]); + +self.onmessage = (e) => { + const { data, opts } = e.data; + const { ds, y } = data; + const seasons = seasonalities(ds); + const mstl = MSTL.ets(seasons); + mstl.fit(y); + const predictions = mstl.predictInSample(opts?.intervalWidth ?? 0.8); + self.postMessage(predictions); +}; +self.postMessage("ready"); diff --git a/demo/outlier.data.json b/demo/outlier.data.json new file mode 100644 index 0000000..abaeeea --- /dev/null +++ b/demo/outlier.data.json @@ -0,0 +1 @@ +{"data": [[1731057600, 1731057900, 1731058200, 1731058500, 1731058800, 1731059100, 1731059400, 1731059700, 1731060000, 1731060300, 1731060600, 1731060900, 1731061200, 1731061500, 1731061800, 1731062100, 1731062400, 1731062700, 1731063000, 1731063300, 1731063600, 1731063900, 1731064200, 1731064500, 1731064800, 1731065100, 1731065400, 1731065700, 1731066000, 1731066300, 1731066600, 1731066900, 1731067200, 1731067500, 1731067800, 1731068100, 1731068400, 1731068700, 1731069000, 1731069300, 1731069600, 1731069900, 1731070200, 1731070500, 1731070800, 1731071100, 1731071400, 1731071700, 1731072000, 1731072300, 1731072600, 1731072900, 1731073200, 1731073500, 1731073800, 1731074100, 1731074400, 1731074700, 1731075000, 1731075300, 1731075600, 1731075900, 1731076200, 1731076500, 1731076800, 1731077100, 1731077400, 1731077700, 1731078000, 1731078300, 1731078600, 1731078900, 1731079200, 1731079500, 1731079800, 1731080100, 1731080400, 1731080700, 1731081000, 1731081300, 1731081600, 1731081900, 1731082200, 1731082500, 1731082800, 1731083100, 1731083400, 1731083700, 1731084000, 1731084300, 1731084600, 1731084900, 1731085200, 1731085500, 1731085800, 1731086100, 1731086400, 1731086700, 1731087000, 1731087300, 1731087600, 1731087900, 1731088200, 1731088500, 1731088800, 1731089100, 1731089400, 1731089700, 1731090000, 1731090300, 1731090600, 1731090900, 1731091200, 1731091500, 1731091800, 1731092100, 1731092400, 1731092700, 1731093000, 1731093300, 1731093600, 1731093900, 1731094200, 1731094500, 1731094800, 1731095100, 1731095400, 1731095700, 1731096000, 1731096300, 1731096600, 1731096900, 1731097200, 1731097500, 1731097800, 1731098100, 1731098400, 1731098700, 1731099000, 1731099300, 1731099600, 1731099900, 1731100200, 1731100500, 1731100800, 1731101100, 1731101400, 1731101700, 1731102000, 1731102300, 1731102600, 1731102900, 1731103200, 1731103500, 1731103800, 1731104100, 1731104400, 1731104700, 1731105000, 1731105300, 1731105600, 1731105900, 1731106200, 1731106500, 1731106800, 1731107100, 1731107400, 1731107700, 1731108000, 1731108300, 1731108600, 1731108900, 1731109200, 1731109500, 1731109800, 1731110100, 1731110400, 1731110700, 1731111000, 1731111300, 1731111600, 1731111900, 1731112200, 1731112500, 1731112800, 1731113100, 1731113400, 1731113700, 1731114000, 1731114300, 1731114600, 1731114900, 1731115200, 1731115500, 1731115800, 1731116100, 1731116400, 1731116700, 1731117000, 1731117300, 1731117600, 1731117900, 1731118200, 1731118500, 1731118800, 1731119100, 1731119400, 1731119700, 1731120000, 1731120300, 1731120600, 1731120900, 1731121200, 1731121500, 1731121800, 1731122100, 1731122400, 1731122700, 1731123000, 1731123300, 1731123600, 1731123900, 1731124200, 1731124500, 1731124800, 1731125100, 1731125400, 1731125700, 1731126000, 1731126300, 1731126600, 1731126900, 1731127200, 1731127500, 1731127800, 1731128100, 1731128400, 1731128700, 1731129000, 1731129300, 1731129600, 1731129900, 1731130200, 1731130500, 1731130800, 1731131100, 1731131400, 1731131700, 1731132000, 1731132300, 1731132600, 1731132900, 1731133200, 1731133500, 1731133800, 1731134100, 1731134400, 1731134700, 1731135000, 1731135300, 1731135600, 1731135900, 1731136200, 1731136500, 1731136800, 1731137100, 1731137400, 1731137700, 1731138000, 1731138300, 1731138600, 1731138900, 1731139200, 1731139500, 1731139800, 1731140100, 1731140400, 1731140700, 1731141000, 1731141300, 1731141600, 1731141900, 1731142200, 1731142500, 1731142800, 1731143100, 1731143400, 1731143700, 1731144000, 1731144300, 1731144600, 1731144900, 1731145200, 1731145500, 1731145800, 1731146100, 1731146400, 1731146700, 1731147000, 1731147300, 1731147600, 1731147900, 1731148200, 1731148500, 1731148800, 1731149100, 1731149400, 1731149700, 1731150000, 1731150300, 1731150600, 1731150900, 1731151200, 1731151500, 1731151800, 1731152100, 1731152400, 1731152700, 1731153000, 1731153300, 1731153600, 1731153900, 1731154200, 1731154500, 1731154800, 1731155100, 1731155400, 1731155700, 1731156000, 1731156300, 1731156600, 1731156900, 1731157200, 1731157500, 1731157800, 1731158100, 1731158400, 1731158700, 1731159000, 1731159300, 1731159600, 1731159900, 1731160200, 1731160500, 1731160800, 1731161100, 1731161400, 1731161700, 1731162000, 1731162300, 1731162600, 1731162900, 1731163200, 1731163500, 1731163800, 1731164100, 1731164400, 1731164700, 1731165000, 1731165300, 1731165600, 1731165900, 1731166200, 1731166500, 1731166800, 1731167100, 1731167400, 1731167700, 1731168000, 1731168300, 1731168600, 1731168900, 1731169200, 1731169500, 1731169800, 1731170100, 1731170400, 1731170700, 1731171000, 1731171300, 1731171600, 1731171900, 1731172200, 1731172500, 1731172800, 1731173100, 1731173400, 1731173700, 1731174000, 1731174300, 1731174600, 1731174900, 1731175200, 1731175500, 1731175800, 1731176100, 1731176400, 1731176700, 1731177000, 1731177300, 1731177600, 1731177900, 1731178200, 1731178500, 1731178800, 1731179100, 1731179400, 1731179700, 1731180000, 1731180300, 1731180600, 1731180900, 1731181200, 1731181500, 1731181800, 1731182100, 1731182400, 1731182700, 1731183000, 1731183300, 1731183600, 1731183900, 1731184200, 1731184500, 1731184800, 1731185100, 1731185400, 1731185700, 1731186000, 1731186300, 1731186600, 1731186900, 1731187200, 1731187500, 1731187800, 1731188100, 1731188400, 1731188700, 1731189000, 1731189300, 1731189600, 1731189900, 1731190200, 1731190500, 1731190800, 1731191100, 1731191400, 1731191700, 1731192000, 1731192300, 1731192600, 1731192900, 1731193200, 1731193500, 1731193800, 1731194100, 1731194400, 1731194700, 1731195000, 1731195300, 1731195600, 1731195900, 1731196200, 1731196500, 1731196800, 1731197100, 1731197400, 1731197700, 1731198000, 1731198300, 1731198600, 1731198900, 1731199200, 1731199500, 1731199800, 1731200100, 1731200400, 1731200700, 1731201000, 1731201300, 1731201600, 1731201900, 1731202200, 1731202500, 1731202800, 1731203100, 1731203400, 1731203700, 1731204000, 1731204300, 1731204600, 1731204900, 1731205200, 1731205500, 1731205800, 1731206100, 1731206400, 1731206700, 1731207000, 1731207300, 1731207600, 1731207900, 1731208200, 1731208500, 1731208800, 1731209100, 1731209400, 1731209700, 1731210000, 1731210300, 1731210600, 1731210900, 1731211200, 1731211500, 1731211800, 1731212100, 1731212400, 1731212700, 1731213000, 1731213300, 1731213600, 1731213900, 1731214200, 1731214500, 1731214800, 1731215100, 1731215400, 1731215700, 1731216000, 1731216300, 1731216600, 1731216900, 1731217200, 1731217500, 1731217800, 1731218100, 1731218400, 1731218700, 1731219000, 1731219300, 1731219600, 1731219900, 1731220200, 1731220500, 1731220800, 1731221100, 1731221400, 1731221700, 1731222000, 1731222300, 1731222600, 1731222900, 1731223200, 1731223500, 1731223800, 1731224100, 1731224400, 1731224700, 1731225000, 1731225300, 1731225600, 1731225900, 1731226200, 1731226500, 1731226800, 1731227100, 1731227400, 1731227700, 1731228000, 1731228300, 1731228600, 1731228900, 1731229200, 1731229500, 1731229800, 1731230100, 1731230400, 1731230700, 1731231000, 1731231300, 1731231600, 1731231900, 1731232200, 1731232500, 1731232800, 1731233100, 1731233400, 1731233700, 1731234000, 1731234300, 1731234600, 1731234900, 1731235200, 1731235500, 1731235800, 1731236100, 1731236400, 1731236700, 1731237000, 1731237300, 1731237600, 1731237900, 1731238200, 1731238500, 1731238800, 1731239100, 1731239400, 1731239700, 1731240000, 1731240300, 1731240600, 1731240900, 1731241200, 1731241500, 1731241800, 1731242100, 1731242400, 1731242700, 1731243000, 1731243300, 1731243600, 1731243900, 1731244200, 1731244500, 1731244800, 1731245100, 1731245400, 1731245700, 1731246000, 1731246300, 1731246600, 1731246900, 1731247200, 1731247500, 1731247800, 1731248100, 1731248400, 1731248700, 1731249000, 1731249300, 1731249600, 1731249900, 1731250200, 1731250500, 1731250800, 1731251100, 1731251400, 1731251700, 1731252000, 1731252300, 1731252600, 1731252900, 1731253200, 1731253500, 1731253800, 1731254100, 1731254400, 1731254700, 1731255000, 1731255300, 1731255600, 1731255900, 1731256200, 1731256500, 1731256800, 1731257100, 1731257400, 1731257700, 1731258000, 1731258300, 1731258600, 1731258900, 1731259200, 1731259500, 1731259800, 1731260100, 1731260400, 1731260700, 1731261000, 1731261300, 1731261600, 1731261900, 1731262200, 1731262500, 1731262800, 1731263100, 1731263400, 1731263700, 1731264000, 1731264300, 1731264600, 1731264900, 1731265200, 1731265500, 1731265800, 1731266100, 1731266400, 1731266700, 1731267000, 1731267300, 1731267600, 1731267900, 1731268200, 1731268500, 1731268800, 1731269100, 1731269400, 1731269700, 1731270000, 1731270300, 1731270600, 1731270900, 1731271200, 1731271500, 1731271800, 1731272100, 1731272400, 1731272700, 1731273000, 1731273300, 1731273600, 1731273900, 1731274200, 1731274500, 1731274800, 1731275100, 1731275400, 1731275700, 1731276000, 1731276300, 1731276600, 1731276900, 1731277200, 1731277500, 1731277800, 1731278100, 1731278400, 1731278700, 1731279000, 1731279300, 1731279600, 1731279900, 1731280200, 1731280500, 1731280800, 1731281100, 1731281400, 1731281700, 1731282000, 1731282300, 1731282600, 1731282900, 1731283200, 1731283500, 1731283800, 1731284100, 1731284400, 1731284700, 1731285000, 1731285300, 1731285600, 1731285900, 1731286200, 1731286500, 1731286800, 1731287100, 1731287400, 1731287700, 1731288000, 1731288300, 1731288600, 1731288900, 1731289200, 1731289500, 1731289800, 1731290100, 1731290400, 1731290700, 1731291000, 1731291300, 1731291600, 1731291900, 1731292200, 1731292500, 1731292800, 1731293100, 1731293400, 1731293700, 1731294000, 1731294300, 1731294600, 1731294900, 1731295200, 1731295500, 1731295800, 1731296100, 1731296400, 1731296700, 1731297000, 1731297300, 1731297600, 1731297900, 1731298200, 1731298500, 1731298800, 1731299100, 1731299400, 1731299700, 1731300000, 1731300300, 1731300600, 1731300900, 1731301200, 1731301500, 1731301800, 1731302100, 1731302400, 1731302700, 1731303000, 1731303300, 1731303600, 1731303900, 1731304200, 1731304500, 1731304800, 1731305100, 1731305400, 1731305700, 1731306000, 1731306300, 1731306600, 1731306900, 1731307200, 1731307500, 1731307800, 1731308100, 1731308400, 1731308700, 1731309000, 1731309300, 1731309600, 1731309900, 1731310200, 1731310500, 1731310800, 1731311100, 1731311400, 1731311700, 1731312000, 1731312300, 1731312600, 1731312900, 1731313200, 1731313500, 1731313800, 1731314100, 1731314400, 1731314700, 1731315000, 1731315300, 1731315600, 1731315900, 1731316200, 1731316500, 1731316800, 1731317100, 1731317400, 1731317700, 1731318000, 1731318300, 1731318600, 1731318900, 1731319200, 1731319500, 1731319800, 1731320100, 1731320400, 1731320700, 1731321000, 1731321300, 1731321600, 1731321900, 1731322200, 1731322500, 1731322800, 1731323100, 1731323400, 1731323700, 1731324000, 1731324300, 1731324600, 1731324900, 1731325200, 1731325500, 1731325800, 1731326100, 1731326400, 1731326700, 1731327000, 1731327300, 1731327600, 1731327900, 1731328200, 1731328500, 1731328800, 1731329100, 1731329400, 1731329700, 1731330000, 1731330300, 1731330600, 1731330900, 1731331200, 1731331500, 1731331800, 1731332100, 1731332400, 1731332700, 1731333000, 1731333300, 1731333600, 1731333900, 1731334200, 1731334500, 1731334800, 1731335100, 1731335400, 1731335700, 1731336000, 1731336300, 1731336600, 1731336900, 1731337200, 1731337500, 1731337800, 1731338100, 1731338400, 1731338700, 1731339000, 1731339300, 1731339600, 1731339900, 1731340200, 1731340500, 1731340800, 1731341100, 1731341400, 1731341700, 1731342000, 1731342300, 1731342600, 1731342900, 1731343200, 1731343500, 1731343800, 1731344100, 1731344400, 1731344700, 1731345000, 1731345300, 1731345600, 1731345900, 1731346200, 1731346500, 1731346800, 1731347100, 1731347400, 1731347700, 1731348000, 1731348300, 1731348600, 1731348900, 1731349200, 1731349500, 1731349800, 1731350100, 1731350400, 1731350700, 1731351000, 1731351300, 1731351600, 1731351900, 1731352200, 1731352500, 1731352800, 1731353100, 1731353400, 1731353700, 1731354000, 1731354300, 1731354600, 1731354900, 1731355200, 1731355500, 1731355800, 1731356100, 1731356400, 1731356700, 1731357000, 1731357300, 1731357600, 1731357900, 1731358200, 1731358500, 1731358800, 1731359100, 1731359400, 1731359700, 1731360000, 1731360300, 1731360600, 1731360900, 1731361200, 1731361500, 1731361800, 1731362100, 1731362400, 1731362700, 1731363000, 1731363300, 1731363600, 1731363900, 1731364200, 1731364500, 1731364800, 1731365100, 1731365400, 1731365700, 1731366000, 1731366300, 1731366600, 1731366900, 1731367200, 1731367500, 1731367800, 1731368100, 1731368400, 1731368700, 1731369000, 1731369300, 1731369600, 1731369900, 1731370200, 1731370500, 1731370800, 1731371100, 1731371400, 1731371700, 1731372000, 1731372300, 1731372600, 1731372900, 1731373200, 1731373500, 1731373800, 1731374100, 1731374400, 1731374700, 1731375000, 1731375300, 1731375600, 1731375900, 1731376200, 1731376500, 1731376800, 1731377100, 1731377400, 1731377700, 1731378000, 1731378300, 1731378600, 1731378900, 1731379200, 1731379500, 1731379800, 1731380100, 1731380400, 1731380700, 1731381000, 1731381300, 1731381600, 1731381900, 1731382200, 1731382500, 1731382800, 1731383100, 1731383400, 1731383700, 1731384000, 1731384300, 1731384600, 1731384900, 1731385200, 1731385500, 1731385800, 1731386100, 1731386400, 1731386700, 1731387000, 1731387300, 1731387600, 1731387900, 1731388200, 1731388500, 1731388800, 1731389100, 1731389400, 1731389700, 1731390000, 1731390300, 1731390600, 1731390900, 1731391200, 1731391500, 1731391800, 1731392100, 1731392400, 1731392700, 1731393000, 1731393300, 1731393600, 1731393900, 1731394200, 1731394500, 1731394800, 1731395100, 1731395400, 1731395700, 1731396000, 1731396300, 1731396600, 1731396900, 1731397200, 1731397500, 1731397800, 1731398100, 1731398400, 1731398700, 1731399000, 1731399300, 1731399600, 1731399900, 1731400200, 1731400500, 1731400800, 1731401100, 1731401400, 1731401700, 1731402000, 1731402300, 1731402600, 1731402900, 1731403200, 1731403500, 1731403800, 1731404100, 1731404400, 1731404700, 1731405000, 1731405300, 1731405600, 1731405900, 1731406200, 1731406500, 1731406800, 1731407100, 1731407400, 1731407700, 1731408000, 1731408300, 1731408600, 1731408900, 1731409200, 1731409500, 1731409800, 1731410100, 1731410400, 1731410700, 1731411000, 1731411300, 1731411600, 1731411900, 1731412200, 1731412500, 1731412800, 1731413100, 1731413400, 1731413700, 1731414000, 1731414300, 1731414600, 1731414900, 1731415200, 1731415500, 1731415800, 1731416100, 1731416400, 1731416700, 1731417000, 1731417300, 1731417600, 1731417900, 1731418200, 1731418500, 1731418800, 1731419100, 1731419400, 1731419700, 1731420000, 1731420300, 1731420600, 1731420900, 1731421200, 1731421500, 1731421800, 1731422100, 1731422400, 1731422700, 1731423000, 1731423300, 1731423600, 1731423900, 1731424200, 1731424500, 1731424800, 1731425100, 1731425400, 1731425700, 1731426000, 1731426300, 1731426600, 1731426900, 1731427200, 1731427500, 1731427800, 1731428100, 1731428400, 1731428700, 1731429000, 1731429300, 1731429600, 1731429900, 1731430200, 1731430500, 1731430800, 1731431100, 1731431400, 1731431700, 1731432000, 1731432300, 1731432600, 1731432900, 1731433200, 1731433500, 1731433800, 1731434100, 1731434400, 1731434700, 1731435000, 1731435300, 1731435600, 1731435900, 1731436200, 1731436500, 1731436800, 1731437100, 1731437400, 1731437700, 1731438000, 1731438300, 1731438600, 1731438900, 1731439200, 1731439500, 1731439800, 1731440100, 1731440400, 1731440700, 1731441000, 1731441300, 1731441600, 1731441900, 1731442200, 1731442500, 1731442800, 1731443100, 1731443400, 1731443700, 1731444000, 1731444300, 1731444600, 1731444900, 1731445200, 1731445500, 1731445800, 1731446100, 1731446400, 1731446700, 1731447000, 1731447300, 1731447600, 1731447900, 1731448200, 1731448500, 1731448800, 1731449100, 1731449400, 1731449700, 1731450000, 1731450300, 1731450600, 1731450900, 1731451200, 1731451500, 1731451800, 1731452100, 1731452400, 1731452700, 1731453000, 1731453300, 1731453600, 1731453900, 1731454200, 1731454500, 1731454800, 1731455100, 1731455400, 1731455700, 1731456000, 1731456300, 1731456600, 1731456900, 1731457200, 1731457500, 1731457800, 1731458100, 1731458400, 1731458700, 1731459000, 1731459300, 1731459600, 1731459900, 1731460200, 1731460500, 1731460800, 1731461100, 1731461400, 1731461700, 1731462000, 1731462300, 1731462600, 1731462900, 1731463200, 1731463500, 1731463800, 1731464100, 1731464400, 1731464700, 1731465000, 1731465300, 1731465600, 1731465900, 1731466200, 1731466500, 1731466800, 1731467100, 1731467400, 1731467700, 1731468000, 1731468300, 1731468600, 1731468900, 1731469200, 1731469500, 1731469800, 1731470100, 1731470400, 1731470700, 1731471000, 1731471300, 1731471600, 1731471900, 1731472200, 1731472500, 1731472800, 1731473100, 1731473400, 1731473700, 1731474000, 1731474300, 1731474600, 1731474900, 1731475200, 1731475500, 1731475800, 1731476100, 1731476400, 1731476700, 1731477000, 1731477300, 1731477600, 1731477900, 1731478200, 1731478500, 1731478800, 1731479100, 1731479400, 1731479700, 1731480000, 1731480300, 1731480600, 1731480900, 1731481200, 1731481500, 1731481800, 1731482100, 1731482400, 1731482700, 1731483000, 1731483300, 1731483600, 1731483900, 1731484200, 1731484500, 1731484800, 1731485100, 1731485400, 1731485700, 1731486000, 1731486300, 1731486600, 1731486900, 1731487200, 1731487500, 1731487800, 1731488100, 1731488400, 1731488700, 1731489000, 1731489300, 1731489600, 1731489900, 1731490200, 1731490500, 1731490800, 1731491100, 1731491400, 1731491700, 1731492000, 1731492300, 1731492600, 1731492900, 1731493200, 1731493500, 1731493800, 1731494100, 1731494400, 1731494700, 1731495000, 1731495300, 1731495600, 1731495900, 1731496200, 1731496500, 1731496800, 1731497100, 1731497400, 1731497700, 1731498000, 1731498300, 1731498600, 1731498900, 1731499200, 1731499500, 1731499800, 1731500100, 1731500400, 1731500700, 1731501000, 1731501300, 1731501600, 1731501900, 1731502200, 1731502500, 1731502800, 1731503100, 1731503400, 1731503700, 1731504000, 1731504300, 1731504600, 1731504900, 1731505200, 1731505500, 1731505800, 1731506100, 1731506400, 1731506700, 1731507000, 1731507300, 1731507600, 1731507900, 1731508200, 1731508500, 1731508800, 1731509100, 1731509400, 1731509700, 1731510000, 1731510300, 1731510600, 1731510900, 1731511200, 1731511500, 1731511800, 1731512100, 1731512400, 1731512700, 1731513000, 1731513300, 1731513600, 1731513900, 1731514200, 1731514500, 1731514800, 1731515100, 1731515400, 1731515700, 1731516000, 1731516300, 1731516600, 1731516900, 1731517200, 1731517500, 1731517800, 1731518100, 1731518400, 1731518700, 1731519000, 1731519300, 1731519600, 1731519900, 1731520200, 1731520500, 1731520800, 1731521100, 1731521400, 1731521700, 1731522000, 1731522300, 1731522600, 1731522900, 1731523200, 1731523500, 1731523800, 1731524100, 1731524400, 1731524700, 1731525000, 1731525300, 1731525600, 1731525900, 1731526200, 1731526500, 1731526800, 1731527100, 1731527400, 1731527700, 1731528000, 1731528300, 1731528600, 1731528900, 1731529200, 1731529500, 1731529800, 1731530100, 1731530400, 1731530700, 1731531000, 1731531300, 1731531600, 1731531900, 1731532200, 1731532500, 1731532800, 1731533100, 1731533400, 1731533700, 1731534000, 1731534300, 1731534600, 1731534900, 1731535200, 1731535500, 1731535800, 1731536100, 1731536400, 1731536700, 1731537000, 1731537300, 1731537600, 1731537900, 1731538200, 1731538500, 1731538800, 1731539100, 1731539400, 1731539700, 1731540000, 1731540300, 1731540600, 1731540900, 1731541200, 1731541500, 1731541800, 1731542100, 1731542400, 1731542700, 1731543000, 1731543300, 1731543600, 1731543900, 1731544200, 1731544500, 1731544800, 1731545100, 1731545400, 1731545700, 1731546000, 1731546300, 1731546600, 1731546900, 1731547200, 1731547500, 1731547800, 1731548100, 1731548400, 1731548700, 1731549000, 1731549300, 1731549600, 1731549900, 1731550200, 1731550500, 1731550800, 1731551100, 1731551400, 1731551700, 1731552000, 1731552300, 1731552600, 1731552900, 1731553200, 1731553500, 1731553800, 1731554100, 1731554400, 1731554700, 1731555000, 1731555300, 1731555600, 1731555900, 1731556200, 1731556500, 1731556800, 1731557100, 1731557400, 1731557700, 1731558000, 1731558300, 1731558600, 1731558900, 1731559200, 1731559500, 1731559800, 1731560100, 1731560400, 1731560700, 1731561000, 1731561300, 1731561600, 1731561900, 1731562200, 1731562500, 1731562800, 1731563100, 1731563400, 1731563700, 1731564000, 1731564300, 1731564600, 1731564900, 1731565200, 1731565500, 1731565800, 1731566100, 1731566400, 1731566700, 1731567000, 1731567300, 1731567600, 1731567900, 1731568200, 1731568500, 1731568800, 1731569100, 1731569400, 1731569700, 1731570000, 1731570300, 1731570600, 1731570900, 1731571200, 1731571500, 1731571800, 1731572100, 1731572400, 1731572700, 1731573000, 1731573300, 1731573600, 1731573900, 1731574200, 1731574500, 1731574800, 1731575100, 1731575400, 1731575700, 1731576000, 1731576300, 1731576600, 1731576900, 1731577200, 1731577500, 1731577800, 1731578100, 1731578400, 1731578700, 1731579000, 1731579300, 1731579600, 1731579900, 1731580200, 1731580500, 1731580800, 1731581100, 1731581400, 1731581700, 1731582000, 1731582300, 1731582600, 1731582900, 1731583200, 1731583500, 1731583800, 1731584100, 1731584400, 1731584700, 1731585000, 1731585300, 1731585600, 1731585900, 1731586200, 1731586500, 1731586800, 1731587100, 1731587400, 1731587700, 1731588000, 1731588300, 1731588600, 1731588900, 1731589200, 1731589500, 1731589800, 1731590100, 1731590400, 1731590700, 1731591000, 1731591300, 1731591600, 1731591900, 1731592200, 1731592500, 1731592800, 1731593100, 1731593400, 1731593700, 1731594000, 1731594300, 1731594600, 1731594900, 1731595200, 1731595500, 1731595800, 1731596100, 1731596400, 1731596700, 1731597000, 1731597300, 1731597600, 1731597900, 1731598200, 1731598500, 1731598800, 1731599100, 1731599400, 1731599700, 1731600000, 1731600300, 1731600600, 1731600900, 1731601200, 1731601500, 1731601800, 1731602100, 1731602400, 1731602700, 1731603000, 1731603300, 1731603600, 1731603900, 1731604200, 1731604500, 1731604800, 1731605100, 1731605400, 1731605700, 1731606000, 1731606300, 1731606600, 1731606900, 1731607200, 1731607500, 1731607800, 1731608100, 1731608400, 1731608700, 1731609000, 1731609300, 1731609600, 1731609900, 1731610200, 1731610500, 1731610800, 1731611100, 1731611400, 1731611700, 1731612000, 1731612300, 1731612600, 1731612900, 1731613200, 1731613500, 1731613800, 1731614100, 1731614400, 1731614700, 1731615000, 1731615300, 1731615600, 1731615900, 1731616200, 1731616500, 1731616800, 1731617100, 1731617400, 1731617700, 1731618000, 1731618300, 1731618600, 1731618900, 1731619200, 1731619500, 1731619800, 1731620100, 1731620400, 1731620700, 1731621000, 1731621300, 1731621600, 1731621900, 1731622200, 1731622500, 1731622800, 1731623100, 1731623400, 1731623700, 1731624000, 1731624300, 1731624600, 1731624900, 1731625200, 1731625500, 1731625800, 1731626100, 1731626400, 1731626700, 1731627000, 1731627300, 1731627600, 1731627900, 1731628200, 1731628500, 1731628800, 1731629100, 1731629400, 1731629700, 1731630000, 1731630300, 1731630600, 1731630900, 1731631200, 1731631500, 1731631800, 1731632100, 1731632400, 1731632700, 1731633000, 1731633300, 1731633600, 1731633900, 1731634200, 1731634500, 1731634800, 1731635100, 1731635400, 1731635700, 1731636000, 1731636300, 1731636600, 1731636900, 1731637200, 1731637500, 1731637800, 1731638100, 1731638400, 1731638700, 1731639000, 1731639300, 1731639600, 1731639900, 1731640200, 1731640500, 1731640800, 1731641100, 1731641400, 1731641700, 1731642000, 1731642300, 1731642600, 1731642900, 1731643200, 1731643500, 1731643800, 1731644100, 1731644400, 1731644700, 1731645000, 1731645300, 1731645600, 1731645900, 1731646200, 1731646500, 1731646800, 1731647100, 1731647400, 1731647700, 1731648000, 1731648300, 1731648600, 1731648900, 1731649200, 1731649500, 1731649800, 1731650100, 1731650400, 1731650700, 1731651000, 1731651300, 1731651600, 1731651900, 1731652200, 1731652500, 1731652800, 1731653100, 1731653400, 1731653700, 1731654000, 1731654300, 1731654600, 1731654900, 1731655200, 1731655500, 1731655800, 1731656100, 1731656400, 1731656700, 1731657000, 1731657300, 1731657600, 1731657900, 1731658200, 1731658500, 1731658800, 1731659100, 1731659400, 1731659700, 1731660000, 1731660300, 1731660600, 1731660900, 1731661200, 1731661500, 1731661800, 1731662100, 1731662400], [29.95303563751022, 29.863273801887598, 29.74530909481922, 30.820551787925357, 28.598607277720664, 28.04993986829502, 28.29403407292073, 28.27844638313103, 27.19576649852163, 27.456331724634296, 27.217397865234982, 27.514561762216, 28.100707855820108, 29.080409286648, 28.96774854209461, 28.59917456792718, 29.054092458061, 30.20321953602552, 30.049120713816286, 31.161660734516037, 30.807950826641765, 30.940787547948453, 30.303247495709485, 29.97833174891068, 29.27737662612823, 29.06887825845655, 27.7703924326953, 27.73216655446883, 27.99376745244439, 26.673529371537505, 27.03079123482727, 25.861663738328662, 25.67546786601307, 26.1381018968254, 26.367870804933087, 26.146981091503275, 26.150687855431052, 25.251272120136942, 24.971657833955803, 25.049016570494864, 24.146909076619085, 24.029044879084967, 24.283391170712733, 24.70898423840648, 23.824109309415924, 23.79307543899782, 23.814198956115774, 24.03614807858634, 25.40789910021787, 25.373487185262995, 26.07907652194211, 26.36225280726735, 26.531897857546173, 26.639923256847187, 25.63863757150638, 25.517299277077505, 25.29934010132516, 26.445620823140388, 26.765567439231248, 27.136340389200125, 26.52445409484905, 27.583560436741365, 27.64822023840647, 29.29084150902583, 30.21304529232804, 30.8685423339558, 32.20665430252101, 33.00934374813259, 33.32652315676551, 34.006192789395975, 34.41200527863368, 34.60147287426082, 34.31286902388733, 33.93509753935704, 33.49818208341114, 33.36442998615002, 33.324088357656805, 33.62759791215375, 32.82527979769686, 32.28982365624028, 32.618716238728084, 32.77269979559602, 32.79886627108621, 32.62893223101463, 33.22687126455026, 33.842093282524125, 34.9003531032978, 34.94043060387489, 35.13482187414737, 35.15343338453159, 35.61403076581207, 36.07186723825085, 34.95663262690631, 36.141349826953, 36.07189071973234, 36.00615942989418, 36.0634800708061, 35.64693211733582, 34.628497796918765, 34.98107946086212, 34.70187174680984, 35.16978544493339, 35.12675279069406, 34.881740649393095, 34.51271267460317, 34.06354221732026, 34.12935250560224, 34.23096519172114, 34.28192991588858, 34.46200592071273, 35.05611878197946, 34.68594767287971, 35.32302091456583, 34.639189734593835, 34.0864164694211, 33.995515647370055, 34.26800288281979, 34.43414791106443, 34.72011426407563, 34.62203068549642, 34.03298289464676, 33.782411005757865, 33.642475630099725, 33.596953493930904, 33.176091730003115, 33.6089233058668, 33.81750602163088, 33.83296398544974, 33.76984175038904, 33.80976322338935, 33.504409440603176, 33.98205118549642, 33.854380510037345, 33.33098983496732, 32.19536714215686, 32.195491453236855, 31.319860889666984, 30.31191530462185, 29.934557712962963, 29.496193829754123, 27.970238982415182, 28.00001684749456, 27.658789600894803, 26.773564653127924, 26.428654224245253, 25.96830611601307, 25.157386397309413, 25.444824792794893, 26.005840585978834, 26.011094775816357, 25.84598265849673, 25.596641827775837, 25.67185444850947, 25.830137625612096, 25.568252246654215, 25.557462635543107, 25.567507131108, 25.924851764861497, 25.683637649159664, 25.534749995953938, 25.01063931076876, 24.840825974323064, 24.619350702692188, 24.466899899859943, 24.06399944506692, 23.79861774696545, 23.25869371690139, 22.79285178113589, 22.476787037659506, 21.614429070494865, 21.854125648070337, 21.98432185364146, 21.49076895183629, 21.21588116511049, 21.124067452523605, 20.92951476276066, 20.225114531003904, 19.577598227824467, 19.399860092826017, 19.37568616823193, 19.65219908745721, 19.740305957513748, 18.96386359928416, 18.69538046827148, 18.522187093003872, 18.495270675509005, 18.202278550575784, 18.527459956349205, 18.23835240639589, 18.40909652248677, 18.373685651416125, 18.35169219685652, 17.848618238794867, 17.55532619358855, 17.129680582399626, 17.362410895113605, 17.78700482081194, 17.847541706582636, 17.626260146436355, 17.414016638422037, 17.16611828644504, 17.84877248111708, 17.89090516635543, 17.8580062429972, 17.613188282835356, 18.153491634818188, 17.850908444989106, 17.965471032913165, 17.75756014480237, 17.623024629785245, 17.74181328413931, 17.58540116713352, 17.221494343559648, 16.91178959632742, 16.916904245331466, 16.85650740865235, 17.036334725334576, 16.404240407173983, 16.09307928371872, 16.22359039748807, 16.094488065048242, 16.071588599517586, 16.04681967732649, 16.052524661764703, 15.96977837458373, 16.201742987706197, 16.00119780124235, 15.999546109866172, 16.07154683899069, 16.059097926003737, 15.921683130217088, 15.94632245129163, 15.90779125715842, 15.71850959542484, 15.77202033146592, 15.726179993948252, 15.939666317934364, 16.143804096938865, 16.18770933232182, 16.166904010176758, 15.904480699579834, 15.943808437286028, 16.150462298756757, 16.605606048930778, 16.546311239028945, 16.606717163320887, 16.46745734049175, 16.393836884814295, 15.793753632137022, 16.432226256380332, 16.37009026521229, 16.30069493207283, 16.372235267117958, 16.326280563414254, 15.797535416558382, 15.66723042146942, 15.752634536336757, 17.108542957749766, 17.179691147136634, 17.572840839895218, 17.331188539808732, 17.41912896296296, 17.50850310356365, 17.61586773435458, 17.63557130750078, 17.758211365701836, 17.953709275124492, 18.58020508574541, 18.6157399302346, 17.16027266020853, 17.114009797619048, 16.75153771981015, 16.365364255803247, 16.723904659897293, 16.745477639709772, 16.7261548657463, 16.775858133499973, 16.60797762215997, 15.972383708527854, 15.640905713974478, 15.615036482648616, 15.696409038204171, 15.706842939931528, 15.70203697307812, 15.558468838817973, 15.34469298591659, 15.332774201137308, 15.324677888754673, 15.286677382430748, 15.42678012822907, 15.2982240281374, 15.558028704403986, 15.578224791549951, 15.521079541683996, 15.696742827264238, 15.73194824696545, 15.512766524867075, 15.713962422969187, 15.73888101198257, 15.726763535947711, 15.916383375739182, 15.930153244475571, 15.790553629500891, 16.026275746187366, 16.050241972066605, 15.983796771397447, 15.830916428727043, 15.881488170634922, 15.665264145969498, 15.99050106528167, 15.962517592592592, 15.848953131108, 15.838988146436352, 15.741511470354808, 15.547978630890588, 15.740267586756923, 15.814504308022096, 15.945720483402717, 15.893490969905464, 15.780766881855614, 15.598468843215064, 16.349898699968875, 16.26321101392779, 16.306206134531593, 16.255589608154374, 16.241397524555193, 15.79177208603049, 16.22596335227332, 16.151819750389045, 16.171208179505136, 16.327685821584186, 16.33617113398693, 16.35743944397759, 16.327289239807037, 16.539782297463432, 16.506313569297, 16.496929552832245, 16.538976984282602, 16.42404102626245, 16.465148749949815, 16.57263218191721, 16.551918147136636, 16.43848442296919, 16.441467330282578, 15.956709071163106, 16.075407759440814, 16.491280881497044, 16.673435442651257, 16.788089734593836, 17.1074782605042, 17.434960714043207, 18.395287009492687, 18.518673946978424, 18.591881351618422, 18.99378390600685, 18.9641970733738, 18.814731962026663, 19.79220148848428, 19.156718110255213, 19.143529239100275, 19.072940947868037, 18.87603148661687, 18.60243504863056, 18.04718722251271, 17.845195782057267, 17.86110615467048, 17.72402362605042, 17.75410096934395, 18.219076372082817, 17.594972222208607, 17.860385457905384, 18.25565400070028, 18.131256190908037, 18.111837153983814, 18.1747396223934, 18.161671735683164, 18.246769469641563, 18.94130278929349, 18.996576257703083, 19.085948344693435, 18.91653471747588, 19.318004814970436, 19.228231316993465, 18.69785498537193, 18.825560808123253, 18.749351485449733, 18.29543528252412, 20.03306114869281, 20.04836886169014, 19.273633238250856, 19.210570661998133, 19.186030088846746, 17.075320851274498, 16.734598128462498, 18.163879581854964, 18.50376333092126, 18.416643440242765, 18.54805604123872, 16.80106513390912, 15.19109867514784, 16.750830686323145, 16.529999624260814, 16.652114520385933, 16.47875576206038, 16.513074905929038, 16.415602921879863, 16.588177933362232, 16.441787964519143, 16.335029924914412, 16.08485037498202, 16.02439377362579, 16.06314758426704, 15.230445414643638, 15.306215451836293, 15.033510256691567, 14.986670843137254, 14.993455415074829, 14.959099673096924, 14.921933785677975, 14.991234340880796, 15.100281981792715, 15.221623879348872, 15.244688261480055, 15.093950632197322, 16.134841088049203, 16.221349057656397, 16.327889707282914, 16.45857591810548, 16.207169611111112, 16.074529205415498, 16.126420353290992, 16.339561041207332, 16.232400375057708, 16.233766994677225, 16.179139762371616, 16.061525022676513, 16.163151396047308, 16.02493578623541, 16.098288211406786, 15.985533375739186, 16.108784270538965, 16.499360942265792, 16.37577047109075, 16.80595181955792, 16.811845873707078, 16.79489208566695, 16.76394039738433, 16.743571952869853, 16.715972820339246, 16.740809038689182, 16.68534953633676, 16.665785662141435, 16.509162497000766, 16.05978813453159, 16.055756450824774, 15.636819847727333, 15.58804066775599, 15.523467827497663, 17.253858916870087, 17.545208256535947, 16.147899642110826, 15.9931104475568, 15.884401304128414, 15.784315240507317, 17.539855381553927, 17.657612168845315, 16.42872689721444, 16.27552686072207, 16.22539846747588, 15.875054106676002, 13.941797504511625, 14.710430429349517, 15.32185712830688, 15.69540503190165, 15.701383069172111, 15.66757353711485, 13.515868756100872, 14.60399975630252, 15.231637657238176, 15.319268157251788, 15.428243712418302, 15.634891500233426, 15.570254784847933, 15.416909826252724, 15.99639979520697, 15.664125891662549, 15.773115409663866, 16.28065289760349, 16.14168312495783, 15.578410523031437, 15.95892298500169, 15.932489862044818, 15.897650923202614, 15.760776364134635, 15.734370444921025, 15.775313739807032, 15.430559858525914, 15.58994109155125, 15.576222505368811, 15.158150569638968, 15.258364636357513, 15.672970119981326, 15.52750433169935, 15.537347102240895, 15.787786256380327, 15.749422585589793, 15.870705684173668, 15.735723998910675, 16.154201272486773, 16.01436661749144, 15.963097317372782, 16.043643256638397, 15.971042003920529, 15.428453119125429, 15.646671030967944, 15.61514414456894, 15.41359645059135, 15.38685767429194, 15.158174960317458, 15.299907019919075, 15.633304197089949, 15.651345776571414, 15.669427024976658, 15.675054942343603, 15.599559191565517, 15.577215380718954, 15.734193846016186, 15.898505279567384, 16.112791051742917, 16.196292476579522, 16.23682090027922, 16.108952339154087, 15.64059437192655, 15.72116629657965, 15.69698764821364, 15.692816619281048, 15.694626883101852, 16.13091309477124, 15.968828210524732, 15.99347262472767, 15.838092090246656, 15.794359347961407, 15.66431154604212, 15.604253385600163, 15.648954538068006, 15.653365155150953, 15.823983562298997, 15.79878280524432, 15.525950206403447, 15.150779772875817, 15.575611847818111, 15.491235970043576, 15.637008655539994, 15.73021386800433, 15.814642966978948, 15.733011345704949, 16.090174008247743, 16.09290387638889, 15.923140856753816, 15.927837373171489, 15.90830546978032, 15.96050227606598, 16.15209283022098, 16.191995831577447, 16.013837063725493, 16.05658222051043, 15.972243615662284, 15.765808010192965, 16.04471653960473, 15.935192740491106, 15.988276545751637, 15.924805429582946, 16.029444591658883, 16.299855418300652, 16.055676154295053, 15.90797536484594, 15.994800790149394, 15.808071067382508, 15.621368012527231, 15.71942359111422, 15.38323665281668, 15.357515135231871, 15.364476172804494, 15.369041984671648, 15.118106942627604, 14.612957563053326, 14.925202003034547, 14.964679106831625, 14.841369481170249, 14.950473323140368, 14.955285674758793, 14.857311822051043, 15.369997063725492, 15.33552246527778, 15.30956074424214, 15.512667509025832, 15.454274713352008, 15.566674187108497, 16.4841688053351, 16.543183877055455, 16.569315768985373, 16.50539888095238, 16.459510504668533, 16.934991595238095, 16.677577016651107, 16.778338013071895, 16.73889355878463, 16.612504637332712, 16.60984196705676, 16.44130551974663, 15.930104814659195, 15.817930082339329, 15.927317455097134, 16.108830345549332, 16.062900079053843, 15.425852695066917, 15.702782155773422, 15.778790347171649, 15.947172755913478, 15.955940277077495, 15.88630323175122, 15.926702646825396, 15.949168741441024, 15.955354570417056, 15.806934616090883, 15.813087967475882, 15.808628181372548, 15.713464992608154, 15.79629166941008, 15.757777477639424, 15.563070768596328, 15.665675844460008, 15.59825409056956, 15.26706152614379, 15.619170457049488, 16.08920792623716, 16.310844318316214, 16.31558521621797, 16.572413997403537, 16.371723069483348, 15.632466465063803, 15.898287828586987, 16.358722201058203, 16.22133449369748, 16.135728408700082, 16.042362723078117, 16.003836454832914, 15.564784347183318, 15.427393734593837, 15.206454386865856, 15.080231130467372, 15.340297517818238, 16.038820388502465, 16.06583143506915, 15.830732147681296, 15.819681416199812, 15.734710986727748, 15.6413193208061, 15.795192781481484, 15.869326893246187, 15.75284899922191, 15.594404798940502, 15.624948763538749, 15.709900050108931, 15.557435785091814, 15.359340510582012, 15.256679418300653, 15.20708091381627, 15.189402544193513, 15.224218146669775, 15.455127455844105, 15.325820708527855, 15.521707532990977, 15.596725178727048, 15.771263214908185, 15.490882766339867, 15.832144106687036, 16.113430639589172, 16.632300736433372, 16.956894933084342, 16.90308161160608, 16.682749958372238, 16.632823855353255, 16.660194061397707, 16.668143398307663, 16.500273537037035, 16.323788903322445, 16.44661547657952, 16.578365122860255, 16.103945292328042, 15.721491998832866, 15.82129000855898, 15.851487354227617, 16.103065050497975, 16.109219583099907, 16.473852929660755, 16.355200609477127, 16.231915105275444, 16.845853054748943, 17.101142516728913, 16.912532434562713, 16.702380941565515, 16.6403241319639, 16.74641893230626, 16.738779891767816, 16.93375659188064, 17.25330079302832, 16.974867006769376, 17.022782527155307, 16.981438659741674, 16.5731452798662, 16.44206678243464, 16.854572865740742, 16.94042488725977, 16.909778279841074, 16.66637219208045, 16.03550711286184, 15.921322209185345, 16.755360477328136, 16.71680904883369, 16.615096380520104, 16.599844290574264, 16.74787446022864, 16.523119284794664, 16.68002069187675, 16.75947101100283, 16.742359627426996, 16.723580415814013, 16.55766871945968, 16.96405793697479, 16.143725015017118, 16.1936506267507, 16.3556601589396, 16.24673270813881, 16.042395628540305, 16.462577973127814, 16.033945474814356, 15.843624850217868, 15.957205380796765, 16.038155446305375, 15.958735758325552, 15.80920001976346, 15.852504410364146, 15.801432699346408, 15.852280048008092, 15.65949207648615, 15.665890025988173, 15.194338029356002, 15.693900000428602, 15.803309455026456, 15.633533467164645, 15.522399265250549, 15.561380513227514, 15.06795383994709, 15.633615471733329, 15.665216524976657, 15.819994819546244, 16.009711243386242, 16.184713594051516, 16.337904803299097, 16.362160507270268, 16.50797301296117, 16.708475108567193, 16.594911321089306, 16.971783758199763, 17.024640698942033, 16.897511120772965, 16.884020007732936, 16.397045213448457, 16.455133324182825, 16.46571674608963, 16.029323428338, 15.752586731092435, 15.678901720158, 15.770744349673205, 15.97653549263215, 15.575747094537816, 15.70604614626582, 15.848743045898177, 15.670930224400871, 15.415007387721754, 15.346886492997198, 15.615959527933397, 15.556615479458449, 15.939207874867726, 16.215848692904483, 16.075335340569563, 16.039910509259258, 15.848209769404496, 15.728989638422034, 15.878155091503269, 16.046595601151573, 16.020167064581386, 16.482619253112354, 16.171293354341735, 16.158633708761283, 16.281297153750387, 16.126164924906565, 16.0425059946474, 15.952424522486773, 15.795642294195456, 15.810952770697169, 15.967480541549955, 15.840082992374729, 15.962275006322624, 15.474110797230002, 15.324867081543726, 15.280658617102397, 14.89814297089947, 14.718883081566778, 14.856665356364772, 15.087540991129789, 15.016998266028631, 14.923100258558978, 14.77540385702984, 14.807435861655774, 14.64809642063492, 14.591777553376906, 14.66608788593215, 14.552516475023342, 15.26362413966698, 15.27617082638046, 15.127000713844795, 14.937672232259573, 14.93178331233854, 15.624447475979744, 15.520852602466544, 15.51872981808279, 15.5968528846094, 15.493388807578588, 15.379295736383442, 15.455803889666978, 15.933148471684756, 16.008211747432306, 16.13731753859322, 16.139586441798944, 16.26385581016802, 15.950944014703287, 16.14201804679168, 16.288656823295987, 16.373246261982572, 16.37290313600996, 16.503083671335197, 16.751898161142233, 16.442639133488306, 16.61099144972767, 16.862056506069095, 16.989940200941486, 17.25737960130719, 17.015005668845316, 17.33300877194211, 17.704407293013944, 18.08944948436041, 18.5930607464986, 18.77788117746266, 18.652963170337305, 19.04258231582633, 19.61942861157797, 20.65924917242453, 21.383894861111116, 21.48186834381875, 23.209179607142858, 24.19647005384376, 24.5214955522221, 24.98303681847379, 25.12500682244009, 25.81259219018832, 26.69195484064737, 27.181494441643327, 27.23263100202304, 26.83017046451914, 26.91854621171802, 26.705622142545906, 25.80605634897292, 25.726396034780574, 25.49669879824152, 25.244466792172425, 25.244587575291828, 24.94070331696365, 24.47721357454093, 24.532549092135465, 25.441538929582943, 25.29817629520697, 25.1362140026455, 24.805212766339867, 25.07915541900093, 25.192079268489348, 25.232303295751635, 25.12024762838404, 25.30774912560024, 25.782652155314487, 26.18651306177383, 26.39936209274821, 25.774044771086214, 25.97110584150327, 26.297513341658888, 26.73970202458761, 26.252155010270773, 26.769535225801437, 26.824729704784605, 26.787241030226177, 26.613074315203864, 26.01204807202556, 25.32043274346405, 25.31940421645334, 25.0582257281357, 24.95397961780268, 24.45608493448491, 24.15081576361656, 24.03161615289449, 24.504549139044503, 25.176910941643325, 26.002173037270463, 26.242481537503892, 26.590075022807408, 27.02431280554461, 27.44500764874013, 27.83917443576227, 28.284174551217657, 28.855722243397462, 28.547293153286947, 29.44415284072129, 29.81445275342359, 29.964548243075004, 29.82077820284781, 30.36672373723934, 31.326497464052288, 31.182774545518207, 31.93450909718332, 31.94773055073141, 31.45765542250233, 31.070918881886087, 30.839865427878344, 29.90568724618736, 29.825897404839715, 28.996993888811083, 28.55440255897915, 28.2989449370526, 27.17912277619372, 26.550067385309685, 26.303895424680984, 26.66516079995332, 26.82646347268908, 27.22654947456494, 27.43881026027077, 27.612922985371924, 28.11432561554622, 28.7910508505291, 29.878905585511987, 30.652839040616247, 31.989178864923748, 32.591856319094305, 33.006937964737006, 33.172184068160604, 33.79789118145036, 34.18817149774354, 35.061667306008154, 35.37494464316838, 35.49579809228136, 35.444021282446315, 34.41277051696234, 33.18777731652596, 31.906656082321817, 31.84804050622471, 31.573171003657016, 31.00188013328665, 29.772398182228446, 29.00536911258948, 27.72081820012449, 26.8440208802521, 26.39049785348584, 26.130775098083973, 26.11139108667912, 25.60692098329792, 24.85254959574039, 24.56086913671024, 23.290570220432617, 22.849228726495877, 22.53708572128852, 22.233742922580145, 22.014494287581694, 22.030337230547776, 21.969601938658712, 21.283787370837228, 21.247130050575787, 21.54530237132613, 21.43420982748276, 20.95057503625895, 21.63306590506072, 22.45365236694678, 22.479683783688024, 22.209711630174294, 21.82540693907237, 21.175493624183005, 21.21679579475698, 21.76771847908772, 21.39529282356313, 21.26245653625895, 21.106861509276268, 21.112944654139437, 20.260393246019422, 19.46302126867414, 19.66103017320261, 19.70667216394336, 19.799422294108577, 19.88412544063181, 19.59325005734516, 18.96468321100996, 18.831971181061316, 19.027530584733896, 18.908606491468912, 19.05710377964519, 18.94984087283498, 18.797077038671024, 18.712378199346407, 19.659089674136325, 19.642245752878928, 19.81671344814815, 19.69948399720342, 19.762548899315284, 20.01591502816682, 20.64571238756613, 21.12030365087146, 21.154666449424216, 21.735726419856835, 21.91166285768752, 21.920285634842195, 21.11153186609088, 21.356249038982256, 21.72814919187675, 22.03842023179272, 21.993448536258956, 22.413816895022823, 22.020754450577734, 21.719279260024383, 21.73694043674136, 21.92774360484166, 21.94870998381575, 21.9750309335512, 22.001090681683788, 21.532187566096376, 20.954508151338317, 21.26567032026144, 21.41374213220317, 20.713415560613136, 20.40877250606909, 20.134661798675022, 19.84822645673825, 19.440354624649864, 20.082077490786133, 20.25600144817927, 20.225053532547477, 20.385310981130694, 20.501970646591968, 20.62069577318705, 20.749377198801746, 20.972647519919075, 21.06650566588858, 20.961461780656705, 21.02215985589791, 21.2462769166135, 20.898642050264552, 20.72713162698413, 20.698429204403983, 20.243511259063755, 19.95164396066371, 19.76764227521009, 19.53309764620293, 19.45406651828509, 19.26709387138189, 19.672119872099028, 19.715884932228445, 19.86074717701525, 19.67366026953004, 19.62476885192059, 19.7741549719888, 19.827140925459076, 19.81451488374248, 20.03717791643324, 19.88069762262683, 19.61092430474181, 19.61376492920894, 19.43015660348584, 19.29714577304635, 19.3122946206038, 19.064078506689626, 19.032203836990355, 18.753546028011208, 18.789695273653905, 18.625894785558664, 18.70606760235467, 18.93073123381575, 19.10551179497355, 19.18202209157005, 18.525505272331152, 18.733719684694996, 18.63060704816371, 18.73923255944536, 19.01112311290072, 19.070838653610984, 18.919540971848093, 19.373163832436585, 19.94378007817137, 19.814827790694057, 19.633144747976967, 19.595201439620293, 19.772977002256457, 19.644022835200744, 19.69374471397448, 19.57751686752711, 19.099664513849984, 19.20295792934952, 18.95163239417728, 18.448602624795104, 17.98906895762292, 18.040238431683782, 18.008927158666616, 17.859937890979644, 17.6189108952569, 17.590971904917524, 17.907110499922194, 17.99377952544351, 17.910653818047777, 17.828156230625584, 17.66028085783341, 17.864858731325864, 18.20381284271125, 18.57404345518207, 18.780373729147215, 19.090191743495176, 19.53459700590765, 19.7694760830221, 19.715810490429504, 19.945540071039527, 20.589202382041705, 21.11833922868036, 21.69763626788827, 21.87414477754435, 22.42980729843929, 22.390358587393013, 23.09285842532876, 23.519531891839144, 24.22542042553688, 26.00741676968565, 28.12112738383131, 28.41898211159873, 28.38402894164333, 28.418249322984757, 28.25845947945845, 28.8282337605042, 30.040350805567893, 30.537068798169543, 30.42826366145347, 30.97012893050628, 30.633389854735324, 29.258431924914408, 29.127843441176477, 29.94667897525677, 30.48722529046063, 31.99304218589389, 32.434969916122, 32.087657569716775, 32.16097693596328, 32.11973950381069, 31.98126356450358, 31.22355839122316, 30.718044557422967, 31.37401508302209, 32.26878918814192, 33.13392691308746, 33.4286263530968, 33.06332738515407, 34.077594599673205, 33.790105509803915, 34.29178034632742, 34.41367359391534, 34.89562024221912, 35.31303631302521, 35.036466559134766, 35.13735108761801, 33.95437970510426, 33.10701106084657, 32.74687451590349, 32.18692372058823, 31.020462861655773, 31.547220375350136, 31.618947578509182, 32.458175925225646, 32.02902069950203, 32.63893456637099, 32.810597094070964, 32.492282185029566, 32.2644156388889, 32.5640096896981, 32.71382762527234, 32.324408789371304, 32.127316678338, 31.15009263040772, 31.322034554440293, 30.696703190554004, 31.03989573700591, 31.0047587718643, 31.448713940475542, 31.6882036293962, 32.06467450816994, 31.670598644257705, 31.731466753657017, 32.055815940476194, 32.6176546014628, 34.21164674027324, 36.39588707835356, 36.98506761756017, 37.26260232559784, 37.48737604147215, 38.11322594903516, 39.09390352435418, 39.92957592966076, 41.11814798996265, 41.53633400342358, 43.75433233076564, 45.22210823358232, 45.94716945938375, 44.28613132835357, 44.08080764861501, 44.58453748801743, 45.68711489183334, 45.50579194291939, 45.70428879925303, 46.14371431061314, 46.0271807368503, 45.99982757469655, 43.9383786215375, 42.064431036757874, 40.51262016355431, 40.21728166348948, 42.164950206115776, 41.872314192810464, 40.805037980067326, 40.460362021475255, 40.27919512605042, 39.907757060224085, 39.97441747945845, 39.66202409124132, 39.554811855586685, 39.8236985776008, 40.17393125981948, 40.20105151523498, 38.15939844973545, 38.10388060270775, 38.10868795238095, 37.76667838409586, 38.1944354309835, 39.9600233680361, 40.48861186515717, 41.17232629396203, 42.06883916441021, 42.40268050077808, 43.35455748109244, 44.64866233948023, 46.06030304427327, 46.39649157057268, 47.07272701859633, 46.870113418611886, 47.00390210488639, 46.49541227528789, 46.162699520074696, 46.49174940499534, 47.80194981637099, 48.6670579124735, 48.48589286335461, 48.67077304992305, 48.14738923039216, 48.25628076556178, 47.39642288437598, 48.12888048101463, 46.855573381108, 45.90683067460317, 45.915639956115776, 45.85207522012138, 43.85625430904269, 42.770546748473016, 41.92172086966944, 41.30457763420025, 41.44105074859879, 41.46675462480548, 41.609936009492685, 40.64718111328976, 40.49218833333333, 39.99093476182695, 39.53363980834371, 39.25350038157485, 39.36005271615313, 39.16527436476812, 39.26088350490196, 40.1482201258948, 39.686102025695405, 38.90356809974971, 38.95167733566761, 39.02081540810769, 41.86242601081543, 42.1164606844071, 42.57756492857144, 43.07263250739185, 42.97024921256681, 42.83954898487539, 42.18741412393207, 41.36052337235966, 41.49958240793361, 42.05350534547153, 41.78209721949892, 42.03346025225645, 39.80099284644941, 39.86415566417679, 39.28880759401016, 38.50853915273887, 38.29308131320224, 38.66008671560846, 38.74606056862745, 39.42475649528875, 38.91906947191098, 37.9472488648011, 37.46243230960162, 36.74198946459695, 36.43356956029346, 35.98886308387668, 35.21337107386075, 35.42994861389262, 34.83581327380952, 33.802001726012215, 33.14040012145969, 32.54854235122938, 31.9538156118892, 31.36296682761358, 31.01836448443822, 30.287022473622784, 29.63925874585541, 29.29317321887644, 29.315871385620916, 28.80939217366688, 28.4976237765082, 28.060925107920944, 28.326372941076613, 27.441111176781824, 27.40896594740118, 27.386246560301903, 27.185116652289526, 26.942544723674736, 26.68810303478058, 26.632564558989525, 26.139316497472198, 25.872865568436225, 25.94036224146386, 25.652967456193583, 25.33545361264006, 25.578626960161845, 25.62954491900093, 25.797884430905693, 25.9094277316371, 26.642493093183944, 26.659961012449426, 26.6767689439776, 26.875826175984937, 26.63963282173981, 26.31558172805789, 25.98300252820082, 26.192967403906003, 26.264670581646836, 26.268780526143797, 26.148956555258167, 26.06740394701214, 25.206765047463428, 24.97855108709693, 25.17686198988484, 25.281059788448623, 25.09777258708502, 24.95140701206038, 24.67220289923088, 24.31220947650171, 23.991345796884403, 23.919994543417367, 24.096093622626828, 23.97507769113361, 23.70829725334578, 24.043864481240924, 23.35279107107231, 22.886684686896984, 22.9184446328198, 22.772214547696866, 22.366506410831654, 22.56385730734516, 22.772715370502, 22.41419770276923, 22.656588457049487, 22.88909072792535, 23.132387247043265, 22.94394824867725, 23.248895373482725, 23.3663066691814, 23.54494789887263, 23.972925707885604, 23.910260038327376, 24.26200141332088, 24.36061792211329, 24.773200006610526, 24.50664064985995, 24.541120028067915, 24.595486469109865, 24.27913287453869, 24.258958230859008, 24.17626172004228, 23.83595275306874, 23.65997054648984, 23.808828818238403, 24.198824425692496, 24.02968686391223, 23.70801264799253, 23.45279582983193, 23.39261137138189, 23.249921823373796, 24.00490839302577, 24.14104297316582, 24.464310736227823, 24.7184077683629, 24.762711090826983, 24.275658887099283, 24.11906483232182, 24.68590482114912, 25.212377521475258, 25.443180975801432, 25.838308494700573, 25.7893401075319, 25.27496361204481, 25.424686377922377, 25.760958820417056, 25.83637879520697, 26.573176231379687, 27.21173482446312, 28.334426429582944, 29.75764543249884, 30.37115616098662, 31.105745666122004, 32.91334886399004, 34.78783257625272, 36.29673115818549, 37.88398959094564, 39.30899731691565, 42.23859194654528, 43.49946764122316, 44.25163316058396, 45.39835158378398, 47.14825232586369, 47.186279976582966, 49.74730297263904, 49.36005032819794, 49.24778413972404, 48.73659258975257, 49.428605851384994, 49.48578742514784, 48.471441337461165, 48.67029517345054, 49.58609072541703, 49.90196191270141, 48.21413834078129, 51.09894176589449, 51.60006177728051, 52.487380544804736, 52.16715187174725, 53.78550170869117, 52.5894160467314, 52.39657928702507, 51.710352110527545, 50.87115098854475, 49.36149983735545, 48.17157061995738, 48.57326721924154, 45.83262865909526, 42.39195559207048, 40.56406306385717, 39.7143027113901, 37.44514583146592, 36.86321826844071, 35.612993041466005, 36.13280289273265, 36.52636471439835, 35.432434779798214, 34.71801588849984, 36.81785581592177, 36.82784093432929, 37.7547408275222, 38.147507677015255, 38.48848565297516, 39.53633211601307, 41.35579270533768, 41.54676385566449, 41.646476865468415, 41.4223828033668, 42.694538720887, 43.89042413688163, 42.49709295541551, 45.36052033488952, 46.559948898848425, 47.925975052754445, 48.30738190849673, 48.40923505695611, 48.69136640219422, 49.37178644339663, 49.16038840079365, 49.43457452046374, 48.67392278563648, 49.18116621397448, 48.85711542156862, 47.23825045953937, 46.23982721101775, 45.555362409197016, 45.77490714707309, 46.96165437908496, 47.41456376198257, 49.41840357796452, 51.45634375412453, 52.65055057010583, 53.85409703719265, 54.75834083512294, 56.11755640149393, 57.13260375217865, 57.82272517343605, 58.5444857633747, 59.80774717055712, 59.74678828018986, 58.69939659668663, 56.77340684461562, 54.88521253976035, 53.59145656092438, 52.51846669382196, 51.12716500809212, 49.2678949798462, 47.60717607570805, 46.66741428602552, 45.31504959773512, 42.895719403205725, 42.078847984360415, 41.35122172362278, 40.63232206022408, 39.89006223404918, 38.672230211406784, 37.15137598708372, 36.59264821537504, 36.34777349151884, 36.29007297144414, 35.654052683706816, 35.05637063795518, 34.7885655874572, 34.40977468565204, 34.32285001365288, 34.23532670432618, 34.48986219351074, 34.71150121700902, 35.0629820235761, 34.910187818783065, 35.02336001291628, 35.20272896288515, 35.82997719115183, 35.82525039371305, 35.47235785675382, 35.66051245066915, 35.92107202256459, 36.070047241752256, 35.838564787659514, 36.12436073910676, 35.7259557787666, 36.50720230205416, 36.509081299875504, 36.01479087745098, 35.36973208426704, 35.06930468695127, 34.727690006475, 33.20413966355431, 31.94603036842515, 31.411618722222222, 31.631869100840333, 31.32795141013072, 31.491674578197944, 30.720355754655056, 30.50187770393713, 30.31525091386555, 30.077274925225648, 30.17703682996617, 30.243908692265794, 31.34132037620604, 32.33078625412387, 32.07779101991908, 31.401569506691565, 31.11000867079053, 30.5443076432008, 30.43915386320224, 30.725048240974168, 31.13512280610022, 30.96563149758793, 30.93439926626206, 31.557279228213503, 31.10961384975101, 31.53576246175045, 31.70323704956427, 32.35429677731092, 32.54694870767196, 32.057977512060376, 32.29619608937521, 31.865596893324, 31.251012293650795, 31.46241264744787, 31.29308487643947, 30.321214473155926, 30.11489618222845, 30.563252474867728, 30.98556315735424, 30.27556312814348, 30.16241906185808, 29.60766402588029, 29.35835735262994, 28.995941086212262, 30.37577113912232, 29.916048992452534, 29.728144940476195, 29.74356293177716, 28.652657278089013, 26.263917763538743, 25.523330776377215, 26.360224060457515, 26.69911988118581, 26.414377854415655, 25.52290155034236, 24.50161645035792, 22.595677798630565, 24.23895374066293, 24.58643521321779, 24.262346924369748, 24.278022629162773, 24.23464258364457, 23.99668387013629, 23.950841263227517, 23.80886238468721, 23.4541607219888, 23.583923409041397, 23.32333983644569, 23.26908677832245, 22.974828418460813, 23.344450956427018, 22.830894603935185, 22.7905619160442, 22.964173071662, 23.07462359735799, 23.845640568316217, 24.124320450980395, 24.18875691289326, 24.455284602474325, 24.626330398303768, 24.633118175114767, 24.41079257578587, 23.99278446685341, 24.574858743588543, 24.378151036181137, 24.185006745331464, 23.972486583717195, 23.110318068082787, 22.705006332944286, 22.1392865638033, 22.49766711904762, 22.53765045393713, 22.54989190522876, 22.30147154587159, 22.41702473315437, 22.05471604614068, 22.41000625031124, 22.69278411064426, 22.97273726906318, 23.044599705026453, 23.627242596249616, 24.35937529320534, 24.52309035976025, 24.82063925575786, 25.07713584025833, 25.646450587924058, 26.353340671879863, 26.324419660753183, 26.38019941061443, 26.45754913056334, 26.60714560457517, 26.70387766417678, 26.747553309290385, 25.84988819992376, 26.322156330555558, 26.315893762479504, 26.368263986100736, 26.108516099361967, 25.98677602653284, 26.22856374891067, 26.26393970824969, 25.96143746162125, 25.52694369353297, 25.389925906850426, 25.266855014628074, 24.722659003034547, 24.311457229069404, 23.776992792889573, 23.373458825396828, 22.60020190094927, 22.5317731984127, 21.99819671234049, 21.65472825855898, 21.390612615953422, 21.599597446959624, 21.16857727108621, 21.498010084523813, 21.301282574465063, 21.737155888247614, 28.941519378053144, 30.683325622266835, 30.10672652678386, 30.342811931156216, 31.18028617490149, 32.04195342106439, 32.67427847105948, 33.07506722216928, 34.11548636046872, 35.687232192478085, 36.61099612202504, 38.07003860742663, 31.33421437968978, 31.341021234474702, 32.81750915369659, 33.42009787269247, 33.51584828537921, 34.82027475208247, 35.72584330357143, 36.77830609259513, 36.612629537101874, 37.53986060189562, 37.21786295580454, 37.32792532288749, 38.23609606294741, 38.69930116223156, 40.16258098845251, 43.10860418199503, 43.06576481411453, 42.27689291285403, 41.98435512527233, 41.43259898297542, 40.78623344327731, 39.179202198412696, 39.166901099050726, 39.63499159321506, 38.740876140678495, 38.371520157874265, 36.316609068458895, 34.64305476353875, 34.38826739083412, 34.583611309368194, 34.84495106193589, 34.94191446615313, 35.24561090196078, 35.50791810729848, 35.32929853376906, 34.708683642857146, 35.54792278018985, 38.13360967857143, 37.39278815289448, 37.24195483551199, 38.33855358280034, 38.150463419934646, 37.64831801151572, 37.798801106231856, 36.579282069716776, 36.0713801992686, 35.85510867304699, 38.6449288504513, 38.43794044693433, 37.49687819343293, 38.78656974410468, 38.893579520074695, 39.53655079341736, 42.006981234282605, 43.58947669125428, 44.38410089075631, 45.33721998078121, 47.18701480555556, 48.82210844615559, 49.00227917981638, 50.04410459228136, 50.145150208286, 50.07533922938064, 50.77371721567461, 51.95491781924992, 51.83780849557462, 52.51051064316837, 53.59569798887332, 54.31590329474013, 54.359801736694685, 54.59526468121693, 55.076255975568, 55.8000795112823, 56.32548859165889, 56.29014255656707, 55.74937262854031, 55.1600782142079, 55.6956282491441, 56.7931471765484, 58.51953660029568, 59.29646032189543, 59.64451045961787, 60.49986027380952, 59.758455841036415, 60.0169401769499, 62.47193526369437, 64.25345477961083, 65.15533455578898, 65.29349541370992, 63.76451453789294, 64.03442365678494, 64.20112469600062, 63.68688397354498, 62.68592639166741, 61.23934605555555, 61.507429628384685, 60.02641491493032, 58.71985655851229, 58.28219560776533, 56.74402686002178, 56.995057124183006, 57.21578334088079, 55.3941797858699, 54.460482613834415, 55.056609129863055, 54.87578277863368, 53.24555933394737, 52.35314615639589, 50.83593094771242, 50.02183197984749, 49.624878035636485, 49.62305981286959, 48.56729803127918, 47.76180798784431, 47.79112803353564, 47.216991773965134, 46.41029189711978, 46.79852942966075, 47.79166498918456, 48.452717780112046, 49.6942540208528, 49.40555872556801, 48.37815424891068, 47.99062614534704, 46.90910889908185, 46.78408291993465, 45.860680444911296, 46.16305443627451, 45.89038259228136, 44.38720359158108, 42.63181636935885, 41.63106481668223, 40.51809575778088, 40.82716892436975, 40.37373300163398, 39.972239143868656, 39.838756389044505, 39.55341045432618, 38.70255616970121, 37.55137538951136, 36.3544600645814, 36.52478681100218, 36.3036486171024, 36.49216072704638, 36.07410381290979, 35.92358574782135, 35.989703703937124, 35.706097228446936, 35.48809784111422, 36.08925472922502, 37.54149428252218, 38.18512871872082, 38.52994407874261, 38.9663893914566, 39.1348089309835, 39.20948040206, 38.94065032103952, 38.65833714394647, 38.27459481076876, 37.66037073177979, 36.791864775018354, 36.176603826409234, 34.253947305186685, 33.62910438193321, 33.04709697589838, 31.88685326392779, 31.331123684329285, 31.08102568199502, 30.708833811391223, 30.632624754435103, 30.35980950742947, 30.38994977682636, 30.152671463858443, 29.92257080299406, 29.993215339604525, 29.83656750121216, 30.107286024601763, 31.18444142759658, 30.80441029924385, 30.68309658679184, 30.105453858315308, 29.367361014161222, 30.147412355119823, 30.23743372564581, 30.294253633831307, 30.736016323840648, 30.33779947362278, 30.238448669856837, 29.99853747633183, 28.836513139355745, 28.645005974730918, 28.757488991207595, 28.9120738155929, 29.97955305143168, 29.662877003616185, 29.57024124812287, 29.56932205510067, 29.446095569375284, 29.505650070975246, 29.934819192615294, 29.811716671869483, 29.728058882432567, 29.156978097554266, 29.072683149926, 29.92309394204197, 29.685036386251305, 29.369783741129787, 29.077412506700217, 28.757709143099216, 28.356968827739745, 27.81872714084276, 27.636077187294678, 27.274139675088406, 26.9755682244186, 26.846516654928223, 26.621107724044464, 25.32656001898537, 24.87756408839091, 24.474266545985063, 24.348820924998705, 24.04505455708527, 23.79244593464053, 23.854179590958605, 23.505184995953936, 23.10082746739807, 22.77156258574541, 22.123093134220355, 21.87031804092748, 21.295922551976343, 20.965330042561465, 20.79353702178649, 20.38957380921258, 19.925428181670167, 19.95686806170246, 19.246737766262054, 19.16979782024977, 19.55583878913788, 20.07028337745098, 20.26058436025521, 20.86595349577822, 20.75224879761905, 21.15287445043573, 21.078668310768755, 21.993339466931214, 22.657715618908863, 22.646563256847184, 22.642692663476502, 22.81727716985683, 22.841175586523494, 22.44124780150949, 21.995666380485527, 22.06267161469032, 21.861700284936195, 21.48733536476813, 21.492718399315283, 20.555411660274014, 20.136782106777357, 20.250075441247148, 20.241643933629007, 20.509505761126672, 20.6313757316371, 20.778894685029567, 20.59953656667445, 21.01500586414566, 21.18762231535948, 21.489331384998444, 21.476968823685027, 21.969039700746965, 21.8024728756925, 22.27065682741986, 22.26045610613134, 22.06303080967943, 21.947689870872885, 21.86945254668534, 21.69858373459384, 22.07662584033613, 22.087491632897603, 22.689501820883912, 22.942856237239344, 23.037209333955808, 23.0887938837535, 23.43776733814452, 24.65037444051023, 25.41984600642522, 26.29556289568204, 27.374771511717007, 28.178831560311625, 29.32782085459162, 30.586069889069083, 31.873897776628837, 32.9154709297235], [0.3041666678338002, 0.3044444456893868, 0.3041666678338002, 0.3044444456893868, 0.3044444456893868, 0.3044444456893868, 0.3052777792561469, 0.3050000014005602, 0.3044444456893868, 0.3052777786336756, 0.3044444456893868, 0.3044444456893868, 0.3041666678338002, 0.3033333342670401, 0.3033333342670401, 0.3030555564114535, 0.3027777785558668, 0.3036111121226268, 0.3036111121226268, 0.3036111121226268, 0.3038888899782135, 0.3030555558667911, 0.3033333342670401, 0.3030555564114535, 0.3030555564114535, 0.3033333342670401, 0.3041666678338002, 0.3044444456893868, 0.3055555571117335, 0.3047222235449735, 0.3044444456893868, 0.3047222230781201, 0.3050000014005602, 0.3050000013966699, 0.3052777792561469, 0.3050000014005602, 0.3050000014005602, 0.3058333349673202, 0.3052777792561469, 0.3050000014005602, 0.3041666678338002, 0.3050000014005602, 0.3050000014005602, 0.3061111128177198, 0.3055555571117335, 0.305833334344849, 0.3052777792561469, 0.3055555561002178, 0.3063888906784936, 0.3061111128229069, 0.3058333349673202, 0.3061111128229069, 0.3055555571117335, 0.3047222235449735, 0.3044444456893868, 0.3030555564114535, 0.3030555564114535, 0.30277777855457, 0.3041666678338002, 0.3038888899717296, 0.3030555564114535, 0.3022222228446934, 0.3022222228446934, 0.3022222228446934, 0.3022222228446934, 0.3022222228446934, 0.3022222228446934, 0.3022222228446934, 0.3025000007002801, 0.3033333342670401, 0.3022222228446934, 0.3025000007002801, 0.3027777785558668, 0.3027777785558668, 0.3027777785558668, 0.3025000003112356, 0.3033333342670401, 0.3036111121226268, 0.3036111121226268, 0.3036111121226268, 0.3038888899782135, 0.3030555564114535, 0.3050000014005602, 0.3047222235449735, 0.3052777792561469, 0.3091666692343604, 0.8241668134920634, 0.8241668122802299, 0.8247223692032368, 0.8247223692032368, 0.8263890363367569, 0.8263890363367569, 0.8263888910675381, 0.8275001477591036, 0.8252779249144102, 0.8252779249144102, 0.8244445913476501, 0.8208334792250234, 0.3061111128229069, 0.3061111128229069, 0.3052777792561469, 0.3050000014005602, 0.3030555564114535, 0.3030555557889822, 0.3027777785500313, 0.3016666667444755, 0.3016666671335201, 0.3016666671335201, 0.3025000007002801, 0.3025000000778089, 0.3025000007002801, 0.3025000007002801, 0.3027777785558668, 0.3033333342670401, 0.3036111121226268, 0.3036111121154946, 0.3041666678338002, 0.3044444456809578, 0.3044444456893868, 0.3044444453781512, 0.3038888899782135, 0.3041666678279647, 0.303888889589169, 0.3052777786336756, 0.3055555571117335, 0.3050000014005602, 0.3050000014005602, 0.3058333349673202, 0.3058333344226579, 0.3188888941798942, 0.3188888889666977, 0.31944444552534, 0.3194444498910675, 0.3191666720354808, 0.3205555613036884, 0.3194444489969148, 0.3188888941798942, 0.3188888941798942, 0.3194444498910675, 0.3188888941798942, 0.3183333334111422, 0.3058333349673202, 0.3080555577938588, 0.3077777799454044, 0.307777779956427, 0.3075000021008403, 0.3066666685340803, 0.3063888906739549, 0.3061111128229069, 0.3066666685340803, 0.3058333349673202, 0.3055555571117335, 0.3052777787808645, 0.3050000014005602, 0.3030555564114535, 0.3027777785558668, 0.3025000002334267, 0.3033333342670401, 0.3027777785558668, 0.3030555564114535, 0.3027777785558668, 0.3022222228446934, 0.3022222228446934, 0.3025000007002801, 0.3025000006963897, 0.3025000007002801, 0.3025000007002801, 0.3027777785558668, 0.3027777785526248, 0.3027777785558668, 0.3033333342670401, 0.3036111121226268, 0.3044444456893868, 0.3044444456893868, 0.3044444456893868, 0.3052777792561469, 0.3058333349673202, 0.3061111128229069, 0.3055555571117335, 0.3055555571117335, 0.3083333356676003, 0.3080555578120136, 0.3080555578120136, 0.3083333356676003, 0.307777779956427, 0.3083333356676003, 0.3083333356676003, 0.3075000021008403, 0.3069444463896669, 0.3063888906784936, 0.3066666685340803, 0.3069444463896669, 0.3041666678338002, 0.3038888899782135, 0.3038888899782135, 0.3033333342670401, 0.3033333342670401, 0.3044444456893868, 0.3052777783224401, 0.3055555571117335, 0.3058333349673202, 0.3063888906784936, 0.3069444463896669, 0.3069444463896669, 0.3069444463896669, 0.3066666685340803, 0.3061111128229069, 0.3058333349673202, 0.3055555571117335, 0.3041666678338002, 0.3033333342625014, 0.3030555564114535, 0.3033333342670401, 0.3027777785558668, 0.3022222228446934, 0.3025000007002801, 0.3033333342670401, 0.3041666678338002, 0.3061111128229069, 0.3066666685340803, 0.3066666685340803, 0.3072222242452536, 0.3072222242452536, 0.307777779956427, 0.3080555578120136, 0.3091666692343604, 0.3105555585122938, 0.3105555577342048, 0.3105555576563958, 0.3111111142234671, 0.3094607864145658, 0.3091666692343604, 0.3100000028011204, 0.3102777806567071, 0.3105555585122938, 0.3097222249455337, 0.3097222249455337, 0.3083333356676003, 0.3066946788048553, 0.3063888906720097, 0.3061111128157747, 0.3052777792561469, 0.3047222228446934, 0.3050000014005602, 0.3044444456893868, 0.3038888899782135, 0.3041666678338002, 0.3044444456893868, 0.3047222235449735, 0.3047222235449735, 0.3044444456893868, 0.3041666678338002, 0.3038888899782135, 0.3033333342670401, 0.3033333342631498, 0.3041666678338002, 0.3038888899782135, 0.3036111121226268, 0.3033333342670401, 0.3030555564114535, 0.3019444449891067, 0.3025000007002801, 0.3041666678338002, 0.3047222235449735, 0.3050000014005602, 0.3050000014005602, 0.3052777792561469, 0.3055555571117335, 0.3061111128229069, 0.3063888906784936, 0.3061111128229069, 0.3069444463896669, 0.3080555578120136, 0.3075000021008403, 0.3061111128229069, 0.3058333349673202, 0.3052777785558668, 0.3063888906784936, 0.3061111120448179, 0.3052777792561469, 0.3047222235449735, 0.3041666671335201, 0.3052777792561469, 0.3047222235449735, 0.3036111121226268, 0.3038888899782135, 0.3036111121226268, 0.3036111121226268, 0.3036111121200333, 0.3027777785558668, 0.3030555564088599, 0.3025000007002801, 0.3025000007002801, 0.3027777785519764, 0.3022222228446934, 0.3019444449891067, 0.3025000007002801, 0.3025000007002801, 0.3027777782446312, 0.3030555564114535, 0.3030555564114535, 0.3041666678338002, 0.3050000014005602, 0.3050000014005602, 0.3052777792561469, 0.3075000021008403, 0.3072222242452536, 0.307777779956427, 0.308611113523187, 0.3083333356676003, 0.3080555578029362, 0.3080555578120136, 0.308611113523187, 0.3075000021008403, 0.3066666685340803, 0.3069444463896669, 0.3075000021008403, 0.3052777792561469, 0.3063888901331829, 0.3119444477902272, 0.3105555585122938, 0.3108333363678804, 0.3108333363678804, 0.3105555585122938, 0.3105555585122938, 0.3102777806567071, 0.3102777806567071, 0.3116666699346405, 0.3105789004046063, 0.3105555585122938, 0.3097222249280273, 0.3038888899782135, 0.3044444456893868, 0.3044444456893868, 0.3047222235449735, 0.3047222235449735, 0.3044444456893868, 0.3050000014005602, 0.3055555571117335, 0.3038888899782135, 0.3038888899782135, 0.3041666678338002, 0.3036111115779645, 0.3036111115779645, 0.3036111121226268, 0.3038888899782135, 0.3036111121226268, 0.3033333342670401, 0.3038888899782135, 0.3041666678338002, 0.3066666685340803, 0.3066666685340803, 0.3075000021008403, 0.307777779956427, 0.3083333356559294, 0.3088888913664543, 0.3088888913787737, 0.3083333356676003, 0.308611113523187, 0.3088888913787737, 0.3083590117491441, 0.3080555578120136, 0.3050000014005602, 0.3052777792561469, 0.3047222235449735, 0.3041666678338002, 0.3036111121226268, 0.3030555564114535, 0.3027777785558668, 0.3027777785558668, 0.3030555564114535, 0.3166666713352007, 0.3161111156240274, 0.3169444491907874, 0.3186111163243075, 0.3322222312480548, 0.3325000091036414, 0.3327777869592281, 0.3341666762371615, 0.3338888983815749, 0.3344444540927482, 0.3355555655150949, 0.3352777876595082, 0.3213888948801743, 0.3216666727357609, 0.3211111170245876, 0.3191666720354808, 0.3061111128229069, 0.3058333349673202, 0.3058333349673202, 0.3050000014005602, 0.3058333349673202, 0.3050000014005602, 0.3047222235449735, 0.3050000014005602, 0.3052777792561469, 0.3047222235449735, 0.3055555571117335, 0.3055555571117335, 0.3055555571117335, 0.3058333349673202, 0.3055555571117335, 0.3050000014005602, 0.3052777785558668, 0.3066666685340803, 0.3061111128229069, 0.3055555571117335, 0.3061111128229069, 0.3069444463896669, 0.3061111113445378, 0.307777779956427, 0.308611113523187, 0.3083333356676003, 0.3083333355119825, 0.3091666692343604, 0.3083333356520391, 0.3069444463896669, 0.3066666685340803, 0.307777779956427, 0.3069444463896669, 0.3058706819950202, 0.306944446377996, 0.3058333349673202, 0.3044444456893868, 0.3041666678338002, 0.3041666678299098, 0.3036111121226268, 0.3036111121226268, 0.3036111121226268, 0.3038888899782135, 0.3027777785558668, 0.3027777785558668, 0.3027777785558668, 0.3016666671335201, 0.3016666671335201, 0.3025000007002801, 0.3030555564114535, 0.3033333342670401, 0.3033333342670401, 0.3030555564114535, 0.3033333342670401, 0.3038888899782135, 0.3044444456893868, 0.3055555571117335, 0.3055555571117335, 0.3055555571117335, 0.3050000014005602, 0.3039075628643616, 0.3050000008558979, 0.3050000014005602, 0.3075000021008403, 0.3075000021008403, 0.307777779956427, 0.3072222242452536, 0.3066666685340803, 0.3066666685340803, 0.3066666685340803, 0.3080555578120136, 0.3083333356676003, 0.308055557804233, 0.3066666685237061, 0.3066666685340803, 0.3041666678338002, 0.3044444456893868, 0.3047222235449735, 0.3044444456893868, 0.3044444456893868, 0.3033333342670401, 0.3036111121226268, 0.3027777785558668, 0.3025000007002801, 0.3033333342670401, 0.3033333342670401, 0.3030555564114535, 0.3027777785558668, 0.3025000007002801, 0.3016666671335201, 0.3019444449891067, 0.3019444449891067, 0.3019444449891067, 0.3016666671335201, 0.3019444449891067, 0.30277777832244, 0.3022222228446934, 0.30222222237784, 0.3030555564114535, 0.3033333342670401, 0.3033333342670401, 0.3044444456887384, 0.3044444456893868, 0.3063888906784936, 0.3066666685340803, 0.3069444463896669, 0.3061111128229069, 0.3066666685288932, 0.3080555578120136, 0.3083333356539842, 0.3075000021008403, 0.307777779956427, 0.3088888913787737, 0.3077777786336756, 0.3100000028011204, 0.3088888913787737, 0.3088888913787737, 0.308611113523187, 0.3091666692343604, 0.307777779956427, 0.3063888906784936, 0.3063888906784936, 0.3066666685340803, 0.3066666685340803, 0.3063888906784936, 0.3063888906713614, 0.3041666678338002, 0.3033333342670401, 0.3036111121226268, 0.3036111121226268, 0.3030555564114535, 0.3033333342670401, 0.3030555564114535, 0.3030555564114535, 0.3030555564114535, 0.3044444456893868, 0.3047222235449735, 0.3050000014005602, 0.3052777792561469, 0.3052777792561469, 0.3055555571117335, 0.3069444463896669, 0.3069444463896669, 0.3069444456115779, 0.3075000021008403, 0.3075000021008403, 0.3083333356676003, 0.3075000021008403, 0.306388889589169, 0.3069444463896669, 0.3072222242452536, 0.3072222242452536, 0.3063888906784936, 0.3058333349673202, 0.3091666692343604, 0.3108333342670401, 0.3122222256458138, 0.3119444477902272, 0.3108333363678804, 0.3108333363678804, 0.3108333363639901, 0.3100000028011204, 0.3091666692343604, 0.3091666692343604, 0.3091666692343604, 0.3088888913787737, 0.3058333349673202, 0.3038888899717296, 0.3019444449891067, 0.3022222228446934, 0.3027777785558668, 0.3016666671335201, 0.3016666671335201, 0.3022222228446934, 0.3027777781668223, 0.3033333342670401, 0.3033333342670401, 0.3030555564114535, 0.3033333342670401, 0.3036111121226268, 0.3050000014005602, 0.3047222235449735, 0.3044444456893868, 0.3044444456893868, 0.3044444450669156, 0.3052777792561469, 0.3052777792490146, 0.3047222235449735, 0.3052777787114846, 0.3061111128229069, 0.3061111128229069, 0.3058333341892312, 0.3047222229225023, 0.3058333349673202, 0.3055555571117335, 0.3061111120448179, 0.3069444463818863, 0.3058333341892312, 0.3080555578120136, 0.3083333356676003, 0.3083333356591713, 0.3069654540927482, 0.3080555578120136, 0.3083333356539842, 0.308055557799046, 0.3075000021008403, 0.3077777793339558, 0.3077777799428109, 0.3069444463896669, 0.3069444463857766, 0.3041666678338002, 0.3041666678338002, 0.3038888899782135, 0.3038888899782135, 0.3030555564114535, 0.3030555564114535, 0.3030555564114535, 0.3025000007002801, 0.3022222228414515, 0.3016666671335201, 0.3016666671335201, 0.3013888892779334, 0.3025000007002801, 0.3025000007002801, 0.3022222228446934, 0.3025000007002801, 0.3025000007002801, 0.3027777779333955, 0.3036111121226268, 0.3038888898225957, 0.3044444456893868, 0.3044444456893868, 0.3047222235449735, 0.3050000014005602, 0.3047222235449735, 0.3047222235449735, 0.3052777788671024, 0.3058333338779956, 0.3055555571117335, 0.3069444459104942, 0.3063888906784936, 0.3063888906739549, 0.3061111124338624, 0.3066666672891379, 0.3080555578120136, 0.307777779956427, 0.307777779956427, 0.3077777794117647, 0.3077777799505915, 0.3080555578003427, 0.3080555578120136, 0.3061111128157747, 0.3063888906784936, 0.3061111128229069, 0.3061111128157747, 0.3055555571046013, 0.3055555571117335, 0.3063888906784936, 0.3055555571117335, 0.3088888913632124, 0.3130555592125739, 0.3119444477902272, 0.3116666699346405, 0.3130555592125739, 0.3127777813569872, 0.3133333370681606, 0.3136111149237472, 0.3138888927793339, 0.3125000035014005, 0.3116666699346405, 0.3127777813569872, 0.3097782454870837, 0.3052777792561469, 0.3052777792561469, 0.3058333349673202, 0.3044444456893868, 0.3041666678338002, 0.3044444456893868, 0.3041666678338002, 0.3041666678338002, 0.3041666678338002, 0.3041666678338002, 0.3033333342670401, 0.3030555563336445, 0.3041666678338002, 0.3044444456893868, 0.3050000014005602, 0.3052777792561469, 0.3058333349673202, 0.307777779956427, 0.307777779956427, 0.3075000021008403, 0.3080555578120136, 0.3100000028011204, 0.3100000028011204, 0.309463120586939, 0.309444447089947, 0.309444447089947, 0.3083333349673202, 0.3222222284469343, 0.3216666727357609, 0.3188888941798942, 0.3194444498910675, 0.3197222277466542, 0.3191666667444756, 0.3180555606131341, 0.3177777827575475, 0.3175000049019608, 0.3166666713352007, 0.3163888934796141, 0.3169444491538294, 0.3036111121226268, 0.3036111121226268, 0.3038888899782135, 0.3027941178804855, 0.3027777785558668, 0.3027777785493829, 0.3025000007002801, 0.3027777785558668, 0.3027777785558668, 0.3030555564114535, 0.3036111121226268, 0.3044444456893868, 0.3036111121226268, 0.3036111121226268, 0.3033333342670401, 0.3041666678338002, 0.3047222235449735, 0.3044444456893868, 0.3038888899782135, 0.3041666678338002, 0.3041666678338002, 0.3058333349673202, 0.3052777792561469, 0.3044444456893868, 0.3047222235449735, 0.3050000014005602, 0.3050000014005602, 0.3044444456893868, 0.3038888899782135, 0.3038888899782135, 0.3041666678338002, 0.303888889589169, 0.3047222235449735, 0.3027777785558668, 0.3027777785558668, 0.3030555564114535, 0.3030555564114535, 0.3027777785558668, 0.3030555564114535, 0.3036111121226268, 0.3036111121226268, 0.3036111121226268, 0.3038888899782135, 0.3036111121167913, 0.3030555564114535, 0.3036111121226268, 0.3055555571117335, 0.3047222235449735, 0.3044444456893868, 0.3044444456893868, 0.3041666678338002, 0.3033333342670401, 0.3036111121226268, 0.3036111121226268, 0.3030555564114535, 0.3030555564114535, 0.3036111121226268, 0.3033333342670401, 0.3013888892779334, 0.3019444449891067, 0.3019444449891067, 0.3022222228446934, 0.3022222228446934, 0.3025000007002801, 0.3022222228446934, 0.3030555564114535, 0.3036111121226268, 0.3041666678338002, 0.3033496735916589, 0.3036111121226268, 0.3036111121226268, 0.3033333342670401, 0.3033333342670401, 0.3033333342670401, 0.3041666678338002, 0.3044444456893868, 0.3058333349673202, 0.3050000014005602, 0.3052777792561469, 0.3050000014005602, 0.3058334183006536, 0.3061111961562403, 0.307222307578587, 0.307222307578587, 0.307222307578587, 0.307222307578587, 0.307222307578587, 0.3066667518674136, 0.3055556404450669, 0.3058334183006536, 0.3052778625894802, 0.3050000847338935, 0.3038888899782135, 0.3030718957360722, 0.3025000007002801, 0.3022222228446934, 0.3030555564114535, 0.3027777785558668, 0.3022222228446934, 0.3033333342670401, 0.3030555564114535, 0.3027777785558668, 0.3027777785558668, 0.3030555564114535, 0.3033333342670401, 0.3036111121226268, 0.3041666668222844, 0.3050000014005602, 0.3044444456893868, 0.3047222235449735, 0.3052777792561469, 0.3044444456893868, 0.3044444456893868, 0.3075000021008403, 0.308611113523187, 0.3091666692343604, 0.3091666692343604, 0.3088888896669779, 0.3086111135082741, 0.307777779956427, 0.3075000021008403, 0.3075000021008403, 0.3075000021008403, 0.3077777783224401, 0.308611113523187, 0.3058333349673202, 0.3044444456893868, 0.3038888899782135, 0.3041666678338002, 0.3041666678247228, 0.3036111121226268, 0.3038888899782135, 0.3041666678338002, 0.3044444456893868, 0.3036111121226268, 0.303055556405618, 0.3022222228446934, 0.3019444449891067, 0.3019444449891067, 0.3016666671335201, 0.3013888892779334, 0.3016666671335201, 0.3022222228446934, 0.3019444449891067, 0.3500000140056022, 0.352777792561469, 0.3530555704170557, 0.3530555704170557, 0.3538889039838157, 0.3541666818394024, 0.3544444596949891, 0.3547222375505758, 0.3547222375505758, 0.3544444596949891, 0.3538889039838157, 0.3544444596949891, 0.3027801121226268, 0.3030555557111734, 0.3033333342670401, 0.3033333342670401, 0.3033333342670401, 0.3033333342670401, 0.3033333342670401, 0.3030555564114535, 0.3027777785558668, 0.3027777785558668, 0.3033333342670401, 0.3027777785558668, 0.3030555558667911, 0.3036111121180881, 0.3030555564114535, 0.3030555564114535, 0.3022222228446934, 0.3022222224556489, 0.3027777785558668, 0.3030555564114535, 0.3030555564114535, 0.3016526619981325, 0.3010971062869592, 0.3010971062869592, 0.3008193284268338, 0.3002637727201991, 0.3005415505757858, 0.3013748841425459, 0.3013748841425459, 0.3010971062811237, 0.3008193284313725, 0.3008193278089013, 0.3013748841425459, 0.3027777785558668, 0.3033333342670401, 0.3036111121226268, 0.3038888899782135, 0.3041666678338002, 0.3038888899782135, 0.3038888899782135, 0.3038888899782135, 0.3024859955648926, 0.3019304398537192, 0.3016526619903519, 0.3010971062869592, 0.3010971062869592, 0.3005415505757858, 0.3002637727201991, 0.3002637727201991, 0.3008193284313725, 0.3010971062869592, 0.3002637727201991, 0.3091667528011204, 0.3108333363678804, 0.3111111142234671, 0.3111111142234671, 0.3127777813569872, 0.3150000042016807, 0.3150000042016807, 0.3150000042016807, 0.3150000042016807, 0.3138888927793339, 0.3136111149237472, 0.3138888927793339, 0.3052777792561469, 0.3050000014005602, 0.3052777792561469, 0.3052777792561469, 0.3041666678338002, 0.3019444449891067, 0.3019444449891067, 0.3019444449891067, 0.3016666671335201, 0.3022222228446934, 0.3025000007002801, 0.3022222228446934, 0.3019444449891067, 0.3022222228446934, 0.3016666671335201, 0.3016666671335201, 0.3011111114223467, 0.3011111114223467, 0.3013888892779334, 0.3016666671335201, 0.3016666671335201, 0.3019444449891067, 0.3016666671335201, 0.3016666671335201, 0.3022222228446934, 0.3036111121226268, 0.3036111121226268, 0.3036111121226268, 0.3066666685340803, 0.3066666685340803, 0.3069444463896669, 0.3080555578120136, 0.3083333356676003, 0.3075000021008403, 0.3075000021008403, 0.3075000013227513, 0.3116666699346405, 0.3100000028011204, 0.3100000028011204, 0.3100000028011204, 0.3072222242452536, 0.3072222242452536, 0.3066666685340803, 0.3058333349673202, 0.3055555571117335, 0.3055555571117335, 0.3061111128229069, 0.3061111128105876, 0.3063888906784936, 0.3069444463896669, 0.3072222242452536, 0.3072222242452536, 0.307777779956427, 0.308611113523187, 0.3088888913774769, 0.308611113523187, 0.3088888913787737, 0.3088888913787737, 0.3083333348895113, 0.3088888913787737, 0.3041666678338002, 0.3036111121226268, 0.3036111121226268, 0.3036111121226268, 0.3027777785558668, 0.3025000007002801, 0.3022222228446934, 0.3025000007002801, 0.3038888899782135, 0.3038888899782135, 0.3038888899730264, 0.3030672273576097, 0.3041666678338002, 0.3044444449112978, 0.3047222235449735, 0.3055555571117335, 0.3058333349673202, 0.3052777792561469, 0.3052777792561469, 0.3047222235449735, 0.3030555564114535, 0.3033333342670401, 0.3072222242452536, 0.3075000021008403, 0.3066666685340803, 0.3066666685230577, 0.3061111128229069, 0.3052777792561469, 0.3052777792561469, 0.3052777792561469, 0.3052777792561469, 0.3055555571117335, 0.3058333349673202, 0.3069444463896669, 0.3030555564114535, 0.3027777785558668, 0.3025000007002801, 0.3022222226112667, 0.3030555564114535, 0.3063888906784936, 0.3066666673669467, 0.3072222242452536, 0.3075000021008403, 0.3072222242452536, 0.3072222242452536, 0.3061111123560535, 0.3063888906784936, 0.3063888906784936, 0.3066666685340803, 0.3066666685237061, 0.3061111128229069, 0.3027777785558668, 0.3027777785526248, 0.3022222225334578, 0.3022222228446934, 0.3022222228446934, 0.30194444475568, 0.3030555564069148, 0.3033333342670401, 0.3036111121226268, 0.3041666678338002, 0.3044444449891067, 0.3047222235449735, 0.3052777792561469, 0.3058333349673202, 0.3058333349588912, 0.3058333349673202, 0.3072222233115468, 0.3313888975392956, 0.3308333419701214, 0.3305555633364457, 0.3322222236227824, 0.3319444533924681, 0.331666675527804, 0.331111119825708, 0.3308333419701214, 0.3297222305477746, 0.3305555641145347, 0.3308333419701214, 0.3308333419091731, 0.3066666685334319, 0.3058333338001867, 0.306944446377996, 0.3055555571058981, 0.3052777792561469, 0.3052777792561469, 0.3072222242452536, 0.3075000021008403, 0.307777779956427, 0.3072222242452536, 0.3069444463896669, 0.3055555571117335, 0.3066666685340803, 0.3075000020904661, 0.3061321205259881, 0.3061111128229069, 0.3058333349673202, 0.3063888906784936, 0.3047222235449735, 0.3041666678338002, 0.3041666678338002, 0.3038888896669779, 0.3038888899782135, 0.3038888899782135, 0.3030555564114535, 0.3027777785558668, 0.3027777785558668, 0.3025000007002801, 0.3025000007002801, 0.3022222228446934, 0.3025000007002801, 0.3038888899782135, 0.3036111115001556, 0.3041666674447557, 0.3044444456893868, 0.3047222235449735, 0.3044444456893868, 0.3038888899782135, 0.3036111121226268, 0.3050000014005602, 0.3050000014005602, 0.3061111128229069, 0.3186111163243075, 0.3183333347338935, 0.3186111163139333, 0.3188888941461781, 0.3186111163243075, 0.3186111163243075, 0.3194444498910675, 0.3194444498910675, 0.3255555627139744, 0.324722227902272, 0.3250000070028011, 0.3236111177248677, 0.3108333363678804, 0.3097222249267305, 0.3102777806567071, 0.3100000028011204, 0.3158333377684407, 0.315555559912854, 0.3147222258792406, 0.3161111156240274, 0.3100000028011204, 0.3100000027972301, 0.3097222249455337, 0.3102777806567071, 0.3105555585122938, 0.3111111142234671, 0.3105555585122938, 0.3102777806567071, 0.3047222235449735, 0.3050000014005602, 0.3050000013953731, 0.3050000014005602, 0.3072222236227824, 0.3069444463896669, 0.307500001556178, 0.3077777792561469, 0.3119444477902272, 0.3116666699346405, 0.3116666699346405, 0.3122222256458138, 0.3125000035014005, 0.3122222256458138, 0.3136111149237472, 0.3125000035014005, 0.3102777806392007, 0.3102777806567071, 0.3097222249280273, 0.3094444470737374, 0.3050000014005602, 0.3050000014005602, 0.3047222228446934, 0.3044444453781512, 0.3041666678338002, 0.3080555578120136, 0.3075000021008403, 0.3075000021008403, 0.3075000021008403, 0.3075000021008403, 0.307777779956427, 0.3075000021008403, 0.307777779956427, 0.3075000007002801, 0.3086111135179999, 0.3080555577983975, 0.307777779956427, 0.3038888899782135, 0.3030555564114535, 0.3027777785558668, 0.3030555564114535, 0.3050000014005602, 0.3047222235449735, 0.3050000014005602, 0.3047222235449735, 0.3052777792483662, 0.3052777792561469, 0.3055555571117335, 0.3058333349673202, 0.3058333349673202, 0.3063888906784936, 0.3066666685340803, 0.3066666685340803, 0.3044444454559601, 0.3050000014005602, 0.3047222235449735, 0.3050000014005602, 0.3044444456893868, 0.3041666678338002, 0.3041666678338002, 0.3036111121226268, 0.3038888899782135, 0.3038888899782135, 0.3038888899782135, 0.3036111121226268, 0.3036111121193849, 0.3041666678338002, 0.3038888899782135, 0.3038888899782135, 0.3038888899782135, 0.3033333342670401, 0.3030555559446, 0.3038888899782135, 0.3036111121226268, 0.3033333342670401, 0.3036111121226268, 0.3041666678338002, 0.3047222235449735, 0.3036111121226268, 0.3036111121226268, 0.3030555564114535, 0.3030555564114535, 0.3041666678338002, 0.3044444456848481, 0.3041666678338002, 0.3044444456893868, 0.3050000014005602, 0.3047222235449735, 0.3050000014005602, 0.3052777792561469, 0.3075000021008403, 0.3088888913787737, 0.3088888913787737, 0.3100000028011204, 0.308611113523187, 0.308611113523187, 0.3083730168845315, 0.3083333356676003, 0.3091666692343604, 0.309444447089947, 0.3088888913787737, 0.3080788997043261, 0.3061111128229069, 0.3055555571117335, 0.3066666685340803, 0.3069444457671957, 0.3075000021008403, 0.307777779956427, 0.3075000021008403, 0.3080555578120136, 0.3080835680827886, 0.3083333356676003, 0.3083333356676003, 0.3083333356676003, 0.3083333356676003, 0.307777779956427, 0.3069444463896669, 0.3058333349582428, 0.3052777792561469, 0.3052777787892934, 0.3052777792561469, 0.3050000014005602, 0.3030555564114535, 0.3030555564114535, 0.3033333342670401, 0.3036111121226268, 0.3036111121226268, 0.3036111121226268, 0.3050000014005602, 0.3061111128229069, 0.3072222242452536, 0.3072222242329343, 0.3069444463896669, 0.3072222242452536, 0.3075000021008403, 0.307777779956427, 0.307777779956427, 0.3091666692343604, 0.3108333363678804, 0.3113888920790538, 0.3097222249455337, 0.3083333356676003, 0.3072222242290514, 0.3066666685340803, 0.3072222242452536, 0.3069444463896669, 0.3066666685340803, 0.3066666685340803, 0.3063888906784936, 0.3047222235449735, 0.3038888899782135, 0.3041666678338002, 0.3047222235449735, 0.3052777792561469, 0.3058333349673202, 0.3069444463896669, 0.3066666685340803, 0.3063888906784936, 0.3066666685340803, 0.3061111128229069, 0.3058333349673202, 0.3055555571117335, 0.3047222235449735, 0.3036111121226268, 0.3030555564114535, 0.3022362279800809, 0.3019444449891067, 0.3011111114223467, 0.30083333356676, 0.30083333356676, 0.30083333356676, 0.30083333356676, 0.30083333356676, 0.30083333356676, 0.30083333356676, 0.3013888889666978, 0.3025000007002801, 0.3030555564114535, 0.3038888899782135, 0.3041666678338002, 0.3050000014005602, 0.3055555571117335, 0.3055555571117335, 0.3066666685340803, 0.3080555578120136, 0.308611113523187, 0.3088888913787737, 0.3086111135134612, 0.3080555578120136, 0.307777779956427, 0.3069444463896669, 0.3066666685340803, 0.3061111128229069, 0.3058333349673202, 0.3061111128229069, 0.3050000014005602, 0.303067226965296, 0.3038888899782135, 0.3041666672891379, 0.3052777792561469, 0.3047222235449735, 0.3052777792561469, 0.3061111128229069, 0.306417139273977, 0.3061111128229069, 0.3066666685340803, 0.3063888906784936, 0.3066666685340803, 0.3069444463838315, 0.3072222242452536, 0.3066666671296297, 0.3058333349673202, 0.3061111128229069, 0.3052777792561469, 0.304444445533769, 0.3050000014005602, 0.3058333349673202, 0.3058333349673202, 0.3066666685340803, 0.3063888906784936, 0.3061111128229069, 0.3058333349673202, 0.3061370073629312, 0.3058333349673202, 0.306111111967009, 0.3069444463896669, 0.3077777799454044, 0.3072222242452536, 0.3075000021008403, 0.3069444463896669, 0.3063888906784936, 0.3063888906784936, 0.3069444463896669, 0.3066666685340803, 0.3066666685340803, 0.3075000021008403, 0.3075000020937081, 0.3072222242452536, 0.3063888906784936, 0.3072222242452536, 0.3061111128229069, 0.3063888906784936, 0.3058333349673202, 0.3055555571117335, 0.3050000014005602, 0.3044444456893868, 0.3041666678338002, 0.3030555564114535, 0.3033380026455026, 0.3033333342670401, 0.3036111121226268, 0.3030555564114535, 0.3030555564114535, 0.3025211871468926, 0.3027777785558668, 0.3027777785558668, 0.3047222235449735, 0.3047222235449735, 0.3061111128229069, 0.3066666685340803, 0.3063888906784936, 0.3069444463896669, 0.3072222242452536, 0.3063888906784936, 0.3066666680672268, 0.3069444463896669, 0.3072222242452536, 0.3080555578120136, 0.3069750490347739, 0.3080555578120136, 0.3069444463969203, 0.3066666674447557, 0.3072222234671646, 0.3069444463896669, 0.3069444463896669, 0.3080555578120136, 0.3086111125000004, 0.3091666692343604, 0.3091666692343604, 0.3100000028011204, 0.309444447089947, 0.309444447089947, 0.3091666692468889, 0.3091666692246346, 0.3086440702068951, 0.3091666692343604, 0.3086111122782446, 0.3051828343612299, 0.3083333356578746, 0.3088888913787737, 0.3084133720096325, 0.3034938586802538, 0.3072222242452536, 0.3063888906784936, 0.3069444463896669, 0.3049859962651727, 0.3006980902723251, 0.3033050861463229, 0.3007983207256978, 0.2996872091503268, 0.3002427650171179, 0.2988538753501401, 0.2991316535947712, 0.2994117854954428, 0.2996872093059446, 0.3002427650171179, 0.2996872093059446, 0.3019234365079365, 0.3022012151416122, 0.3050000014005602, 0.3063888906784936, 0.3069444463786444, 0.3063888906784936, 0.306666667989418, 0.3063888906784936, 0.3058333349673202, 0.3052777781668223, 0.3047222235449735, 0.3050000014005602, 0.3050000010037351, 0.3055555571117335, 0.3058333349673202, 0.3044444456893868, 0.3038888899782135, 0.3036111121226268, 0.3036111121187365, 0.3047222235449735, 0.3055555571117335, 0.3055555571052497, 0.3052777792561469, 0.3049929980547775, 0.3036088007754876, 0.3022245570339247, 0.3027637734204793, 0.3027637734204793, 0.3024859955648926, 0.3027637734204793, 0.3024859955648926, 0.3013843003410403, 0.3005415505757858, 0.301082862912585, 0.2988538757391846, 0.299444527854334, 0.3005345480370122, 0.2965457595561333, 0.2999789922969187, 0.3002567701525054, 0.3002567701525054, 0.3002567701525054, 0.3005345480080921, 0.3002567701525054, 0.3005345480080921, 0.3025000006963897, 0.3022222228446934, 0.3019444449891067, 0.3022222228446934, 0.3027777785558668, 0.3027777785558668, 0.3030555564114535, 0.3033333342670401, 0.30333333356676, 0.3033333342670401, 0.3033333342670401, 0.3030555564114535, 0.3036111121226268, 0.3041666678338002, 0.3038888899782135, 0.303888889589169, 0.3036111121226268, 0.3038888899782135, 0.3038888899782135, 0.3047222235449735, 0.3047222230781201, 0.3055555571117335, 0.3055555571117335, 0.3055555571117335, 0.3050000014005602, 0.3047222235449735, 0.3047222235449735, 0.3047222235391381, 0.3047222235449735, 0.3055555571117335, 0.3047315603012501, 0.3044444456893868, 0.305277778400249, 0.3061111128229069, 0.3061111128229069, 0.3063888906784936, 0.3069444457671957, 0.308611113523187, 0.3088888913787737, 0.308611113523187, 0.3083333356676003, 0.3075000021008403, 0.3075000021008403, 0.3075000021008403, 0.3066666685275964, 0.3052777792561469, 0.3055555571117335, 0.3055555571117335, 0.3058333349562976, 0.3038888897447868, 0.3038888899782135, 0.3038888899782135, 0.3036111121226268, 0.3036111121226268, 0.3038888899782135, 0.3033333337223778, 0.3038888896669779, 0.3047222235449735, 0.3055555571117335, 0.3055555571117335, 0.3050000014005602, 0.3050000013940763, 0.3047222235449735, 0.3050000014005602, 0.3050000007002801, 0.3063888906784936, 0.3069444463896669, 0.3080555577996943, 0.3077777799499431, 0.3069444463896669, 0.3058333349673202, 0.3058333349673202, 0.3055555571117335, 0.3066666685340803, 0.3075000021008403, 0.3069444463896669, 0.3083333356546326, 0.308611113523187, 0.3083636801276065, 0.3080555578120136, 0.3075000007002801, 0.307777779956427, 0.307777779956427, 0.307777779956427, 0.307777779956427, 0.3072222242452536, 0.3063888906784936, 0.3072222242452536, 0.3066666685340803, 0.3047222235449735, 0.3038888899782135, 0.3041666672891379, 0.3175000048967736, 0.3166666713352007, 0.3180555606131341, 0.3180555606131341, 0.3186111163243075, 0.3186111163243075, 0.3191666720354808, 0.3181792726423902, 0.3188888941798942, 0.3188888941798942, 0.3188888941798942, 0.3180555605800664, 0.3050000014005602, 0.3050000014005602, 0.3041666678338002, 0.3038888899782135, 0.3030718957360722, 0.3041666678338002, 0.3052777792561469, 0.3052777792561469, 0.3041666678338002, 0.3044444451447246, 0.3052777792561469, 0.3052777792561469, 0.3055555564114534, 0.3061111128229069, 0.3058333349673202, 0.3061111128229069, 0.3061111128229069, 0.3050210091036414, 0.3039052293028322, 0.3050000014005602, 0.3050000014005602, 0.3047222235397864, 0.3038888899782135, 0.3038888899782135, 0.3036111116512347, 0.3033333342670401, 0.3030555564114535, 0.3027777785558668, 0.3038888899782135, 0.3033333342670401, 0.3036111118892001, 0.3033333342670401, 0.3033333341892312, 0.3038888899782135, 0.3038888893557422, 0.3047222235449735, 0.304444445682903, 0.3047222235449735, 0.3047222235449735, 0.3047222235449735, 0.303888889589169, 0.3041666678338002, 0.3038888894335512, 0.3033333342670401, 0.3033333337995383, 0.3036111121226268, 0.3036111121200333, 0.3033333342670401, 0.3038888899782135, 0.3036111121226268, 0.3044444456893868, 0.3047222235449735, 0.3044444456809578, 0.3044444456893868, 0.3063888906648775, 0.3063888906784936, 0.3066666685198158, 0.3058333349673202, 0.3058333349673202, 0.3052777792561469, 0.3047222235449735, 0.3047222235449735, 0.3038888899782135, 0.3036111121226268, 0.3038888899782135, 0.3038888899782135, 0.3022222228446934, 0.3019444449891067, 0.3019444449891067, 0.3019444449891067, 0.3033333342670401, 0.3033333342670401, 0.3033333342670401, 0.3036111121226268, 0.3041666678338002, 0.3044444456893868, 0.3044444453003423, 0.3047222235449735, 0.3038888899782135, 0.3041666678338002, 0.3080555578120136, 0.3080555578120136, 0.3069444463896669, 0.3075000021008403, 0.3080555578120136, 0.3083333356676003, 0.307777779956427, 0.307777779956427, 0.3075000020975983, 0.3072222242452536, 0.3080555578120136, 0.3080555578120136, 0.3038888899782135, 0.3041666678338002, 0.3041666678338002, 0.3039028951136009, 0.3038888899782135, 0.3030555559446, 0.3033333342670401, 0.3033333342670401, 0.3033333342670401, 0.3033333342670401, 0.3025000007002801, 0.3030555564114535, 0.3033333342670401, 0.3033333342670401, 0.3030555564114535, 0.3025000007002801, 0.3030555564114535, 0.3038888899736748, 0.3041666672113289, 0.3047222235449735, 0.3055555571117335, 0.3058333349673202, 0.3058333349673202, 0.3052777792561469, 0.3052777792561469, 0.3052777792561469, 0.3058333349673202, 0.3063888906784936, 0.3063888906784936, 0.3055555571117335, 0.3058333349569461, 0.3052777792561469, 0.3047222224556489, 0.3044444454559601, 0.3061111128229069, 0.3063888906784936, 0.3066666685340803, 0.3066666685340803, 0.3069444463896669, 0.3066666685340803, 0.3061111128229069, 0.3066666685340803, 0.3058333349673202, 0.3058333349673202, 0.3055555571026561, 0.3055555571078432, 0.3050000014005602, 0.3047222235449735, 0.3047222235449735, 0.3044444456893868, 0.3038888899782135, 0.3036111121226268, 0.3033333342670401, 0.3027777785558668, 0.3033333342670401, 0.3033333342670401, 0.3036111121226268, 0.3036111121226268, 0.3025000003890445, 0.3030555564114535, 0.3027777785558668, 0.3036111121226268, 0.3033333342670401, 0.3033333342670401, 0.3036111121226268, 0.3038888899782135, 0.3036251172580143, 0.3050000014005602, 0.3061111128222585, 0.3061111128229069, 0.3063888906733065, 0.3058333349673202, 0.3063888906784936, 0.3055555571117335, 0.3055555571117335, 0.3055555567226891, 0.3058333345004668, 0.3088888913787737, 0.3088888913787737, 0.3075000021008403, 0.3063888906784936, 0.3061111128229069, 0.3058333336445689, 0.3061111128229069, 0.3052777779333955, 0.3058333349673202, 0.3061111128229069, 0.3061111128099392, 0.3055555571000626, 0.3025163400248988, 0.3022222228446934, 0.3025000007002801, 0.3027777785558668, 0.3027777785558668, 0.3030555564069148, 0.3025000007002801, 0.3027777785519764, 0.3027777785558668, 0.302777778400249, 0.3033333342670401, 0.3038888899782135, 0.3033333337223778, 0.3041666678338002, 0.3041666678338002, 0.3038888899782135, 0.3038888899782135, 0.3038888899782135, 0.3038888899782135, 0.3041666678338002, 0.3041666674447557, 0.3052777792503114, 0.3052777792561469, 0.3047222235449735, 0.3063888906733065, 0.3058333349673202, 0.3055555571117335, 0.3058333349673202, 0.3066666685340803, 0.3063888906784936, 0.3069444463896669, 0.3066665826330767, 0.287130284016575, 0.2607392895386114, 0.2351856678674326, 0.2101916094212593, 0.1832407416441646, 0.1582486246637518, 0.1332597355889246, 0.1077138888729649, 0.0818922304286509, 0.0569383453060783, 0.0315022553005243, 0.0070833333333333, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null], [23.5380183401319, 23.357389521319643, 23.268815843137254, 22.939981505202173, 22.996245802638374, 22.699379477591037, 22.408662835595024, 22.44233507990456, 22.333434807111733, 22.45897141946779, 22.590059841036418, 22.370803333634843, 22.669486841503268, 22.68431266036415, 22.679063174214136, 22.62941452521008, 22.55303372307812, 22.65384490771864, 22.802425746709982, 22.712746643596976, 22.633444334811703, 22.679587484827263, 22.62004810980752, 22.712770955648924, 22.762745589402424, 22.85147217203548, 22.916579507314037, 22.94861878683344, 22.99272562869592, 22.71592924424214, 22.81342714122316, 22.870515024150198, 22.64111452387696, 22.53646207111733, 22.510248946331323, 22.010107820339243, 21.755539639974323, 21.726422588546534, 21.66771345168068, 21.424629156515557, 21.4263688749611, 21.050695769763458, 20.90810005882353, 21.25219285996084, 21.57149520953937, 21.976669171101776, 22.246579404531747, 22.448062868034807, 22.94867519374417, 23.5721960210084, 23.919154378546192, 24.477692797973106, 24.79518195525988, 25.10085551027077, 25.69641630411156, 25.71758411196701, 25.75792717164644, 25.69652360297061, 25.611118236073505, 25.58443107632729, 25.669725095860564, 25.460733824628548, 25.54820920927288, 25.65333729292848, 25.63332868938687, 25.85339895510426, 25.92640307812013, 25.746692294658423, 25.45574660559317, 25.17043806279633, 25.12878585192966, 24.84361623700591, 24.80908047167756, 24.33571772822907, 23.77061940522876, 23.081060208450044, 22.493803625739183, 21.878690570022176, 21.39632862605042, 21.21742170829443, 21.073229397992527, 20.89701463671024, 20.75460192802677, 20.353375725334576, 20.10321906146903, 20.28154596475257, 20.30491459103641, 20.312138141845622, 20.336380266651105, 20.142346113600997, 20.68567511546841, 20.910434990740743, 20.98910938849985, 20.969556684484903, 20.79332752545, 20.89112146444133, 22.335794238250852, 22.116593141456583, 22.119578903609696, 22.08159250015562, 22.02791454537232, 21.664176310301897, 23.095859092203547, 22.942781495720517, 22.692517713507623, 24.559265908583622, 24.51947902342048, 24.056622472398587, 22.84061954723, 22.550535869358857, 22.703644710625458, 22.648496535394862, 22.61937962733128, 22.10225179461264, 20.40052253034547, 20.359891007547464, 20.14185205298786, 18.631811785239652, 18.56967359220355, 18.488947602941177, 18.30373283348895, 18.58923011565905, 18.25853676758481, 18.25961324591568, 18.241951792561476, 18.306407954248364, 18.28049983636788, 18.21945878890445, 18.179750365079368, 18.13254279380641, 18.133614158318423, 17.93504236896981, 18.035525499688763, 18.125308422474223, 18.10648723186469, 18.187979237628383, 18.176991455493308, 18.12550433138811, 18.13060021016184, 18.212124449502024, 18.26542965678493, 18.27258185239652, 18.268681461470976, 18.364941978991595, 18.35538757461873, 18.383851936322504, 18.520478922346715, 18.673854313414253, 18.362434994086524, 17.87490234749455, 17.524001122565885, 17.19599519810146, 16.79216718215064, 16.49146203446286, 16.11119085702874, 15.627603070961715, 15.2486277237784, 14.987001350762526, 14.513047167989418, 14.06655023583878, 14.046745162854034, 14.051653019452225, 13.95965954956427, 14.073323201213816, 14.100887742997198, 14.006102694366636, 14.236953042405853, 14.11762613488173, 14.320747622938065, 14.23603012877373, 14.285566500778089, 14.394144748910676, 14.447431386632427, 14.434204312402738, 14.552301896669778, 14.487218274343162, 14.325420838624336, 14.70786117454104, 14.700872174421647, 14.62725057089948, 14.5623320235663, 14.727128170937515, 14.810937544216682, 14.747120274090834, 14.770982114047102, 14.743777250464916, 14.863214512142283, 14.915178866676404, 14.93542192419045, 14.66129796540488, 14.53961395624546, 14.585254813114988, 14.793382767165864, 14.707064435232342, 14.657898246558313, 14.670830278341526, 14.90126203850676, 15.182455803503744, 15.249143412965587, 15.422646617902238, 15.682693169324258, 16.11770265655564, 16.22737584500467, 16.310658708527853, 16.10942382998755, 16.086082803218048, 16.097402946700903, 16.158329731990484, 15.91465320245876, 15.606333325241208, 15.65168806940554, 15.690033667832502, 15.351345517351383, 15.181956768829751, 15.11488973319328, 15.014514937752878, 15.138935713585433, 15.255125583800188, 15.292739641145351, 15.283616820432618, 15.3121934484127, 15.209442576875194, 15.234288202769996, 15.367389554077189, 15.608283671101775, 15.65037047798008, 15.748611801198257, 15.666489788048551, 15.634720408418923, 15.722823828820417, 15.856227513998476, 15.851952499704977, 15.81813197821351, 15.881134943666355, 16.022462759553495, 16.24930649992219, 16.216596108309993, 16.341427296918766, 16.428713335823222, 16.726282052754435, 16.90609522812917, 17.086054701680673, 17.181453901571743, 17.32003973661687, 17.57861600163399, 17.66100656254929, 17.770233596402633, 17.902827021164025, 18.08648486749144, 18.185649218005636, 18.25778711352319, 18.44743280431061, 19.00402675302353, 19.12364136445689, 19.197957730859013, 19.71734901182696, 19.73784851890756, 20.00539731707127, 20.21353681838685, 20.343007430594454, 20.31462740795207, 20.367451887383304, 20.25838330111915, 19.888149152272018, 19.51655504455598, 19.43437270104006, 19.246188311749798, 18.80838049533082, 18.65011762254902, 18.17960326591711, 17.99144761249482, 17.605551878462496, 17.31277784858388, 17.07573986929347, 16.952691105353253, 16.68973164363523, 16.46723638886036, 16.4001211826953, 16.388064407329598, 16.158787966153128, 16.05646768143075, 16.041384371459692, 15.888641795751631, 15.9820489891742, 16.154138443043887, 16.187154278887203, 16.23073604590725, 16.559701584138008, 16.615966479675016, 16.815095568172275, 16.94080506162011, 17.00885385410831, 17.061869551602232, 16.95623051984127, 16.977903966075317, 17.158768259726113, 17.400108132664176, 17.490046855119825, 17.637251957961155, 17.555273477746653, 17.597348444288826, 17.59259585200747, 17.454516961251166, 17.571125293028324, 17.737740396348816, 17.68277330088842, 17.914913797057526, 18.004005902255813, 17.778541111033306, 17.89732513319652, 17.78952148941799, 17.78428611321195, 17.87053722961407, 17.867873678182384, 17.92304416511049, 17.870035212712033, 17.749216561157795, 17.624031465841902, 17.38565835823218, 17.528228342433092, 17.440180393090568, 17.38462654660753, 17.459318554809894, 17.327806167247644, 17.364843766585622, 17.708286815336788, 17.69510033442266, 18.102456000389047, 18.360619000233427, 18.62061647321817, 18.53646162970744, 18.39960127684407, 18.33426730835668, 18.34132161126673, 18.30117914254591, 18.18595014028945, 18.108857195689385, 17.94182776188856, 17.882552126261153, 17.498861851462806, 17.31118588655462, 17.262173602318704, 17.332729128618112, 17.476356160441956, 17.610819536959234, 17.709505306644882, 17.89875579551821, 18.08575191192032, 18.15150605796763, 18.268247038671024, 18.40576131395892, 18.48681876268285, 18.48748637636166, 18.494932483737937, 18.415324918322053, 18.323856481325866, 18.067712628953345, 17.995350379785247, 17.73382095883909, 17.47570275132275, 17.196746167444754, 16.98342868962029, 16.746042108699033, 16.56622768277311, 16.763064502645502, 16.748634596638656, 16.63218734850218, 16.668515341736697, 16.83468926268285, 16.60361253944911, 16.49576991557734, 16.367336997121072, 16.407808456582632, 16.443274589713663, 16.431773051509495, 16.357105079598508, 15.960161715608466, 15.532273992296918, 15.405201168767508, 15.32857242981637, 15.080412575708062, 15.117235484827267, 15.075769528478055, 15.214762324835306, 15.233233121107617, 15.268792413151656, 15.323713103096797, 15.411859800964832, 15.491320551820726, 15.50156891853408, 15.657245932461873, 16.037697941954562, 16.18358741044196, 16.327049333800186, 16.4382793059446, 16.222192004979767, 16.15897777902272, 16.35899126906318, 16.359995006691566, 16.398141747821352, 16.415319483660134, 16.42486235496421, 16.46069121537504, 16.25301027754435, 16.263064477201993, 16.30130925160611, 16.309761631497043, 16.553300446234047, 16.753396205536102, 16.53175989021164, 16.530653445611577, 16.64148681037971, 16.626981524743883, 16.589159809757234, 16.555616581543728, 16.605513397759108, 16.49376736181139, 16.414845774581778, 16.38477325793651, 16.098048617569248, 16.00685134765017, 16.147880248210395, 16.07243542328042, 15.949752117413633, 15.895809612900717, 15.845030626283846, 15.798681201503008, 15.708337692187987, 15.740517860934098, 15.70106873669468, 15.668237198332946, 15.574192549253032, 15.5762932456427, 15.598230177481456, 15.475027449346406, 15.329474129162776, 15.20755320059135, 15.02337795883909, 14.856881687830688, 14.800158133597884, 14.676238707205105, 14.523068076719577, 14.372478281045751, 14.23572152482104, 14.091333161764704, 13.983261682850918, 13.919345517195769, 13.970192722689076, 13.96204381512605, 13.925219717942731, 13.957866781355042, 13.999492568646255, 14.026570139511362, 14.266999670712728, 14.28331145277, 14.326989089324618, 14.28333341239496, 14.257534272408964, 14.265251287970749, 14.264735489417989, 14.38977987457205, 14.44960339659197, 14.72227147852474, 15.190015611500158, 15.29631024844382, 15.34170125225646, 15.70254624657641, 15.900600192265795, 16.078305558979146, 16.20625324704326, 16.282555754643248, 16.55926440328354, 16.63820226898537, 16.83791170821662, 16.79594317849362, 16.62160344794455, 16.444070609514394, 16.595334565613655, 16.52284525356754, 16.627385790194133, 16.7096849440554, 16.920282486539058, 17.0871451765484, 17.10628149782135, 17.17643791713352, 17.251898052054155, 17.228385055399936, 17.34684185846561, 17.501953896317048, 17.41022964345692, 17.53887022019919, 17.527780333333332, 17.564475056116432, 17.484418878073452, 17.670315287442293, 17.715000091503267, 17.767481420483843, 17.385861664346667, 17.28300920175848, 17.354383810535325, 17.183667980469966, 17.21065109508248, 16.836047765639588, 16.593391837223777, 16.43154094498327, 16.33026126276066, 16.05002602699969, 15.854347360799876, 15.65768996661998, 15.908867967475878, 16.21265203244631, 16.40871126397578, 16.802233848039215, 17.21387256232493, 17.760004925925926, 18.091620407670664, 18.321536422502334, 18.63568407648615, 19.06129753384623, 19.45184686048864, 19.63656205291005, 19.170878241907875, 18.81436071576408, 18.8610858517721, 18.60751020222533, 18.26490919667868, 18.12257552636296, 17.80618395518207, 17.770175381886087, 17.533027661404198, 17.039514138499843, 16.505524814737004, 16.283297895238743, 16.262427221988798, 16.31440729170557, 16.01516668681917, 15.75962980804544, 15.493819566249748, 15.213378437752878, 14.986890931216932, 14.830084391767818, 14.833579924387903, 14.793638446156242, 15.005158193277314, 15.106229585589796, 15.233914898413348, 15.370112357939758, 15.463683047852475, 15.504992512293803, 15.65540111118892, 15.623650404917525, 15.672234331076874, 15.713324427170868, 15.718456442421417, 15.720986784906122, 15.718636167055712, 15.980424228291318, 16.081624907878965, 16.189542877139743, 16.43556233006536, 16.799343763927794, 17.073323933162154, 17.464446945066914, 17.540796137021474, 18.02229239363329, 18.783845007236227, 19.079122683913013, 19.49527611087769, 19.49080831100218, 19.3657800716432, 19.258387184546507, 19.161699904057738, 18.816074241818395, 18.492381250904536, 18.2132075052132, 18.013202938141923, 17.59339441977902, 16.952225294117646, 16.645698685574228, 16.426447992452538, 16.185509553524746, 16.034614943030917, 16.061536107998755, 16.041243663665192, 15.973529078275751, 15.87049923023654, 15.79696272167756, 15.631083239573607, 15.61086867421413, 15.60190184765017, 15.598449481321325, 15.281514421646436, 15.252354750544663, 15.260527859632742, 15.17468260838261, 15.146512106598196, 15.223998096794274, 15.405678846483038, 15.55718201563959, 15.540000150404603, 15.648576232570806, 15.681943963040773, 15.689588109554936, 15.841787773415296, 15.863568794195457, 15.770082041238716, 15.666877124727668, 15.698178742608157, 15.52973950638033, 15.502035111733582, 15.350377711251168, 15.2534293872549, 15.266351903906006, 15.369261936274508, 15.370354327419856, 15.2448982167756, 15.401166447868036, 15.69966655454404, 15.915310553843758, 16.025316962651726, 16.06788725645814, 16.215090867798786, 16.27575127692188, 16.415747072664434, 17.018253178182384, 17.579675651416125, 17.874797216308746, 17.983604235371928, 18.038664217705417, 17.81946106792717, 17.72104587029256, 17.720140212418304, 17.955100419545598, 18.17699617421413, 18.358543802832244, 18.46426952823231, 17.97209392704897, 17.347124329520696, 17.122266661220046, 17.226095762371614, 17.047886897447867, 16.892108213585434, 16.89628894459163, 17.117297000903886, 17.097333707127298, 16.96330754368817, 16.74745190367258, 16.521907270852786, 16.486627158418923, 16.54433461554622, 16.560123625661376, 16.405139625038906, 16.445968278925466, 16.41913883818926, 16.37867191503268, 16.124678843837533, 15.850716126053094, 15.700221195110364, 15.644768581310304, 15.383749028166822, 15.381445071661997, 15.42852657217554, 15.402644225044098, 15.306971930438843, 15.247184396578303, 15.155835788281978, 15.09680705096483, 15.171052052365392, 15.156939044743364, 15.087128324385311, 15.078769304466231, 15.245403994475568, 15.09664813165266, 15.023963047209904, 14.921898091581076, 14.90503534827264, 14.799453180886244, 14.612612183933113, 14.6335318881108, 14.654716868164492, 14.669292094070965, 14.628372172424529, 14.651516459433036, 14.57599940429505, 14.61908511476813, 14.634093605119826, 14.661315901493932, 14.743281144491128, 14.746098770697168, 14.685177694833488, 14.715621075241208, 14.849053739651415, 15.087798063881106, 15.031143191487706, 14.966673118419315, 14.852241003321147, 14.798060576019296, 14.809123853572151, 14.78178251034858, 14.692882133286648, 14.714686606131345, 14.773534400051224, 14.684698969032056, 14.556985788631472, 14.288122514628071, 14.397044112433862, 14.498141245876129, 14.49291818899782, 14.55601103540305, 14.846110553861926, 14.872555210862124, 14.935489406419237, 14.915281927637723, 14.893522753112354, 14.906459278478057, 14.938517171179583, 14.985734556956116, 14.96522821747588, 14.872723499968878, 14.7573953208061, 14.94340373288204, 14.974221368191722, 14.955251352163089, 15.010074089480238, 15.133965365234983, 15.145560598895113, 15.13371421514161, 15.198239478745208, 15.202585877217556, 15.240113241752256, 15.231768818082788, 15.211956453392467, 15.040068073840644, 14.992051262994089, 15.150281953544845, 15.132146783769066, 15.18906319460006, 15.248798036336757, 15.361340027310924, 15.524170984360412, 15.568458730092308, 15.846225197556802, 16.02682505111526, 16.098830719576718, 16.2378574851385, 16.261857628929352, 16.27128128898226, 16.377957321505736, 16.420174827030813, 16.43854125427949, 16.70003072222222, 17.005910062636165, 17.16557732340492, 17.450308223609166, 17.731914029333957, 17.97672074618736, 18.390474329598504, 18.681141910997, 18.791725573218176, 18.86769657928727, 19.04945197799241, 19.26416916744476, 19.13361162198231, 19.110714848817302, 19.207346530189856, 19.20047976976346, 19.51423327940074, 19.404806922107404, 19.47906406792586, 19.69812580376595, 19.90092931862745, 20.109514775443508, 20.425586313025214, 21.021242071739803, 21.74920241635543, 22.235264738717717, 22.64040728018985, 23.26668901976346, 23.795178825630256, 24.709016013600348, 25.43833229502801, 26.11786167186949, 27.059839071039526, 27.993205348751825, 28.749416867413636, 29.06173681926937, 29.773258652269423, 30.83644144459812, 31.410011961981013, 31.769994183938945, 31.989966322572364, 32.26142645778769, 32.55679153060397, 32.973689854745565, 33.189262064120896, 33.20240304901961, 33.20557410768752, 33.19889843767507, 33.17716680711173, 32.78121077163088, 32.564355257080614, 32.93027923700591, 33.04148810473078, 32.8951078523187, 32.99450799545013, 32.81374304371628, 32.431658634220355, 32.400403036414566, 32.252340595980925, 32.065691096137435, 31.650745222839504, 31.720269744786805, 31.823880807166848, 31.440519081777158, 31.224602276221603, 30.937058920400844, 30.772138255291004, 30.726599846716464, 30.595636272752625, 30.558166609477126, 30.479116560036704, 30.28330779853053, 30.33163456255836, 30.615915914721445, 30.588359963641203, 30.498406957127298, 30.516700230536102, 30.505268656073632, 30.32789038873327, 30.277979428493623, 30.400465487239344, 30.24150334866168, 30.27733797798008, 30.29594105582984, 30.06757021179583, 29.804676327108627, 29.45662338087457, 29.214162956642937, 28.70042566549953, 28.237357791549957, 28.11168589090609, 27.82013086881419, 27.53702039017598, 27.3451365445845, 27.485485942265804, 27.65553461348558, 28.01323121700902, 28.18600695883909, 28.646819783182902, 28.83593186150016, 29.348535292472647, 29.25151784926665, 29.474125265795205, 29.60759641201057, 29.432337548460684, 29.608086663320886, 29.56212051844071, 29.434402490770218, 29.060028194366637, 28.87585752116402, 28.45873295051354, 28.792743662386528, 28.55373279092748, 29.00636129738562, 28.976634260037347, 28.81584793803105, 28.894587794973543, 28.522652460550887, 28.03485812488328, 27.40223411639305, 27.166578246109555, 26.709164447478997, 26.403464883597884, 25.55895536609088, 25.21119530220977, 24.806440447478987, 25.91494884726048, 25.980338220743857, 26.041594415343912, 25.951413630174297, 26.227453593059447, 26.006307615896684, 26.0092347788671, 26.403632341036417, 26.393713913320884, 26.389473628695924, 26.143746286094903, 25.77494673366013, 24.21538290437286, 24.09425459895153, 23.798523497043263, 23.70856865323232, 23.299534783136867, 23.39024333721016, 23.21215229310613, 22.72140170697168, 22.582566474004047, 22.77749219428818, 22.873673390756306, 22.89814718261749, 23.216590089246807, 23.705660170168077, 23.73833490343915, 24.043440388888893, 24.18317898350451, 24.318609383364453, 24.76599234609399, 25.12880209648304, 25.40734132321818, 25.60373445985061, 25.836232667055715, 26.14818690507314, 25.95445203742608, 25.87067245238095, 26.123975441721136, 26.282607461951446, 26.31565610605353, 25.968282491679638, 25.480252263538745, 25.511302075319016, 25.421087703625894, 25.76902197672024, 25.885784336912543, 26.196470829754123, 26.451391737784, 26.630917292794894, 26.81401835309679, 26.888443286948853, 26.96231807306256, 27.267618908263305, 27.61072190748521, 27.7286001185477, 27.74446744467787, 27.25320709554933, 27.15641471992751, 26.67077044130097, 26.434505236150013, 26.261954549719885, 26.19226040154581, 26.13041057490923, 26.331005697478997, 26.369178663466776, 26.50211270199191, 26.650698245183637, 26.61661775041304, 26.532815461888564, 26.79572638219732, 26.535007578275756, 26.46291102077497, 26.43929588383131, 26.270172879318395, 25.89311387745098, 25.608538058431243, 25.620189251478365, 25.38174638600996, 25.12598956781629, 25.101792664332404, 24.82283029474012, 24.25847992102397, 24.040694321739807, 23.69115562558357, 23.350533907796454, 22.98731426260504, 22.8328205532777, 22.770799843602816, 22.33554658123249, 21.830948051431683, 21.448107726112667, 21.279513251945225, 21.10123364301276, 20.96717645985061, 20.875709763227512, 20.83770101984127, 20.72934744382197, 20.594727933784625, 20.477986305555557, 20.169036888655462, 19.98955218487395, 20.059402798474945, 20.164405442574445, 19.956305653516317, 19.975654281275293, 19.97008723031435, 19.933301007236228, 19.9442369921413, 19.9511490865235, 19.959291025550502, 19.91291386157797, 19.96172582485217, 20.000084224129186, 20.278686038021743, 20.437832404061627, 20.43558690343915, 20.448247809290383, 20.46077348957361, 20.233810033457825, 20.222442153205726, 20.42001500108932, 20.447241901182696, 20.498401980158736, 20.48811486266016, 20.36997232431078, 19.976403082286154, 19.86483036305504, 19.919713669312173, 19.84819341674448, 19.57150396864301, 19.363896251556177, 19.028394152738876, 18.897001242794897, 18.521380420090257, 18.133432296062868, 17.822358538671022, 17.517497930672267, 17.207532949346405, 16.957552285792094, 16.731447401104887, 16.556718878462497, 16.59303906154684, 16.718886959060846, 16.81228780577797, 16.664430394880174, 16.778597093059446, 16.978597149393092, 17.05118108504513, 17.14220602194211, 17.39855783208839, 17.400653796299565, 17.34431789145658, 17.494063877450984, 17.52918054088534, 17.420908376828507, 17.44246066409897, 17.525604701914098, 17.570056150326796, 17.86825891028634, 18.005315368625507, 18.18995107213923, 18.4088239429343, 18.617505127061936, 18.842515046218487, 19.263331666822285, 19.551475931995014, 19.541139697012134, 19.65832458884869, 19.97064510690943, 20.03717191924474, 19.93434050303065, 20.00330613422036, 19.981615828742605, 20.190996835823217, 20.36564734635142, 20.6132311940554, 20.676109911064422, 20.94052394631186, 21.439501355735167, 21.960808318394022, 22.481903985851105, 22.857524504519464, 23.186493287121337, 23.61517870999845, 23.91668842989418, 24.59316130656707, 25.085482639074343, 25.19984824400872, 25.451920896747588, 25.519807628384687, 25.588329330143164, 25.554005743554185, 25.471491799097414, 25.571923084403217, 25.364072238795515, 25.20865015351697, 24.93711550407552, 24.82527328384687, 25.21181075941488, 25.32787236749144, 24.96729382306256, 24.63421415213261, 24.334472743152816, 24.19373962947401, 23.75807491853408, 23.625886383131032, 24.014952729952544, 24.00944352139745, 23.580976325651005, 23.17475728902673, 22.43532511417509, 22.204097958216625, 22.39744307237667, 22.591047346865608, 22.698181852285, 22.745950785636477, 23.24459792943706, 23.656749316760035, 23.658584054621848, 24.12813915445067, 24.36375965950825, 24.78353507194082, 25.12268666290981, 25.085812129629637, 25.23598502446443, 25.325377428882664, 25.564766953003424, 25.974440678899523, 26.38754225443511, 26.510116477902272, 26.78240689845939, 26.76557041993464, 27.15221842125739, 27.419783081854963, 27.946232512506487, 28.7946246249611, 29.388562662464984, 29.94358431761594, 30.08103908737939, 30.57149408698321, 30.5283626330068, 30.56755206434796, 30.62679586756925, 30.64193178092192, 30.5567700804544, 30.479267346675613, 30.54329216503268, 30.509883570494868, 30.618201059056958, 30.45508942857143, 30.011720607595443, 29.87862064659197, 30.59219096012164, 31.73354710668316, 32.019382757697244, 32.22754606014629, 32.48804694824476, 32.63635160784313, 32.88723250124494, 32.85795652340872, 32.919350689231244, 33.35333035161843, 33.90265011227824, 34.056809855742294, 33.24224248373794, 32.53515373397137, 32.82248973498288, 34.21435230516651, 33.91807258629007, 33.735593587223775, 33.52183890686275, 33.54529280118011, 33.12434497136632, 32.611457956114485, 32.116004059446, 31.807449104730782, 31.289580983815757, 30.78913528983816, 29.614144377172813, 28.190217020774977, 28.02489521949891, 27.76153154682956, 27.362771701715687, 26.991403717398068, 26.86024120782757, 26.880700437675067, 26.823070086679117, 26.686615413202876, 27.236776528089013, 27.50601366546777, 27.62081953750389, 27.512846000022243, 27.47249334228136, 27.90801155139537, 28.47615827871148, 28.51432828089014, 29.21949190320573, 29.067498563492062, 28.87276192763772, 28.70546968464052, 28.16855309928416, 27.97691472766885, 28.591440816682223, 28.715423321195143, 28.29346682531901, 27.61820774766573, 27.016562680899227, 26.412459045653737, 25.766095559679425, 25.581918633597883, 25.16298570540772, 25.311508297852477, 25.398032963660008, 25.276768924214128, 24.689459512527232, 25.269436989340186, 25.24792026975568, 25.35831015631808, 25.61857822004357, 25.750095621926548, 25.27748366098662, 25.255781864049705, 25.18302099276377, 24.835812499922188, 24.918066714207903, 24.91586784387515, 24.88867043565204, 25.70605955808629, 25.445408607142856, 25.25468284399315, 25.17575837830688, 25.18513982010582, 25.258629576252726, 25.263928399004044, 25.323148217086832, 25.333912258376778, 25.135262723622784, 25.02431797043262, 23.612715666577188, 22.85760661031864, 22.922547051809705, 22.8774046171024, 22.652503722290305, 22.401606914488017, 22.26502660239456, 22.32714655625584, 22.387796763071893, 22.35381677598493, 22.38392953888824, 22.811565393946477, 23.09388277256458, 23.10053521503917, 22.914239207049487, 22.944372106364767, 23.15077876509493, 23.123376795518208, 23.225393870116847, 23.072129597494552, 22.81564460270775, 22.86277113313103, 22.943964512760655, 22.926805703548087, 22.92937983649497, 23.089445936430128, 23.370840708450046, 23.391433431216928, 23.3111405332244, 23.366839508246446, 24.10499835278556, 24.31882015289449, 24.3870585226252, 24.38753996904005, 24.517234249267556, 24.325075801738954, 24.687793682128422, 25.47908593727367, 25.21558139130548, 25.26957781401605, 25.262871151501805, 25.333716180317023, 25.326584674186293, 25.50766781442448, 25.52471327748616, 25.33654783815748, 25.060743858131683, 24.96427536118892, 24.461259098566373, 24.90557273188965, 24.71550791418309, 24.536728908284104, 24.50635198361225, 24.45803344289115, 23.24551880756653, 23.42862585413127, 23.25137864634428, 23.181662160519764, 23.14445545525988, 23.02076007492997, 21.885418150054463, 21.21142921084839, 21.29496768230625, 21.34292514954871, 21.477789787270464, 21.39982117534949, 21.35554027046374, 21.22427513764395, 21.225166019996887, 21.3851657605042, 21.565608037348277, 21.55815449875506, 21.511634945767195, 22.946023695144724, 23.38009376128229, 23.34366491204157, 23.304942677559914, 23.208423385678454, 23.202599576641767, 23.251574653805505, 23.06268213976944, 22.887974235527544, 23.073434375505755, 23.19899299194842, 23.224506545284783, 21.361408347442037, 21.18108317958294, 21.18762625692499, 21.14955195253657, 21.16792093196455, 21.13733292086835, 22.75121043905863, 23.28241296887644, 23.40764489180606, 23.103655860644256, 23.052589318914706, 23.06200139343609, 23.0999872386399, 23.09398738743096, 23.199167084344847, 23.374435024129998, 23.554076977746657, 23.735835183006536, 22.577909623560533, 22.825186956037967, 22.855674838157483, 23.12121268425148, 23.31838169366636, 23.413904216464367, 24.838906305866796, 24.9648228350354, 25.118886792417825, 25.75294589982969, 26.167949074632265, 27.03153170880019, 26.864453863624878, 26.96641941050338, 27.46767503566382, 28.339753413771533, 28.91722045523639, 29.477307424491823, 28.756523955581414, 29.52839253944911, 30.280131174068888, 30.48000371093993, 30.4813942612993, 30.637027458470147, 30.943985611111117, 31.38873802684407, 31.48310492180205, 31.75777706473701, 31.909079699089247, 32.52370630929039, 32.98922399447557, 33.16915799998055, 33.22850622035481, 33.51534291526611, 33.87542645560614, 33.88370892973856, 33.9189176457257, 34.33158321389073, 34.547507192654834, 35.37345678664799, 35.42830804418405, 35.1102102900816, 35.14059424110869, 34.84341797922502, 34.92129794436664, 34.798564501711795, 34.82602494871485, 35.104603028944915, 35.37098345549072, 35.24642223054777, 35.30936057438531, 34.631572671490815, 34.78088025295674, 34.79945625661376, 34.73321384998444, 34.600926962029256, 34.410513766532446, 34.32849877443199, 33.90482053882081, 33.567321396436355, 33.14907183138357, 32.759925425225646, 32.66883108224271, 32.524566709928415, 32.06736394911298, 32.08000787768441, 32.09490073263395, 32.69528579009664, 33.073221859554934, 33.68107136834345, 34.16277307586368, 34.788645898770625, 35.574675258257635, 36.04639211647992, 36.20971321451914, 36.56912727832243, 37.11925819864613, 37.25805187457205, 37.12396165555831, 36.70725329343451, 36.40886343339558, 36.80780713192684, 37.74236273184524, 37.83080568407122, 37.37112884321506, 36.96099353016327, 36.85392457578587, 36.96127771840959, 36.84573492267289, 36.51729209220355, 36.586494170817296, 36.54432606356987, 36.36290190689387, 35.23662997939038, 34.00519384158497, 33.14406893529961, 32.95735541892312, 32.936792892918135, 32.49934187044818, 32.41059422300031, 32.07598394281046, 32.0542850445845, 31.91980788867191, 31.32355331083792, 31.30784100775211, 31.388180855620423, 31.426915526795263, 31.425585112763024, 31.06626831723817, 30.773216821195145, 30.545681818160595, 30.31051249789916, 30.1197043982707, 29.93709470269681, 29.6754685750302, 29.69762855664488, 29.581795163243072, 29.46113071825397, 29.199384219421106, 28.99035810962087, 28.876298672890737, 28.86006087099284, 28.61194230303802, 28.34497040981948, 28.08201274089636, 28.040560219965105, 27.778115136087767, 27.640742857298477, 27.33841095697168, 27.405313144102088, 27.32001719829988, 27.39055617729488, 27.512107936430127, 27.25715464409949, 27.2253134735819, 27.577383795985057, 27.77240614219772, 27.9849680148615, 28.133241151486747, 27.89650614444833, 27.903569357220665, 27.78444898848428, 27.3325979783711, 27.015096569576983, 26.62862810378626, 26.459582287192653, 26.26297900918145, 25.903740309324107, 25.88214957920946, 25.730507723622782, 27.05261476136529, 26.989865069016496, 27.108046435185184, 26.98038792374728, 26.947223484837814, 26.9258781625428, 27.204281403079538, 26.938858731762256, 26.89855331961325, 26.87474052897086, 26.832073974167443, 26.580032627295367, 24.5891884221911, 24.42573807524121, 24.080502300031124, 24.316674183862432, 24.419817289739605, 24.63436480687831, 25.394693456387024, 25.52711504365079, 25.525751792561465, 25.585562550031128, 25.30627193666356, 25.371117900560225, 26.18333590634032, 26.504141252334264, 26.810707568860877, 26.879170848661687, 26.96227616269841, 26.764888272169053, 25.48882587947401, 25.664468120448177, 25.851085895184923, 25.876918665888574, 26.08122427894491, 26.052896577108623, 25.344669642001243, 25.09495811375661, 24.79676051672891, 24.632505743075008, 24.30219373054777, 24.06625424787128, 24.321662245953934, 24.128524875038902, 24.172150216464363, 24.33398389678974, 23.999880247587924, 23.822902228520203, 23.448927952225336, 23.262484068394023, 23.24599713873327, 23.16275586398096, 23.267760716285867, 23.2416784239807, 23.770807083878, 23.441744040616246, 23.124883631419237, 22.93494561258948, 22.937319568705263, 23.0472726100996, 24.301508974803536, 24.39852268043884, 24.34136800420168, 24.28275844584501, 24.156400127991105, 24.36892359835045, 24.595342800809213, 24.613891496576407, 24.51775485823218, 24.42284274867725, 24.353372639044508, 24.13598193386243, 23.21455946814412, 22.921900203314657, 22.771319161297853, 22.857257817693743, 22.7799171645096, 22.53031614379085, 21.319940320417054, 21.29359747580143, 21.28310468954248, 21.35869388009648, 21.375451251479024, 21.431774975334577, 21.039830537317805, 20.86008469607843, 20.86869118759726, 20.86916505610021, 20.917540594116357, 20.81441948576097, 20.821127761048864, 20.45190740873016, 20.223403434329285, 20.49092294810146, 20.437112860396567, 20.36068958488951, 20.32250331279178, 20.43003763390912, 20.42447512068161, 20.42908591441021, 20.338570098506068, 20.353282987939615, 20.32897368549642, 20.32460796537504, 20.525378433566768, 20.41589198008092, 20.39631054629629, 20.352517104419544, 20.474659931683785, 20.441470643635228, 20.38191441052108, 20.25802621023965, 20.249968067382508, 20.24377686928105, 20.255274105353248, 20.4524356302521, 20.34590409453781, 20.161985051353877, 20.17934504606287, 20.196447326174912, 20.16470887247121, 20.08498404684096, 20.435696081392656, 20.860955257780887, 21.09591133722377, 21.41794716293184, 21.76170773809524, 21.849288627450974, 22.187178522175536, 22.33317843899782, 22.351128734957594, 22.312412772096422, 22.28262522735761, 22.06121873264861, 21.896890775832556, 21.90734192545907, 21.693016529952537, 21.658997149704327, 21.305600574175223, 21.16589193829754, 20.93855767685963, 21.02142651104627, 21.11852340873016, 21.28992626637035, 21.43072229209461, 21.642697103563645, 21.648093278011206, 21.64651831091724, 21.823938879240583, 21.792447283691256, 23.82372721864301, 24.07560931862745, 24.27586142981637, 24.908867575396823, 25.6694874991441, 26.332843308206897, 26.94434431372549, 27.313161089246808, 27.87559808341114, 28.25036185473078, 28.84013393107234, 29.39840445141807, 27.8557621945041, 28.3753503583878, 28.73660444179894, 28.86411425, 28.700456521475253, 28.56703448856209, 28.962690101156124, 29.210472167678184, 29.25397822494553, 29.64409015802599, 29.78827584701668, 30.38658359158108, 30.489438282835355, 30.82463391129785, 31.39454025661245, 32.04870113569872, 32.57795917717087, 33.038276084150326, 32.77635561546841, 33.12878405322129, 33.968802905462184, 34.630840039858924, 35.01492868362901, 35.53152454863057, 36.02938641705571, 36.13115407275132, 36.2580284850947, 36.44913215639589, 36.38474703478707, 36.38552908107688, 37.008135708204215, 37.26698025544273, 37.5886703155929, 37.67056572813569, 37.29066646467476, 36.99571118635232, 37.11869116619982, 37.493735657485225, 37.27033218030592, 37.09983112542795, 37.36375658325552, 37.44330681932773, 37.06307045168067, 36.41135463141923, 35.93789062721755, 35.98885029948646, 36.24285934539371, 37.08196895088767, 37.66975985932151, 37.39796096623093, 37.25525000676937, 38.20693628812636, 38.20811806710953, 38.14771599276377, 38.01985477890084, 40.384113505835664, 43.50551615390601, 46.33783920323685, 47.52215575914968, 47.48980709220355, 46.99869352170868, 47.34676099727669, 47.97303138352007, 47.39030434337069, 47.5597726428351, 47.86578589347961, 48.512760310846566, 46.220857535014005, 43.54917687962963, 40.49610214464675, 39.9748236110333, 39.80061531854964, 39.9155616293184, 40.113210237531774, 40.13300249058512, 39.96951594545595, 40.32067839978214, 40.46505791635543, 40.28972242009933, 40.2298119221911, 39.747001202847805, 39.45677990087145, 38.697948766750976, 37.99142673486423, 37.537623899004046, 37.40514726976346, 37.02822422851956, 36.87893653159041, 36.11766207417395, 35.572534140101794, 37.02759923924875, 37.06269629442758, 37.11116537581699, 37.77947323809524, 37.79770414169001, 37.55289357827576, 40.00734467835227, 42.06598101034858, 45.13490023583878, 48.38323221957672, 49.34336804038282, 49.66456319957984, 47.80512280275444, 47.41140655812325, 47.503290217709306, 46.89170743343124, 46.86615900155618, 46.74085263165267, 43.57868610578963, 40.25760102620735, 36.78327049198568, 33.05845017117958, 31.774134583722372, 31.272916710852392, 30.932869572138014, 30.489246582399623, 30.037406779333956, 29.920609442810456, 29.88010874004046, 30.23315969817927, 30.25753144207422, 30.359993610255213, 30.520427749066293, 30.737674181061312, 30.906637801276062, 31.041689080298784, 31.00097047266963, 31.068978808278864, 31.26142252080044, 34.40526315196015, 34.27812747004357, 34.45657990258326, 34.746472205803904, 34.81345723544973, 35.410567981637094, 38.0257154379085, 38.38465298303765, 38.61411352521009, 38.80527402831918, 38.922694189931526, 39.022017032206406, 36.03367178485839, 36.35248414958309, 36.23431606458139, 35.90960307314037, 35.99463609866168, 35.52480893751945, 33.31394147783419, 33.3681875035014, 35.03721311982571, 37.83440584041395, 39.363819169234354, 39.81103271895426, 40.15342010333022, 40.43081614814815, 40.94831664394647, 41.43364827606599, 43.61722511811391, 44.11020791363213, 44.09177549645152, 44.39359735543106, 42.76698090616443, 40.44002950511529, 40.0684715901027, 39.958327829754126, 39.5494943565982, 38.94096786500156, 38.43139371685341, 37.84500251244943, 37.18574718744164, 36.96224416153128, 36.92211267045403, 36.57158391168689, 36.09963907170157, 35.298701070494864, 34.71016352778955, 34.24194919786803, 34.05118331255836, 34.05745782314037, 34.02248314137878, 33.9771683548864, 31.87310939270152, 31.70443521163372, 31.526408072595704, 31.417571393650142, 31.3359440593865, 31.27902551774043, 30.72085677438725, 30.661499120544796, 30.740778779800813, 30.60037434207257, 30.22695030644387, 30.02945491215375, 30.24267089021164, 30.03887566293184, 29.669571687203028, 29.497982038126363, 29.263229424519533, 29.07796528869718, 30.89536008986928, 31.14313088322116, 31.09724465756303, 30.997897927248683, 30.94725635255213, 30.922284353909543, 30.655217160364145, 30.69779192173397, 30.74969932119514, 30.69438967573724, 30.67759679116091, 30.63984687830688, 29.74422510806684, 30.466484609243697, 30.412125433940243, 30.37273693557423, 30.401446081388112, 30.407594239729228, 30.24658540919701, 30.266452282757545, 30.360400518440706, 30.36408746257392, 30.319767931294745, 30.374917205571123, 28.553438829598505, 28.18125358426704, 28.306766992063498, 28.29046991837846, 28.325803718954248, 28.2588830284761, 28.246685798474942, 28.199372186663552, 28.214393982103957, 28.15784190787426, 28.168250118347338, 27.965906261593528, 27.88331935683162, 27.54117889768129, 27.138772901397815, 26.81781586184641, 26.439536542950517, 26.1263760383559, 26.10644032633053, 25.756456651805166, 25.364720598972923, 25.067175972300028, 24.750829105664486, 24.54976959453781, 24.395403922891376, 24.43118590662932, 24.466175735880288, 24.464985234905075, 24.644385852458115, 24.66660572790228, 24.533016366324308, 24.70498652544351, 24.76933880538373, 24.776021748582583, 24.768244367413637, 25.03335408208839, 25.275467322571064, 25.481995918845318, 25.86337313803299, 26.27196562535014, 26.65708017016807, 26.84280510275716, 26.783627775393224, 27.09398235690943, 27.567565829174807, 28.053903592203547, 28.60142469833489, 28.945997510348587, 28.637577122237783, 28.51946584679104, 28.507888147292253, 28.21052600186676, 28.234442769207128, 28.33303496863665, 28.34051411776657, 28.26161195214753, 28.36004960972482, 28.559382633675693, 28.332080412062773, 28.21858614627166, 29.065787344957982, 29.88936636846528, 30.34657189619774, 31.013737543747546, 31.428423184329294, 31.84207162615612, 32.49835588756614, 33.04101320942756, 33.59966301626206, 34.14256273926237, 34.80581723117025, 35.28013325326408, 35.18510107983193, 35.71811469491129, 36.04610477474064, 36.19781997580143, 36.37579390653856, 36.74351857026144, 36.56300736500155, 36.107231711320125, 35.951688217654635, 35.618236141082434, 35.408144563922065, 35.196942231921625, 35.188674678826075, 34.94845296850349, 35.23127532970439, 35.011714219240034, 34.853339507399824, 34.270469277933394, 34.36575822237784, 34.73372405449108, 34.64857355259882, 34.294282073947635, 34.320964066526614, 34.409039311546834, 34.17123532477435, 33.72391988383131, 33.58841637099284, 33.55373416791161, 33.63679503983816, 34.28626254065256, 34.23366319614716, 34.41240504376103, 35.05756806753813, 35.21974179156487, 35.38047198825086, 35.646209128020935, 35.98603036609088, 36.74152306126284, 37.10537125280113, 37.30955038798242, 37.29171729567383, 37.15269699455338, 37.2397301643324, 37.22617039083411, 37.116609272953625, 37.42303952380953, 37.99648196799287, 38.69095606333178, 39.40024317316937, 39.204341880874566, 38.79964596529723, 38.70575243238407, 39.03818217787115, 38.952963018736384, 39.70781856978421, 39.88798663974479, 39.97259251532836, 39.921009464986, 40.22425223451603, 39.83325546397448, 38.94040404933084, 38.38424438600996, 38.412703880743145, 38.20482067351385, 38.056814394491134, 37.76389684326607, 36.80619068034741, 36.30415519203237, 35.64467651539579, 35.12007916479926, 33.59829050031124, 32.648089470277, 32.31551842615935, 32.30156653874883, 32.0064414850354, 31.38543028392468, 30.592923689309053, 30.07026694208424, 29.434295289137225, 29.10172516767818, 29.134737284080305, 29.247267233815748, 29.22780148008092, 29.17339961013008, 29.18399680438842, 29.22667871802054, 29.41301913453159, 29.619347702692185, 30.20981173135505, 30.938140784891463, 33.19681873093682, 33.90772437174953], [11.468929372123668, 11.47731869561158, 11.37980449821948, 11.266748987005917, 11.192397872562644, 11.233093597493903, 11.396716368698783, 11.461230208061002, 11.607781023031436, 8.97926481652661, 8.999799302676626, 9.036218588928444, 9.121669215764085, 9.172946020541549, 9.31450297437299, 9.31837552637722, 9.411517450980392, 9.324722376283848, 9.177248036025524, 9.094836868169676, 8.942628521164021, 8.8906165210512, 8.862383484905072, 9.015558066004, 9.220558126984129, 9.262614537857925, 9.185698160519763, 9.183945045284782, 9.014596264550264, 8.998058068178755, 9.005109812555775, 9.01454735370565, 9.085558087904616, 9.164628902738873, 8.532852370681606, 8.28416174591698, 10.159575496265171, 10.02379583924681, 9.959725000233428, 9.862425588313103, 9.515854432384064, 9.504787778784106, 9.46687692343604, 9.367182844142937, 9.152875790694056, 9.064855331224065, 8.955044377840025, 9.027138271215248, 7.154033260348584, 7.382684044117648, 7.579481416177768, 7.684934300964831, 7.786480160441954, 7.659114902107258, 7.588804437217298, 7.57971538514693, 7.832429795977281, 7.963468578898227, 8.574229654139433, 8.586543202112512, 10.9061701437098, 10.764505757391849, 10.459729712807349, 10.281760376361657, 10.175628256691567, 10.541114056102169, 10.72460840787426, 10.763774720277, 10.64080814721444, 10.441503687006229, 9.944402644957984, 10.215885179582944, 7.89837081932773, 8.050788859399315, 8.622761421802055, 8.88404300715842, 9.186136922813567, 9.171563996333257, 9.500002659119204, 9.83916695813881, 9.805280516417678, 10.096655372441385, 10.80823114176782, 10.777442163476504, 10.591454739335646, 10.545077591505873, 10.243842694366634, 10.145499964752569, 9.62461737620604, 9.410140259881729, 8.938389783846873, 8.60682575140056, 8.596113514472457, 8.446893051898538, 8.464719751633988, 8.28100864371304, 8.202952630096483, 8.060016036823713, 7.973888650949268, 7.932315351041356, 9.892691757236229, 9.85805830960162, 10.005002796763147, 9.996389209072518, 10.00289250778089, 9.884124938847506, 9.477355412698412, 9.358480559290385, 9.36084993934926, 9.9629672042791, 9.805336460862124, 9.733336046374108, 7.963891114125558, 7.959014669234362, 7.82250218713041, 7.752397069514346, 5.946747662698413, 5.873825056680554, 5.739063152349829, 5.621609777135856, 5.553068680769249, 5.0073892585589785, 5.075834748988485, 5.040001356442577, 5.192762831463975, 5.117495466775599, 5.049198403050109, 5.006390285325241, 4.970778602941177, 4.9640816494709, 4.83089415227202, 4.892235192265796, 4.792515231567732, 4.532908594746603, 4.462706608505163, 4.445602417082788, 3.969752670168067, 4.030568293495175, 4.003110285325242, 4.028014626128229, 4.026070180292953, 4.001179843993153, 4.2485995284002485, 4.156635109010271, 4.204137422502335, 4.275187833499962, 4.288486197323373, 4.318012372231308, 4.434409599751011, 4.487183755524431, 4.496348092592593, 4.464130528400249, 4.43962073015484, 4.4477275895580455, 4.704099144024276, 4.73416795899471, 4.733098788339689, 4.802223556800499, 4.778948494395814, 4.764298690943043, 4.869709546840959, 4.778056857843138, 4.7516422762994095, 4.800251069794585, 4.813589058667912, 4.863276296338444, 5.3695906146125125, 5.46330914410404, 5.415750665809482, 5.279571893785662, 5.373334835122939, 5.348675579442889, 5.590108864456894, 5.620279343543819, 5.691948332269947, 5.644161147136633, 5.633890461951448, 5.564073503345782, 4.9105837087612825, 4.8463505223311545, 4.893612476968566, 4.913610106598196, 4.821817296680773, 4.868404667678183, 5.564379272720199, 5.640375016284109, 5.681238715764084, 5.95797544645453, 5.954579133986929, 5.989723893557422, 5.9905572299253045, 5.899987602863368, 5.794168276143791, 5.822310185541811, 5.726878314537317, 5.677678963507626, 5.087565540227201, 4.985818363367569, 4.793236583411142, 4.442270108465609, 4.331658529326826, 4.151178945845005, 4.221620119436663, 4.1985515187519455, 4.164765225472044, 4.020278902116402, 3.972379695845005, 4.027783567849362, 3.4348483807189543, 3.4796110603797072, 3.5783343339914686, 3.684366102240897, 3.802778840491752, 4.04579004684681, 3.1190967677404293, 3.3031591554621844, 3.352778715375039, 3.384167613056334, 3.373974675743081, 14.061115037970744, 14.19672425941488, 14.121222339091194, 14.06354497440087, 13.967307766339868, 13.893103773062824, 13.6932694186897, 13.99688519545596, 13.857604106753811, 13.942921714130096, 14.172503968409588, 14.265965612577569, 3.50660222270853, 3.7767648732493, 7.484334486480073, 7.7155577132742, 7.88367159667304, 7.8680577431184675, 8.001946681061312, 7.93361333076564, 7.9997734309056945, 7.910235630796763, 7.715590327342049, 7.715279936741364, 7.856668859632743, 7.615279895189316, 4.0268403903672585, 3.910934793495176, 3.79548406092437, 3.969723331522985, 3.896714334967321, 3.727265131107999, 3.725397761793621, 3.8402788506847183, 3.8322232418300657, 3.7846974789915966, 3.789239209523164, 4.454071034780578, 4.334895211562403, 4.406112341814503, 4.445050181683785, 4.346560339713663, 4.463912453481302, 4.833226072513357, 4.894611415786783, 4.935752933317771, 5.028334736653835, 5.075001415499534, 5.052779187363835, 4.437490897251412, 4.670556859793552, 4.606763617880486, 4.69184066721133, 4.971282743047127, 4.93144623871771, 4.661828106286959, 4.658334632741987, 4.672664521319638, 4.709114163320884, 4.779027838079677, 4.77580653330221, 4.76172066293184, 4.657830383753502, 4.730474934640522, 4.632277200746965, 4.425731853641457, 4.38518306442577, 4.387965571117336, 4.48416536686897, 4.368250360933451, 4.314205161336759, 4.206114526921881, 4.1771290066137565, 4.19681622162893, 4.312969268907563, 4.339433798941799, 4.831814995253657, 4.900349050575786, 5.021000459928416, 5.412032250911019, 5.277354348661688, 5.306273624649861, 5.243334797541239, 5.284904563648993, 5.238666190475542, 4.935122673669468, 5.118334762138189, 5.263716427680539, 4.953377856053533, 4.836763639432903, 4.702641351670947, 4.730758663943355, 4.875556859127637, 4.8650666409119205, 5.01666806800498, 5.151112535091816, 5.250297894880175, 5.863709378468995, 5.602811944366635, 5.366367023187053, 5.201112563336446, 5.324079426003735, 5.382902918456272, 5.441867558561573, 5.448890363832484, 5.421789465287433, 5.395650338313103, 5.334359417397439, 5.20399063453159, 5.083757174058513, 5.03189206843229, 4.968871567226891, 4.933021908963585, 4.757508301976347, 4.7894550781486736, 4.531045766495487, 4.340771416785333, 4.292062340956018, 4.127284031644886, 3.9731897008247743, 3.901706488095238, 3.346412305986845, 3.318334258636789, 3.2918216354387235, 3.316270710670544, 3.405834284547152, 3.342991120214753, 3.5483343234684632, 4.015624295985061, 4.304058073762839, 4.39222344973545, 4.464723469965764, 4.533890044195457, 5.001789364098332, 5.235232396514162, 5.356371656605331, 5.414775030881062, 5.296973914877063, 5.249305826019297, 4.934437591269841, 4.478454789021176, 4.330762159872659, 4.382144046218488, 4.388612336756925, 4.405722426312383, 3.9776915185185184, 3.751063054429273, 3.68520631660442, 3.5275009849050742, 3.4895853990818546, 3.4238898412477963, 3.625278788748833, 3.638888974437832, 3.538934176470589, 3.432547558667912, 3.359041503968254, 3.229115453003424, 3.1247830223311546, 3.188236146903206, 3.2301922819016498, 3.305451431683785, 3.366667607723194, 3.4314645323698025, 2.996557741752257, 3.0409438418923123, 3.0027318673358234, 3.035278626206038, 3.088889752085928, 3.2036189504357298, 3.891723679253562, 3.903987158617339, 3.829234575708061, 3.9041163855431065, 3.914825961251167, 3.950095967009026, 3.71065920961718, 3.788044877139745, 3.8584688617335834, 4.685456440553999, 4.673425635306438, 4.6471114409430445, 4.190148192343604, 4.22295632508559, 4.166340976875196, 4.084167807500778, 4.050120137488329, 3.976523042290774, 4.800207882352941, 4.7785354065515095, 4.769529773252851, 3.965682667211329, 4.069919393323997, 4.091277914021165, 4.9232856795829445, 4.924674478524743, 4.987779171595863, 5.115834763383131, 5.225834793806412, 5.301668147643693, 5.062326262371616, 5.208890342826019, 5.218859930283225, 5.328514484162648, 5.408612622938064, 5.403612619358855, 5.32833482010582, 5.28139036048864, 5.2255570137721765, 5.108070893246187, 5.007242089013383, 5.0191680676159365, 4.988166528944912, 4.775150551276066, 4.711861652894491, 4.546156543650794, 4.361847590024899, 4.34524851206038, 3.537199040071584, 3.5136540584137363, 3.535607867802677, 3.5102927350386457, 3.4860466995020234, 3.408537350295674, 3.805134092981637, 3.7944455005459616, 3.790157430205416, 3.7775010554777473, 3.7481499516806727, 3.6772232425303457, 3.5005369938530966, 3.459342584422658, 3.467746039137878, 3.5309416735916583, 3.5311120972611274, 3.4753253380796765, 2.6378345252878925, 2.6640570708061, 2.6494848048552755, 2.657498379940866, 2.721417612511672, 2.6979721641508463, 2.862210680438842, 2.956399002256459, 2.908056339548976, 2.85176077474323, 2.8463896558512296, 2.846233232848045, 3.027500845315904, 3.053334184718332, 3.0472230731202754, 3.0746063529411765, 3.0452786283068782, 3.041066977746654, 2.925301880563337, 2.8878975139252, 2.903042313336446, 2.954207126283847, 3.0088897289915963, 3.027500820243937, 3.254445346638655, 3.2028930174291945, 3.226704886865857, 3.148492890989729, 3.068670284313726, 3.0329396812947405, 2.976433324929972, 2.917358400638033, 2.84377060200747, 2.732878901805167, 2.6422276186585747, 2.6213983802462706, 2.129288099339273, 2.165432010270775, 2.132981448879552, 2.1102783681139123, 2.1258338732427617, 2.168366105820106, 2.233433815515095, 2.351291463741052, 2.4494451265950827, 2.4869263761282294, 2.5024632410519763, 2.4817205064536, 2.6055277145191407, 2.536111771553066, 2.637222960084034, 2.6588896300964837, 2.6553618694610925, 13.512503782446313, 13.47653262192655, 13.5433113881108, 13.542753544428882, 13.610524334661935, 13.60413538258637, 13.58694824859944, 13.608007914488017, 13.62155135496098, 13.977818861733583, 14.517504053297806, 14.827872809738237, 3.936945538671024, 4.240263979302832, 4.463876092275522, 4.496889607055971, 4.574200463818861, 4.951131104618612, 5.456945971366324, 5.933860158185497, 6.026483828976034, 5.52807660540688, 4.96662489210633, 4.698444289449113, 4.676434452545206, 4.227014477655229, 3.905981396825397, 3.824564552332045, 3.7089707143567776, 3.5787582894419803, 3.1372386922657958, 2.683723902583256, 2.757222992685964, 3.051389740532612, 3.278959768751945, 3.393889792481718, 3.6397232367796297, 3.889001940709617, 4.142501155265073, 4.804627798080084, 5.788057173264218, 6.152459547230003, 6.120281806068447, 6.016280794039838, 6.002695342981638, 5.840382064503579, 5.698927798021701, 5.750435645344435, 5.845861608232181, 5.658510981481481, 5.594990997354497, 5.0413727472766885, 4.253608974556489, 3.924086020074697, 4.165278943164489, 4.324248520385932, 4.876352826719577, 4.95166805174292, 5.027195609314375, 5.161825650304117, 5.106633016028633, 5.317819849247545, 5.370200946000622, 5.295241902661065, 5.2372236830681365, 5.184597526610645, 5.016621345627141, 4.770060801602217, 4.241820958061002, 4.072829289760349, 3.9208451590413937, 3.594292914098973, 3.357696208575198, 3.0410972461581864, 2.96951990935263, 3.0197230649704325, 2.8845216731248056, 2.816667453470277, 2.8197509522791617, 3.660144827951448, 3.600122365001557, 3.6233343470277, 3.636667682773109, 3.63473489141768, 3.614586987784002, 3.609841335924706, 3.9979889118425143, 4.332753266082452, 4.742519910908808, 4.791411177948957, 4.837886430516652, 4.076567349125947, 4.51662122455649, 4.983395354263929, 5.412779292756641, 5.941995034313726, 6.499152103185628, 6.931970296647111, 6.951946376984127, 6.95255092343604, 6.945359006380331, 7.353890947012139, 7.465828351403167, 7.3473717816682225, 6.9019089692654845, 6.435620358309991, 6.092691606242223, 5.61899173723934, 5.152325071242487, 5.132535077964518, 4.980961903828198, 4.803193450202303, 4.302194389355742, 3.771515113367569, 3.8552788546555967, 4.076625685963275, 4.07339513180828, 4.152515156784937, 4.157998177248677, 4.33755485760971, 4.368871408107688, 4.40785356940554, 4.102215473155929, 3.897139242491443, 3.972407734049176, 3.965556664721445, 3.642227840549461, 3.5188898704481795, 3.568740338391569, 3.576655986616869, 3.635757190631809, 3.624685803522816, 3.593961405617802, 3.302556163865546, 3.513334314650136, 3.5453276937234315, 3.761989846794274, 3.7804142183317775, 3.825001065748521, 3.817412181372549, 3.8440462416452807, 3.763406727201992, 3.6154071120448186, 3.495673183239963, 3.4208342859477123, 3.840390821311211, 3.687795050108933, 3.571945443043884, 3.2730564427326487, 3.321945373015873, 3.288662599673202, 4.247588861237551, 4.250267213974479, 4.293612312013695, 4.3009441409897295, 4.305201882897604, 4.331080941332088, 4.520559056907486, 4.560258016651105, 4.902132532368504, 5.296007525400077, 5.31708831800498, 5.344922080376596, 5.083817921867544, 5.094746933118069, 5.058880673980704, 5.0564042793339565, 4.989445838134801, 4.9230418369093005, 4.165418145269219, 4.141210275754747, 3.953614426081544, 3.7109627217553687, 3.7010000384375976, 3.776742326330532, 3.3580650388519317, 3.415736184772172, 3.4538891660370656, 4.244723408341115, 4.3384021998910685, 4.378964778944912, 4.547781249844383, 4.5697024542483655, 4.580355892312481, 4.580555899061755, 6.2440213204948645, 6.13044028491091, 6.6090587047930285, 6.54291715802988, 6.545480318945601, 5.77574144047619, 5.693327838001868, 5.694165876828509, 6.229611746654219, 6.195519899548709, 6.063475023313493, 6.04861127409223, 6.15673605174292, 6.202501726968565, 5.481672760893247, 5.536458971336501, 5.577566882041707, 5.656740579520696, 5.683414254668534, 5.687041705960163, 5.21583237535014, 5.218890346872082, 5.274868391534392, 5.260396981121638, 5.1675551118892, 5.175311854280792, 5.682480545362589, 5.65496876704015, 5.549042095892346, 5.454256843993154, 5.405486994319951, 5.402471130874573, 5.221204524509804, 5.162622773187053, 5.013364968561681, 4.959848424603175, 4.991079796607532, 4.94206017981637, 4.911987813979677, 4.865272117601027, 4.876252473389356, 4.843444356598195, 4.859585802054155, 4.856355147525677, 7.307364213521895, 7.674927434951758, 7.726325674371053, 7.709047713352007, 7.633697221444134, 7.586299921176342, 7.2068786683784625, 7.186855392623718, 7.1826630680224905, 7.191309175925926, 7.178706430302682, 7.114240995020229, 4.421468276597676, 5.303360436430128, 7.360468887643946, 7.386907207334143, 7.401981481714908, 7.432000161764705, 7.252324529411764, 7.273890922969189, 7.316668713663243, 7.34784983854653, 7.402779848583878, 7.439493186430129, 7.426839081197488, 6.285466950709811, 4.643056853330221, 4.67111131283264, 4.83395557928727, 4.874723579987551, 5.360521974089637, 5.301390370992841, 5.272162977824464, 5.175344481666928, 5.106502337768441, 5.050848727473676, 5.597124295673825, 5.553276368163194, 5.385283886321196, 5.331902484980937, 5.145314195066916, 5.084450445845005, 4.628528286881418, 4.643376576252724, 4.66361241643324, 4.716602601569149, 4.73166799081855, 4.767562020852785, 4.175200844996245, 4.208203739184563, 4.287064669265093, 4.352936664923749, 4.39661653487007, 4.423315857941697, 4.56568277237849, 4.606166017896048, 4.767512994008715, 4.9038902607376285, 5.015000233971366, 15.797854550964828, 15.965615969187676, 16.946190472672235, 20.595659291521425, 23.732329134507413, 24.40566972447868, 24.539572654917528, 25.04400790328354, 25.346015384453786, 25.468643819638963, 25.64544828509181, 25.842035552694117, 16.273615628618117, 17.847665869878877, 18.63544140198673, 17.151361097961406, 14.663732782835355, 17.256802210473083, 18.72495848996265, 19.504151079209464, 19.471296224789917, 19.49096944891003, 19.461228419300497, 19.43167206022409, 18.587841140319284, 17.538886798319325, 15.836459072673511, 13.952801460161842, 11.12061369097063, 11.144594058979148, 10.043044008948025, 9.471912000155616, 9.639033862430631, 9.641391580298786, 9.993865789760347, 10.10139171249611, 10.039246380053044, 10.165738029256149, 10.081113890170146, 10.181669512449425, 10.244344330652178, 12.896392487005912, 12.994842505540651, 13.067221126439463, 13.063971770152506, 14.774908240974169, 14.512331088634069, 14.835760330298788, 14.912504136243385, 15.249418131030192, 15.424096879474668, 17.384640565592907, 17.95115567664956, 15.30516753898226, 15.244761299875508, 15.105281997899162, 15.149705414799252, 13.706392719724557, 13.672097463228164, 13.508059329520698, 13.660003805907005, 13.432830260727917, 13.895554544514136, 12.061693207644089, 11.421407703098309, 11.249237261671334, 11.53555877342048, 12.011947798397138, 12.077038748832868, 12.065836702225331, 12.258009924405414, 12.366289496420793, 12.722887677065827, 13.036464635973664, 12.680313929271708, 12.617781261593526, 12.691039122385634, 12.547235041316528, 12.323126541238716, 12.084715522175536, 12.150691934640523, 12.331936030967944, 12.404373143790853, 12.185677755991286, 11.675082501711795, 11.561017915363538, 11.47304235636477, 11.504604032231049, 11.67013329691683, 11.641837933815363, 11.630778080134093, 11.61705486632431, 11.393200903983816, 10.961078940631811, 10.67934451003735, 10.825131219187677, 10.906268041005292, 10.960936714860214, 11.187902216386554, 11.171242456816062, 11.219334820494865, 11.133308375816997, 11.149986643090571, 11.20027595113601, 11.234305062709437, 11.325558605664488, 11.702503269530036, 11.736504042335827, 11.657689888188608, 11.301426436663554, 10.97750306364768, 10.944442747879716, 10.70253531319812, 10.67000752986047, 10.506767458878125, 10.002967098235043, 10.10802786835539, 10.07518479716711, 9.776727677019242, 9.505289723521988, 9.371477773687252, 9.388578534836636, 9.640898947791545, 9.726274810678625, 9.881944712340491, 10.037225025754749, 10.336039251885571, 11.35053052603551, 11.07373788671024, 10.86278078898226, 10.912612671257392, 11.06489336266729, 10.933336386554622, 10.119528829598504, 9.759295403205728, 9.566529213473911, 9.16028494510027, 8.794145843759726, 8.271262710084034, 7.03741778828198, 6.963547620915033, 6.888802048505427, 6.422051888533566, 6.196248139744787, 6.16288685060691, 6.177746756452961, 6.079016571039528, 5.930557151409639, 5.970473909967971, 6.044313026610644, 5.984873200746966, 6.5491894406318085, 6.495176847261128, 6.650835188686586, 6.823890777466542, 6.913659670428087, 7.046642895566074, 7.131094864223466, 7.270573808228295, 7.296668705259882, 7.251136939211153, 6.638335185885466, 6.797824008247744, 6.176339190554, 6.292973218253969, 6.265534818160598, 6.2106024800582285, 6.241516609700185, 6.125603864299984, 6.18074006302521, 6.10166836904762, 6.161390602163088, 6.212297084080317, 6.536719766184252, 6.643766933551198, 6.588358399081855, 6.527606761299569, 6.493095434562714, 7.171113111025535, 6.997140092203549, 6.956799266255577, 6.64162876633987, 6.706670704170556, 6.706288008610206, 6.658265774350299, 6.980926816448801, 6.793729618191723, 7.381589344382198, 7.633891021007128, 7.865954489292066, 7.178057552987863, 7.18793617646994, 7.166668668767508, 7.546750397202122, 7.425002073751167, 7.315963718565205, 7.273611436896981, 7.144026200280112, 7.113778747043262, 6.53057128470277, 6.205515066059758, 5.873309259414878, 5.761553843340208, 5.8574758837535015, 5.867501638188609, 5.909308269374416, 6.000835008792407, 5.9996514632742, 6.011690160986617, 6.05074624805478, 6.026124412387178, 5.939324666181658, 5.94481246739807, 5.925923575474634, 5.966465230703393, 5.837863352863367, 5.838334963896671, 5.4110411272720205, 5.33630866285403, 5.394009391845628, 5.418473505969894, 5.382158330143168, 5.369445940737501, 5.375669023000312, 5.35609857228447, 5.372431408496732, 5.361112607765328, 5.396140551587302, 5.430725091114224, 5.479882340430804, 5.476943611577964, 5.391063557500778, 5.357049655462185, 5.347443035636478, 5.411287675925927, 5.751091593059446, 5.811343817849362, 5.75420557228318, 5.69332323295985, 5.59079983434485, 5.509298876592489, 5.425315327671443, 5.497727916433241, 5.480328307775706, 5.41389732285642, 3.712692429894181, 3.620681719343292, 3.1465384107531897, 3.0312909362745093, 3.0624470751633983, 3.0374051271397446, 3.0760956209150323, 3.125278649237473, 3.022486083644569, 2.8939689989813675, 2.948847637099284, 2.988142059311157, 4.65385049859944, 4.535503116713353, 5.461600490429506, 7.132861381850445, 7.141944647447867, 9.517780440709616, 9.45703570113601, 11.663892151260509, 11.497426116657593, 13.786383376862227, 13.72413309551238, 15.386316081999398, 16.036227605431062, 16.24093383722378, 16.998963740896357, 15.69932502635826, 17.995539497907636, 15.726414281045754, 17.02549492747173, 15.853181362978528, 15.861276930119828, 15.883683219576724, 15.878615555633363, 12.911768404556891, 14.283318621615312, 14.553594109482743, 12.830248585823222, 13.57226098684058, 14.40141852320651, 14.821395370992844, 13.494532092331392, 23.40470074688764, 23.45167318239359, 21.38583932158419, 21.583792110644254, 21.4029950323685, 20.98419344483349, 20.769167762994087, 20.473805757858702, 20.04399470409275, 16.958459408963588, 16.58139352482104, 16.637504601899085, 6.162501722346718, 6.262676748132588, 6.568720277388733, 6.694803331896464, 6.939167040849673, 7.094383147292251, 7.243057577749925, 7.406110793820684, 7.560258805633365, 7.905585695300343, 8.454463033112228, 9.02396374473494, 9.14893337799564, 9.351391498288203, 10.003538834731966, 10.28263577832244, 10.46583379691358, 10.65725538515406, 10.669360738017428, 10.66191919615624, 11.284767305555556, 11.25443550575786, 11.178938481170247, 11.067474944833489, 11.154440409041394, 11.577580256691563, 11.715885536336758, 11.5914341232493, 11.926111512449426, 12.875423686741366, 13.081562872082165, 13.17713706122264, 13.776170809134769, 13.937867958294428, 13.639490170479302, 13.34780698540824, 13.162774275676938, 12.931618755991288, 13.025966631341424, 13.168446589169005, 12.772833984914811, 11.664521794876128, 11.859923754046063, 11.95388958636788, 12.627455935596275, 14.204170610799878, 14.622004550031123, 14.761815175536883, 14.772744493775289, 14.721502574151884, 14.582542451798368, 14.49028645557112, 14.490556126283847, 14.740870105165223, 14.391745275054468, 14.186717124483868, 12.136797855797411, 12.113448690591625, 11.98883832391846, 12.053021312013696, 12.28305898591659, 12.724690642934952, 11.895182382028738, 11.99211326851852, 12.019083006613757, 11.791525137021477, 12.065101136037196, 12.141464462227033, 11.520065799408652, 11.397171585978835, 12.12637814215686, 12.13150141237356, 12.21625883994709, 11.86384067656721, 12.643068092981638, 12.684158286959228, 12.713672089480236, 12.867433228133764, 12.894842149470898, 13.109877344460008, 14.121426479769683, 16.79113905602241, 15.859518878970864, 15.722051258169936, 15.529240693510738, 15.524896785792096, 15.664764599439776, 17.519864801276068, 18.18164377466542, 18.83388220593228, 19.09682586025521, 19.38510545059135, 18.66281779199153, 16.47109918220705, 17.215200735449738, 17.505249851462807, 20.10416730866791, 20.57987951423903, 21.921919792872703, 20.41356751735139, 19.692747794973545, 18.93615578801652, 18.40767079186119, 17.8498063588527, 17.958550617180205, 18.010947898926236, 17.169645096716465, 16.423828346258045, 14.01222592787115, 13.33163184414877, 12.14865328890445, 12.773761494319952, 12.834439913320884, 12.868371681655914, 12.839770024821044, 12.905257969533931, 11.774288353485838, 11.543868700902586, 11.580404546218489, 11.66833659212574, 11.62750324587613, 11.589601685279872, 10.0023905638033, 9.3535669003268, 9.12172993104642, 9.05530821249611, 9.078984863678803, 8.9820144624183, 9.18093855189854, 9.114516964285714, 8.982626136087768, 9.000023502878928, 8.981281577497667, 8.99680903555867, 9.048811891208787, 9.034685008403365, 9.098384879940866, 8.931974875194523, 8.812033231092437, 8.778027753657017, 8.530557936430128, 8.707556071039527, 9.000291877840027, 9.036337651338313, 9.172745111344538, 9.185133011204485, 9.661134754562214, 9.920485807267353, 10.03947287815126, 10.27028059489444, 10.3123182989418, 10.22800202614379, 10.951583054777466, 10.813555593681915, 10.506106797930284, 10.200310795086668, 10.090565254046064, 9.850957367413631, 9.357138402580018, 9.075317532368503, 8.862469824618737, 8.66649622805789, 8.580049021086213, 8.74890297105509, 9.060238217086836, 9.520243043106133, 10.229456622393403, 10.229055054180298, 9.986113890522876, 9.965450949891068, 9.6305255445845, 9.682224925770308, 9.66524986406785, 9.529106287348272, 9.498819152816685, 9.30571481040775, 7.682063631860152, 6.68995338801289, 6.676668531201369, 6.681390706816059, 6.9581158251634, 7.055279748910676, 8.30839842754358, 9.20889146179583, 9.137880787348273, 9.12903611756925, 8.964446908643922, 8.772261960006226, 8.811094879863056, 8.641045785014008, 8.65804625560224, 8.560305702005538, 8.340476089751272, 8.286496077108621, 7.967301900123237, 7.991871954870837, 7.94796937107065, 8.144056860177404, 8.171659557458641, 8.20666895905177, 8.830688630641147, 8.873092992296916, 8.751461359943978, 8.762168632119513, 8.777880536934596, 8.731564041059771, 6.904369900248988, 6.501390704248366, 6.506389086990352, 6.3836128942389, 6.451963206738251, 6.362439356817115, 7.205485176392779, 8.01897503338002, 8.252224527077498, 8.332605029927658, 8.426946799719888, 8.48902421055089, 9.67202650708061, 9.951235159897292, 9.992208398537192, 9.907551749533148, 9.97333609072518, 10.211235323295984, 8.74763079318394, 8.366029379457164, 8.150163315748523, 8.055235632819796, 7.9826819171335215, 7.940557774575298, 6.645203319541058, 6.50902372517896, 6.568841284896959, 6.706362677248678, 6.517742150401376, 6.237665039293495, 5.691721875038905, 5.525043528555867, 5.553890439775911, 5.50861264999222, 5.425344596483038, 5.3565677682850925, 5.414112128151261, 5.387357824668016, 5.411620147836913, 5.253869320572674, 5.256997243308435, 5.399312807467068, 7.716488457380842, 7.751668828197946, 7.694376553065672, 7.80389107026079, 7.805774810449738, 7.793665055159277, 7.796323291861189, 7.636022156940555, 7.4269448334467505, 7.428057630252101, 7.397502067600374, 7.198972504920275, 5.027837458061002, 4.9758743729633546, 4.92361245113601, 4.850349146903207, 4.811058740818551, 4.79927763663243, 4.892779144880175, 5.457984655695611, 5.5642749552083135, 5.527779322671569, 5.591170983582321, 5.621782555134742, 5.50750153960473, 5.575956211458218, 5.527779321277507, 5.520151923543033, 16.22090790024899, 16.487737967242452, 16.292264439231246, 16.431990960239652, 16.623508587379398, 16.702782452925614, 16.765079375661376, 16.86721284103641, 16.848293599128542, 16.82639358450047, 17.035282546218486, 17.120630207838563, 6.51299617052678, 6.349100669000935, 6.577707969166927, 6.423854031157279, 6.406666892390289, 6.701160411217407, 6.732672248366013, 6.917632573762839, 7.106113092981638, 7.333386647927694, 7.375153696545285, 7.513335433084345, 7.694600576719577, 7.796061821977128, 7.846708769374415, 8.410912614379084, 12.11610032969145, 12.535649991129787, 12.79769259803338, 12.961817243930907, 13.177283156050938, 13.867636894646749, 13.996383445618717, 14.122982467009027, 14.211425468954248, 14.353175003948474, 14.058352159663864, 14.26194842577031, 9.23740925512359, 10.433527495498767, 10.49382636028894, 10.425745129452617, 10.20534810247432, 10.244708304154994, 10.29606960173255, 10.3677783068005, 10.468917630112967, 10.605938770527942, 10.770894292379266, 10.941550529307372, 10.775980606255189, 10.744186248377222, 10.723870780539354, 10.619846537114848, 10.505467192106908, 10.7753857151682, 10.651394108776843, 10.621638120924924, 10.6999189124598, 10.675245472844695, 10.230700432766625, 10.468954638577651, 10.523823781571291, 10.480196521086214, 10.510836266339869, 10.83462519907071, 11.025193895450158, 11.651392136788049, 11.93709642016807, 12.856151874337328, 12.98701462070996, 13.19555923801743, 13.152243671167811, 13.473925074706274, 13.58682327676626, 14.105162646903208, 13.996052023551702, 13.81626158841348, 13.331881560720774, 13.1113852730671, 13.041000031977102, 12.099319926464885, 11.953847636399006, 11.836317224245253, 11.717831708450046, 11.85497745409275, 11.810140253112356, 11.51810299393221, 11.804676316293184, 11.929151238252166, 11.831147582045393, 11.999223627217551, 12.01092891004768, 12.022213217164644, 12.201429484831811, 12.13251947925939, 11.548394445371018, 13.44062692063492, 13.360828962962962, 13.101838142623716, 12.768019237223776, 12.6169593732493, 12.200924497240376, 12.374975351384975, 12.126695533691253, 11.957763928181736, 11.546837741390824, 11.543336556411456, 11.611601517273575, 9.867780530592515, 9.97711296389667, 10.21666951789605, 10.17637071311858, 10.042180644802366, 9.968910377295362, 11.573169673175148, 11.685829363159456, 11.56805878120137, 11.547482190264812, 11.318756398303766, 10.6194676803879, 11.472010443043883, 11.2293210227202, 10.886064975101151, 10.797033614923748, 10.822925350747612, 9.983398862651727, 8.324434976112668, 14.882226283302211, 15.908122936801666, 15.808223304388424, 15.839308671802051, 15.951094349836447, 15.01156345062378, 14.970000298397135, 14.90270484772798, 14.897625454302837, 14.755753357376287, 14.921813123871772, 15.068251136476816, 7.613461875505758, 7.467432010504203, 7.495307798008093, 7.516393117569249, 7.537357773887333, 7.471558843059446, 7.548174840864587, 7.671089857609711, 7.744847947017376, 7.944920477279802, 7.811162699424213, 9.7648509667756, 9.53384482928727, 9.502780430879762, 9.484827492374729, 9.40941197175537, 9.251157845160288, 11.129489474011828, 10.983641670946156, 10.814561650248988, 10.706527050485008, 10.538329178882666, 10.307925010815437, 9.175989954248369, 9.235280337612824, 9.165859141677691, 9.06214995206972, 8.895758628773732, 8.437493267556956, 6.9792969196175685, 7.111043716230937, 7.025634530734516, 6.9161993336445695, 6.727644811131212, 6.151930797930283, 5.640663200824775, 6.23856144687792, 6.166213156199434, 6.18031669359115, 6.190163592950535, 5.932052021475257, 5.773285845077939, 5.530240679271708, 5.483110768347863, 5.57384605991091, 5.389168171724245, 5.541817509726113, 5.577349800022404, 4.768056888422036, 4.831668017195768, 4.701172991363213, 4.662638926845369, 4.847179111422348, 5.455279303221288, 5.488462029567383, 5.461257089856313, 5.306703088545881, 5.331592242359166, 5.258234365546218, 5.243334798708372, 5.289723701758481, 5.225533534391535, 5.258334804310612, 5.287562088313104, 5.182929756219525, 4.7195344052287584, 4.727705598350451, 4.735479711316673, 4.735372282057267, 4.900553491051976, 5.018612512138189, 5.36777927762216, 5.311882784936196, 5.295995835278556, 5.408941651182696, 5.323171109940947, 5.221654037192655, 5.314144734905073, 5.265742480703393, 5.281175553299098, 5.256907197056879, 5.138493386476813, 4.924748100601722, 4.661390190087147, 4.736667990896359, 4.723750120992841, 4.565001276377218, 4.494468949933223, 4.305719080532213, 4.2869876118892005, 4.365422662633032, 4.451067958280165, 4.468490880018674, 4.51663285084099, 4.510179884220355, 4.564851823062559, 4.495834589635854, 4.474723472922503, 4.520556818783069, 4.550445956115779, 4.575993261749145, 4.58375703680361, 4.494085168012767, 4.470997957983194, 4.404034820961064, 4.314384896202926, 4.273451590069639, 6.146110413554311, 6.200842014005603, 6.187214538593216, 6.38470298225957, 6.45377392779334, 6.557312708683474, 6.9327983425925925, 6.9100025760971056, 6.780370688764394, 6.980548151862729, 9.264250919701215, 9.122009928653762, 7.296113152462683, 7.496022138655463, 7.61990874470125, 7.588496404061625, 7.732380680983505, 7.10319115227202, 6.983540675925927, 7.010833570939025, 7.071890356442577, 6.8943086207464495, 4.769069954170558, 4.703544645658263, 4.580021113756613, 4.334251904701611, 4.169545877217553, 4.069237829209461, 4.109167815748521, 4.140743416491597, 4.1497233821195145, 4.130585999221911, 4.1829680082477445, 4.305834534080299, 4.460965250855899, 4.615486801509493, 4.68790041938998, 4.876945808823529, 4.899116663927897, 15.583991268985374, 16.139101093802523, 16.340837907164914, 16.481886016106444, 16.714722506047053, 16.813113864223467, 16.80178338326202, 16.869486409531618, 16.997598121693123, 17.13808131971678, 17.13196090585123, 17.401071568146307, 7.028909396903207, 6.679680414565826, 6.829826613909638, 6.985636796218488, 7.07435604725289, 7.197009428960474, 7.470758316915655, 7.9730834346405235, 8.066211326390187, 8.255280081980112, 8.376260431928888, 8.483886351618423, 8.445880007526716, 8.921732158496733, 9.160123924058512, 9.404673476020594, 9.558914757335438, 9.719157437759367, 9.80402003197946, 9.629292862278245, 9.834981385465296, 9.967955495409276, 10.016094910597571, 10.05166947035481, 9.94666942141301, 9.894433218253967, 10.131554803921569, 10.013403740662932, 10.045527839402428, 10.316368202058053, 10.462362631886087, 11.194169769931404, 13.314718752188416, 13.316600038729383, 13.323185146644525, 13.324763224867729, 13.666908479225686, 13.760019069950202, 13.642190841192033, 13.580832256769376, 13.577862254085616, 13.510325630018674, 13.29957075090388, 12.760427629089511, 10.917493480429766, 10.850682069016496, 10.990588922891382, 11.088093168767507, 11.42611429956427, 11.703446003657016, 12.07833427614379, 12.32847893767507, 12.42463863530968, 12.447227715183118, 12.696516140756303, 13.56658167499222, 14.665837426081543, 14.879042191876753, 15.02896048521631, 15.192833208024387, 14.878893042483664, 14.59629571573102, 16.162021159770852, 16.093688711640212, 16.19880982033406, 16.213104372856368, 16.40468935543106, 15.379295458837806, 14.60847035146281, 14.56745705499987, 14.44183167841192, 14.225944305800663, 14.218414275754748, 13.298597338079675, 12.697676208683472, 12.808837845365185, 12.992185014628072, 13.232482321739807, 13.136446147300685, 13.175551522175535, 13.52805932726424, 13.619382630125257, 13.87055942647059, 13.989499480547774, 13.93165332072829, 13.55405996739807, 13.676343389007547, 13.728059383675694, 13.47521517343604, 13.215577438932335, 13.136823882741986, 12.810073222922504, 12.907312123478189, 13.013997208941552, 15.39664449634298, 15.52389322097728, 16.157464586351676, 15.91731899611605, 16.098701878773735, 16.285632380096484, 16.570210892001246, 16.906038716542174, 16.623060196000626, 15.888910042290435, 15.507940296529728, 14.994473989495797, 12.415311350918149, 12.445131393323996, 11.46932381971548, 10.87633816425459, 10.526410327497668, 10.332679881263616, 10.568179439855498, 19.184172024582438, 19.06388227327402, 18.90621415538438, 18.78315860714286, 18.69968754660753, 18.798931052754437, 21.17533252964519, 21.151947831232494, 21.123530429876027, 20.98283717287712, 20.4544501144569, 19.802661205150176, 12.248509282913163, 12.197260480735824, 12.075059207749764, 11.995934552567698, 12.004176909041398, 14.090242910441956, 12.29795382524121, 12.279181758247743, 12.148292164799257, 12.062874431061314, 11.993336685418612, 12.17194467841581, 10.670532727095017, 10.789960863445378, 10.907934798863993, 11.07643166128036, 11.039584822978917, 7.8807192972112, 7.707403936196701, 7.686967477824463, 7.743340046683396, 8.025254321632822, 8.213148641145347, 8.491636397359052, 8.844967435807655, 8.746545208683475, 8.634962886788047, 8.46224080166511, 8.472168549875507, 8.782315559757237, 9.579927712807343, 9.651078648537194, 9.73875606940554, 9.390803188764394, 9.339932498707755, 9.185002523965142, 10.474888503267977, 10.37611401065982, 10.388581208683473, 10.427829671802057, 10.388812119281049, 10.886288793719524, 12.08789068775288, 12.064104656240277, 12.09101166721133, 12.10466480664488, 12.030481755462189, 11.69243949922191, 10.179829993152817, 10.22302324081855, 10.252505111266728, 10.170268907329598, 10.203114300630284, 8.889010492917427, 7.666225235294118, 7.725949701732545, 7.603886306178027, 7.6386853662464995, 7.647490400015561, 7.684085284469344, 7.653533745798319, 7.554280674758792, 7.444236248443823, 7.456134131263617, 7.467294144802366, 7.283891533564816, 7.62035216387722, 7.593916570339248, 7.522466846872084, 7.499994809212573, 7.391451573140368, 7.148321862738614, 6.695793002489886, 6.704329431372549, 6.696633476346094, 6.689046959305946, 6.55079310410831, 6.408286838151001, 5.910928086834734, 5.77672191861189, 5.75298240079365, 5.713890484282603, 5.700227780982863, 5.845894163797468, 6.252345168914047, 6.387118699112979, 6.393460976968566, 6.297501758792406, 6.333771409193122, 6.068443245331466, 5.991009931216931, 5.942606553532524, 5.8964160133053225, 5.859049128462497, 5.879630403863862, 5.830621109710551, 5.725550022175538, 5.516915612476029, 5.346656654941229, 5.299209198009437, 5.286393087726543, 5.37821227017412, 5.389781182036665, 5.357164584167984, 5.356363389589169, 5.391208253423592, 5.322586472844693, 5.2766855098026255, 4.915556928104576, 4.920430734572094, 4.966831385256636, 5.015764529121943, 5.097223646927884, 5.106383246127192, 5.111668092170162, 5.126945875910477, 5.098255326413205, 5.076835995409275, 5.1357202989670965, 4.991694851696234, 4.948532980314349, 4.971826705726735, 4.986101849206349, 4.982818762994087, 4.964273051353874, 5.082300577419858, 5.149315121582245, 5.2452418032990975, 5.285685335901028, 5.216331972998366, 5.115143636047569, 5.058536641708167, 5.043621782757548, 4.962419574618736, 4.664854115402276, 4.51480044475568, 4.365091200339117, 4.263164067226891, 4.216684069911298, 4.147105611625847, 4.298847961517231, 4.410279008844589, 4.549938193043884, 4.762602855152835, 4.936597975608958, 4.9989952446041945, 5.368299794033354, 5.607436160829531, 6.096404550903119, 6.271305110539864, 6.316356499315949, 16.95831468246187, 17.30342685760971, 17.400004868093813, 17.690004954469508, 17.99565861225555, 17.98199847402256, 18.26930009709125, 18.279820587267672, 26.231036531671936, 25.961396154672983, 26.042911066235547, 26.601888684583816, 17.25665280882353, 16.963249274509803, 17.00923210473078, 16.878060278166824, 17.08694482438531, 17.331713509147082, 17.332227071428573, 17.57792705265712, 9.800240735994398, 9.858254042680777, 9.730112455630618, 9.83500273327108, 8.805558014669026, 8.856734330156025, 9.422857416441223, 9.43979481706016, 9.186900405998465, 9.591272414046395, 9.78836173116404, 9.881213913906333, 9.78771251333676, 9.791113844941137, 9.648985067927171, 9.678473452925616, 9.685726030457648, 9.73530810732961, 9.2589471914099, 9.257593324065, 9.357409046371512, 9.101570891223158, 9.019855389314245, 9.09257924579832, 9.218083692187983, 10.2629952832244, 10.258935997276687, 10.635924718541862, 10.723595387721756, 10.82876097587924, 10.951274983815749, 11.028805547230004, 11.05035294623405, 10.901669707205109, 10.855271437156365, 10.72422311192616, 10.872736422671608, 10.156396360985967, 10.274970149820392, 9.990726384998444, 10.113480668744812, 10.23741149229692, 10.370002891845626, 10.520166127061936, 10.551853831621536, 12.699408261126672, 12.572433409897291, 12.51455282741986, 12.516380639355743, 12.476301250311236], [87.85164654372862, 87.98196899190788, 88.32031106223806, 88.64039286072206, 88.88501965266107, 89.7677598753242, 90.62714146016184, 89.99026284739061, 90.32052872027698, 90.8282614442751, 91.74511474906627, 91.53281936912543, 93.13968925163398, 93.55197056761595, 93.89920665503944, 94.91765737994086, 99.38516847486773, 104.45737482329598, 110.34342612564453, 116.76335513907304, 115.56807919631184, 107.89426526867412, 100.23708020921062, 92.5868886530501, 90.53258291129788, 90.02417714635854, 89.2471250526361, 86.98358143145035, 80.9896692844726, 74.4789294136321, 66.92485072086382, 60.565766328431366, 59.04136289324619, 60.21953320046882, 60.4701474422658, 60.84984833317771, 61.34766104014939, 61.72251699517585, 61.70751253634455, 61.247106583878, 62.5803598321662, 62.64484630999066, 63.78892692405851, 63.18113537542795, 59.851176014394646, 58.35758376820729, 57.84769770516586, 58.138743296433766, 57.41480286476813, 56.95696681590415, 56.752025136710245, 55.66673045977279, 54.83416989215686, 56.029403067556935, 54.77104886072077, 54.57099484889511, 54.772498700746965, 54.76151562075941, 54.26156231961282, 53.27384265917021, 54.99446125630252, 54.56588747633832, 54.471051423331424, 53.43579655368101, 53.32995396537503, 51.3491180087924, 51.37402501574528, 52.09421619343293, 52.558037377373175, 52.31298577671893, 52.26105503881303, 52.214799393577536, 50.58943718145037, 50.59773086810874, 50.37058675117751, 49.84615128976035, 49.81688426563959, 50.479208871212, 50.37852754800809, 50.13110452614379, 50.33858515768427, 50.3126071398226, 50.29404520634921, 50.00905617682138, 49.68903753252412, 50.04745530022046, 50.02800378155475, 50.07889859120048, 47.722827123984594, 47.42814686702459, 47.59586897798462, 47.94444025687072, 50.1155531731248, 50.87596401034861, 51.49725742016808, 51.577182582620736, 51.37683259554933, 51.08254691425459, 55.186140195845006, 54.583229423047, 56.01713886148009, 56.43717859951758, 59.42249578120137, 62.98029255898498, 61.74958753995357, 60.82174129867921, 60.08033145277002, 59.95218950202303, 60.0909734211796, 59.68201203115533, 55.70163515420493, 57.25466212385946, 58.16601321866944, 56.84216901198257, 53.24998651071817, 48.763457462418295, 49.05854051991908, 49.13877375466855, 51.50834762815126, 54.39504510488639, 54.39509912962964, 54.28473742234672, 53.57327089231247, 52.19574519926859, 51.79451494161481, 52.46941890896358, 52.964811580532206, 53.14631240234529, 52.83106269265485, 52.676527025210085, 49.87580344446053, 47.30507075993749, 47.12479794203236, 47.04530462449424, 46.96179941754723, 46.76127961772487, 46.24360454746343, 46.81888921895425, 47.49271993072481, 46.47790718354407, 46.43238874315283, 46.48405311850296, 47.18538646264136, 47.42975135491883, 47.46544949961096, 47.33107040978966, 47.40361186321195, 47.5605350943822, 48.17970641173923, 46.7703903496732, 46.04823601727357, 48.088129489408274, 48.09234273653907, 48.02773482170648, 47.332438423825096, 47.38342073996265, 47.29598173661687, 47.498150336056646, 47.379508662643495, 46.55929324172937, 45.36771067120555, 45.291592117024585, 44.99845057135076, 45.46812637037234, 46.01996338894855, 45.93623790849609, 45.95131486943018, 45.82036253338002, 45.96049565281668, 45.76237961741364, 45.64355293473481, 45.44607877087872, 47.52842026291628, 48.14991397352487, 48.326207358621225, 46.84192864643181, 46.51640190756303, 46.54040038383131, 46.56220934360411, 46.29488657633055, 46.0803183250856, 46.23399972814616, 46.40806844854707, 46.11270793660536, 45.00916722626828, 45.13079409741674, 46.41503302676626, 46.6528956556178, 46.70014123708372, 46.60065718510739, 46.63697578081233, 46.88540950613201, 47.0779003968254, 49.070858461095554, 51.71301180431061, 51.15336657473159, 50.99914628952692, 49.0153785978836, 49.022757120448176, 48.49818573764202, 49.118561558201066, 49.22611988507626, 49.17591922961407, 48.82329529536259, 48.63060153112357, 46.161011065141615, 43.71001453727047, 43.4324862264239, 43.49760315813687, 43.3242721390445, 42.13254486601307, 45.64194077567694, 45.614106910908816, 45.607799757002816, 45.55792812791783, 45.37511957181763, 45.49533232773109, 45.49788598232299, 45.165735826641765, 46.58398476353422, 51.98102754878618, 52.09579167880485, 51.55298341517597, 50.96280813492064, 55.64465584948713, 55.613925260582, 56.06530474533147, 56.79256678151261, 57.622935804155, 58.279911146574456, 58.34019901198257, 56.12274317982998, 51.217530508092125, 51.02763795066915, 52.758583673825086, 62.31403873622782, 58.15191403112356, 58.16631597502334, 57.848307386087775, 57.56644660343549, 56.767643747689085, 56.28679653456337, 56.23521757298475, 60.37638012184873, 69.68843189628073, 70.50313525273756, 70.42626346280734, 61.96272739404325, 64.25857977731093, 64.44369886584578, 65.00540311447699, 64.86801955010505, 65.16338174833575, 65.15101004048009, 65.04053029832956, 60.372213362782375, 52.76971554560004, 51.23616976351929, 50.45606270319993, 50.71268932466495, 48.943946813534026, 48.91997573229889, 48.968034090442494, 49.3136802717087, 50.94954002162306, 51.60322371537504, 51.84522441030321, 50.51400355631095, 51.44974819377623, 49.39296262247121, 42.483296605431065, 36.51095999224854, 36.61473246226268, 36.71428636354136, 36.33590837107065, 35.74967106014501, 33.97612023124417, 33.47483860927224, 32.64718787200436, 33.27713869623405, 31.69334303551337, 34.73531481559291, 41.70228509217894, 48.63087687500455, 48.54334691464364, 48.45028383496733, 48.56089103874884, 48.89388574011826, 48.84578148901856, 48.44583497587925, 48.0401663886438, 45.99296989457164, 46.45745619142266, 44.62366733372304, 44.725173090888646, 44.65814469086523, 46.2630821363212, 46.02634973980703, 46.00683803540306, 46.10078741840767, 45.832645660831005, 45.818777631263615, 45.82451764768129, 46.82139439923423, 46.79215300090068, 47.90437483753501, 50.64256804183137, 51.0552155770172, 49.36428977723574, 49.35403781465921, 48.89452535566449, 48.524135225568, 48.55084866378773, 48.45970521786493, 48.36466423000311, 48.61051659235916, 48.02235819607843, 47.38336657314037, 43.057306584721566, 44.687572873093686, 44.73618401701875, 45.259669190027005, 45.14587568835008, 44.81834547222224, 44.65324734796141, 45.19477425614691, 44.90687024712107, 45.57553057656396, 46.21849981753813, 47.56006822852474, 47.651377668611886, 47.23463011702459, 47.207788405617805, 46.68429622788089, 46.67648534056956, 47.5718195043573, 47.86569254545598, 47.69707194462666, 47.57196599988458, 46.18515953710643, 45.860700978602544, 45.02234867500268, 44.29115345829442, 44.57701743090569, 46.54388530854303, 46.83846539900404, 47.26874328778156, 46.7753628252412, 48.69416148512813, 48.53970775980392, 48.471018253968246, 47.9725872579216, 49.10486277637722, 48.67831750630252, 49.89645271848739, 49.91319574245707, 48.15372452829975, 47.96233325676937, 47.627909801038754, 47.43164677169442, 45.49261497330441, 45.62495398389356, 45.31760304138331, 45.76055824253034, 44.56883112034317, 43.49279461725088, 43.9473256355431, 44.965094203895646, 45.45479938569294, 45.40909253408031, 45.42996807838731, 45.29513118098351, 45.30180722630006, 45.207216124183, 44.93793203147889, 44.88284812519452, 46.20299283014317, 45.51621417219109, 45.521365934091314, 45.3060651250389, 45.51544667704768, 45.47349752715531, 45.45501261118892, 45.78639455625584, 45.75440109718331, 45.84862393977591, 45.98370979279489, 44.9481614389557, 43.55010809220354, 43.906795448377686, 43.68444506567071, 45.433532491513645, 45.92084618331778, 45.94313813093811, 45.83468096452761, 45.45989088585434, 45.25239552521008, 45.39628223661686, 45.2846015734516, 46.57772024310099, 48.04680067724867, 49.13148070432617, 48.85827588118581, 48.14787243230626, 48.51801303688142, 48.78912189122317, 49.16069963847686, 49.657340932306255, 50.08550880135388, 50.00746722930284, 49.508927749675145, 48.38389651065982, 46.63859981598194, 45.88236997634609, 46.24953095356494, 46.49569612455584, 46.45591577186431, 46.20180959259259, 45.86325901980239, 45.28431407835356, 44.96805583885777, 44.90071942295233, 44.411176961991, 44.957180566993465, 45.03137993082594, 45.24175133971366, 45.09319604123871, 45.04421389261723, 44.5787820577342, 44.6292561817616, 44.57470417265795, 44.49098337394958, 44.48608357788087, 44.39924884687208, 44.16040198015289, 44.24878894133209, 45.03329397806976, 45.400567560924365, 38.43158065413943, 32.17043616464364, 32.05203960877685, 31.86953926033951, 31.82995520921452, 31.706742748210395, 31.741163840802987, 31.667508858854653, 31.13499577777777, 30.69387547619048, 30.418574070445587, 30.52797288515406, 37.37967417405852, 43.74223879007158, 43.7662282045596, 43.73499316767818, 43.80684213460941, 43.96091068907563, 43.83061416841153, 43.76456376851852, 43.44627272136632, 43.131720685652034, 42.62318447064207, 43.76276643028322, 44.472035909663866, 43.33912031543729, 43.31322633769064, 43.29993963484282, 43.22317699431996, 43.19581255104264, 43.19797407383419, 43.20313527303144, 43.071692747260286, 44.63538086779684, 45.57992795448179, 45.320899132664174, 44.02800191426756, 44.25776199643312, 44.26603239285714, 44.255847895915686, 44.249244100339126, 44.28930723622782, 44.37446134469344, 44.2565785717398, 44.30877039350171, 41.9564965930763, 40.22041804751468, 39.51782932072829, 40.84468279466231, 43.3469565760971, 43.39874690491752, 43.43417882197323, 43.52001216212396, 43.64547422735762, 43.49339199323063, 43.39390103252413, 43.23323817019336, 43.4664663820417, 42.64507256659999, 42.6162677010582, 41.27231824105198, 41.60003236382988, 42.94503993448491, 42.928284488951135, 43.02409179964929, 43.304010386710246, 43.4866717010582, 43.62738372253346, 43.47615607617492, 45.58512441479925, 51.756015835097, 53.233651359788354, 54.20280847331155, 54.61177236002178, 54.74986105622536, 54.81931485309679, 54.60990291853216, 54.124811906862746, 54.122148548444486, 54.42084852034898, 54.25259388117868, 50.191015778555865, 44.910936485439386, 44.06723204147215, 43.95419979529321, 52.17577299190787, 51.29676950910365, 51.558819150231486, 51.800934039976944, 51.98197015974168, 52.11384949431995, 52.07764751247992, 52.18695895669934, 57.59129389145658, 69.40306310703781, 70.23130087931838, 69.26376087983452, 61.69877537293807, 61.70440312955183, 61.664718385387495, 61.66249383496733, 61.89164181932773, 61.87628935862122, 61.834204721677565, 61.73052567464078, 56.73055865974167, 47.55678170837224, 47.053189018164495, 47.2030772140698, 46.66375232675978, 46.59541194102085, 46.50541894498912, 46.60018305189853, 46.52863096304078, 47.77995929987552, 48.03749696817616, 47.67527134438219, 47.75045809111422, 46.38681402396514, 46.03497704995331, 46.38798167600373, 48.31308534765017, 48.26918016495488, 48.281990289258495, 48.14107530878075, 47.95574357057268, 46.73509229154996, 46.6902908120137, 46.571371145658254, 44.804132592826015, 44.74283424618736, 44.004389093137256, 42.213126123560535, 43.61942829435108, 45.3930098553766, 45.48817081956116, 45.663427301742914, 46.01473005112045, 45.986083802521016, 45.75886410674151, 45.5756426521164, 45.6248230799614, 45.37163936235605, 44.28177220113601, 44.79048372284469, 45.1833410834053, 45.668514145113605, 45.53050967071273, 45.3875121645561, 45.21401079044637, 45.36889894318913, 45.44772015227137, 45.22386122997912, 45.50368845354808, 45.316557427478855, 46.09836388124158, 49.70838029785247, 50.90898280711173, 49.366078065748525, 49.443503365157184, 49.427310579053845, 49.41557839581389, 49.26896071551251, 49.23919405267662, 49.16879969039837, 49.57391971266729, 49.67704760763241, 49.718548558434485, 46.10365824603174, 52.20213829684096, 52.5646619772798, 53.109965417522574, 53.09199626244229, 53.07179098194834, 53.09272221078433, 53.20385926187689, 53.27315919099946, 53.204729746791024, 53.930217701291625, 53.36419529886399, 53.3504649266904, 47.37373303073451, 46.85315494125428, 46.20515965359089, 46.15888958325552, 47.03619364690321, 46.975951270697166, 46.81097685122938, 46.483319770385926, 45.57896193004979, 46.93617453384687, 47.8046901573296, 47.42549503727046, 47.002314474024914, 47.10227251704016, 47.22497791816924, 47.21520427625879, 46.19995903003424, 48.14118018874105, 48.04789834570495, 47.932638320105816, 47.54903395619358, 45.48553278470277, 44.7882591923436, 45.79698652411363, 46.9404588440366, 47.00350256846406, 46.96503606773849, 46.99459277893648, 47.28177770378152, 45.65262886679116, 45.74601410434175, 45.54075456862745, 45.8597532989418, 46.35673740149001, 45.94095767032368, 44.84783462962962, 45.75378234053191, 46.038229293962026, 46.06390174017922, 46.09449899867725, 45.637879015639584, 45.44521098404918, 45.54453166962341, 45.34303049463118, 43.82543946342981, 44.14327310211578, 43.643599879863054, 44.46845061554622, 44.915974040240165, 44.92190996335201, 44.71710160201849, 44.599801834733896, 44.70537390857455, 44.7406351764706, 44.61187053376907, 44.70264777878929, 44.6501476993263, 44.290243133675695, 44.61777115141612, 44.72909030460693, 45.66513355150949, 45.67112389239029, 45.76376841495488, 45.88209229758597, 45.9174539004046, 45.73730680267663, 45.66064514807034, 45.34118614262372, 46.42689128618113, 47.50062119800603, 47.38053262573918, 47.52015680454404, 45.911798344504106, 45.62080627933397, 45.7000127884376, 45.54258945907252, 45.47428878361345, 45.46051660580455, 45.38302360066981, 44.88268950124494, 43.3539196574074, 41.6480583558201, 42.43674395564892, 42.71875160364145, 43.76907837620604, 43.91743518517935, 43.66483232197324, 43.60051624898848, 43.43561879427327, 43.42580552668846, 43.55917885589792, 43.57724587262683, 42.65858838009648, 43.09096676890756, 42.78772461710239, 42.99974828804854, 43.307535236223934, 43.11195651089324, 43.18084541734815, 43.16890097124833, 43.12099919156552, 43.10733685033329, 43.1147342884376, 43.29636813383132, 44.703569709539366, 44.57768463787027, 43.98806997525677, 43.4107544562714, 44.15632856156438, 44.26250042149082, 44.337465511360094, 44.46334567328043, 44.76624711842516, 44.81095527645503, 44.74164862815126, 44.4731894243905, 44.35289290203859, 42.32481623739756, 35.30113283457828, 28.27808882352941, 22.92793338219408, 22.852608890834112, 22.7475645384376, 22.796016783303536, 22.70811734920376, 22.75016250645814, 22.74674985185185, 22.50679551330532, 21.97793002388733, 23.96014659796141, 30.34329490546219, 38.082393734127, 44.22049286741363, 44.231956825319024, 44.21539034586057, 44.07252370267457, 43.87590365343915, 43.78498409134765, 43.91510092001245, 43.790672781201366, 44.56123298062558, 46.69700334570494, 47.7417978478836, 46.664113434796135, 45.08627302489885, 44.94667924758793, 44.96584591892313, 45.07866539528612, 45.14430988857765, 45.26706427315113, 45.12564049945534, 44.44442399695637, 42.87226941845627, 41.3880912238303, 40.405042330298784, 40.58967598934018, 40.636008070728295, 40.58028910364146, 40.55130210037348, 40.38218878435103, 40.41281920136944, 40.25865228649238, 40.3676326729692, 40.169818441409895, 39.56542529162776, 40.26421577308442, 39.82051864987487, 40.26863723318679, 43.95422323417303, 44.50717623866908, 45.094470737317145, 45.64258738315184, 45.98371022268908, 46.68815946842257, 47.1575198821714, 47.73325549905724, 52.02827791531215, 56.08708275217997, 56.88704300171179, 55.91744918215064, 57.39786139504168, 59.25525697850982, 59.276353727357616, 59.36529177583256, 59.59350587278245, 59.74316771949891, 60.368905777693485, 60.70664865544986, 57.41651089480237, 55.12298173140367, 55.54643900343982, 56.84323375497977, 65.36259902841195, 64.53807348210395, 64.99109422167756, 65.34335157415188, 65.64085359049176, 65.57879904649708, 65.51178276548399, 65.31364212799564, 68.33552382135075, 77.32725088457674, 77.99810262830688, 74.79008464064478, 67.19795057477437, 69.73235370628484, 69.9569495779801, 69.89363738260946, 69.92966661235153, 69.99343139750829, 70.00703820821661, 69.83672986308858, 65.85374946234049, 56.79159017418365, 55.707523706193584, 57.235955389978216, 56.70941495782757, 55.3650642136853, 55.82557115950825, 56.61318792283887, 57.11264417001246, 59.3994071943284, 59.95810431349206, 60.41907283937653, 60.1857045590777, 65.91807345557112, 67.86480830936819, 70.13794332244008, 70.27173845666043, 68.91434157189543, 67.882583590803, 66.78205812784003, 65.73064021249222, 63.77555827521009, 63.13668776034858, 61.84321013787737, 60.48690996685341, 54.01645725202303, 51.26221591394335, 49.64915295891689, 50.72222420681606, 53.14860677614379, 53.32733270367972, 53.62369833113914, 54.34881041327553, 54.55096740575074, 55.243946166557095, 58.03328594999677, 61.10536304863056, 64.08868445401494, 67.28948559235917, 68.87731919192085, 68.36847044654527, 69.07102747673514, 69.85949846739805, 70.15635411671336, 71.51506129435107, 71.37446856691564, 71.27078551142753, 68.04578735792094, 65.03353939293494, 63.7583531146125, 63.36440537002933, 69.53197124410381, 72.52991176890255, 70.35119796755916, 70.19571508162552, 71.55033946579744, 69.86698005610154, 69.4191390950604, 68.70102036060585, 68.33354242299541, 68.4636724684253, 68.58714171017223, 66.79214853729381, 60.02153409718332, 57.78736633322967, 57.130197060336265, 58.7022024780579, 56.90895101742856, 56.6438368162238, 56.55377593985372, 56.588528731092445, 56.36282804785247, 56.00187312402739, 55.87828305112044, 55.58572226688453, 55.24628890841892, 53.57477213177782, 53.334071571428574, 50.87858768191722, 50.94664521210707, 51.904381100213975, 52.08274725684719, 51.77462228353564, 51.530934166900096, 50.6622647002023, 49.62425574377529, 49.61840601394661, 49.74898026092177, 52.55275226322752, 53.76050012822906, 53.706685709772806, 53.35441676501712, 52.833426810146285, 54.4937215445067, 54.57402508215065, 54.817754998677245, 53.77571710075409, 54.1489851896981, 52.44669510799876, 51.89162272899159, 53.6413571590401, 52.35636818611889, 52.01299713955518, 51.47278947953626, 50.8025626756925, 48.592629763112505, 48.56112211686897, 47.57051161585745, 47.79236267475879, 46.74575430283224, 46.666706821350765, 47.05614175035533, 47.619961742063495, 47.46862438292614, 47.5151508709092, 47.52834663017429, 47.68457412603421, 47.76027933757134, 47.81256461243387, 47.37435385014005, 47.727971969460015, 47.92022473722836, 48.747250810690936, 48.89595759204923, 47.43657245487019, 47.55977043565205, 47.60961395090259, 47.63388781979459, 47.86133211048865, 47.978528401723466, 47.671726314036725, 47.29272206820833, 47.0668588426704, 47.22036225381263, 45.48154579495214, 44.69297195946156, 47.06529092365199, 47.93695785558669, 47.81918916814504, 47.75702031628285, 47.67499657889823, 47.38026491072012, 47.3059233828198, 47.21585260729847, 48.862154910464646, 48.95207767460256, 49.31018695136943, 50.245259385776535, 48.1555463834293, 47.576476661609085, 47.65935955734516, 47.68645336951448, 48.00331137729537, 48.4201814502023, 48.79545698202615, 48.76142449507988, 46.378726152872446, 45.40635667631497, 39.39432108348895, 32.41985095160286, 28.46763363390912, 28.727622118736388, 28.829179124416434, 29.059232752801123, 28.6502574694211, 28.545145317149085, 28.67315659936197, 28.405514033846877, 29.303448090077417, 29.17187928816758, 35.93263581139123, 43.30150347222223, 48.324025907767926, 48.0097588250856, 47.77159817639279, 47.39984277365391, 47.12213717452536, 46.77669583877996, 46.34178898358232, 45.65569371537504, 44.39158300513539, 45.45265428640678, 43.61633782882041, 42.79158529256147, 44.07313996864691, 44.694087856561886, 44.73697321786493, 44.88223468728603, 45.012456401104885, 44.944001456660445, 44.76568938297541, 44.3889687780112, 44.74436081956115, 44.25331748241716, 45.52700092755991, 46.31115113881108, 45.532649880641145, 45.1223139414099, 45.02106757477436, 44.91135927544352, 44.84219725809213, 44.85728109632743, 44.87441721724311, 44.80756812099284, 44.82408280329847, 44.60379818121692, 43.80538555080921, 43.85327753082984, 45.37029047346718, 45.533068296685336, 45.59640164760349, 45.60834608037208, 45.41304932563025, 45.33006855485527, 45.62620780656707, 45.34179540343915, 44.10672785071974, 44.54639852938633, 44.76945890507314, 45.04111829277479, 45.67630103050109, 45.51779274961095, 45.49618665211641, 45.45512449159664, 45.421760855353256, 45.72633126455026, 45.54251273615002, 45.33933757563025, 44.87754236057035, 44.81453812254321, 44.7766226819172, 44.99187922447868, 44.66584583068784, 44.63151796620696, 44.68687736313416, 44.670432392001246, 44.71250301260504, 44.61206181255836, 44.82417920807657, 44.84638947868036, 44.96984882779075, 45.0258501818394, 44.57562142647058, 44.08356010395269, 44.87495414347962, 45.35199671342982, 45.37250792436976, 45.55834607897604, 45.83864208839092, 45.88633856442578, 45.83045842102398, 45.84667664822596, 51.08257293121693, 55.29403212908496, 55.60133114838157, 55.69498425304106, 57.0369973657842, 58.1563818128696, 58.48788255598157, 58.70362752169508, 59.0997922892475, 59.79996034656085, 60.56141028983816, 60.861097597027694, 55.66830848347925, 52.30236299821039, 52.11629871521942, 54.36890132220665, 61.21093442174305, 61.52834110792095, 61.65692657570806, 61.83889192777065, 62.17576623073322, 61.85424887339844, 61.579634335045135, 61.29872888709928, 65.52772742615934, 75.4143078446156, 76.64808438336445, 75.289337262216, 69.77589027069716, 69.27840796444134, 69.23499532220667, 69.28535938953603, 68.98313768020542, 69.15474520968462, 69.19950535558668, 69.11110465099725, 64.31086427482103, 54.96720229116091, 53.19829438569224, 52.287526115423546, 53.32662277294391, 53.74989555197635, 53.92251476227955, 54.03142895463741, 53.92162944623405, 55.24406514019803, 55.80455066970121, 55.862470320728285, 55.05106747276688, 55.41504081808279, 55.025892512760656, 55.95557229583427, 54.545819984126986, 53.89117906897241, 53.58564258870215, 53.24928642413633, 52.9824113146592, 51.38682958434485, 52.158184092826026, 58.55977546075124, 60.92198711616869, 60.269220860410826, 60.37128203384687, 60.80592502736863, 60.398746938453165, 60.561372938920016, 60.92948941783381, 61.06408980625584, 61.357925351151565, 61.41045058597885, 59.64216732726423, 52.58842546879863, 50.3917564030501, 51.27047723300524, 52.19503530942395, 52.12825736251167, 46.84309607230932, 46.96751469125429, 47.023168836523496, 47.247099206381264, 47.34739107337379, 47.52244981847184, 47.574618508403375, 49.3246484432773, 54.1163379952831, 54.30847816728913, 57.22498455882352, 60.05203519747899, 66.29918745962625, 67.07903780975724, 67.10871438515406, 67.87983447794312, 69.22504223194834, 69.15764289853524, 68.88441657049486, 67.60727221662192, 63.38123077204197, 61.63269435955493, 57.0219913313881, 53.72269189970739, 55.6742702273252, 58.08652603556063, 59.82363899472692, 58.90819062192654, 57.32399791351282, 57.40191318215064, 57.64743663920012, 55.94831311935885, 53.98356336150015, 50.45004791525962, 44.76772289204339, 37.93005693721541, 31.714812206893868, 30.98044960704108, 30.771859582008634, 30.740841912231566, 31.59562253921569, 31.35811316713352, 31.37353801151572, 34.157676061604406, 35.9751343793962, 41.3593530296452, 47.90007609197012, 54.53874749903452, 60.417217890522885, 59.57427769745824, 57.62102442133521, 57.50661594802365, 56.833497631220176, 58.56963950995955, 58.15191605983505, 54.18996285459332, 53.5441628990812, 52.228312695845, 50.714652442499215, 43.36630798744553, 36.88593397852474, 35.80801591983025, 35.8062582097728, 35.53566495619359, 35.37047344506692, 33.53889738266549, 33.565207153205726, 33.40100406481481, 33.40749350301444, 33.491342788515404, 31.025049918534084, 30.99587851931544, 31.05975106427016, 31.436565143012768, 31.555701994847755, 31.57731186430128, 31.31060307352941, 31.326177522486777, 31.691953228758173, 31.204657943043884, 30.646135496173752, 30.390698180672267, 34.17058081906643, 40.7096190278556, 47.47135780905697, 48.879371164021165, 48.67555208761283, 48.75245248661688, 48.92274655112045, 48.81656050788788, 48.47005720233362, 48.24080552956544, 47.85344125941487, 48.9613175856676, 50.62904154754124, 50.13175853413152, 47.199694982259565, 47.38429387208217, 47.20998903403297, 47.02701321008404, 47.01609086554622, 46.96208552832244, 46.91398798630564, 48.28947748965141, 52.26883606959647, 56.16268520144724, 57.426239917211326, 61.160889807033925, 65.92946020206972, 67.65254423093681, 68.61844552178648, 68.45198190393974, 69.64875887195184, 73.01744732119514, 77.28813287869592, 74.04388141394853, 72.68299548240093, 69.67220179097421, 68.53005859546244, 66.10445928524679, 60.72426225435729, 56.247444354907145, 55.25131760582011, 55.27427304925304, 53.31325892117958, 49.63490667939944, 45.98640175933707, 47.60152092490234, 44.03869784934381, 42.85696120774976, 43.224285809835045, 44.57491147010906, 51.06519829286882, 51.001631459228136, 51.12325875676937, 51.117514309212574, 51.02055088274198, 50.89659421568627, 50.896774623949575, 49.41829539792022, 50.08387526960784, 50.11221362192654, 51.300364615546215, 49.94346695938375, 45.70228628096794, 49.36529159375973, 52.621681182072834, 54.43695968137255, 54.63330841705572, 54.76759432562896, 53.89686836951448, 53.76181888250856, 54.73057087519453, 56.92689326710888, 58.44670437929597, 58.32162730695611, 55.56194923264861, 52.42474358633096, 48.46973655291006, 47.124412862667285, 47.03133613499845, 47.00685925380876, 47.193979129474016, 47.41944507555244, 48.28868700955862, 45.60910636858076, 43.91768940896358, 44.75679543744164, 44.72946360208528, 44.7278716214597, 44.715813019374416, 44.70700810690943, 44.81113986896981, 45.13141774042951, 45.27732327715531, 50.62365069360978, 50.80571030112044, 51.11849965013783, 50.54693301027077, 51.290093418111965, 51.36824717190132, 51.377085149393096, 51.78581029594552, 51.373888991051984, 51.534851417487495, 51.20301357547464, 50.71404564570569, 44.74218312965319, 41.76883120292561, 41.10570792913741, 39.30551178299097, 39.92831385278556, 44.11492580726735, 44.071382400248986, 44.20932824751272, 44.14564919746926, 44.0314247713216, 44.24196589643636, 44.37140128368542, 44.75437973801743, 44.10852063708566, 42.28773852722599, 42.54927473187052, 42.72145795642332, 44.53279024125298, 44.684601327780086, 44.74387065265135, 44.803866393966594, 44.85575701397124, 44.81019911492375, 44.84100033733632, 44.59226717179881, 53.219851331932766, 57.6188332170194, 58.860630647136624, 59.82156225643609, 57.67834947836913, 57.69720173031435, 58.09929492071274, 58.77639351657329, 60.76625402240897, 65.50068345041497, 66.11465901875195, 66.7154909938531, 60.48805841106442, 60.26312385971055, 60.56347171007431, 60.51078723767593, 70.34881984271472, 70.96791886329481, 72.75988487398686, 72.9463789165638, 71.53357883160209, 68.0698599833898, 68.27585902606357, 68.51666775842004, 74.38808461613122, 82.17905071681483, 83.52328980680049, 76.92390166192031, 66.93846872628906, 67.15873483631711, 65.9913349204074, 66.46029822311964, 67.23873730691564, 66.92071582634252, 67.05802015826008, 67.08858772250203, 58.47109310754033, 52.17998921418568, 50.61830390438309, 60.48862302309116, 60.80964804283477, 60.88409802000494, 61.18131255201865, 60.28190417891431, 59.55340579357299, 61.04806766618231, 60.92898984640522, 60.36311792971221, 59.36071554966779, 58.72669757570806, 58.30344593812664, 55.100783242374725, 56.87154370199192, 55.68356351246029, 56.24247251789605, 55.92209537433863, 56.4013592825559, 54.8873927071273, 54.73139616098662, 54.53293008971366, 51.98210150816993, 50.535658446234045, 50.8266795782576, 51.138848483120746, 53.8125185603019, 53.69194240542005, 54.09413491409508, 54.28822461935886, 53.81258647354497, 53.790810830025805, 54.05092007718643, 54.59532953320618, 53.3974209535527, 46.25021866041946, 38.20217580539993, 29.51119537706193, 26.540912259803925, 26.48481587815126, 26.505898969376265, 26.57267063391561, 26.731329219613336, 27.427504837928016, 27.48878168425083, 26.489074612122625, 29.150016610177403, 36.532745795113605, 44.50029477151841, 55.60263439558045, 59.06787037457205, 59.059123874760736, 61.35991902100841, 64.55292877645502, 67.44232259768648, 71.38657347977102, 71.08151119035931, 70.88077480254826, 69.49858658761133, 69.83920228524742, 69.94780404381687, 67.80157832069264, 71.64947147938064, 71.47808614379086, 68.82471631230614, 65.40437378832227, 63.45496389376117, 59.74117859710552, 60.21141131930928, 60.03131542067052, 63.40063851174914, 64.52202445323684, 64.08802010341752, 63.96689583842491, 60.1957794339719, 60.405294663165286, 60.16807159624962, 60.45285622847483, 60.4701590558668, 61.21554895101672, 62.75824344810146, 62.6157074355022, 59.42355621459371, 58.30996807648615, 59.69479044156162, 51.86548371525185, 52.28564865818551, 52.38839457315464, 52.216976995175855, 52.59688122353629, 51.45092672572363, 52.71159315919701, 52.323942953236845, 52.05487200669157, 53.44266237072896, 54.591622797005655, 52.54264088826641, 60.12947834718332, 59.83868120790539, 59.89820458909119, 59.73931370611578, 59.4633119037504, 59.56763948124805, 57.09765688240481, 56.61571609010271, 56.18696842343604, 57.5148697980859, 58.03968781489262, 60.01441957897603, 57.60080664309057, 56.8951599964463, 56.84106389456894, 56.771063405228766, 56.21320134897292, 55.43395256123561, 55.419366263914725, 56.02890909936197, 55.2815902092236, 52.95049044484905, 52.01329469436664, 50.98897140639589, 52.473216872237785, 53.28831226291498, 52.73737692530345, 52.79500249112979, 53.00584816277623, 53.40143817161791, 53.37780895697167, 53.197610580610025, 53.07279060060691, 53.104513303610325, 53.28482367413631, 53.0091181868678, 53.46615610231871, 54.14270125311235, 53.97558175, 53.45121189386866, 53.236800000933705, 52.96591518067228, 52.53824282032044, 52.6986021712574, 52.59293505450472, 52.65964850164436, 51.6829277841581, 51.88254713366274, 53.1356126118892, 52.32950977334267, 52.37735778563647, 52.50560035192967, 52.30204769156551, 52.02242522346717, 51.30778268121304, 51.589873991129785, 51.41134737366105, 50.32419047404386, 51.42044626053232, 48.08999576587301, 51.33876562741021, 51.12862517226892, 50.88227085938253, 50.6232118339558, 50.53482942492739, 50.41489924766573, 50.82268642117959, 50.42408225684719, 50.1289711879085, 49.22587587687195, 48.78824274536648, 52.83513380614664, 49.67758945450384, 49.54499258473195, 49.5536923724589, 49.707480928804856, 49.750821317927176, 49.95604986461252, 49.79146291859114, 49.35369258092125, 49.22535532033925, 48.6223139859944, 47.783870822946525, 46.87100666743373, 47.02721127054155, 46.98401872240379, 46.8527088854653, 46.53705971296296, 46.27143647523407, 45.95800034671646, 45.29979463763877, 44.9822905952381, 44.95992803695923, 44.44915539970432, 45.32505874268596, 44.97939806406158, 44.36537631551509, 44.378709548864, 44.3722691083878, 44.31534822712418, 44.24644319701214, 44.29047887682851, 44.30750524151883, 44.41782984943978, 44.30871904161933, 43.75858373117025, 43.91880071164021, 44.021494444527455, 44.759179191721145, 44.4896639872173, 44.59912075023343, 44.538590413476506, 44.65417916549953, 44.5346619241298, 45.00042540329197, 49.44223606076876, 49.36085013126362, 48.15183058605665, 47.53412970564892, 46.90475976602863, 49.88365982212886, 49.884231489573615, 49.81345926455027, 49.84661016557735, 49.85950940281669, 49.77246227454742, 49.31530137426081, 45.08264549159664, 45.10445191549953, 44.78364902334266, 45.32722743243664, 45.389731983037656, 44.67713882048376, 44.71292095642702, 44.841083851385, 45.12783929497355, 45.31549575925926, 45.912153203081246, 46.113154673825086, 46.24445734018053, 46.57103231963897, 46.45652933770295, 46.092864680066654, 45.13378422564581, 46.99434254814688, 47.13025826119348, 47.07881787114845, 47.09976063702148, 47.1591517088391, 46.87524126937441, 46.3967866180361, 46.79356342731873, 46.73750748568317, 56.62716218238406, 56.76868657625272, 58.20249366683591, 58.82866706383576, 59.830266471521945, 60.2041834859166, 60.55798093663567, 60.93088768580767, 61.36529495051354, 61.9791392666511, 62.30343887251661, 62.96764815170279, 52.00199186406785, 52.23281120964901, 52.96972753289128, 53.54777154643829, 63.75900924603216, 64.25784441718885, 64.76131593601407, 64.95043580099994, 65.41637214949374, 65.88288449075371, 66.06158193923612, 65.88582632049055, 75.3948563471833, 81.26979578968253, 81.76340832399626, 84.31809855904334, 75.3593345559446, 75.47745990118268, 75.6023155847339, 76.03043131945287, 76.11281516635543, 76.7504996835512, 76.85252149175226, 77.1838026340956, 65.50366379302831, 62.0502159003242, 61.965722563414246, 60.5473775533769, 60.40918355267663, 60.655331399937765, 60.76680415873016, 60.57183475217865, 60.663849355174754, 61.71121144981326, 61.66288098100944, 61.47852515590811, 61.18136850769854, 60.95447541840248, 60.12712244514472, 58.79390452894231, 58.73695802279801, 58.18941083807969, 57.87498051128229, 57.61167247368699, 57.3024247099563, 55.690037918067226, 55.51008728160664, 54.90730218187052, 54.82114225980391, 53.81008273066254, 44.15865602528076, 39.67437315799033, 43.14020049183007, 42.93442318736384, 42.667864327030806, 42.576650415810775, 42.49098267413632, 42.38366438738372, 42.4934992421413, 41.84817983854653, 41.6101596490689, 42.750896503579206, 52.29172074572052, 59.28553322265471, 56.069903050809216, 56.27727693837536, 56.97500186142235, 57.466127168845325, 57.71385060077888, 58.30355461342334, 58.52526281113252, 58.97941240118269, 59.0125750201525, 59.71455767444691, 60.52571288165266, 62.673469550776815, 63.75086186780268, 64.93151635980976, 65.02565659647072, 65.1486687876595, 65.8451809185756, 65.63358945549331, 65.6783516878307, 64.73423162558356, 65.23720746807048, 65.03233361503723, 63.78529802245438, 62.41229002110081, 62.0384822884376, 61.49329255796764, 62.07493126167134, 62.053054094771234, 61.42104997844694, 61.35548373972924, 63.76857687130408, 66.53679570798319, 65.38945668860877, 64.97772000319016, 65.02315867997198, 64.55387303771509, 65.19210335877685, 65.13481840421726, 63.87744644559002, 63.242855534002494, 63.54508898225957, 67.1256109937753, 64.35170694024276, 60.82491491328669, 59.48385206971677, 59.76793451377217, 59.190950104905845, 57.628123655184666, 60.77779477956739, 59.8240382718254, 59.34401511947234, 59.21262370222575, 58.04101583819056, 55.572584780112045, 56.46326274371953, 56.45555655267663, 55.96948928713365, 55.52040936173358, 54.11984610535066, 54.29992799181062, 54.26735410247433, 54.54461072245566, 54.82262037776222, 54.785026683940245, 54.57086246988797, 52.39334796519154, 52.54760106398875, 52.5222088141904, 51.45884046397448, 51.11713910620914, 52.13941705801497, 55.43149720712729, 51.48788738577654, 51.24833063313104, 50.97984584018052, 50.84660576633988, 50.75967059570496, 50.56186941884531, 50.09176206800498, 50.14640282115402, 48.62749158115468, 48.92053768604109, 49.166030221833175, 50.09811375270839, 50.11004193541861, 49.956713007080616, 50.03501395961718, 50.10140290631357, 50.447514104341735, 50.60634890795206, 50.2190312490663, 50.19904466194425, 50.15063826898537, 52.07175636990352, 50.96936099929583, 52.14738799891067, 55.42536562005914, 59.14609456948335, 60.907561345908576, 60.81868818157528, 60.57899167942735, 60.60022624164593, 59.925294531098274, 59.81000106932773, 59.90691945044092, 57.3017097780112, 57.50368869748095, 60.58693099323062, 64.4683673250856, 60.760423304310606, 59.08605758255525, 59.38696105736335, 59.52212178625896, 60.23289485262994, 60.89753042509596, 60.84631206428559, 56.22891533469175, 54.7606499335512, 51.727078028555866, 48.192162051276064, 48.05901639472456, 49.25662412161532, 49.12052688834423, 48.93165933979148, 48.702317145035806, 48.20662044879331, 47.68267868502957, 47.59109195995741, 48.46452439239029, 47.68032971903205, 47.22392437239471, 48.5005230673825, 47.89356481558058, 47.51010640873015, 47.49419605166511, 47.34195769000935, 47.37755484971969, 47.27370801781824, 47.12955078415811, 47.10556377065325, 45.31380801323724, 46.85416749929972, 48.918604643324, 48.63161588068005, 49.31125656800498, 48.968108751634, 49.66866668884221, 49.714918078742606, 49.79043603494205, 49.98891889558045, 49.925002176781824, 49.94394941316527, 49.93980018051665, 49.11491910504201, 49.0796269414877, 49.09519411663554, 48.23760673225957, 48.15394627544351, 47.368351170401496, 47.25618300024068, 46.853600580878, 46.678380853563645, 46.79257332282914, 46.95176521451914, 46.7673113933642, 46.38401052312431, 45.30528532765328, 45.2299888750389, 46.5438994991441, 46.49940330236539, 46.46709724361968, 46.459658014749984, 46.54093683952012, 46.26209226704015, 46.32877084656085, 46.095807798848654, 47.17192846700903, 46.90970168124309, 47.10485067863626, 45.64724344127651, 45.62893169178578, 46.33827850463637, 46.30913006755499, 46.298068510057, 46.46459945340285, 46.74910919024547, 46.60275100840336, 46.37025976960136, 46.06086663217009, 44.21839687245957, 43.27236525972612, 43.604956051580814, 44.11432118487395, 45.33378943728603, 45.34612379217242, 45.4666793819639, 45.07170225202175, 44.27059536377218, 43.87659454606286, 43.5441600720063, 42.32497720409275, 43.69090610823218, 44.28045330983504, 45.124678355975725, 45.917612797396, 44.89663470098039, 45.16421198112097, 45.15698968067228, 45.6714623418923, 46.77201820938375, 47.193901989651415, 47.346112170283526, 49.3510538164488, 53.78029014270153, 55.2412637902272, 50.70144086440437, 45.15723480376595, 45.32310975466853, 45.270888012916274, 46.58787006857238, 51.24612049881991, 50.59653796871563, 51.12623712943513, 51.20698637715585, 49.77912315810509, 46.076984928758165, 46.43736790870357, 50.09899249366981, 64.80198803021942, 66.6914145339374, 70.34751968035972, 69.66272940499535, 65.32434365250545, 65.68156571716464, 65.58395842187986, 65.80358255812325, 69.64703651256161, 80.09176111749144, 81.0282783190943, 82.16440532002801, 73.96103082703081, 75.68918771506382, 78.26488161165578, 78.74100660278556, 79.17251203828198, 79.71467900210084, 80.25938731886089, 80.91835317281357, 74.95895300202304, 65.68858398856209, 64.58579483568316, 64.12263132920945, 65.12097982785755, 62.27191515043378, 57.199978300765125, 57.466150179972, 57.96628579159409, 59.73285025801433, 59.68167327948957, 59.48704062589479, 60.73302878217852, 62.971417887021474, 63.32391525023342, 64.17044238953082, 63.19163547245565, 62.88346643565204, 62.06676319358855, 61.60962648924424, 60.18982475412388, 57.58709046302327, 56.84640673039216, 55.99624282656396, 53.81580113188608, 51.72571995736072, 50.82478390180516, 49.86884779287271, 45.15984659383754, 45.01549724509805, 45.06268977729731, 49.57064618215064, 50.95020495129163, 51.73726440829509], [27.156767230064062, 26.693076650378025, 26.48704944802365, 26.101631613834424, 24.069308249844383, 23.22060985223117, 21.785461111733586, 21.667228257779605, 21.0003949519368, 21.51367762908497, 20.652330176704016, 20.184557057946236, 19.893447996342974, 19.37364199816373, 18.658937983037664, 18.00245616214078, 17.094519379716594, 16.307012714052288, 15.760180243152815, 15.153038377415672, 13.710256329490832, 14.54955111904762, 13.854895423902894, 13.916838351696237, 13.548971561157796, 14.657847051407058, 14.715426376750704, 14.683273094615624, 14.577707847107456, 14.66568898498288, 14.836644895580456, 14.754859156958066, 14.52963599789916, 14.207636925925929, 14.097898079831934, 14.311211855664489, 14.59112416153128, 13.346247530112043, 13.180134082010582, 13.176331676661224, 13.369374770697169, 12.829150874805478, 13.34807539316838, 13.400206670557113, 13.591079503582668, 12.60152299015653, 12.445177650407246, 12.32108353252412, 12.58810740036278, 12.505003493284445, 13.288950743386245, 13.086867738420748, 13.008903340958604, 12.69457316207594, 13.001821813492064, 13.027610800887018, 12.934202473403104, 12.90528136920324, 12.57382158989005, 12.146793422095785, 12.332729471306717, 12.10220688538749, 11.47255666774108, 11.658593301742918, 11.731482909642288, 11.354619949559083, 11.718336375972612, 11.875936741830063, 12.040623453369143, 12.67403451633987, 12.863676700591348, 12.609447394491127, 12.956928974634296, 13.072918878384687, 12.904242377295365, 12.82605377606598, 12.810800869795882, 12.743247423747276, 13.067295680750076, 13.002755521553066, 12.576491894024276, 12.214468715063804, 12.346099657640837, 12.212547285434436, 12.787633926704016, 13.882331117569253, 14.165549962418302, 14.30484266851398, 14.583555181061312, 14.732544834078354, 15.003542697167758, 15.184588675770309, 15.208470299875506, 15.645419427871149, 15.54146871031746, 15.254657109330624, 17.060495231032306, 16.897504702847808, 16.83002311850296, 17.02917140716685, 16.76375292761374, 15.887180668300651, 16.84607836230872, 16.436393474167446, 16.075132005780517, 17.33349443417367, 17.08781019817927, 16.542297388465478, 14.363530915576714, 13.902172064270156, 13.929525115028165, 13.658329800420171, 13.728999800331987, 13.653901035169625, 13.343616922998368, 13.85055941938998, 14.030363011882963, 12.501947927793342, 12.484916830610024, 12.169515045195302, 12.476413214285714, 12.647955783146593, 12.363167913910662, 12.146819278216752, 11.734068789449111, 11.053002262278897, 11.124881200169236, 10.692294812558355, 10.281139348661686, 10.181634237472766, 9.94476912955182, 9.722537650686016, 9.91643115662932, 9.787276209539373, 9.756076202178653, 9.805653776299406, 9.796001433940242, 9.8336559634778, 10.146781406395892, 10.591368350373482, 10.769755280734516, 10.692225210784317, 10.962584373757652, 10.965807866557734, 11.29046992514784, 11.621758546619212, 11.688980722611268, 11.832358368502955, 11.755845354964208, 11.475824278633675, 11.42652508706816, 10.90521532212885, 10.94875855664488, 17.137504785247433, 17.024428500389046, 18.375191834399317, 18.306781287815127, 18.276396172396023, 18.157103565670717, 18.84059330975724, 18.869921009259254, 18.62785303828198, 18.83986743347339, 18.927885538982263, 18.930170607019654, 12.939865775754749, 13.204354543836436, 11.527232077731092, 11.758450789449114, 11.807246457905388, 11.879725525619332, 11.21189602278101, 11.576093011204485, 11.673373649704324, 11.8604024597728, 11.943212791394988, 11.895063649081855, 13.01551402816682, 12.905855313025212, 13.802511942032368, 13.96998502489885, 14.044501967009026, 14.208892850140058, 14.164072444946337, 14.042573684474531, 13.894745996265172, 14.10972615515095, 14.093290196623094, 13.8318504111314, 14.091392816059756, 13.151291189309056, 12.827806093915342, 13.492418747899158, 13.524303344382195, 13.532996162854031, 13.723390589442632, 13.759121294273264, 13.437785414696805, 13.843112929582944, 14.008365132819796, 13.874490140565882, 12.863614693510735, 12.87928156509108, 12.32924874081855, 12.299309668067227, 12.25126154824152, 12.240080196000624, 12.024169295650289, 11.970880670946157, 11.790553599595391, 11.728985035636477, 11.672950936741364, 11.941515592436971, 12.04831037535014, 12.242533220121382, 12.329911569669456, 12.573329640522877, 12.44214382211394, 12.636938545673823, 13.080533113282645, 13.264127911686897, 13.238450676548398, 13.70807548529412, 13.707534043650794, 13.663327621537505, 13.960281664849182, 15.527520518674136, 15.03450091145347, 15.480382468288338, 15.71669400259947, 15.608207911966378, 15.263584648303764, 15.315497374234662, 14.88588530866791, 15.34969358644569, 15.363493674057215, 15.237038101696234, 15.184170882664176, 13.628547068316216, 13.689736474787358, 13.790197265950823, 13.894452757469656, 14.160153110877689, 14.766708005680051, 14.785589680466726, 14.77264553060678, 14.949770581154684, 15.1166240843857, 15.132303127061938, 15.11050112413698, 15.00665789737006, 14.61562835698724, 15.074289801276068, 14.849627157485216, 14.301240254435108, 13.87712213017429, 13.625408642604754, 13.210012190448095, 13.323511194444444, 13.18313845813881, 13.174800290616243, 13.155979265873016, 13.293067616553843, 13.073436476812946, 13.245890383675691, 13.439830915032678, 13.532225991985683, 13.62009858817677, 13.848634957882044, 13.898796124915757, 13.935663626984129, 14.061670584656088, 14.165995828885906, 14.10047519265484, 14.03858349204924, 13.716006794039837, 14.089996735683162, 13.839737608776842, 13.825281628462498, 13.735051922485988, 15.025797301861925, 14.603121242772504, 16.614210866868973, 16.539808159197012, 16.312794470743853, 17.294264597572358, 17.140116549330845, 17.03524015639589, 17.043442781512606, 17.18615777287582, 17.317588642623715, 17.52904292215479, 16.089135858660782, 16.06573319966415, 14.88146747217321, 15.035643633831311, 15.21331022657952, 15.293167182150638, 15.383384154030503, 15.738704755976244, 15.994105443879688, 15.880083637721755, 15.766617159410997, 15.455940193948823, 15.356914292896056, 15.015833736594177, 15.292037268322092, 14.952646445914388, 14.81506107158419, 15.05037755322129, 14.47877713951136, 14.235404359859036, 14.402561840617803, 15.8842807875817, 15.86598479909742, 15.935618239163846, 15.961747750233426, 15.604517006596897, 15.973283999766572, 16.27884653485839, 16.4269979067186, 15.416827234221651, 15.55410322043262, 16.291008708410494, 17.055207456104785, 16.22420380485528, 16.711430782964822, 17.19667145059135, 17.728765323249565, 17.931078958372236, 18.257635671802056, 18.485289794185256, 18.955096095393717, 19.002565902038597, 18.6129743181606, 18.12376337036194, 18.29059567947017, 17.934932523576098, 17.913800098158525, 17.665487699430056, 17.082521133167344, 16.392021693955545, 16.649105792950515, 16.61303267353849, 16.720581018751943, 16.717495227746657, 16.250735831854964, 15.570661121615313, 15.590404323218175, 15.362548434637931, 14.865123129240583, 14.761019365390602, 14.951663487740197, 14.774498384142545, 14.63965952684407, 14.29697285410831, 13.526720564892624, 13.52194820471522, 13.641246940631808, 13.408880081878328, 13.497761642468095, 13.55673554738562, 13.4925037605042, 13.669448245253658, 14.143167841228992, 14.64809549858244, 15.414077325552444, 15.81435761290072, 16.00335934562714, 16.541535802905518, 16.779264432353592, 17.05074988982844, 17.579960296840962, 18.513861191098663, 18.70847847681295, 18.332456115001555, 17.618366283040668, 16.75584781813077, 16.44234408691254, 16.110573868502957, 15.83904257438531, 15.386412719343292, 15.18073928610333, 14.759486969659068, 14.043928971444132, 13.884811447945845, 13.883038283613448, 13.826658719343293, 13.779811263829714, 13.540742758792405, 13.443192188375352, 13.464053341375536, 13.12460287267408, 14.680350364923749, 14.418547252956737, 14.055523279878615, 13.867125280004412, 13.692337609645543, 13.625297865059752, 13.508614868480263, 13.475856975138113, 13.310095865065634, 13.533936730820107, 13.352797698101464, 13.51919134676536, 12.036966233504511, 12.150943203470275, 12.144430935784962, 12.466338659779309, 12.502865151798987, 12.454195054358596, 12.685316225693148, 12.699718669000935, 12.490630637059752, 12.430100713741052, 12.348766220666043, 12.006531690747874, 11.98099757088391, 11.85027803330221, 11.464500789838157, 11.788289885776534, 11.89971358191332, 12.013257024592848, 11.82587849229692, 11.961305655228758, 11.84763827046374, 12.041811826953005, 11.951308033535636, 11.943987775782642, 11.944234957827575, 11.917537994008716, 11.91181423576097, 11.869148651442275, 11.720091448463922, 11.414550096470071, 11.45987191557734, 11.307007776688453, 11.298326869670088, 11.645985645191413, 12.140390748521634, 12.40801452641094, 18.70260058940243, 18.91007519444444, 20.17862790009337, 20.80556358146789, 21.00013862743005, 21.527988974867725, 22.27058491114224, 22.339389781668224, 22.03068901991908, 22.160918369223342, 22.14000616907874, 21.29010319444444, 15.458902332181149, 14.140303688842202, 13.514227843059444, 13.389365562964912, 13.126329265291735, 12.15114399670718, 12.076961655851232, 11.887052213896668, 11.626725522296791, 11.864117964303892, 11.580743116049408, 11.603852278400252, 12.785502926304618, 12.974116359477124, 13.655177841892312, 13.805003849828822, 13.712286609240456, 13.666560597085407, 13.80704389091192, 14.123276501711796, 14.280917977746654, 14.622233003423592, 14.57220970121382, 14.246862250889649, 14.481026271008403, 13.554874230003112, 13.328616191487706, 13.609079305010894, 13.806726314020514, 13.780440021630875, 13.688101311740722, 13.534741248910676, 12.874433219624702, 13.125341819327732, 13.182755607376285, 13.079660407753233, 12.18496061749144, 12.144372749221912, 11.967901858326856, 12.072181169120888, 12.0400545275182, 12.070789681120162, 12.04142656450358, 12.860474126906318, 12.999872121044715, 13.464051187441646, 13.619170444755683, 13.782081341658886, 13.87049498877801, 13.995362178882663, 13.81485563754863, 14.500281818238406, 14.6249081674882, 14.906108026810887, 15.362739902798545, 14.831783895658264, 14.67299522938064, 14.93938760208528, 15.240583920625864, 15.368370112511672, 15.698571022888142, 17.466409900482414, 17.304676050653594, 17.49043884656085, 17.719701153127914, 17.59949608309861, 17.272476422502333, 17.01158720043573, 16.66781100453305, 16.832486431683783, 16.507334003657018, 16.273387568238405, 16.059217564114537, 14.233208513694365, 14.115089085434173, 14.299304941565516, 13.868135638835115, 13.71654652710254, 14.58864401976346, 14.35166707010582, 13.84193084204793, 13.839143601103956, 13.79734492063492, 13.782508308027934, 13.80798458350203, 13.96593030153938, 13.25932093121693, 13.481007395813885, 13.660815021361786, 13.5565804730107, 13.004158423280424, 13.819676941904648, 14.029066835200746, 14.36588132092152, 14.410776554777469, 14.362408259517329, 14.270526740974168, 14.26188043837535, 13.811688226680024, 14.061089121459696, 14.009726122315596, 14.070489233807477, 13.70589437799564, 13.032493573782292, 12.2978576975568, 12.547795175950595, 12.45464612317149, 12.914153700435731, 13.158360248461593, 13.097641100140054, 13.01121420658263, 13.516100735760972, 13.642279521786492, 13.5973485991568, 13.608096314192345, 15.337798195611578, 15.2083316162465, 17.333634408003295, 17.41332398793962, 17.021169331154685, 17.651349218430983, 17.577796451991908, 17.45448466696497, 17.570119210054205, 17.662093861399654, 17.606178838448454, 17.608396277101512, 15.981999972066603, 15.524559124260817, 14.022811807189544, 14.050120026184372, 13.50923166739333, 14.502944070961718, 14.528884386636369, 14.90488585543106, 15.032284614223466, 14.792205239573608, 15.028603128470928, 14.98486158092126, 15.077166502334263, 15.02245391775599, 14.895743822128852, 14.83174053891098, 14.79671840780748, 15.09363846675161, 14.351274788462888, 13.778566830120475, 14.16196918075008, 15.321098931839405, 14.883715461499223, 14.78108939337976, 14.52373744335512, 14.272042974400872, 14.470585120837226, 14.33439225809213, 14.124760943249074, 12.584394127139744, 13.11240535130719, 13.4730210105042, 13.463035881574852, 12.344401146047309, 12.463885248933371, 12.347241445663231, 12.255147628384687, 12.182813474789915, 12.33667010496421, 12.391971015873017, 12.471882307282266, 12.125003382662944, 10.952957822595703, 10.752969584811703, 11.087260090802989, 10.762619536959228, 10.581652919442288, 10.60196338600996, 10.397108190320573, 10.025857199968875, 10.463100341036414, 10.413160877061935, 10.30320535706505, 10.355203556956116, 10.293681311858077, 9.892486206790124, 10.038592802731754, 10.230836180827888, 10.168842385077566, 10.293195725911014, 10.564304680827886, 10.481375340491752, 10.466316891300965, 10.630621338235295, 11.10755673171491, 11.83997284290383, 11.845894792016804, 11.727498046374103, 11.945514373716154, 11.814104528867103, 12.16218327692188, 12.19787851450126, 12.34409276268285, 12.1477222363601, 12.48056589791472, 12.3100328583878, 11.483606642857142, 11.399358857531904, 11.50472752917834, 11.470754235449736, 11.849937832710864, 12.649562178590235, 12.498782542234542, 12.410780482841192, 12.50550898749611, 12.199822861655774, 12.636121503112356, 12.995608021164022, 13.3223051346094, 13.257330902738872, 13.44515998723934, 13.258431692770255, 12.97864659226062, 13.248733757780892, 13.228010042872706, 13.226139324540927, 13.053564684287153, 13.043469286725802, 13.013957104206906, 12.50820529956427, 12.121421214884796, 13.915715765172738, 13.723127990072507, 13.533637158652349, 13.487563475723622, 13.155080589039327, 13.205549779934382, 13.09021808502617, 13.086683188141922, 12.789213859321508, 13.177389280890134, 13.44051231582633, 13.378399836531502, 11.837063917678185, 11.861818674934575, 11.514874438842202, 11.840115299175226, 11.824536244942422, 11.6926636164466, 11.765528158315828, 11.722047619903517, 11.458116688686586, 11.558602550108937, 11.484174312558356, 11.355588686692098, 11.25710847798008, 11.157033561157798, 10.863711709905722, 11.02948005716361, 11.077570602474324, 11.23224593330986, 11.141991610547487, 11.097243526688452, 10.89435614169001, 11.01601829403984, 10.742313468098352, 10.76207338721017, 10.661074106364769, 10.597467726812948, 10.273380322883598, 10.207161940299832, 10.08415304746343, 9.692122057605172, 9.880688865961202, 9.807425521630874, 9.396821001447249, 9.629946519940493, 9.742908729691878, 9.85212213188609, 18.5960180918145, 18.74736260262994, 20.857656778922863, 20.7934068007314, 20.788955223622786, 20.94670908103862, 21.367741448230493, 21.392937652738876, 21.32751684897292, 21.707358786414567, 21.583504949735453, 21.469398779457386, 12.972242091212966, 13.329489829869797, 11.464367683629003, 12.057736721444137, 12.045976686476836, 12.29230931183396, 12.199461710239651, 12.508446371615312, 12.582225027777776, 12.743023975957051, 13.080411986850295, 13.247705867024589, 21.95917279550785, 21.77061890063804, 22.574267485894545, 22.888829856286964, 23.05587472426473, 23.046035594803666, 22.655099506029867, 22.605594245642703, 22.38926279199152, 22.61417298179272, 22.714644284780583, 22.664741195845004, 15.059170861733582, 15.133563460883218, 13.690759000233426, 14.229170627139746, 14.454137806178029, 14.694782219016366, 15.308927970277, 15.86680611346369, 16.26525503750389, 17.461398309912855, 18.22865809757236, 19.20869103253253, 18.678894013772176, 19.054442614169005, 19.382192219100165, 20.34237017071273, 20.847783583123903, 21.37000351242155, 21.57680316313094, 21.92068734191437, 22.007211381497044, 22.17301493495176, 22.03554243075008, 21.948556285792097, 22.40547763611956, 23.08827641830065, 23.10739788897708, 23.62632060076253, 23.70707352513228, 23.61333990110489, 23.57711834211389, 23.453866955182075, 23.129244177268784, 23.70595165616247, 23.33831356045752, 22.67425223008092, 21.96394785683162, 22.85360244047619, 21.805469824270546, 21.439298533146594, 20.922659826174915, 20.41945013141924, 20.03842725414489, 19.40823352318705, 18.420754643533883, 18.24105536336757, 18.17014244903517, 18.310614389277934, 18.39917178976035, 16.512631284624963, 16.26193790301325, 17.014666084516566, 17.300469303462698, 17.325637195833888, 17.213615630176932, 17.59340775485911, 17.69148763290085, 18.86640783712062, 19.722782971631187, 20.45975808884676, 20.991116953159047, 21.785895140496727, 22.06666722354952, 22.21302882586368, 22.576117408418927, 23.187674457127297, 24.12410545996412, 24.47012554684096, 24.21513825117686, 24.037376707282917, 24.08096804459104, 24.33599243106131, 24.56695342214636, 24.53600676980497, 24.67610465172736, 25.12348692761892, 25.40782910239651, 25.835154106659147, 25.76788954636659, 25.817050062636167, 25.671761012916274, 25.62595526711796, 24.93151798849725, 24.52506476859633, 24.62268651027077, 24.16778872821351, 23.131557292600704, 22.968101253034547, 22.47380035717328, 21.947867862356052, 21.23774316907874, 22.278987066312, 21.595485777310923, 23.367265869747904, 23.298888197831083, 22.42113727763524, 23.03447390823737, 22.85316204606287, 22.760931841905936, 22.4968103017332, 22.14903955542601, 21.939492447478997, 21.66795388313103, 19.773228559776054, 19.32957559243697, 17.720896333800187, 17.565356966172747, 16.743024009055567, 17.665221867180204, 17.266436155682644, 17.71627034321506, 18.856573566526613, 19.427801751899835, 19.856569196156244, 20.578004967031724, 20.82692637423214, 21.03940786137955, 21.391800698814063, 21.68766690780685, 21.852999906473705, 22.463339606286965, 22.508030439001733, 22.3553015445845, 21.941576404397072, 22.93135540569561, 22.48836038773864, 21.928425495098043, 21.62671199492869, 21.22009390359477, 20.870306628618117, 20.246765436741363, 19.908240431152795, 17.577698554933086, 16.753791132819792, 16.385490697167754, 16.366218200770987, 14.37597733979147, 14.019193641728268, 13.626010987682854, 13.496021196282712, 12.743840283146591, 12.959949866713352, 12.926070334033614, 12.78087646529723, 13.175281450280112, 12.7546060945009, 12.410093754512916, 12.596513374958503, 12.780281340413946, 12.87361468845316, 13.11412116096522, 13.177055153412349, 13.006877117335822, 14.36077655042017, 14.328491105148355, 14.443404852027088, 14.185508066915654, 14.47217235908808, 14.25603448871836, 14.736012237239342, 14.78316224361967, 14.619389989476344, 14.429409692618224, 14.447884307889822, 14.364958319561158, 14.933626872064012, 14.868860035078848, 14.865234961484596, 15.059520713507627, 14.781941365468407, 14.287556415810768, 15.481822457827574, 15.445811818238408, 15.314829142545909, 15.39016284990862, 15.208862516553198, 14.469188009648304, 14.904448542405852, 18.172782810690943, 18.25593172914721, 18.35632860101867, 18.42972735854342, 17.986867971298242, 16.98147544265484, 17.906811456271402, 19.75708520603797, 19.650878411920324, 19.83430739642663, 20.14807031535948, 18.70257524295184, 15.444489229874264, 16.118085971905, 16.375976011416387, 16.450346174603176, 16.702615701388364, 17.060970655637778, 16.36722493845316, 15.68083770035792, 18.877782950824773, 18.836123097416746, 18.53752609461563, 18.33541823257081, 18.140040185535973, 17.255764092323098, 20.07284172844694, 23.13324627482104, 23.173187896669784, 22.774819395347038, 22.622226130641145, 21.258210137732128, 18.63435384716584, 19.17168337688168, 19.42455705018674, 19.705091797852475, 19.698959675692503, 19.85734424610573, 16.844078559134765, 14.204323558038984, 14.217018230781202, 14.234777336601306, 14.240862868036103, 14.192236624914434, 14.15328806033394, 13.899517092724867, 13.939097871133024, 13.797657896626626, 13.841264149237476, 13.754185603408027, 13.785559392890864, 13.659293110848507, 13.750974704715222, 13.80908402338452, 13.79538190452848, 13.900676088235294, 13.96251299344136, 13.99606699354186, 14.052055518729915, 14.12362431618944, 14.228918419215557, 14.166350551303974, 14.08083725155618, 13.893761761204484, 13.622648191332086, 13.528173553300398, 13.424448182417136, 13.002207022637858, 12.79532771123692, 12.558899007992084, 12.513681950743726, 12.499629948723936, 12.590399627061934, 12.529722439464674, 18.780005239184565, 18.977640637409223, 20.78577350599129, 20.830430410208525, 21.006730876984125, 21.589977983504514, 22.270832344580445, 22.461709948957367, 22.458061821715177, 22.40221438422036, 22.2308347561469, 22.36773000770013, 16.272805571195146, 14.572607699968875, 14.297436128402849, 14.418757269530031, 14.402685987861814, 13.584689938920013, 13.791295700950316, 14.184185410294766, 14.496808334656086, 14.543689777699967, 14.639170740273888, 14.329898848873196, 16.368060130796763, 16.56083794903517, 17.116696998132586, 16.97280080734516, 16.841671357142857, 16.57516080742297, 16.494437138611378, 16.062476034681847, 16.00482687044818, 16.199960147058825, 16.331514816370994, 16.670270354453724, 15.63833769460006, 15.35847640440528, 15.871671091581078, 16.125412765320593, 16.18259782384065, 16.710282397417405, 17.523289010986282, 18.53576117035352, 19.3125449545596, 19.65773871794273, 23.251628640678494, 23.16877284016237, 23.4432300139278, 23.22431065293535, 23.36271844257703, 23.841766580724148, 24.51897024851774, 25.268146453727702, 25.28757900151274, 24.25941195248622, 23.939392632975416, 23.87610013001867, 20.802631813025208, 21.048971063803297, 20.975257692032365, 20.86155086749144, 20.849543433328893, 20.818805672969187, 20.676412913057632, 20.84986982020049, 20.398280521475257, 20.459629557189544, 20.355735921023967, 20.22476250256769, 19.7931705140056, 20.34487230080921, 20.608339065826332, 22.326392331891277, 22.44238472575929, 21.954807207084507, 21.023240887955183, 20.82764798327109, 20.595752517195766, 19.97424172536181, 19.62483949120759, 19.22772675251853, 18.21016171887644, 17.558929060068472, 17.018580547307813, 14.900664446000622, 14.42013133348895, 15.219009390928784, 14.620353248423722, 15.547816822517897, 16.419449020774977, 17.35439530816445, 18.12742065943044, 18.730509289258485, 19.240551640678493, 20.14902045199191, 21.190881135653346, 22.182979898848423, 23.109450871770928, 22.91885764433552, 23.68571508627192, 23.906294940398386, 23.653339913615262, 23.74787980602241, 23.676850541315893, 24.040284465141617, 24.57311482450332, 25.211902334889512, 25.146991739807035, 25.29327722891379, 25.182805677948974, 25.327751923980703, 25.13582726061379, 25.698986968617515, 26.179521201447248, 26.04862029502023, 26.66520291822284, 27.113568978710845, 26.61840881224712, 26.322273556489264, 26.17220583114756, 25.71157076462807, 25.53319787208216, 25.228871881842004, 24.72363509126984, 27.30093646560333, 26.512672821428573, 27.574416677248674, 26.627192389666977, 27.371118719498917, 26.374232918145037, 26.52190315919701, 27.51593435185185, 27.3482192455649, 27.38493963499845, 27.266132077330308, 26.80913489169001, 23.71455359903971, 23.415802371537502, 21.517904744055407, 21.540131504896813, 19.66494220121382, 19.359171896436354, 17.806989992733538, 18.76009103976035, 18.298438854964207, 18.19254193643013, 17.7628246735742, 17.143821749144102, 17.309420913009372, 17.417504856753816, 17.42104080298786, 24.8562485445845, 24.464824506691563, 24.43234199145984, 25.145284764752358, 24.687898924279, 24.200997395424835, 24.163342335606007, 24.13745037496109, 25.29629611585745, 28.061956701285144, 27.981886777233115, 26.863501928045608, 20.756684003112355, 21.21418875816134, 20.933156616160044, 21.56060527166132, 21.360678011826952, 21.580776005512643, 22.24586262236637, 22.455715653294394, 21.60064001080247, 19.26057698046703, 19.572106283567837, 19.71843429295052, 19.13554916371512, 18.871099602629943, 18.366858860177405, 18.48861363741052, 18.3152850087146, 17.60409248506069, 17.29117893674136, 17.036026946623096, 16.43654946439011, 19.15321487278245, 19.079790489840107, 19.2758032782806, 19.53616770761217, 19.679904960006223, 19.75261966643324, 18.78848311411713, 19.088597654184824, 19.51415108395581, 19.761487722222224, 20.262664130927742, 20.19145462550576, 18.17889395168067, 18.006382202847806, 17.70240423488692, 17.783982146886206, 17.72958209204793, 17.23029459062727, 17.51913876991908, 17.70741601991908, 17.160926617339072, 16.813372893323997, 16.277740843270827, 15.830205872327284, 15.98101605578898, 16.087782256691565, 16.231919112356053, 15.859394766970771, 15.668633789493857, 15.125254961640213, 15.127276370425294, 14.849329238639902, 15.090342417133522, 15.55266991643324, 15.516361556299946, 16.0246483232646, 16.100282270074697, 15.76969576567136, 15.576230762293806, 15.813657093032212, 15.794086856909432, 15.394461787554466, 15.90076072069328, 16.043328166744477, 15.663364087457204, 15.47245976198257, 15.480246983926946, 14.145471695666693, 14.27375273311547, 14.264397002956738, 14.158379184562714, 13.759174859824975, 13.951471815126052, 13.45187481442577, 15.342666198599048, 17.134600771630875, 17.502124169252532, 17.728107030812325, 17.76794835403505, 17.583910069172113, 19.02083862418301, 19.407225236305635, 19.544617888032995, 19.62003086789086, 19.648985233271084, 19.342649863756613, 16.52040908368023, 15.832226634142549, 15.534503385281804, 15.150281992063496, 14.89315978828198, 14.377402466542172, 14.72525514014553, 14.43720890639589, 14.238553349550656, 14.213768952925616, 13.97067137052599, 13.737040817608804, 15.23889634905073, 15.35452327404295, 15.31363638398693, 15.34282844335512, 15.500345013227516, 14.978455291113576, 15.883837279567384, 15.870543244808385, 16.073468710363368, 16.21713307849427, 16.520623061546843, 16.76496480119826, 17.136162288126364, 17.40554616363212, 17.521389083333332, 18.03804867763772, 18.44072152645503, 18.49654135418612, 17.322896861422347, 17.513524582818523, 17.65587549144102, 17.884727205708607, 17.782343682617494, 17.336125860676677, 16.4391898059446, 22.166500103018983, 22.68105095642701, 24.14279338892784, 24.09762079279489, 23.749916527233115, 26.96757976011516, 27.53592684606388, 27.437115187908493, 27.182112818004985, 27.32028540499533, 27.034573322517893, 27.42919721451914, 22.23852083520932, 20.58869540841892, 20.00587372276689, 19.82177221973234, 19.63645241418197, 15.92058873233738, 15.640933256478029, 15.36621074723746, 15.18312495876128, 14.8036151678338, 14.35484638614029, 13.73391249859944, 15.685744225645816, 15.810837739807036, 16.394343789993773, 16.126270299385958, 15.949169515328354, 16.782782335511985, 17.08673667450206, 17.11822575223377, 17.330494905883928, 17.582299484747544, 17.272946452671917, 17.594621673784133, 16.633893528612962, 15.80030166853408, 15.934238690685628, 15.987520541627765, 15.380219850995951, 15.328504731207172, 15.522079368873197, 16.22180633769063, 16.9164305763288, 17.967969387488328, 18.26770470343567, 18.8328413540305, 19.472227648848428, 20.13964367872705, 20.623863909537015, 21.471985340491752, 22.12117961810615, 23.059805561575377, 23.295920294895733, 23.269972300168465, 23.032117796561504, 22.48782108439932, 22.21023448747277, 21.76083611642935, 22.0441937832244, 22.332741784036106, 22.652628831513905, 22.81298684710551, 22.488413333099903, 23.057912342807217, 23.441873883199957, 24.025027431536348, 24.01237811181139, 24.051668438764395, 24.15539017849362, 24.184093920129165, 23.55132394623405, 24.85852657421804, 24.40244341713352, 23.77026291479925, 23.16298695903889, 23.06757624857002, 22.32020240322276, 21.456237276770217, 21.386067757175592, 20.846740028244632, 19.756718619981324, 19.24246078995157, 18.722537768440716, 16.195583077589767, 15.694164307335928, 15.472980281356987, 14.938009189309057, 14.83228929604666, 14.556366957127295, 14.475840696689133, 14.590044829754124, 15.56941588406474, 16.057754917366946, 16.592931473389356, 17.201715582166198, 17.94246495611578, 18.491475690709617, 18.940390187286024, 19.24646416503268, 19.78868638336446, 19.95247088486195, 20.48281745752557, 20.694736762216, 25.92388888702148, 29.54592493331777, 30.588619652661063, 31.37054544965764, 31.71307792678701, 31.91500890483972, 31.923703677482106, 31.612355817699527, 32.046120052287584, 32.65699546716464, 32.85762531370993, 33.30415226577512, 26.21094146179583, 23.60183532359036, 23.228604797804337, 23.154013943737045, 22.920921329598507, 22.785953853993888, 23.001247710706505, 23.665399851618425, 23.7478975218643, 23.68267372481125, 24.87521988560849, 24.225219886233425, 25.622250235760976, 25.416280012994086, 25.29969475933577, 26.075399171335203, 26.212644774587616, 26.34313962136828, 26.247378189741625, 25.325659074540926, 25.36343930798609, 25.098143991752256, 22.99442493729638, 31.11520671077461, 29.11109806810191, 28.1926060526686, 27.72736328113213, 28.31240029053844, 27.622117037402276, 27.74362948252663, 27.178695509410996, 26.529720310457517, 26.85657585667601, 26.389129578976032, 25.501342596231453, 17.522905962073207, 17.69908478628203, 17.59463410387488, 16.766903132426794, 17.961883909041394, 17.492561589713663, 17.22286273280753, 17.112889632197327, 18.241232965751767, 17.96535476805694, 17.878338311935885, 17.879239192343604, 18.36187454095083, 18.13578414231248, 17.423616238484282, 19.558623300852076, 18.81357889013383, 18.671258530734512, 19.088999195689382, 19.087371654792072, 17.377997748222263, 19.00756118012761, 19.04543012107065, 18.978529832010583, 18.91337041211933, 19.347589253000837, 19.6119008148427, 18.720941262449426, 19.54652727342048, 19.873579187334656, 20.37428429735425, 20.962344542639283, 21.340462607734203, 21.83096955305025, 22.51778405485528, 23.084448326124992, 23.05241033697027, 23.4463390218643, 23.455346124649857, 24.20801434592654, 24.22304325412388, 24.12757429256147, 23.5958327863127, 23.02057561274509, 22.363434882664176, 20.581837597027697, 19.980262102240893, 19.43567954738562, 19.13353658720801, 18.23195870035792, 17.04512433493101, 15.062764026610644, 14.671660028089011, 14.120638648460035, 14.126957634920638, 14.241791645113604, 14.035152006069094, 14.47027927559913, 14.397504004123872, 14.401627373249298, 14.289409781508716, 14.407146597338937, 14.093002240429504, 14.574370272953017, 14.613850768674135, 14.56255991658886, 14.612870415421726, 14.407657908405902, 14.892052280465428, 16.048391326953002, 16.217352625505757, 16.375741949766592, 16.530478332271475, 16.60055272082166, 16.62012663753763, 17.52155000147837, 18.44570272035154, 18.553730472377843, 18.57108815865235, 18.594589245053896, 17.73219241767818, 17.819587024431993, 17.707826877995643, 17.47969908853032, 17.38948000692499, 17.31653577746654, 16.778870839791473, 16.314092673202616, 18.19909669739148, 18.23541796179583, 18.234727303532527, 18.272579459228137, 17.87365777692188, 17.61699818837535, 17.85428817693744, 17.95407611406785, 17.993079130517952, 17.83654989283056, 17.408600214709793, 16.111380057156474, 14.841455636321196, 14.499856624260817, 14.78249897798008, 14.906362504663996, 14.829517247257726, 15.253168132119514, 15.061096367533588, 15.185503506395897, 15.427980320650484, 15.610853753890446, 15.05321247735761, 15.07952632135076, 15.152417585042537, 15.414353926626204, 15.857758388266417, 16.297170424447554, 15.898947781704534, 15.773279258481171, 15.861227453703703, 15.88604365709617, 16.029635496965454, 16.2157513732493, 16.071660279541447, 16.561708514783692, 16.748617993191083, 16.672572919701214, 16.247801384543276, 15.884760006769373, 15.680273580376594, 16.017525348895113, 16.362371379063394, 16.351225789137875, 16.129001673669467, 16.07939373848428, 15.832603306567073, 15.880036982570806, 20.95017850809213, 21.482771793028324, 22.869546346949896, 22.91336988728152, 22.70457831309397, 22.946906284158107, 23.121294675982345, 22.9176296538622, 23.026455746109555, 22.92565985169624, 22.802780689984697, 22.74350419827016, 18.195254936741364, 17.04437500482415, 16.434602807656397, 16.240734745953937, 15.904696845238094, 15.459309432928723, 15.465277234580867, 15.40524067217748, 15.28891473856209, 15.221252882819794, 14.602078019374416, 14.867319446058174, 16.697950445767198, 16.513641214587228, 17.07422251011516, 16.864189734126985, 16.340506921086213, 19.40261960368425, 19.3228644920408, 19.44885669854433, 19.45184934344849, 19.420782626361657, 19.17316795155553, 19.506569095597992, 18.363894005368817, 17.675719501167134, 17.858550637955183, 18.04294603664799, 17.849202130718954, 15.52064135613134, 15.998615560690943, 16.687812479108636, 17.568828207410004, 18.33652229793028, 18.64852063095238, 19.003389689775908, 19.654860688141927, 20.368140603252417, 20.782237057189548, 21.469562291939003, 22.414657352047715, 23.5411199536259, 24.19508122051043, 24.62282637546037, 24.95486903555867, 25.55167377653284, 26.055346369047616, 26.003893447634614, 26.466118478835984, 26.389174017195767, 26.53117195214753, 26.450107324609665, 25.878901276143782, 25.983618342125745, 25.185869036180502, 24.470999592557284, 23.782385913165264, 23.211777129396204, 22.27285074369748, 22.5796339178137, 21.907006209567257, 23.66232670105821, 23.57068081443428, 23.85275623038699, 23.337185433525267, 23.507361647447876, 23.74840985898099, 23.82819733125908, 23.32583016249352, 22.783768897603487, 22.11627031434796, 21.488049015094926, 21.25744502731093, 19.145217495331465, 18.66892446092178, 17.977290276532834, 17.96190996062805, 18.172456173280423, 18.099005578408683, 18.200952561369647, 18.947091950889, 19.44433995666044, 19.575080192810454, 20.15505663562092, 20.521088683433224, 21.128339219032057, 21.927762641690013, 22.596553089105477, 22.36649925031124, 23.24981015950825, 23.40149091114224, 23.50181179395814, 24.03670935247432, 24.785488873638343, 25.082255696234046, 25.949080167522563, 26.331673991359327, 26.249948633053226, 26.169233956115782, 26.218512744086528, 25.84857446431814, 26.02861834570495, 26.26642156395892, 26.46202613437597, 25.823602588702144, 25.39711216806723, 25.219918790562428, 25.520843344048924, 25.91950710348584, 26.1257172910831, 26.35663195093725, 26.89784093906137, 26.97608397611267, 27.28917847901884, 27.68890785410831, 29.45399966184252, 30.02290721778712, 31.833283364456896, 31.547598834578277, 34.61278551805166, 35.44476926789605, 35.57815815305011, 35.2866061835512, 34.56833067779334, 34.14338557041705, 33.789018896591976, 32.69997823474945, 30.291653167491003, 29.590028668378466, 27.497951202782964, 26.514916524276373, 22.37069621187364, 23.14619423179272, 22.18825744708995, 22.01348846657567, 21.20520639822596, 20.429550270463743, 19.650609650082348, 19.295306417600376, 19.078515547774664, 18.37763332963482, 17.514474619670093, 17.495425724070184, 16.537695804579016, 17.82313271397448, 17.371373854419545, 17.65936040467048, 17.861467146047307, 19.354133233426705, 19.984094954948645, 20.41255797222222, 20.53934941635543, 21.45092288507496, 22.09677052537417, 21.28365830524432, 21.45019232618376, 19.79023493215064, 19.757565885932152, 20.450283470510428, 20.53825238966698, 20.39234132885284, 23.48067865834112, 23.28138572183317, 23.169586816579784, 22.861078159620916, 22.766763844615625, 22.33094580119893, 22.20494171475257, 21.843687944677868, 21.1126614624183, 20.57155236850296, 20.14920250178961, 17.775672555477744, 14.947873976190476, 14.508528195611577, 14.092904369967709, 13.44240985494346, 13.019170035558666, 12.834093047307814, 15.059931625739186, 15.672135386865856, 15.604782313647684, 15.627480703703704, 15.609588506613756, 15.44791347159975, 15.942782220199192, 16.277009613678807, 16.47489920681606, 16.54628794989107, 16.51862722875817, 16.51209601151572, 15.998676937473682, 16.594334539682542, 16.38509772587924, 16.21890963559498, 16.04365962947401, 16.039913208683473, 15.588638700855904, 15.241757141798294, 15.191502510223058, 15.15723090086213, 15.403337631286314, 15.834878246187367, 13.405374048207154, 13.880865053532526, 14.645449861577966, 15.756449228291318, 16.362369050335225, 17.580875268829754, 17.628338257002806, 18.341671789215685, 18.77140315740741, 19.40443573436041, 19.63111658333333, 19.519372537599857, 19.2532964991441, 18.96842023817305, 18.56007046690181, 18.190511882586367, 17.726566974011824, 17.858207276737733, 20.16472784158108, 20.242783421335204, 20.233688859119205, 20.440439497069203, 20.8260256389667, 21.21885974657641, 23.14690538141923, 25.092226659274814, 25.390060624509225, 25.59037815834111, 25.500137714441333, 25.54090311749144, 26.18352956886088, 26.33300897961407, 26.21445147175537, 25.90367159796141, 25.66645850015562, 25.449756747198883, 22.57012418759726, 22.027986486305632, 21.807997972144417, 21.35450614239029, 21.12665385170147, 20.915584602488597, 17.98624212885154, 17.93420635986617, 17.82317703316997, 17.605569214674755, 17.27802736858077, 17.098399313958918, 16.870815181683785, 16.80034511562403, 16.587159113990044, 16.516488998755058, 16.496519391398227, 16.790991789411294, 16.96073505734516, 17.213536411048864, 17.687939067927175, 18.203982491051978, 18.95755184982882, 19.4850706774043, 19.94832706660442, 20.00468324525366, 20.226242713818863, 20.39500567289138, 20.29855341495487, 20.02097126427988, 19.835150046218487, 19.49185858963585, 18.96716670004669, 18.54713392724868, 17.92943307002801, 17.37222964503579, 16.746134256380333, 22.67195515343916, 22.51698319483349, 24.031951144439255, 24.52028461258948, 24.86235719097841, 25.12365289417989, 26.131538498910675, 26.1769119326953, 26.021944322206657, 26.11705879839714, 26.19062822214441, 25.407077839168352, 20.079573558278867, 18.974129700653656, 18.12435665953138, 17.762721412143925, 17.48967431842251, 16.64006217877656, 16.554657289371303, 16.681528723544975, 16.854376442110176, 16.816278985527543, 16.913783787270464, 17.645838250077812, 19.761947415110487, 20.19981635456504, 21.440657121997017, 21.58692235220937, 21.63375457545453, 21.926700533962293, 21.68667263958917, 21.773100930672268, 21.72750605469966, 21.72219070557112, 21.752162800474004, 20.200642274898847, 20.205873615779645, 19.141143982726422, 19.271244605325805, 19.32489786943667, 19.298289331923996, 19.33872586021177, 19.93833888192697, 20.57570573506069, 21.12154401697985, 21.61871972666188, 21.662228257858704, 21.68332237379396, 21.713588894974198, 21.53455766659861, 21.262622482161028, 21.18431961167782, 21.50602129760608, 22.09170275479305, 21.92372845367777, 21.63539016540616, 21.628455926859637, 21.60500788552117, 22.54269762518038, 22.29159313975676, 22.528521286175952, 23.50189944568939, 24.15358981732518, 24.483972385050315, 24.404808195158257, 23.93216315686275, 24.22049210792095, 25.0800976809057, 25.22534073627105, 25.343083454137563, 24.548261399529927, 24.083029576164936, 25.151599504883656, 26.015647014439484, 25.663427436217, 25.093888520873342, 24.68366422529786, 23.975407698263936, 23.01768253612117, 22.016018139200124, 22.300774053688144, 22.438645146324827, 22.843194669156556, 22.77852076851852, 22.12770417592528, 20.95278496234049, 22.113007929816373, 22.79582761041083, 23.31814129516872, 24.267740082299127, 25.12724534663866, 25.82570004185925, 26.0088352647648, 26.294990845081177, 27.00750704589623, 27.72764737780015, 27.65666453344789, 27.91849250172658, 26.87803489582025, 26.68267526065982, 27.06714782298475, 26.86377454539267, 26.684953484049178, 26.1245596901669, 25.622710705844767, 25.23807953179985, 24.319545318938687, 23.713269790927484, 23.76571130890134, 23.413174668145032, 23.58359176953003, 23.667646392156865, 23.53362075, 23.639371376180776, 23.704684197123665, 23.974018979536257, 23.92415891223156, 24.07468060558668, 24.13495737268, 24.337266162920816, 25.242898762575216, 26.05427154793028, 26.021685345856685, 26.07940935862123, 25.70224293033899, 25.384112914517445, 25.056439769452226, 26.51549508208839, 26.375488836752385, 27.53614182240054, 27.39559779466231, 28.98718584999817, 29.98407870728291, 29.332229897525675, 29.52194098576425, 29.22539769648513], [49.22642215880797, 48.01863344557008, 47.58115212127497, 47.55278564067849, 46.11720347079965, 45.517017588157486, 45.33499340297984, 44.11722594351074, 43.9041214194464, 44.3829222534236, 44.39015231216931, 44.371059205416806, 44.30810886851429, 44.67072344039838, 45.9296876083878, 45.94687446903207, 45.19218983945236, 44.57519364791472, 44.42972663539918, 44.64203541409897, 44.83044130508871, 43.604856486227824, 43.80085667096756, 43.27542240894284, 42.9247708207815, 41.70164472595705, 39.6544363820417, 37.69474437990131, 37.09801674626517, 36.685476580376594, 36.799948564892624, 36.878310366635546, 35.6685831826953, 36.11973375461602, 36.44919915009337, 36.00593106963897, 35.79528230026455, 35.90231595935199, 35.95468532135076, 36.14612120068476, 35.2950615428727, 34.022142162190065, 33.00640689705883, 32.192828284717045, 31.395021825319017, 30.248611885698725, 28.90360721444133, 29.09015018432929, 28.780287483172668, 28.51566609718332, 28.15938170969499, 28.72454315040461, 28.64683782282913, 29.58129410445781, 29.50797009360411, 29.20465817794896, 29.10976796428572, 32.45006003882664, 32.7076343977591, 32.25187313988679, 31.88480310886898, 31.28590714625655, 30.70777620883909, 29.86680989733672, 29.511410588079677, 28.585086461406785, 28.73731827365391, 28.347768949346406, 29.15906471178607, 26.08536858154373, 25.20538055188816, 25.035326410052907, 25.059913424670608, 25.25050974066293, 25.07244583434485, 25.097583688945303, 25.738290958916902, 26.47160635169559, 26.31924179442888, 26.3665195402272, 25.614675017973862, 27.015555648770626, 27.29346251121745, 27.807852736539065, 27.9004951250428, 28.81517322572298, 29.0805518778874, 29.245231968876443, 28.820360196467472, 28.71119549657641, 28.53114915608465, 28.86396901167134, 27.44918483518747, 30.54111935543106, 31.292748856520383, 30.644366173577403, 29.90965067460317, 28.49880996366325, 27.898735191098663, 27.376916665911963, 28.415098115402383, 31.036072351229382, 30.21136382996615, 29.594108891223154, 29.30992601233085, 25.20647961666783, 25.60034371249611, 27.01304145074696, 31.283486721443516, 32.21152142343604, 31.92467444156552, 31.83922909593837, 28.83590187003841, 25.57814725217865, 25.338408038515404, 26.276186588654166, 26.117338833722386, 25.923625160735693, 23.48218648148148, 21.590479184452487, 17.26253512282913, 17.344829712184875, 17.421986328353565, 17.53556724315282, 17.708428744319953, 17.91706180088702, 17.95688938787997, 17.812404573685033, 17.92020092360528, 18.02943746661998, 17.82018976206038, 17.53124933901338, 17.493946751478372, 17.629938867491443, 17.668620302193563, 17.621531064659198, 17.643464450124494, 17.637358396047308, 17.521452346560846, 17.489621179582944, 17.424002879079783, 17.397014296874676, 17.62320951023252, 17.6789010568005, 18.48281788943355, 19.34237434827264, 20.431709308590104, 21.28555160576729, 21.81830951011516, 22.306369914488016, 22.60184847763451, 22.888507573685036, 22.949313793293623, 23.925492146358547, 23.530016073295982, 23.656782986150013, 22.925233742399367, 22.736888742919398, 21.60689133601904, 20.65704979916485, 19.55644746599751, 19.1880373899004, 18.79946606388111, 18.901139532679736, 18.821232846133427, 17.95898474377529, 18.083462295518206, 18.07901333751621, 18.11584749206349, 17.75954700933707, 17.70563321879863, 17.849110892156865, 18.03618872440805, 18.175658745487084, 18.344174017306, 18.54025954184952, 18.550486814775024, 21.27964629606287, 21.131594779411767, 21.261048924058517, 20.969123099206342, 21.22506628664799, 21.493821669961537, 22.33102388748833, 22.016693115234983, 21.78931691705571, 22.118279974556486, 22.202353745953943, 22.156805167507144, 19.531100009881733, 19.82688232127295, 19.872764377762216, 19.988910000289053, 20.433315654139435, 20.332601205493308, 20.17775978618114, 20.494501569467783, 20.898525728229068, 20.65666549592995, 20.74468349352486, 20.92400924560998, 23.544966465964837, 23.146585621095287, 23.628442311756924, 23.24125435549887, 23.246556067262123, 23.30338630942982, 22.82613787856789, 22.58803534018052, 23.13332229030501, 23.107437842748208, 23.31825088185756, 23.384475702658168, 21.276452566993463, 21.397341466407774, 21.621637014316835, 21.704069050714548, 21.693142928415813, 21.66437974004046, 22.01173521975504, 21.676683454823504, 21.48731580021268, 21.784750683473387, 21.80675374782135, 21.594647851851853, 21.77479076758481, 21.409410344232462, 20.9124588802521, 21.203681509726117, 21.94538575816993, 22.072180904027324, 21.749660247899165, 21.811879881094384, 21.654762783302207, 21.36462927248677, 21.583745119086487, 21.411037452301848, 20.921095482869724, 21.03641530236539, 21.3154725699502, 20.812210952847803, 20.214374823295987, 20.046016017740428, 20.07174406529793, 19.554302446382536, 19.599841785014004, 19.10301133146592, 18.86702406581077, 18.815000708852075, 21.40220892615936, 20.917623902661063, 20.906191079909743, 20.768116950560906, 20.79094863227513, 20.82410678392468, 20.928292201914097, 21.27063308722378, 21.670544856598195, 21.867876807201903, 22.08250613977592, 22.16111727099684, 27.4580910865235, 30.11965082422969, 30.250339191409903, 30.552442961718025, 30.79117288048553, 30.82186654621849, 31.047321032705675, 31.46837588353236, 31.753710049679647, 31.960785034720725, 32.25226613959973, 32.512434020962246, 24.355531087176416, 23.33370787162713, 23.15544917555166, 23.332174450112703, 23.474877395129308, 23.500608666666672, 23.159111589091196, 22.285227425070023, 21.954692516651104, 21.31098289639615, 21.20001216993464, 20.23075913066388, 19.420467103018986, 19.21121229380641, 19.395187421947945, 19.18089224984438, 19.522364717310527, 19.84657405368814, 19.83826176213819, 19.79214600839081, 20.223114418129857, 20.62566323269468, 21.05526008083197, 21.243462443824168, 21.406557751043213, 21.60569166463765, 21.69072885827378, 21.642829485855604, 21.3670989146051, 21.215792288178235, 21.451506883831307, 21.388621270230317, 21.70242618829754, 22.73215312488329, 22.801009975857845, 23.061224360644257, 23.49069945837224, 23.913621678338, 24.501009540965097, 24.504919401805164, 24.359340975704093, 24.24160927217553, 24.58882563095238, 24.71844157538451, 24.60874668291252, 23.846113746420787, 24.28084433597884, 24.220810129570385, 25.580022719550787, 25.46846020697168, 25.1450050978836, 25.54611614628073, 26.4241365353836, 26.4949021223902, 26.326540388499843, 26.17010843308434, 26.03685425731404, 25.464440100762527, 24.952819721910984, 24.732340617187635, 23.028346450046683, 22.398941047619047, 21.66482333549578, 21.16706419327731, 20.82097394483349, 20.771006690865235, 20.732657418611893, 20.81721790328353, 21.230406575241204, 21.5748210489418, 21.80695927966155, 22.332148597961407, 24.867273014705887, 25.381847927400404, 26.66831692732649, 26.84044906707127, 27.12729255854345, 27.16466380811547, 27.10846669779023, 27.045557655462183, 27.157567922502334, 27.39516647875817, 28.899730283992184, 29.64309360848449, 27.10938827513228, 26.665161225595245, 26.237320142079056, 26.235987520919576, 26.04949075723623, 26.09494147383871, 26.004813399369567, 26.04599029364496, 25.71741665943044, 25.330261762760657, 23.67509463748833, 22.57835289640693, 24.224731136882763, 24.283350299875504, 24.10025475155618, 23.82574038250856, 24.01668724719888, 23.986628835511983, 23.934451111627272, 23.437486916044197, 23.293938609372084, 23.10989858862434, 23.13746179815399, 23.074351779730137, 25.19615023478608, 25.35080058294429, 25.98660653213508, 26.162959299019608, 25.76680628272582, 25.61549437217945, 25.55148672829132, 25.477035926781824, 25.40576632119126, 25.42003432407408, 25.50421306442577, 25.150657703270923, 21.26372182173073, 20.646881443813545, 19.628882005991283, 19.279176397058823, 19.7569800629474, 20.091566773884743, 20.27325459873949, 20.472302158341115, 20.52197520525988, 20.847437604730786, 21.061852019452225, 21.363689096124475, 21.518203704870835, 21.77352846164021, 22.22681499367608, 22.361878065748524, 21.77802395549331, 21.308140476501716, 21.17419975295674, 21.02631024766573, 20.735028770852782, 20.56360521093993, 20.57162795689387, 20.399265504344893, 20.13841539993776, 19.93807683185496, 19.834503839402423, 19.860116838001865, 20.29297698895114, 20.607017140056023, 20.383826087068165, 20.078903352474324, 19.929675340957417, 19.8380091151468, 19.50982519840297, 19.31015897780765, 19.20070738881108, 19.20382594692201, 18.84933745837224, 18.59909257718643, 18.273407485038533, 17.87290598434874, 17.734736338613317, 17.56528979365079, 17.473578806094388, 17.33956383426704, 17.301066514550264, 17.17497247230003, 17.775817118707902, 17.46986222953626, 17.072588970354808, 17.32003069817927, 17.648914656960667, 17.556589322051043, 17.778938125661377, 17.993940693355118, 18.16627469039838, 18.1953996459695, 18.001185994921677, 17.97509814981832, 17.303557408341117, 17.605650988250854, 18.16758938671024, 18.13657610882872, 17.722728951213817, 17.857514236357567, 17.959470070009857, 18.08973708909119, 18.03161616565515, 18.27227201408341, 18.72602749880373, 18.806069932954884, 21.50535822595705, 21.26686339340181, 20.90735557155242, 21.207010470121386, 21.686317506458145, 21.628733457516336, 22.467839708839094, 22.09419322689076, 22.297599037614127, 22.30764127030812, 22.303164188883063, 22.49562911113529, 20.177505634375976, 20.71068718845316, 20.987227714985995, 21.000593747976964, 20.646707268985374, 20.746118831939302, 20.141004657718646, 20.415236518051664, 21.165876037037037, 22.13290462519452, 22.55626661865858, 22.68391819919079, 25.072485702147528, 25.15039282200135, 25.59750544102085, 25.62816505808535, 25.96334058356676, 26.404485524898845, 27.15361869133209, 27.448291579174665, 27.02698846802054, 26.82508588001868, 27.02257709532768, 27.277182715790392, 25.26025431248055, 25.2088381080422, 25.232935220199188, 25.95734146589705, 25.794194331388116, 25.43308517601088, 25.01175918176159, 24.699965841814503, 24.77977933473389, 24.316400732337375, 24.007139978090965, 24.10201367557582, 24.29529827349829, 24.02603707461873, 23.30084065227202, 23.341364688064115, 24.095743980469965, 24.389292270152502, 24.130977325319016, 23.956601985204635, 23.771866051820727, 24.16526897222222, 25.034042809601623, 25.27214217190969, 25.26107144872393, 25.49021241674448, 26.207974457438528, 26.741165670837965, 26.4530340505907, 26.78595502248677, 27.370441799486464, 28.321277725344316, 29.33683119662309, 29.22358865413943, 28.66772015102708, 28.68611192763772, 31.293465623199378, 31.30527886087768, 31.068219484469356, 29.99135959158108, 29.03386834539372, 27.944547591347654, 27.262084379240584, 26.29965303369125, 24.89166986276845, 24.2705699437902, 23.688341598350448, 22.884884248980907, 27.062661048163715, 29.31311685862123, 28.81357384825324, 28.76793205905696, 28.83656257664177, 28.9256919199139, 28.848179704814427, 28.83530187830688, 29.408457940943048, 29.283756646591968, 29.124895336735484, 29.084048571895437, 20.914654897759103, 19.827339088079675, 19.92268750188557, 20.07001665631808, 20.598497732415183, 20.863570133442263, 21.0919945783393, 21.10547882633053, 20.89533875412387, 21.06196167950514, 21.19717439033616, 20.79356025910364, 20.31715731232493, 20.44371462861811, 20.837927529645192, 20.605390406551507, 20.28751190172736, 20.53876100816994, 20.89328738530968, 20.49232291643324, 20.796854143301328, 20.81502135721872, 20.485295068549643, 20.394720312169312, 20.279916621070647, 20.1214590384376, 19.604872150404603, 19.655154471288515, 19.697603154512315, 19.44763099608621, 19.06184654007158, 19.129054820339245, 18.90479508418923, 18.876708723856208, 19.119302100217865, 19.190233597747444, 19.41320318220512, 19.312941666300315, 19.322451629474013, 19.343263849439776, 19.11665328475853, 19.06444952931581, 19.3575005641956, 19.28404352684407, 19.216174898770618, 19.0519663129474, 18.97432355174292, 18.71221145629929, 19.592726828509186, 19.52083635200747, 19.393922115546214, 19.51321978960473, 19.82656679606287, 19.92259376501712, 20.320476733426705, 20.34762199517585, 21.00823802908432, 21.626686136476813, 22.13833249481405, 22.521966686283736, 21.708194171053083, 21.812564246887643, 22.036611457594148, 22.145346252256456, 22.38306155096483, 21.768796357533876, 21.72602359710551, 21.58920232612888, 20.985310859943976, 20.282927694600065, 19.91580357041705, 19.73154822091676, 22.27496820854332, 22.450273570774645, 22.228833507470053, 21.98841113886192, 21.924609060273607, 21.957094696553337, 22.03657708719891, 22.19286273648743, 22.478862121112275, 22.934833294347182, 24.96564416951774, 29.874431186848177, 31.40778831255836, 35.68048419296608, 40.15242419374416, 44.510007419856834, 50.63687889488018, 60.01104826136403, 69.32778751215835, 81.54387592841582, 90.97411241176472, 100.39826547603488, 105.71036073956316, 107.30241956646697, 104.92908334765018, 100.69583141845628, 96.33844346068706, 92.17272100746966, 85.75465307966334, 76.2443469335722, 66.28534584741674, 53.70079175591023, 44.09455678244761, 34.36922771053727, 28.543903557280995, 21.778702780223888, 24.701434883441674, 27.225677245970157, 27.748189117724863, 27.61872590118269, 27.291709204022744, 27.232780615611063, 27.425824508014315, 27.015005237807397, 26.82925278657018, 26.102311637799566, 26.143083291394337, 25.935186652361967, 22.170234714021827, 18.92754947243036, 18.60676028693914, 18.42199612861811, 18.48117893479614, 18.359699483336577, 18.25218294366636, 18.491735171490816, 18.657386412387176, 18.602839098117023, 18.92144750380101, 18.76299016339416, 18.818928993541864, 18.74613302941176, 18.90279035978836, 19.20694063320884, 19.20424654341737, 19.149943991985683, 19.13106484195521, 18.89247502776805, 18.77822826229381, 18.500306113276142, 17.999715294166933, 17.93223387480548, 17.756914117258017, 17.32974572167302, 16.99607420043573, 17.19319135842638, 17.36052511920324, 17.303044137012396, 17.1918834853084, 16.967341590958604, 17.14929098716153, 17.164666656784934, 17.281885778400248, 17.56319570346639, 17.439542501244947, 17.577388044428883, 17.755485768751946, 17.376030187619957, 17.575763518822626, 17.785910294973547, 17.957486201058202, 18.12848343549642, 18.042633804388423, 17.928968695222533, 17.921458831854967, 18.00272002925615, 18.971592136399003, 18.97049284070313, 19.3259013448144, 19.65514782656396, 19.584655059290384, 19.379827725334582, 19.194517278011205, 19.055726403439152, 19.3070010061469, 19.335229504046065, 19.32920701882976, 19.05315858955665, 18.15732751960784, 18.12240729761905, 17.774291038983595, 17.396494477971654, 17.15793416705571, 17.123704779100528, 20.60666528680361, 20.50438917779334, 20.5048956686897, 20.437528115468407, 20.843609482726425, 20.861359384695717, 24.29351971103655, 24.264874631108, 24.301355726968566, 24.64214807971308, 25.060564869047617, 25.300740858560975, 23.0825087587146, 23.46881264223467, 23.62720186437908, 24.414274776589288, 24.423839348272644, 24.706590324066298, 24.160776623171493, 25.12888288849984, 25.92014556232493, 27.234020038075823, 27.82138685504201, 28.41057034228385, 28.890878134220355, 31.355495718720825, 33.175064941487705, 33.40997846529723, 34.25999788289761, 34.74521137231559, 35.12812370525988, 34.798735925303454, 35.44081547914721, 35.56537147702044, 36.05368179761905, 36.06188960262994, 35.585103011360104, 32.75437320424836, 32.728208876349896, 32.5470483017384, 32.80628107173981, 33.39231994073962, 31.52463742343604, 31.327438293703324, 30.25103242242453, 30.084764698021058, 30.095365400015567, 30.16288674688764, 30.179879159274822, 29.78979763849984, 29.778882187192654, 30.31784931636127, 30.495486598086607, 36.440866575241216, 37.832469734827264, 38.01386167330448, 38.61748264705882, 38.74487067818238, 39.03039582026143, 38.85557459010271, 39.11846690694056, 39.56331872883597, 39.6377348382353, 38.92263339883288, 38.749449367180205, 32.438215018051665, 31.471576246015537, 31.371964542172424, 31.11061978787997, 30.50596528343837, 30.2462778295207, 29.99759486196771, 30.13913824180543, 29.691814952303144, 29.71280022712418, 29.41386435760971, 29.712262670680964, 29.310766931771894, 32.04599505967943, 32.50596429067527, 33.140742451136006, 33.9575633409586, 34.40087451019296, 34.93257885262994, 35.03861612791784, 35.38368026439465, 35.80839907135076, 36.74508206504824, 36.65891775194, 36.86690275914738, 41.27298947300032, 43.9588015874572, 43.52581451937442, 43.71047834169849, 44.01456539550264, 44.42229656380331, 45.39852463180828, 46.16026352170869, 46.4597642104731, 46.65742781900548, 47.27913054326501, 47.26149308025344, 39.38412365265325, 38.221582868269536, 37.39076390483972, 36.868054775287895, 36.588126107998754, 35.75897932275132, 34.226834120448174, 33.38493604161155, 33.2302625165962, 32.85559070918567, 33.478589811584115, 33.16749459298164, 32.897321226047865, 33.71615432485216, 35.992710752489884, 36.79390678644831, 37.38561154282538, 38.20600162636166, 38.282500288359785, 38.51517326462807, 38.56929771415345, 38.76743528390979, 38.15847894571857, 38.29037608520075, 38.29969243674136, 38.28676803563648, 36.51811189760284, 35.93109049376037, 35.59378192864924, 35.49701186282291, 36.846057758558985, 37.08804914480236, 36.53835472368698, 36.13693775373482, 36.42628384233648, 35.61391222354497, 34.747902378229064, 33.38263286072207, 33.42812430656707, 32.46876161360099, 32.141030418056204, 31.24016412091503, 29.568816927170868, 28.997286564192343, 28.635147733193275, 27.772103709724167, 26.58957010578481, 26.257909192417067, 27.359808656940555, 27.263485480852484, 26.503615994319947, 26.695571819794587, 26.72047822891379, 26.373823332555247, 26.13342181839403, 25.455168671179575, 25.40133575988173, 25.387871827653285, 25.40652143841361, 25.56978723805025, 24.057396903504657, 24.033799745046178, 24.342470104497355, 24.50605088873327, 23.77053405446624, 24.0372289195456, 24.18250674486461, 24.300387996576408, 24.365457076408344, 24.6915891282174, 25.76473167320261, 25.61724889737006, 28.94028776330532, 30.273754625194524, 30.399270234126984, 30.65821055026456, 32.542576102853644, 32.571782649782136, 32.24112228781513, 31.96820407251789, 32.36110079847494, 32.51451853197946, 32.09167562293806, 32.91027037246628, 29.86935627139745, 29.148707606286965, 29.241205149470897, 29.34727675381264, 27.87856933294429, 28.170630695066915, 28.68572170773615, 28.9895505317629, 28.361366310613136, 28.15789309757236, 26.96211500910364, 26.672603264239022, 28.152694536258952, 27.700315704870835, 26.95414130399938, 26.80664896047308, 26.823282174369748, 26.34659918806412, 26.06143979250312, 25.913789191643325, 26.078392013501823, 26.372136769374418, 27.51317698046997, 25.74797597697481, 29.298817535415377, 29.27576896195144, 29.351718863791927, 29.270464913787738, 28.957040610799872, 29.34788854551821, 29.206028208106435, 29.151100431216936, 28.91278298033964, 27.662358217553685, 27.417192423669466, 27.201477525643693, 23.24273005259882, 23.21841785192966, 23.207754576582765, 23.01918132710862, 23.139135519770598, 22.650913848506068, 22.76709762854031, 22.689755432773108, 22.63955023770619, 22.769765150171175, 22.618033233431248, 22.63442907996292, 22.30068725831324, 22.007070817770256, 22.037238907238823, 21.708679084189228, 21.564256570806094, 21.44017135992712, 21.252460982337382, 21.075824183207548, 21.2674260489418, 21.20053970790538, 21.251389868658578, 21.317738862978523, 21.60486118681917, 21.585621243137258, 21.3359296853408, 21.487785241985684, 21.494636606131344, 21.793366966464365, 21.73997083317771, 21.675941489184563, 21.208315414954868, 21.33115166518829, 21.497724897603486, 21.29794699369164, 21.027568777388733, 20.70918585690943, 20.53369083823529, 20.29380557212885, 20.3298139326953, 19.76246317491441, 19.659706530345478, 19.65815183053221, 19.54356457905384, 19.350280589533863, 18.97599684726113, 18.965997125116708, 19.76720427077498, 20.07223472175537, 20.212204071456476, 20.17324979715219, 20.616294252723318, 20.858758912542797, 21.107395790771868, 21.02947070518207, 21.28888950835603, 21.353202968414145, 21.404580717787116, 21.59086951912881, 20.88036724346405, 21.59079433699035, 21.690623802754438, 21.86178836884467, 21.4303653390912, 21.404569343915345, 24.81119728338002, 25.30934141526611, 25.90553879053844, 26.23608545222533, 26.48933733300719, 26.366027918011, 29.68108192059862, 29.1208248321662, 29.200773604512914, 29.52816374097417, 29.752377087068165, 29.462190142545907, 27.000643820572677, 26.30636323965337, 25.556963459695645, 25.79264915764084, 25.8511923719862, 25.709794231707583, 22.415196874961094, 22.43619416938998, 22.0220383112356, 22.6891486949113, 23.35062031601632, 23.937172325907383, 23.98410091472145, 24.96970668183552, 25.483732921568627, 26.243404253267972, 27.07714558294429, 28.670110998210397, 32.187508991830065, 33.51391636749145, 34.11246381722689, 35.14309537728045, 36.04638024657642, 37.12484056567071, 37.56227623708372, 37.717223187675074, 37.57798150816994, 37.91890366246499, 38.83127992514784, 37.63708387223778, 36.57397452824463, 36.57184226447245, 38.45578046350763, 38.59634270650482, 38.28778581753813, 37.70627758333333, 37.81191665678494, 38.011945681528175, 38.471835139566494, 38.62729321146775, 38.21645444507664, 38.51981696078431, 38.20181956139122, 37.84138923506069, 36.374140086834736, 35.946295974011825, 36.07020610006225, 36.18385681037971, 36.23594820813881, 36.07060962317293, 36.14898241760037, 36.21110749439776, 36.87321183434485, 36.83266640157174, 37.39637115217671, 37.5140499387359, 37.890717272486775, 39.05946394038595, 39.26310775560224, 39.33631256969928, 39.43876841293184, 39.65967631986983, 39.65661913895178, 39.32523165795206, 38.77243251056126, 38.94869402598817, 41.76542209656085, 42.23225395915033, 42.11375048358232, 41.0244806486792, 41.32271387301588, 41.97846603921569, 42.33116671996577, 42.818172244086526, 43.14988100918145, 43.3835365445067, 44.26133339510388, 43.22344270767195, 49.40735145059136, 52.15936747619049, 52.53724480960162, 52.95651691083099, 53.54930046046724, 53.91590901551769, 53.67651775529101, 53.60228736780268, 53.72536193350776, 54.52343657220667, 54.31017107318381, 54.2008856642546, 46.09349563227513, 44.95010093285092, 44.19882471226268, 43.81360803478058, 45.47562106162465, 48.14350957516341, 47.888619602863365, 47.66725557346606, 47.78221200256769, 46.87029011002178, 47.08758884010271, 46.48806892094616, 44.76705574722287, 44.56534822502334, 45.16686927466543, 45.51549939651415, 42.557911791783376, 38.97667603944912, 38.94171684617181, 38.33292084192474, 38.227323542016805, 38.09527345206972, 37.27223778944912, 36.80561291635543, 36.95677202155307, 36.3413123453159, 35.151828722689075, 34.37428813015484, 34.738500743308435, 34.55764404013384, 34.492868181216934, 34.0250749980587, 34.08348560870359, 34.158604505368814, 34.61261144786804, 34.01041621138344, 33.66912877031983, 33.22480077684668, 32.71425728306879, 32.23881685574229, 30.20792550007781, 32.17835801984128, 32.073222678026774, 32.13285971655839, 31.2085296678338, 30.66266611749144, 30.96746361375661, 30.641996946067408, 31.55508304512917, 31.548019322284468, 31.3865157775679, 31.63264570183629, 33.94762469288827, 31.742948735047072, 31.078413851540617, 30.404459265950827, 30.204062463196387, 30.141786195222537, 31.10076899627172, 33.39696159282537, 32.95877868884221, 32.88834250933707, 34.08064286397968, 34.35259559298164, 36.10586858683474, 39.77896981512605, 39.72665897533459, 39.57419134745891, 39.59682214867401, 39.35250368345783, 37.49373085900898, 34.4503020542328, 36.818243204715216, 37.10204748618505, 36.199953439698106, 35.45294857944288, 31.95483483769063, 28.1283546643324, 27.94323828874884, 28.1753249903517, 28.836655092826017, 29.32793514417989, 28.32266191394336, 29.08420261959613, 26.917182726268283, 26.826377883520077, 27.05919806854964, 27.06548101346094, 26.93391917927171, 27.125275409119205, 27.412147390367263, 27.495289784702766, 26.457017660364144, 26.30575153314659, 26.39602890118269, 25.727281255145765, 27.317407130096488, 26.89858193716737, 26.290778678493616, 26.469410380492075, 27.339685071428573, 27.22963139231248, 26.991881072984757, 27.07605014363524, 26.722946515133835, 26.889600353018988, 27.373218908263308, 26.868705239651412, 28.790978563414257, 28.73661530119826, 29.194975060535327, 28.75134242412011, 30.396431946934328, 30.27585546778712, 30.054153444133213, 29.393686702925617, 29.02843897346716, 28.61338291370993, 30.67725612449425, 33.77583766056417, 29.984903289789774, 30.19518283807968, 30.31374239628073, 30.72283039838157, 30.28373156722689, 33.813438064503586, 33.913202370727646, 34.12609935760971, 33.96023607718643, 34.26833334414877, 33.00796349151883, 31.15045166884532, 34.265915018537335, 37.12554979645192, 40.49939247385622, 40.20020378516962, 36.83253874136321, 33.42863130967943, 33.47746425365702, 33.386703264083415, 33.80710469887955, 33.52689523031435, 31.541098522798013, 30.405100960473074, 27.07640091503268, 22.78150598201241, 19.773898905462183, 20.009361149470895, 20.152297630485528, 20.00852504100529, 19.73490725373483, 19.85710145252221, 20.11099414018922, 24.627290656084654, 25.878274619981323, 25.951706377414677, 27.056339983566115, 27.613284384871363, 27.771010882352943, 28.71607924556489, 29.231417926650227, 29.14531816378773, 29.12390867849362, 28.915548698467187, 28.21739090102708, 23.47318910566449, 22.34244744391297, 22.60567254901961, 22.623659337457205, 22.112353950357925, 21.93654128120137, 25.62067630049798, 26.12134706302521, 26.15951701268285, 26.27517531689167, 26.129478135231867, 26.29376933535637, 27.15590116493801, 27.26173681279178, 26.807268650430828, 26.19529432912517, 26.49506022650171, 25.84103497634609, 21.69124500248989, 21.52116791643324, 21.56801485084033, 24.5488948775048, 24.776065979769687, 24.056312628462496, 23.87663226942564, 23.880711011671337, 23.970257733275293, 27.181510342826023, 27.00060966429026, 27.11291161922038, 26.96985668953244, 26.823798028089016, 27.000862420168065, 24.94708143711799, 24.88281943401805, 25.11509773739496, 25.225690555010893, 25.286659111655773, 25.430205279384204, 22.48188290413944, 23.22700120188047, 24.388290179028555, 26.761579736227823, 27.58766608706816, 28.30095522131427, 28.645649711850297, 29.71000447814691, 30.79346849203118, 33.769201511437906, 35.283343189309065, 36.48393017366946, 39.42549148558575, 39.7411311276066, 39.621362296996566, 40.21384593744165, 40.78610281963897, 40.86529348887333, 40.768190108839626, 40.789805688842215, 41.20874558302209, 41.0752959618671, 41.29067567351385, 41.21777781092437, 40.71303634208426, 40.99532957180724, 40.27934686507936, 39.480349841198525, 39.82479843049073, 40.07448575683746, 40.43959089078377, 40.890941071769525, 40.53476370460799, 40.68045821241843, 40.50853172548919, 40.05194094002463, 40.13359030134583, 40.537051255584814, 41.30316490488423, 42.28686322150615, 41.980918229735934, 42.65806854048867, 43.14920314502542, 43.132467269141, 42.74655761399004, 42.96608425023343, 42.58022081691566, 41.9039705283897, 41.463704072984754, 41.42998325291431, 40.27952680749843, 39.37779799096025, 38.74908692166957, 37.87122334949133, 37.40940432148239, 37.29854163773972, 37.02882276498026, 37.65902714662735, 37.96369139897667, 38.2946611929472, 40.82154933902285, 41.00303059707957, 41.68110959650291, 42.9853989074538, 45.041378026516455, 46.93506638608777, 48.59695799317815, 49.172956765950815, 56.71729853539591, 58.95473113943355, 60.22524676076429, 60.06133187130408, 67.83262201968829, 70.94586106473702, 71.13177820603796, 71.39341485596016, 71.15771786235605, 70.72981863328665, 70.16546886025522, 70.3463996346094, 62.548270696441, 61.077558109710544, 60.17307234025833, 61.75470991335781, 52.06441615972256, 51.41110109018052, 51.15715935500706, 50.73587938172204, 49.792306906473705, 48.85562567896379, 47.937759904997314, 46.90862780836092, 45.820427804136266, 45.648090857765325, 45.68158715935263, 43.05571738243075, 42.065330707757006, 41.28528899673203, 40.98870615504479, 41.18562163600996, 41.6670502140391, 43.683105049386, 44.801974315698615, 45.85765474719888, 46.79006088897856, 46.96421612994086, 46.84502348192154, 46.81271020347028, 47.319746072593816, 47.60242914407616, 48.238397991597296, 48.44044830373095, 48.76384772447869, 47.24142934469343, 46.60921010457516, 45.521702346327416, 44.88843684640523, 44.804052841970126, 44.96547230137794, 44.19337297502335, 43.20264913313103, 42.23279377785559, 40.447489257277766, 38.26367927114951, 36.53426767857143, 34.917200800887024, 33.51609868643013, 32.07934930376595, 30.399279338560195, 33.804625197494154, 34.73901670152506, 34.38592141978949, 35.31017779139434, 34.499628462807344, 34.140760931061315, 34.85832583836048, 34.62622778477267, 34.72560456940554, 34.46705635379708, 34.50736629333113, 34.18174894343293, 30.540003430827888, 29.227501419000934, 28.22994687088845, 28.20167454139434, 28.346952349598, 27.67837375202303, 29.65180499746264, 30.0754420315126, 30.17294210317461, 30.1731404842308, 29.83868876945223, 28.962323670401496, 29.95610458932461, 29.892740937830688, 30.09497244064566, 32.04188057788671, 32.62596964820442, 32.61277619133209, 32.234896182619444, 31.896149921802056, 31.58078542606603, 31.315855518129474, 31.87085352894491, 31.881511544325143, 32.06552454442888, 32.23993822665734, 31.939526673591654, 30.48650415242764, 29.753908019480157, 28.90714570588235, 28.58628914729225, 29.20079686187817, 29.202974350606908, 29.448084176652152, 29.26897380971319, 30.025787792846582, 28.92542313779956, 28.348875692110177, 27.485570853641452, 28.432421521164017, 28.374596940554, 27.72473897645957, 28.108095760115155, 28.402339510582017, 28.34086434500467, 30.648747401587958, 30.60435710815437, 29.660728487260105, 29.8988434011827, 30.53762201119216, 31.02556369940683, 33.55731269895736, 33.47552699042951, 33.72117214954871, 33.30404674836602, 33.03486626338313, 32.88967483395581, 30.407655377606595, 29.84074541728589, 28.83630349424214, 28.060439931438687, 28.040209791237444, 26.441289404874084, 23.167823517896053, 23.13185861826953, 22.70144313935574, 22.518205202769995, 21.924153355282584, 21.66605152785559, 21.39179821374105, 21.47021094556884, 21.60034375630058, 21.50381701704015, 21.35028373138101, 21.07620758520075, 20.980664005602243, 20.43614637703709, 19.89699826039073, 19.6196548429972, 20.218602700435728, 20.535247969498908, 20.49601394817927, 20.583345517584814, 20.78693563453159, 20.857678195767196, 20.618532741985685, 20.835500577124183, 20.895164544273264, 20.88659068155224, 20.849564115779646, 20.971053321034297, 20.811198159197016, 20.53388250451292, 20.636725661842515, 20.518905474424884, 21.210330356655085, 21.556420134220357, 21.67009204388422, 21.56616555532213, 21.446849576924475, 21.629709406940552, 21.94167488912232, 21.97097424095796, 21.33878006890497, 21.364391844226574, 21.24938912564841, 20.91401095603797, 19.99133336965907, 19.68305595098039, 20.382500290071583, 21.08869348107234, 22.308560958138813, 22.3665580227202, 22.32092955779305, 22.455757028244623, 22.49683328009065, 22.510249027187733, 22.429196196545288, 22.247914164877063, 22.13636430096483, 22.38352373225957, 22.034714117258016, 20.603147445516264, 20.103961821428573, 19.92630524229692, 19.852400283752203, 19.80123309235916, 20.03830826789605, 20.224073661764702, 23.76449730454404, 23.838850737529828, 24.03412973825085, 24.172867956504824, 25.404038103719262, 25.871455460803283, 29.25079003361345, 29.876875159903133, 30.746716432688167, 35.5641740401494, 36.37236271981015, 36.25814543331777, 33.70712597237784, 33.892191654372866, 34.00844645448179, 34.998750951535435, 33.641509439542475, 33.50155388471607, 31.047293515172736, 31.41428026558964, 30.50188636025521, 26.82112083434485, 27.116562010192965, 28.06889669002284, 28.302771097416745, 29.002913736383444, 29.427598963352008, 29.497718042016807, 30.39714663224016, 31.13636643493092, 34.2101355785883, 34.754820592972564, 35.804380305633366, 37.25910200863615, 37.6468516292179, 37.824929291160906, 38.34448724481734, 39.03557311212263, 39.69607967330901, 40.34801976517274, 40.49877405835668, 40.56725883967997, 38.475049292561465, 38.79640340764084, 38.69853315001556, 38.4754722954404, 39.11429776828509, 39.1772261126673, 39.05255684569198, 39.47294012107065, 39.30821361070391, 40.034844594683065, 40.77890025474635, 41.54937355134419, 41.56874074665423, 41.74130180485528, 42.04962510021786, 42.15348327455065, 42.43636798366013, 42.75004844560185, 43.19760461041084, 43.061724328431374, 42.67063541075319, 42.6603654038282, 42.38228493689699, 41.94101214737005, 42.09866678625895, 41.7130036267507, 41.20901878492064, 40.49049529154996, 40.3807825357908, 40.308700839169, 40.272741246887655, 39.87683152224168, 39.48072151881613, 39.17310102980081, 39.08862200015562, 38.77325262277013, 40.99825493534081, 41.48256659305945, 41.97097959578276, 42.78817409741675, 42.85765058977592, 43.68717100154127, 44.17543852606598, 45.03764783076564, 45.82354406037972, 46.54626376999689, 47.168346488250855, 47.09931472401183, 52.01426284368192, 56.649032590958605, 56.99527441674447, 57.02570790795207, 57.03814115896359, 57.372780944911305, 57.578976969247336, 57.73517006535948, 57.3768244440554, 57.30283416075319, 57.835530888811086, 58.10681730306567, 51.74225069926859, 48.95341632522759, 49.21781219693433, 50.93694828251051, 51.51700221465596, 51.41159385822302, 51.35314581559291, 52.12854531551511, 53.7969261416122, 58.702919778528006, 58.881077530656704, 58.37971793859451, 58.08183175907188, 58.60743310185185, 58.45630594164332, 58.08101456917211, 57.94338877427638, 57.85220961747653, 57.94859124346405, 57.36211424004046, 56.55637673832866, 52.57502857002801, 52.22264034842113, 52.00806486118892, 51.93862685862122, 51.53474994825708, 50.878380876361646, 49.81222786842514, 49.77980367685964, 49.488534947089946, 48.84345989371304, 47.86019012348272, 47.55237433084344, 46.81090408691254, 48.069216655073134, 48.93243454925303, 49.25466303112749, 49.80733364355742, 49.98972452240896, 50.467275589013376, 51.95346583060808, 57.03999392553688, 56.99214374416434, 56.51310733604757, 55.75784145098039, 55.121996663243074, 53.890917181284365, 52.72275619514473, 52.96978028461264, 51.623338834422654, 50.776594616780784, 50.0376659807812, 49.48609615219421, 48.50543106178027, 50.840137529022726, 51.12057129567383, 51.09927871093993, 51.27306488517547, 50.16652396140678, 48.621362268129474, 47.94217214192343, 52.24310971055089, 54.78199694249923, 53.764791457439856, 54.17781630718954, 53.03063812651728, 50.48039784430439, 53.90727385286337, 54.79169236733583, 54.16243014402232, 54.508014451250446, 54.863329059446, 56.57388528174603, 51.06810020378151, 49.88841386118893, 54.84152770549331, 52.11895546872082, 48.87135564420778, 47.85391571361656, 43.37212086323272, 42.83258281746032, 43.1712056748366, 43.05899629629763, 42.63901782975413, 40.88016065709617, 40.60778323786442, 39.56587660169623, 39.41571324105197, 39.50818074521995, 38.97949722821351, 39.12225839534443, 39.41728197658991, 38.76644833780803, 39.002582539502285, 39.46698046023966, 38.9575800681606, 40.80155583380019, 41.31882050389044, 39.81519230158665, 35.6261610550887, 36.34008191938997, 36.46983918837275, 36.15274975124471, 35.9951492421413, 35.877591974712104, 35.683571580454405, 35.04820183169935, 35.65958510764667, 38.33921911920324, 37.58636423738393, 37.41278290250546, 36.4893671855763, 35.183181368665124, 34.72612770728292, 34.14320429843475, 33.79518347463429, 34.70976589347438, 38.45842687908496, 38.74588790085398, 35.47056749665422, 32.85442974276377, 33.137592667289134, 33.88923842794895, 35.9895329016074, 36.701612797001125, 36.52565395269219, 36.68126126509493, 36.9593516849174, 36.21576431626205, 35.938618608584946, 35.84058604793029, 36.27911092421154, 36.33157783278868, 36.33782693650794, 34.3645104615624, 32.873728250700275, 32.68078862480548, 32.62954877269297, 32.68913795502646, 32.246731083878, 29.461343058356675, 26.69701540001556, 26.79609977840025, 26.28669931984647, 25.58591206146903, 25.406915187363182, 25.53955522307812, 25.154886273342672, 24.9360266990235, 24.667978946778064, 24.48876955625584, 24.11532018806411, 25.199136619825705, 23.58391496817616, 23.565258396047305, 23.360239772953623, 23.299207193588543, 23.040229310301896, 22.82375845098039, 22.461410145891687, 22.37537028571429, 22.727500890834115, 23.04936154800809, 23.09892171436352, 23.024680818160597, 22.798952367335826, 23.06121747689076, 23.00319162620604, 23.71759287667289, 23.748093669779024, 24.28678172984749, 24.766350322751325, 24.84498582671958, 24.60167673879552, 24.60812064379085, 24.609772246863, 24.68048391581077, 24.69662384469343, 24.447328883699686, 23.899694972922504, 23.93528445269219, 23.70702480230504, 22.930747456605605, 22.61223971332608, 22.61758304029115, 22.786181546049573, 26.225204000466853, 26.259919801002397, 26.35252836204482, 26.568438585745408, 27.012306424680983, 27.35091125544079, 30.898337020848896, 31.346038046792017, 32.04149263021024, 32.48894913042588, 33.04119951391466, 33.71220116958451, 31.54170105185769, 31.980293495542856, 32.16256650729073, 32.36499451945223, 32.426952995767195, 32.592571866330985, 29.6503769249008, 30.18841147820096, 30.328236224930357, 30.771392588364986, 30.97459724477532, 30.236352841816696, 31.497697666812684, 32.25268583770858, 33.79083086054411, 35.21829620572885, 39.27917762807345, 41.3918619904652, 45.04106055314348, 45.55310063511456, 46.193058816677045, 46.96445224976657, 48.23914264087794, 49.05748525565411, 49.02668034423623, 49.429289742051175, 49.55585275739185, 50.06773543300654, 47.523626047619054, 46.36486838990041, 45.9350638429784, 47.017863156485376, 48.241481931683786, 49.171273636693385, 49.61903762791784, 49.66041299976656, 50.34769809111423, 50.73223635923075, 50.87412188748833, 50.98998814801848, 50.940588307189536, 52.33795263608777, 51.67975711297075, 51.72773488266417, 51.02464007290694, 51.31703289346147, 52.16550319965765, 52.22051723591659, 52.15336772089948, 51.784644387225725, 51.43960286679116, 51.00094653727047, 51.482641624183, 49.8591629196234, 49.66707889860982, 48.89907180388591, 48.22523130049797, 47.25894875319016, 46.15802135239652, 45.66734401812949, 44.90359980866791, 44.53167659670536, 44.656555627373166, 44.43819409367932, 43.93138580407719, 43.966895048397134, 46.68647402917834, 47.57252681185808, 48.5463465283816, 52.22604104505135, 53.47175845463741, 54.522409110644254, 55.96192621623094, 57.0191818816235, 57.89750843790849, 60.16330069288828, 62.004557213818856, 63.12434058411142, 69.88104176906319, 70.83992264090737, 70.72299512547856, 67.64453936391223, 66.55335189028945, 65.88141255664489, 65.01970612286026, 64.91221428524743, 63.97602710208528, 61.80023485434173, 59.92498063040771, 57.79013827395801, 49.42507849649211, 49.04361246459694, 48.35149252832244, 47.66850473436041, 47.63536885652038, 46.95913591378774, 46.50361061258948, 45.53089921957672, 45.05276742927171, 45.28914159197012, 45.289419316604416, 44.73830851367751, 43.23000175389045, 42.654961782835365, 43.77228669436664, 47.18604646661999], [1.1453315020813888, 1.0444447363834424, 0.9630558243853098, 0.9229040808434484, 0.7188890893207284, 0.7036113067226891, 0.6813890788204171, 0.6730557436974791, 0.6513890708839092, 0.607500169545596, 0.5320378302987862, 0.4855556911764707, 0.4127217701453732, 0.3505579039060068, 0.2408940336912542, 0.1935737716308745, 0.1417973929349517, 0.1338889257443727, 0.1178454742452536, 0.1136367905384375, 0.1133333648459383, 0.112777809134765, 0.1683333802521008, 0.1649066319638966, 0.1613001882197323, 0.1657749775910364, 0.1725000482415188, 0.1780556053532524, 0.2011111671335201, 0.1999439794506693, 0.1980556107998755, 0.1977054172839507, 0.1969444994553377, 0.1986111664332399, 0.1472222633053221, 0.1477778188608777, 0.1463889296607532, 0.1397222611992947, 0.1391667053376906, 0.1402778168378462, 0.1425000396825397, 0.1483333747276688, 0.2283333967475879, 0.2933334152661064, 0.2997223057889823, 0.3063889743230625, 0.3891667755991285, 0.3944445545440398, 0.4019445569561158, 0.4172223388577654, 0.4261112301587302, 0.4344445658263305, 0.4308334536258947, 0.4322223429816371, 0.3511881443264345, 0.287222302054155, 0.279782914799253, 0.2747222985527544, 0.1919444978213507, 0.2083333907563025, 0.3141667542794896, 0.3252778685029567, 0.3466667633053221, 0.3377778720043572, 0.39694455524432, 0.4858334680983505, 0.5105556983348897, 0.5175001447245565, 0.5216668124805478, 0.662500185418612, 0.8016668880329909, 0.7770915105696912, 0.6786113008092125, 0.715032878540305, 0.695277970043573, 0.7275002015250545, 0.8666669091970122, 0.7778221491045509, 0.7744446609088079, 0.7825002187208216, 0.7927779992997198, 0.6565196286168172, 0.5350001490708324, 0.5397223729380641, 0.5416668120136944, 0.5041668074229692, 0.5044445850198498, 0.4841668015853565, 0.2853828215063803, 0.3660271542950514, 0.4360061650326797, 0.4980556942888267, 0.8497224596949892, 0.9500002654839717, 1.0811114131652662, 1.0772225231870527, 1.0919165812979827, 1.085278081154684, 1.0800003018985371, 1.0760248902116405, 1.3177781462807343, 1.2313892331932774, 1.1454623302566798, 1.0496617055711173, 0.7168395503423594, 0.6418909095082477, 0.5922223877217555, 0.5922223877217554, 0.5760505553999378, 0.5757681090880797, 0.5791037774665422, 0.5797223833489317, 0.3355556491596638, 0.3366457250233426, 0.3380346143790849, 0.3377474995331466, 0.3402778726268285, 0.3142296937376804, 0.295485584344849, 0.2957656961562402, 0.2960411400560224, 0.2972223050887021, 0.2974697106286959, 0.2983334163554311, 0.3869445523653906, 0.3878875648148148, 0.3875001081543728, 0.3885598301431684, 0.3863889967320261, 0.3897223309990663, 0.3913889982103953, 0.3916667759855795, 0.3941667766106442, 0.3922223316993464, 0.3924300375038904, 0.3911112201213819, 0.305088746809835, 0.3052778629007158, 0.3052498155929038, 0.3052031318082788, 0.3059897815904139, 0.3056512615935263, 0.3467040827108621, 0.3466503963585434, 0.3440803699813258, 0.3460108096794273, 0.3463889854497354, 0.3463889854497354, 0.3416667619002232, 0.3413095939153439, 0.3411112062713974, 0.3416667619825708, 0.3427778730936819, 0.3384921337217485, 0.2898810092592593, 0.2893161168689698, 0.2916667478991597, 0.2907143429038282, 0.2947223044662309, 0.2891667473544974, 0.2830556343759726, 0.2780229354964208, 0.2712932443199502, 0.264586894257703, 0.2564776380859568, 0.2519771833177715, 0.1988655931372549, 0.1923902910052909, 0.1842950984282602, 0.1745075161842514, 0.1625000452847806, 0.162222267351385, 0.1624136338313103, 0.1600000444995593, 0.1611111559290383, 0.1600000445066915, 0.1604691888415551, 0.1602778219732337, 0.1525000424836601, 0.1525000424058512, 0.1522222646280734, 0.1547222646280734, 0.160464520463741, 0.1616667116402116, 0.1610224103641456, 0.1597222668845316, 0.1593347355275443, 0.1597222667289138, 0.1605556002956738, 0.1605555992063492, 0.155277820961718, 0.1555555988951136, 0.1558333766728913, 0.1528944926801277, 0.2738889651416122, 0.3061111964674759, 0.3530556540616247, 0.3552778768285092, 0.3533521055088702, 0.3841667739651416, 0.4188890059134765, 0.4344445658217918, 0.4508334593837536, 0.4552779049953314, 0.4936112485994398, 0.5811112735760972, 0.4460947748988484, 0.6366668442265794, 0.8044446693899783, 0.894722472533458, 0.9408335965608468, 0.9661113812636168, 1.0477780691721132, 1.1058336423902893, 1.175000328898226, 1.2041670028011204, 1.1682099385925675, 1.083333635620915, 1.0866669708138814, 0.8752780222462136, 0.6591993618775291, 0.58177420183629, 0.5530557102396515, 0.498889028400249, 0.3870588253968253, 0.3275000913476502, 0.2423739563492063, 0.2197222827536571, 0.2219445062247121, 0.2202778392429195, 0.2180556163243075, 0.2180556163243075, 0.2794445224867725, 0.3158334214908185, 0.3050000849673202, 0.2997223055555555, 0.2747222987855327, 0.3697223248521631, 0.4763890219421101, 0.4891668027388738, 0.4983334725334578, 0.5077779194677872, 0.529444592281357, 0.5572223779956427, 0.4861112468098351, 0.4505556813725491, 0.4711112414410209, 0.5366668166822285, 0.5455557082166201, 0.4319304482551354, 0.3413889843604108, 0.3185504274010531, 0.3078268814970433, 0.2991667499221911, 0.2651914123871771, 0.3388889825708061, 0.417777894257703, 0.4175001152349829, 0.3803221311806205, 0.3287838491285402, 0.3269445356364768, 0.3947223324774355, 0.404722327264239, 0.4222223401805167, 0.4708334648303766, 0.4713890205214526, 0.4736112433862435, 0.3739472642195799, 0.3166667551139908, 0.3169445327439313, 0.3347223156707127, 0.3352778713818861, 0.3375000942265795, 0.3929435498755057, 0.5801868228550697, 0.7783335511204482, 0.9347224837379396, 1.1427780973389357, 1.3525003782290694, 1.5597576715686274, 1.73861159772798, 1.8793794642079051, 2.0115528451602867, 2.167500606831622, 2.324722873093682, 2.339328237161532, 2.30922786756925, 2.2398814588390907, 2.200903869047619, 2.2492063523187054, 2.1963753921568627, 2.1384108723934023, 2.177149958138811, 2.18165509274821, 2.1889403403361345, 2.091164897214441, 1.939577500311236, 1.823426809757236, 1.6730560212418302, 1.5276053720043574, 1.360350247510115, 1.1099090437286026, 0.9761111972455648, 0.8606513573762838, 0.6615056898537193, 0.5169258593215064, 0.3564473337223778, 0.3136111985683162, 0.309166752621533, 0.4278899382975412, 0.4766667998755058, 0.4672223526299409, 0.4501984200857196, 0.4525001258169934, 0.4207469741622576, 0.3793067263460939, 0.352222318627451, 0.4527779011826953, 0.4786112448646125, 0.4838890240429505, 0.4763890218643013, 0.326666757858699, 0.2747222990196078, 0.2738889655306567, 0.2827778569094304, 0.3181372665642185, 0.3383334280267663, 0.3616667678590893, 0.3677778800802734, 0.2533404067635394, 0.2221732104730781, 0.2150000600684718, 0.2116667258014316, 0.2091667251789605, 0.2436111792717087, 0.2469445068471833, 0.239374474778147, 0.20984599291939, 0.1853408527077497, 0.1627778230625583, 0.1625000454403984, 0.1750000489417989, 0.171302525210084, 0.1702778253968254, 0.1705556032524121, 0.1705556032524121, 0.1197945876128229, 0.1172222548163712, 0.1127707783853361, 0.2241667290694055, 0.2452778464052287, 0.2575000720452072, 0.3261112023809523, 0.318611200280112, 0.3183334224245253, 0.318611200280112, 0.3386112058823529, 0.3425000958605665, 0.4541667938064115, 0.4638890187519452, 0.4508334595367778, 0.3348132653173309, 0.3200794519919079, 0.3127778653127918, 0.3161111995798319, 0.414722338313103, 0.4263890082477435, 0.4369445667600373, 0.4311112313258637, 0.4308334539371303, 0.3380775785951807, 0.3319672390947832, 0.3261214606700836, 0.4330672503112356, 0.4277910351191528, 0.4236264201194367, 0.3344625416191168, 0.2298810113600995, 0.2181536525054466, 0.2197642990974167, 0.2055556130563336, 0.2016667230781201, 0.1750000490527346, 0.1708333341562853, 0.3294445366479925, 0.3072223082010582, 0.311666753890445, 0.3111111981792717, 0.3111111981792717, 0.311666753890445, 0.311666753890445, 0.2994445282446312, 0.2997223061002178, 0.2997223061002178, 0.2997223061002179, 0.2997223054894408, 0.1279901967787114, 0.0559873961251167, 0.0558333488951136, 0.0558333488951136, 0.0576680683162153, 0.058888905306567, 0.058888905306567, 0.0680555745409274, 0.0677777966853408, 0.0675000188297541, 0.0675000188297541, 0.0675000188297541, 0.0844444680205415, 0.0638889067071273, 0.0641666845627139, 0.0644444624183006, 0.0622222395723104, 0.0608333502956738, 0.0611111281512605, 0.0522222367724867, 0.0522222367724867, 0.0525000146280734, 0.0522222367724867, 0.0522222367724867, 0.0491666803610333, 0.0522222367724867, 0.0516666810613134, 0.0513889032057267, 0.0513889032057267, 0.1586111554621848, 0.1769444937752879, 0.2586111834733894, 0.2597222948957361, 0.2597222945066916, 0.2627778513071896, 0.2633334070183629, 0.25739495805381, 0.3419445401493931, 0.3422223180049798, 0.3425000958605664, 0.3425000958605664, 0.2358333993917938, 0.2172222829909742, 0.1633333790071584, 0.1625000454403984, 0.163055601147033, 0.1602778225957049, 0.1605556004512916, 0.1576563974387906, 0.1002778057889822, 0.1002778057111733, 0.1000000279333955, 0.10055558356676, 0.1005555836445689, 0.1022222502334267, 0.0836111344537815, 0.0855555793650793, 0.0852778015873015, 0.0852778015873015, 0.0852778015873016, 0.0854155001556178, 0.0713889088079676, 0.0711111309523809, 0.0711111309523809, 0.0705555752412076, 0.0702777973856209, 0.0580555560969759, 0.0711111309523809, 0.0688889081076875, 0.0686111302521008, 0.0683333523965141, 0.0675000188297541, 0.0677777966853408, 0.0680555745409274, 0.0680555745409274, 0.0688889081076875, 0.0688889081076875, 0.0686111302521008, 0.0791666884259319, 0.0608333502956738, 0.0608333502956738, 0.0608333502956738, 0.0611111281512605, 0.0611111281512605, 0.0611111281512605, 0.0563889046062869, 0.0569444603174603, 0.0561111267507002, 0.0561111267507002, 0.0563889046062869, 0.0563889046023966, 0.0527777924836601, 0.0527777924836601, 0.1925000538437597, 0.4025001126672892, 0.622500174291939, 0.8275002317149083, 1.0902780830999068, 1.3505559337846251, 1.5986115588235297, 1.7719449407096175, 1.9458338783068785, 2.0488894627295364, 2.061667244086524, 2.0730561361655777, 1.936412259570495, 1.7176354158107685, 1.5086344824151885, 1.3043254299719889, 1.0497806094771245, 0.8370448621226269, 0.6117063977591036, 0.4453058380018674, 0.2746755873015873, 0.191388942421413, 0.2041667237784002, 0.2008333894335512, 0.2044445016339869, 0.2116667258014317, 0.2123833033632902, 0.2050000573451603, 0.2097222806612509, 0.1677124394646747, 0.1727778260971055, 0.2341667321817616, 0.248055624572051, 0.2438889564270152, 0.262458029956427, 0.3811112177093059, 0.425277896669779, 0.469444575708061, 0.5068792010582012, 0.5497152242452537, 0.6316668434484904, 0.7562443528633677, 0.9359150584967324, 0.8991622313258638, 0.9260459928415812, 0.9615338666841746, 1.035352752412076, 0.9581489486461252, 0.9744050264550264, 0.9865665627917832, 1.004834544273265, 0.9837675158730158, 0.9141669224245256, 0.7732493137254901, 0.60276845113601, 0.5913890542328044, 0.5469515997302632, 0.5152779218020543, 0.4046638688141923, 0.3522805822440087, 0.286736697945845, 0.222033149782135, 0.1688048586990351, 0.1567530379707438, 0.154444487394958, 0.2122222813569872, 0.2502941218487395, 0.2500000692499222, 0.2497222918611889, 0.2497222917055711, 0.3072223082010582, 0.3305556480703392, 0.3419445401493931, 0.3422223180049797, 0.333333426626206, 0.3258286718733791, 0.3963889998443822, 0.3425000957049486, 0.2972223053999377, 0.2944445268349935, 0.2977778611111111, 0.277747436427534, 0.2447222906940554, 0.2511344557267351, 0.307500085978836, 0.3125000094926859, 0.6180557254901962, 0.6811113017318968, 0.6763890782757549, 0.6694446316526611, 0.6505557377061936, 0.6652779639744787, 0.658889073373794, 0.7511113213507624, 0.7513890992841581, 0.7148552844265498, 0.6569446283846873, 0.6525001811534357, 0.3135971097766888, 0.2825000790538438, 0.2075000580454404, 0.2161111715686274, 0.2161111715686274, 0.2002778338001867, 0.1988889445222533, 0.1069444743230625, 0.1027778064892623, 0.1016666950669156, 0.09972225, 0.1122222535753191, 0.1116666977902272, 0.1099719925303454, 0.1052778071895425, 0.096111137955182, 0.0963889148770619, 0.0958333600995954, 0.0980555829442888, 0.2527778485060691, 0.2652778519296607, 0.2800000783535636, 0.279722300497977, 0.2683334084189231, 0.2711111150015562, 0.3572223205726735, 0.3711112148303765, 0.3941667769996887, 0.3947223327011364, 0.3944445548552755, 0.4063890026455027, 0.2525116746031746, 0.2322222871926548, 0.2169445051353875, 0.2166667272798008, 0.2158333937130407, 0.2127871736642961, 0.1219981369287534, 0.1561111547619048, 0.1350000377373171, 0.1341667041705571, 0.1350000377373171, 0.1327778148926237, 0.1325000370331467, 0.1341667041705571, 0.1344444820261437, 0.1344444820261437, 0.1416667062713974, 0.1425000398381574, 0.1500000419389978, 0.1008333615001556, 0.1791667167755991, 0.179722225568005, 0.2861111911764706, 0.2844445240429505, 0.3955556661998132, 0.5047223635231871, 0.5075001420790538, 0.5075000039682539, 0.5450001525832554, 0.5561112668067226, 0.6550001833955804, 0.7452779864612511, 0.6869446367102396, 0.7475002077063787, 0.7511113211951447, 0.774444660130719, 0.7672502419824412, 0.6655557416744476, 0.6652779640522876, 0.6677779633092629, 0.6219446185807657, 0.6113890600684719, 0.5419445958605664, 0.4630556849517586, 0.4422223457049486, 0.369570500778089, 0.2711111866635543, 0.2256115832451502, 0.1281512651727357, 0.1772222715530656, 0.1763889382197323, 0.1747222710862122, 0.1750000489417989, 0.1755556046529723, 0.1436531293962029, 0.131666703470277, 0.1294444806255835, 0.1286111470588235, 0.1300000363367569, 0.296111193977591, 0.2955556382664177, 0.2655556298630563, 0.2661111855742297, 0.2655556298630563, 0.2652778520074696, 0.2636111193588547, 0.2663889634298164, 0.2722222983971366, 0.2725000762527233, 0.27444452124183, 0.2752778547307812, 0.1094444750233426, 0.1094911587301587, 0.1525000426392779, 0.1500000419389978, 0.1500000419389978, 0.151666708994709, 0.1516667088099241, 0.2230556179582944, 0.3005556396669779, 0.3961112212107064, 0.4786112450980392, 0.4919445821661998, 0.4925001378773732, 0.4933334714441331, 0.4366667889044507, 0.4383334560379708, 0.4380556781823841, 0.4363890110488639, 0.4361112331932772, 0.3652778800186741, 0.2043394071739807, 0.1793884274808071, 0.1063889186118892, 0.0908333586990351, 0.0900000251322751, 0.0902778015873016, 0.1580555997510115, 0.1563889326174914, 0.1586111554621848, 0.1591667111733582, 0.1591667111733582, 0.1568183955026454, 0.161944489729225, 0.1591667111733582, 0.1583333776065982, 0.1583333776065982, 0.1594444890289449, 0.1594444890269997, 0.0866666908652349, 0.0869444687208216, 0.0847222457983193, 0.0847222458761282, 0.0847222458761282, 0.085000023653906, 0.083611134064737, 0.0838889123093682, 0.0841666901649548, 0.086388912387177, 0.0855555794428882, 0.0855555794428882, 0.0791666887643946, 0.0788889109088079, 0.0788889109088079, 0.0783333551976346, 0.0783333551976346, 0.0786111330532212, 0.078333355195041, 0.080555578042328, 0.080555578042328, 0.0783333551911507, 0.0780555773420479, 0.0780555773420479, 0.0755555766417678, 0.0777777994864612, 0.0786111330532212, 0.080555578042328, 0.0816666894646747, 0.0822222451758481, 0.0927778013538749, 0.0927778036881419, 0.0925000258325552, 0.0925000258325552, 0.0938889151104886, 0.1936111652661064, 0.2094445023342671, 0.2100304032057267, 0.2113889480236539, 0.2097222808901339, 0.2088889473233738, 0.2394445114379085, 0.2341667320099341, 0.2361111771708683, 0.2402778432150638, 0.3466667636943666, 0.4422223459383753, 0.399166778400249, 0.5636112672709828, 0.7255557587145971, 0.7461113187052598, 0.7922224440553998, 0.87166691075319, 0.900278029878618, 1.0402780690943043, 1.0583336157018364, 1.0705558552339491, 0.9783336073672064, 0.9307166511826952, 0.9758989544817928, 1.0224883353472871, 0.946652917289138, 0.9343417497607376, 0.8970891819950201, 0.8358569081076874, 0.787574914021164, 0.7458335417833799, 0.8377780100289194, 0.9347224836601308, 0.9588891572517896, 0.9536113775287892, 0.8625233593993152, 0.7405557625272331, 0.8661113534080298, 0.8925002495331468, 0.8991669182228448, 0.9538891556956116, 0.9441669309056956, 0.9288891478369126, 0.8268580807494299, 0.8841669134765018, 0.8683335762527234, 0.8408335683162155, 0.9038891416122006, 0.9308335936041084, 0.8083335589791473, 0.7816668849984437, 0.7744446606753814, 0.7175002003579211, 0.7190569651416121, 0.7783335506535948, 0.760555767848715, 0.6125793752664956, 0.6161112835356366, 0.6005557233893557, 0.5228034602396514, 0.4819445790538438, 0.4488890141612201, 0.4444445684718332, 0.549444597805789, 0.5458334856831621, 0.5488890424039061, 0.425555672735761, 0.4325001199813258, 0.4355556772486773, 0.4205556730469965, 0.4202778951914099, 0.4194445617802677, 0.3105556423902894, 0.3105556423124805, 0.3094445308901338, 0.199444496031746, 0.2081115876906318, 0.2058333906784936, 0.2430556233212757, 0.2605789608582323, 0.259166739028945, 0.2644445182850918, 0.2741667433084345, 0.2816667450980392, 0.3994445560224089, 0.660833518207283, 0.8600002406629319, 0.8769446894893212, 0.9036113639122316, 0.913541330454404, 0.9825002749766574, 0.9758336064425772, 1.0144447282135076, 1.0909713366013072, 1.1358336508714597, 1.153753800497977, 1.0441669586834734, 0.744472485760971, 0.5996056525054466, 0.5933334990662933, 0.5641668243075009, 0.6535247703859322, 0.7400002063492065, 0.7463890974945534, 0.6999533255524432, 0.6293604218720824, 0.5815897729536259, 0.5680557144387386, 0.648055736694678, 0.6490966494708994, 0.7302195992841582, 0.7375001784158107, 0.7466668752723313, 0.6130322159079321, 0.6341668437597261, 0.6255557303921568, 0.6302779167444755, 0.6844446357765328, 0.6975001950669156, 0.67638907648615, 0.6200001732804233, 0.614727061552064, 0.5204856377995642, 0.4970169152661065, 0.4830603309990662, 0.4852707804005868, 0.4715570635698723, 0.4662209296607532, 0.4606326939775911, 0.3954388448490507, 0.4036205421724246, 0.4343090617569257, 0.5593348755057579, 0.5575981826174915, 0.5638890467631497, 0.5683334924525366, 0.5672480477746653, 0.5293509376914551, 0.5185132108621225, 0.5903923180827886, 0.5878269601618424, 0.5877779421879864, 0.5794446059757237, 0.5613890459850608, 0.5833334964985996, 0.581111273576097, 0.5797223843759727, 0.581111273653906, 0.5813890515094927, 0.6169446158276747, 0.626111286336757, 0.5436112632275133, 0.5375001504046063, 0.6383335117491442, 0.6363890667600374, 0.6197223955026454, 0.6280557312480548, 0.6269446198257079, 0.6277779533924681, 0.6275001754590724, 0.6255557304699658, 0.7152779778244632, 0.7861113309212576, 0.894444694833489, 0.9333335928260194, 0.8702780212418303, 0.9147224782913166, 0.9238888955804544, 0.7836113304544041, 0.7958335559446003, 0.7961113338001868, 0.8108335602240897, 0.8433335692453835, 0.8017695942265796, 0.7770473654684097, 0.7702779900404607, 0.7690452988010966, 0.8388891227824464, 0.8325212404295054, 0.8314939361967009, 1.0302780661375663, 1.1033336421568627, 1.2002781138344227, 1.2952781390445065, 1.3397225952380951, 1.24485971385493, 1.3102781432461874, 1.2057960499922202, 1.2160271594304388, 1.128209694445098, 1.0938891949891068, 1.0739988290538465, 0.8781676745253656, 0.8388003590102707, 0.8130579119981326, 0.7131047538126363, 0.6429833664021164, 0.6773764670090722, 0.4114822689853719, 0.3750747057007997, 0.3480556525054467, 0.3402778727824463, 0.3394445391378773, 0.3360107417295629, 0.3241667572362279, 0.2727497692187985, 0.1963889435107376, 0.1908333865546218, 0.1922222757547463, 0.1904621853408029, 0.1980556107220666, 0.1972222247121071, 0.2138889485683162, 0.2466667354497354, 0.2722222959850607, 0.3191667557578587, 0.331666759414877, 0.3419445399159664, 0.343888984982882, 0.345833429816371, 0.3444445406914619, 0.3463912267351384, 0.3422223177715531, 0.3425000951706863, 0.3266667580143169, 0.2877964569716775, 0.2673482779145923, 0.2122852487550575, 0.3400000950046685, 0.3383334277933396, 0.3369445385154062, 0.3366667607376284, 0.336944538671024, 0.2972222247121071, 0.3394445392934952, 0.3391667614379086, 0.3386112057267351, 0.3397223169921672, 0.3383334279489574, 0.3272223135698724, 0.3336112041705571, 0.3263889801587302, 0.3263889799253034, 0.3263889800031124, 0.3252778686585746, 0.3411112058668174, 0.3241667571584189, 0.3258334239807035, 0.3269445357920947, 0.325833424291939, 0.3277778692810458, 0.3302264247587924, 0.329166758636788, 0.3283334251478369, 0.3280556472144414, 0.3275000915810769, 0.3269445356364768, 0.3481045776532835, 0.3480556527388733, 0.3547223211880125, 0.3613889898070339, 0.3694445476968565, 0.3755556604419545, 0.3800001062091503, 0.2827778568316215, 0.2888889694211018, 0.297222305166511, 0.3077778637566138, 0.3169445329131653, 0.3177778663243075, 0.4490710624027388, 0.4476845073918457, 0.4486112364612512, 0.4482307262682851, 0.4508334593059446, 0.4505556814503579, 0.4519445707282913, 0.4577779056956116, 0.459976758558979, 0.4552779046840958, 0.4608894547152194, 0.4356629649768407, 0.3533334316837846, 0.3622223231403673, 0.3675001023187053, 0.4593301507158419, 0.4616667955182073, 0.4708660596016184, 0.6386112895269219, 0.6431233799408652, 0.6455557360722067, 0.6697224092748211, 0.6608335178960474, 0.6726097178370432, 0.6376378579987552, 0.6294446203703705, 0.6225001737472767, 0.531111259414877, 0.5246266297852474, 0.5036811746809835, 0.4609081281512604, 0.4538959903516962, 0.4460575214752568, 0.4255556744475567, 0.4271452853252412, 0.4112605285421363, 0.6061112798786182, 0.661314351774043, 0.6624301314970432, 0.6658335193744164, 0.6663306925770308, 0.6391385076116273, 0.5404949898070339, 0.6210458995487084, 0.6252170936041083, 0.727159374572051, 0.7322224268596328, 0.769757245193357, 0.7909570799797699, 0.8783405533769064, 0.903244858776844, 0.9574068723934018, 0.9751683158263308, 1.0229554412219295, 1.1840359569716776, 1.1151800259103644, 1.108611419167003, 1.0033336139122315, 0.9938891665888578, 0.923695146575624, 0.7387793695144724, 0.6134385340024899, 0.5905557204326175, 0.5274814643635232, 0.516045888032991, 0.4891013137811231, 0.5306280635698724, 0.5369585995953938, 0.5486112643168378, 0.5586112671179584, 0.5694446034858387, 0.6048622935444558, 0.6977779728446935, 0.6930557494553377, 0.7675002147525678, 0.8200002294584501, 0.8233335636476814, 0.815177411895685, 0.7761113274976659, 0.7758335496420791, 0.7797224395424838, 0.7741668825863679, 0.7747224379084966, 0.7469584519801389, 0.7738891050420168, 0.7866668867102397, 0.8000002215219422, 0.7611113237628384, 0.7633335439620295, 0.8326353898225956, 0.8575002394179895, 0.9994447238361092, 1.0002777930283226, 1.2050003372237788, 1.3250003705220978, 1.3774580059608112, 1.617222674525366, 1.7511116002956744, 1.713056034352631, 1.7522227122626832, 1.7769444746576424, 1.9462278520236844, 1.985801200669157, 1.9861116669779024, 2.094722804207026, 1.9347017463429816, 1.8694449573529417, 1.8621036690801185, 1.763838017896047, 1.6425004597663144, 1.6081143602552133, 1.6716998128631086, 1.648889347080343, 1.3991670565670715, 1.3397225966846935, 1.193889221599751, 1.0758336329754123, 1.0370681722689077, 0.9883450196662004, 0.9586508087191364, 0.6816668562091504, 0.6636112943510738, 0.6906304421101773, 0.5845448288982259, 0.5775001615312793, 0.5683334889498393, 0.615833505602241, 0.6247223970588234, 0.6241668411920324, 0.6086112804187418, 0.6997714359632742, 0.682602894257703, 0.9847224977435418, 0.992086846385777, 0.9880558319327732, 0.9827780529100528, 0.9997225019452224, 0.9846708750836456, 1.003055835901027, 0.9925002773109244, 0.9841669421101772, 0.9797224959435632, 0.8711113548863992, 0.8830182131185808, 0.8076099314503581, 0.7859105801431684, 0.7444446525832555, 0.7643092595704949, 0.8577780175848118, 0.8595798388139583, 0.8919446935885467, 0.8952780281668223, 0.9038891418456272, 0.9133335888577652, 0.9258335925147838, 0.8947668205602508, 0.687500192184096, 0.7141668664799254, 0.7191668678026768, 0.7036113076311088, 0.6152779492685964, 0.6019398045200495, 0.4788890225645815, 0.4684220398381575, 0.5783334950202303, 0.5910879158107688, 0.6194537866479926, 0.6250303670245876, 0.8925002496109554, 0.873609002489885, 0.8727756691565515, 0.8779974278711485, 0.9071034138655464, 0.8987278388577652, 0.9844447188764396, 1.0141669485716305, 0.9900933922346716, 1.0324535862122628, 1.0893280206971678, 1.133711509308539, 1.0552570422502334, 1.2133336729691877, 1.2491670161842514, 1.2536228250855896, 1.2305558987706195, 1.3556256341425457, 1.3533733555750085, 1.3527781559290382, 1.321130152766108, 1.5869448867880485, 1.5236232060373225, 1.5026194628073457, 1.3386114845004702, 1.2105558926237163, 1.2278013969032058, 1.3658337147525677, 1.3652459961307433, 1.2464987068699274, 1.1214024989305416, 1.1386246553843762, 1.0943298426409602, 0.8412161551995798, 0.9133335882352944, 0.97975723653906, 1.1411114298163711, 1.1193840116713352, 1.0875982934173671, 1.1347084876283848, 1.1749092495863604, 1.152464990411752, 1.140278096478175, 1.1470287573918456, 1.2108336686896983, 1.4655839384531593, 1.3719048111577965, 1.2696592463773486, 1.1172225343137256, 1.1319584585025684, 1.1250119855275444, 1.1016669744786802, 1.0533336274509806, 1.0406863186773792, 1.0227243399721615, 0.9900352886728948, 0.9111183397167872, 0.8595940540771864, 0.8808942499221913, 0.9233335884687208, 0.9226003764394648, 0.908889142234672, 0.8982588717709306, 0.8892252607376285, 0.8777756795829444, 0.8388492005972348, 0.8544446830065361, 0.8588891288515406, 0.866389130952381, 0.7711113265639589, 0.6921918942577031, 0.6878244674479986, 0.7600002123404916, 0.7580557671121229, 0.757222433706816, 0.7700212135854343, 0.777222439386866, 0.7863212088883736, 0.7877779978991598, 0.7831748085901028, 0.7758335501867415, 0.8250002307033926, 0.8627780143946467, 0.9935411023187052, 0.964166936196701, 0.9630558247743544, 0.953611377762216, 1.0286627416744476, 1.023959191409897, 1.0169001038748833, 1.0083079298941795, 0.9933333535636476, 1.0588891850295676, 0.9005558073451604, 0.8702990208845592, 0.688524752256458, 0.768333548241519, 0.7947224446000622, 0.8238891193588547, 0.9602780464519142, 1.043889180827887, 1.0713282106034088, 1.053611397447868, 1.061659949776378, 1.0291857869565908, 1.286111470899471, 1.49833375180063, 1.5238893152038595, 1.4343697600373482, 1.4169448408807963, 1.4132940383597885, 1.0262091543728602, 0.9577780455182072, 0.92634687938378, 0.9622224913003186, 0.958889156940554, 0.9316669271708684, 0.6248879659197011, 0.4163890050575786, 0.384932312235352, 0.4052778908341114, 0.3998740558667912, 0.3933334428104575, 0.3983334442888266, 0.3933334430438842, 0.3997712494339409, 0.3994445559446001, 0.4005580212609526, 0.3952778880329911, 0.4547223491285403, 0.4572223498288204, 0.4389659260815437, 0.4561112384842826, 0.4555556825396825, 0.4565874223467164, 0.5897223865520282, 0.5880604278315846, 0.5823342676626205, 0.5861112748210394, 0.5967303925953622, 0.5958334991441022, 0.7405557624494242, 0.7370800333800188, 0.7705298898764142, 0.8455557917055709, 0.8408335683940243, 0.8294446763927794, 0.6919446376439465, 0.6858335248210394, 0.6590499551042639, 0.6691668536414566, 0.651666848583878, 0.6591668506795312, 0.4644445740740741, 0.4619444581388111, 0.4504528488951136, 0.3605556562402739, 0.3613329599284158, 0.366666768907563, 0.3963889996887644, 0.3983334445222534, 0.4011017840024898, 0.399169132138637, 0.4027778902894492, 0.3988493097572362, 0.3988890002334267, 0.402777889779828, 0.4751937586030745, 0.6169446168689698, 0.6527779601618425, 0.6911113042328041, 0.837500233199212, 0.9272224815592902, 0.9136674063372052, 0.9377780400715844, 0.9405558184718332, 0.9347224835823216, 0.9683336039526924, 0.971111382586368, 0.8533238620474856, 0.7519446543728603, 0.7325002044817928, 0.6977779729225025, 0.6712792391009184, 0.6597224067071272, 0.6960270792094616, 0.6925001934329287, 0.6947224161998133, 0.6969446391249533, 0.6745822850918145, 0.6701658495953937, 0.6891668581544064, 0.6716668544195455, 0.661944629318394, 0.658611294973545, 0.6257143902116402, 0.600371219343293, 0.5761811394335511, 0.582920261048864, 0.589369840725179, 0.599722389589169, 0.753889099361967, 0.8036113355119826, 0.8212209074852164, 0.8380557896047308, 0.8425002354497356, 0.8411113460161843, 0.6683335198412699, 0.6836113018161897, 0.6871289438219733, 0.7971499922191098, 0.7984595190631809, 0.7967414997665733, 0.702581706660442, 0.6947946925770309, 0.6900630296451914, 0.7003805941487706, 0.7244446470588235, 0.8730557969965764, 1.1244447587924058, 1.1530184285714289, 1.1531957236227823, 1.2225003417366946, 1.354722601073763, 1.392500388888889, 1.5086115317460318, 1.4888893050108931, 1.4530226847275691, 1.6163893402583256, 1.6229111876242963, 1.496944860899732, 1.486538599882891, 1.4817720261437908, 1.5265779749455335, 1.5880559971210706, 1.5058337539682545, 1.5419448751167133, 1.5525404528571145, 1.6616671306411457, 1.6983338055472244, 1.712778256039917, 1.7256784480843184, 1.8980956532057272, 2.070817451291628, 2.0669450223311547, 2.0008918183162154, 1.9770173476347863, 1.9736932482882044, 1.927222649859944, 1.9332516553856949, 1.962222770763306, 1.9463866740166669, 1.8245126455804543, 1.8207520312791787, 1.6444449037763271, 1.4119448362524651, 1.3963892787892935, 1.3905443912673354, 1.24333367989418, 1.2711650502645502, 1.2413471178026767, 1.164449345082477, 1.0231841379624351, 0.9839565918923124, 1.0656024622633422, 1.0689241355541317, 1.1298672219301091, 1.2130254945656989, 1.223982552131964, 1.1985317576252723, 1.2035320389044508, 1.119278983504513, 1.112222533146592, 1.2098025599181292, 1.214722562247121, 1.2969865148084192, 1.176468263383131, 1.125212474011827, 1.0577804277346534, 0.9711113813414256, 0.9388891510462, 0.8923177331776402, 0.8994446955337692, 0.8957495066137567, 0.8988891402894491, 0.9136113665577345, 0.911111366013072, 0.8052147545776484, 0.8285926320417056, 0.8411019725334579, 0.8341155107376285, 0.8093419294273265, 0.8172224506691566, 0.8493769518674693, 0.8391669011826953, 0.8514044282331579, 0.8597224623404918, 0.6050001685340803, 0.611944615234983, 0.6282330059134765, 0.630805452614379, 0.6369211055088703, 0.7483335421724245, 0.6380557337379396, 0.6375024657640834, 0.6016456594304388, 0.7576729043728602, 0.7701098841425459, 0.771438085122938, 0.7900001835460112, 0.8866131909430439, 0.877161533846872, 0.8917719264705882, 0.890074913547886, 0.7883078495175849, 0.7819446629318395, 0.7808335514316839, 0.8132588387021477, 0.6504482061935885, 0.6236112636898279, 0.6011462731092436, 0.8238891012293806, 0.7058335302676627, 0.672623887332711, 0.6503783201058202, 0.6269446192810457, 0.5988773755057578, 0.7476892782446313, 0.7301449236694678, 0.7093674188453158, 0.7022224183784626, 0.6994446401027089, 0.7013890848895116, 0.4288890087547994, 0.4288890087924058, 0.4534897389187166, 0.4314076828509181, 0.4302778979147215, 0.5147223660908808, 0.3297223141923436, 0.3264986031720096, 0.300964057500778, 0.3375000940709617, 0.3338889821039527, 0.3300000921257391, 0.3250000908029878, 0.4294445643479614, 0.4343604125310258, 0.4505696866635543, 0.4441667908496731, 0.3725001040305011, 0.370833436896981, 0.3658334349517585, 0.3425000017896047, 0.3355556492374728, 0.3286112022253346, 0.3236112015250544, 0.3269445357142858, 0.2161111679116091, 0.1586718070948755, 0.1775000495642701, 0.17500004886399, 0.1602778225957049, 0.185277829598506, 0.1833333841425458, 0.2013889448607366, 0.1847222738873327, 0.1841667181515207, 0.1814682993864219, 0.1766667159975101, 0.1737978574917017, 0.1716667146747588, 0.1727778260971055, 0.1730556039526922, 0.168055602552132, 0.1266667020697167, 0.1269444799227099, 0.1209640537659508, 0.1277778134920635, 0.1277778134920635, 0.1283333691889724, 0.1347222598817304, 0.1358333713040772, 0.1575000440398381, 0.1341667041705571, 0.1350000377373171, 0.1350000375038904, 0.1427778176937441, 0.2250000629474012, 0.3153174620972575, 0.4850001357765328, 0.5375001504824153, 0.5655557138188608, 0.6927779717553689, 0.7202779779022721, 0.7940242777633932, 0.9105558105353252, 0.9197224797696856, 0.9961113900527806, 1.1052780873015873, 1.0693020596794272, 1.0532843209396727, 1.0613891841736691, 1.0822225248210395, 1.0636114075617285, 0.9313772267351385, 0.9169447007061172, 0.8047406886036064, 0.7386113173825085, 0.7358335391378774, 0.6582096283068782, 0.5550001549175226, 0.5018837654061624, 0.3865266209150326, 0.2371638685807656, 0.1819887983193277, 0.1748623222066604, 0.3879062664176782, 0.3819445511204482, 0.370277880665164, 0.3722223261749144, 0.3669445469187675, 0.3608334315281668, 0.4802779122315593, 0.4865944337068161, 0.48543884942343, 0.502222362822907, 0.5127779213352008, 0.5194445898692811, 0.4247223411142235, 0.4444444672424525, 0.5886112727980082, 0.8152780060690944, 0.8863891370992842, 0.944444708673107, 0.8613634260037348, 0.8593652945845006, 0.8463630363440067, 0.869444687752879, 0.9819003402583256, 1.0663891873638345, 0.9997225020230316, 0.9878527267676274, 0.8002847867919394, 0.668611139589169, 0.6294001030967943, 0.5962510285591752, 0.5797223842981637, 0.582777940865235, 0.5820496326434645, 0.5691668159041395, 0.4766667998696703, 0.407500113600996, 0.4502779037503891, 0.452427673399734, 0.4364379450442221, 0.450856781739496, 0.4555556829287271, 0.4719445758053498, 0.5686112700746966, 0.6813890794428883, 0.7555579497354498, 0.8630557960544407, 0.9052780308123248, 0.9383335955493308, 1.042222513383131, 1.2575003481170246, 1.4816436826174912, 1.5330559842631533, 1.5481563120915032, 1.5755956311079986, 1.518611535480859, 1.4527988466386554, 1.450418191020853, 1.3911791542003844, 1.3607543417366947, 1.362558698329054, 1.2577591204462342, 1.0356396056216943, 0.8610714747886191, 0.843333568549642, 0.8555557941176473, 0.8428992047930283, 0.8280557866402118, 0.7806536325085589, 0.7375420630751384, 0.7125001993464052, 0.6952779720666044, 0.6575001835511982, 0.7167555383597884, 0.7311999869281047, 0.7044631257391845, 0.6613352103952692, 0.7355626052754435, 0.912778033146592, 0.9033335856676004, 0.89055580454404, 0.8851307825842761, 1.0113891716464365, 1.0744447431528168, 1.316667033046738, 1.2788892462651729, 1.2966366282290698, 1.4410691723000326, 1.4830559705104267, 1.3936114997665734, 1.210833397603486, 1.3683337162309368, 1.4191670638032992, 1.4783337451330545, 1.480653697945845, 1.5254249502645507, 1.3486114885620917, 1.3316670392156862, 1.4562676293832353, 1.3456163665400809, 1.3776193263305323, 1.3843747036258949, 1.3975166350802202, 1.5553364836601309, 1.5165269482570805, 1.4571478527855586, 1.349703859866169, 1.2414778787672478, 1.211977406240274, 1.2599256024743233, 1.1003854119203236, 1.0743931501899853, 1.0059479428104576, 0.9644447135076256, 0.9008335843448492, 0.5762326122004358, 0.6519725989508773, 0.6540943079416961, 0.6350001770904659, 0.6155416941332088, 0.6093278765950825, 0.477560803610333, 0.4624394214130097, 0.4437209299719888, 0.4380486659663866, 0.4486065589791472, 0.4605556844849051, 0.4591224359632742, 0.4716667983193278, 0.4629902036678408, 0.5363890386710239, 0.5466668113134142, 0.5538890434173669, 0.5805557174758792, 0.5966668330999066, 0.6048366319638966, 0.6263890638032992, 0.6344446215375039, 0.7011113069561159, 0.7277779810146282, 0.6395658793132069, 0.5996919311391223, 0.5933334989884843, 0.5955557213209502, 0.5794446058979147, 0.6422224011826954, 0.6242274925303455, 0.5832726468253968, 0.8965198259414877, 0.872215435340803, 0.7987887139744788, 0.7595566789604731, 0.731062275674344, 0.7106467754435107, 0.7030207296140678, 0.7741668828197946, 0.7627079559601619, 0.6410295842670402, 0.6326775752412077, 0.6362793498087204, 0.3340010231870526, 0.4167554821817616, 0.4131186940554, 0.4222223401027077, 0.4250001187266576, 0.4169139913717432, 0.7155557556800499, 0.7097224205571118, 0.711111309990663, 0.7158335334578276, 0.7225002019919078, 0.7425002075941489, 0.8405557905384377, 0.759722434640523, 0.7636113244631186, 0.7458335418611889, 0.7502779876283848, 0.7702779919105218, 0.7625002134298164, 0.6855557474271192, 0.683858716931217, 0.6921335238873326, 0.7831981510270776, 0.7778503432928726, 0.7402873123249301, 0.9593910171957674, 1.0782215848895116, 2.601503992685964, 2.617829863056333, 2.6237215460321397, 2.341667322128852, 2.343889545051354, 2.348056213040772, 2.3458339850511427, 2.2558339649081853, 2.244445070760065, 2.19750294770788, 1.9842442467320265, 1.8687540191409904, 0.3479481869747899, 0.3611112093837534, 0.4442133628047521, 0.4972223611111112, 0.4980556942888265, 0.4980556945222533, 0.4975001386554623, 0.4955556937441643, 0.5012793097572363, 0.4876728660908808, 0.4813329933084345, 0.4919422381730469, 0.4902779144102086, 0.4661112408704231, 0.3483566864889753, 0.616111282290694, 0.602500168067227, 0.5902779425770309, 0.5794446062869593, 0.5716668263305322, 0.5517108868534738, 0.8674792256458139, 0.8590828670245877, 0.8362397254901961, 0.8261673629007158, 0.8136113388577654, 0.8007493027349835, 0.4850001356961304, 0.5166668112356054, 0.5352779275599129, 0.5311111127450979, 0.5344445939931528, 0.5311112586763808, 0.2069445020230314, 0.2058333908341114, 0.2061111687675069, 0.204444501556178, 0.2488889585278555, 0.2487465077030812, 0.2661111855742297, 0.3419655477746654, 0.3236112016806722, 0.3236112012657077, 0.321388978680361, 0.3219445344693433, 0.5266668141145348, 0.5269445918923126, 0.5266668141145348, 0.5263890361811392, 0.4797223562869592, 0.483333364379085, 0.4466667917055711, 0.338611205804544, 0.3383334276377217, 0.3391667614379085, 0.3383334280267662, 0.3408333340336134, 0.1475000412387176, 0.1488889304388422, 0.1488889305166511, 0.1488889304388422, 0.1508333755057579, 0.1583333747795526, 0.1680556025521319, 0.168055602474323, 0.1680556025482416, 0.1697222696078431, 0.1713889368191721, 0.1802778278653263, 0.1769444939309057, 0.1755556045751634, 0.1755556043417367, 0.1794444945533769, 0.1777778274976657, 0.1637651736694677, 0.1947222766884531, 0.1950000544662309, 0.1950000545440398, 0.1925000537659508, 0.1894975939697258, 0.1646802062713974, 0.1736111596638655, 0.1733333817304699, 0.1733333818056853, 0.1697222692966075, 0.1691667139744787, 0.1461531300802733, 0.1727778260192966, 0.1722222703081233, 0.1725000481637099, 0.1733333820398548, 0.1727521034113268, 0.1646311425714198, 0.1911111645658263, 0.196666721599751, 0.19833338881108, 0.2000000559400613, 0.2019445009337068, 0.2119444456893868, 0.1961111659663865, 0.1972222773109244, 0.1988889445222534, 0.3080556416900094, 0.3413889844382197, 0.3483333344226579, 0.3333006546840958, 0.3302778700591348, 0.3294445365701836, 0.3283543418145035, 0.4455650174188194, 0.6452779553682142, 0.6780557462465396, 0.6786113006561886, 0.6961113038424912, 0.593076570787426, 0.8236113418119101, 0.8227780072415952, 0.8055557815625325, 0.9169447014070302, 0.9436113756757608, 0.9544447098413654, 1.0055558375783828, 0.7891454496449551, 0.8391669016572335, 1.0958336404597908, 1.3163892560299897, 1.318889258324938, 1.1138892007698005, 1.1286114216594043, 1.2002781136836678, 1.136944761437909, 1.2616670198412698, 1.397500391300965, 1.3481446312636165, 1.392778164709879, 1.3964733100321625, 1.1580602308590102, 0.9866339933084344, 1.011127458839091, 1.0447225144724557, 1.1583450175828665, 1.232500344771242, 1.2261114505135386, 1.1966153229069405, 1.0405252164643637, 0.9766669389200128, 0.9400819553926154, 0.8955558053221289, 0.8575002324151886, 0.8530557937266575, 0.8625002406039289, 0.8216668956582632, 0.709514479380641, 0.62575631232493, 0.6188890612135602, 0.5227779225801432, 0.5700001591360638, 0.5716668232181761, 0.5906792835868615, 0.5847223856034087, 0.5850001633565478, 0.5893115508870216, 0.5452779298941799, 0.564166824229692, 0.5509593937688045, 0.7350002039371306, 0.7944446661220044, 0.7737675130602245, 0.7441668744164333, 1.1091669740617551, 1.2761904826486148, 1.6980863748054775, 1.7661116048863992, 1.7833338321662, 1.8163893968253968, 1.7938893906006848, 1.7775004933862435, 1.6708987093059444, 1.6661115772642388, 1.707778255757859, 1.7063893664021168, 1.3095284872049755, 1.0570494950523852, 0.9788959018051664, 1.0111113929349518, 1.1647225466853408, 1.148055876361656, 1.193055888966698, 1.1814729551820726, 1.1887255298377697, 1.1611114355742296, 1.1637398160597572, 1.1950003341892317, 1.240833680438842, 1.3654155411725823, 1.5137348642539437, 1.4906652971424683, 1.3330559284242425, 1.319022305399938, 1.282500358854653, 1.2967063778400247], [28.19695231123561, 28.857211351917996, 29.38336929240585, 29.278859424716, 29.11248866532382, 28.992799660675384, 28.937411966947444, 28.87836452388733, 27.88227629014939, 26.949874391239373, 26.99905734129837, 27.195007560690943, 27.276597210006223, 27.37683300492791, 27.875285531045755, 27.69496551338313, 27.711351925132927, 27.051905094926862, 26.209862722922495, 32.926638205600675, 32.014205503992265, 31.17199263201838, 31.294441164488017, 30.23414909477124, 29.367377125994008, 28.363985284391536, 27.01645211756925, 26.31351807731785, 25.376055177248677, 25.08380916682229, 25.16436967498169, 17.587891990660342, 17.581995893929626, 17.413347245720512, 16.387744771786494, 16.593958767818236, 16.643888787426086, 16.7312884029723, 16.76487360768752, 16.437270941147965, 16.552254777466544, 16.667226855743625, 16.571173833563495, 18.884832293261752, 18.8531540174292, 19.288693355007005, 19.425889965997516, 19.34952425762528, 19.31381474937753, 19.46743030900833, 19.41944984165889, 20.00029225124494, 19.868135306411453, 19.83743536079988, 19.81072178044404, 17.430623301976347, 17.017740919467787, 17.115928902038593, 17.009526461095547, 16.93191624493918, 16.903715898848432, 16.725349938608776, 16.699661485973007, 16.855424786069616, 16.891061760958735, 17.100282531590413, 17.217824148537193, 17.514727098739495, 17.538821220666044, 17.71414099455338, 18.570754404839725, 18.61833850933707, 18.6405232141301, 18.64451252279801, 18.666466449035173, 17.995800552054156, 17.926038828820417, 17.713123140605113, 17.29939345463741, 17.283125714908188, 17.362406639337593, 16.975868175225646, 16.04080570611578, 16.12941378566047, 16.161701294243443, 16.292056062636167, 16.28229910348584, 16.54004422883598, 16.626421326539987, 16.60637712961277, 16.667541928804855, 16.6579406521164, 16.54810424922191, 16.49803748451603, 16.47530168075008, 16.396194747432308, 16.31223357041706, 16.103967729147218, 16.094128850840338, 17.48469437378683, 19.005826821039523, 19.0168235454028, 18.986891051587303, 18.977325525741158, 18.94787388406473, 19.13444261533162, 19.18923253828198, 19.20278312488329, 19.17808884928416, 19.18348084095861, 19.236242357531903, 17.023623114612512, 15.93894912985724, 15.894670407244009, 15.960251743472554, 16.361225186507937, 16.720198261904763, 16.911230530021918, 18.293963799237478, 18.613989636554628, 18.710896842514785, 18.86609722105509, 18.78104374694665, 18.741258642857144, 18.722227434640523, 18.712801436430127, 18.68992094379734, 18.212250269452227, 17.90068396537504, 17.626141819716775, 16.155719306683157, 15.868417764394646, 15.866073268362902, 15.790566802131965, 15.761668598259028, 16.222345631419234, 16.367534717242453, 16.40221510286337, 16.391150620059136, 16.51247410225972, 16.811727953470278, 17.158291248644858, 17.50164153896475, 17.84369068129474, 18.055315250622478, 18.36194955882353, 18.70008448233738, 18.52299725583567, 18.80933522564581, 19.16410891215375, 19.5033224160442, 19.80604163686586, 19.867967446000627, 19.796755864427727, 19.691949916666665, 19.284274556722693, 19.365838719810142, 19.847783140834117, 19.63185179938577, 19.39436303563648, 19.08073787612823, 18.847661350750208, 18.886589857843138, 18.938625276455028, 19.074316363601, 18.924416899671908, 20.4968404201564, 21.016887129184173, 20.929638590024897, 20.77188946140679, 21.28005250314867, 21.20456451704015, 21.22007295043573, 21.229097707983197, 20.974172465764084, 20.685542600529104, 20.311982631263614, 23.777522767931064, 22.187711569094304, 21.88524863009648, 21.545001026377214, 27.692420871990095, 27.262409337924066, 28.30226944819889, 28.44749150848117, 34.72047389028945, 34.93113216625169, 35.30937461632431, 35.226263527466536, 32.475620482648615, 32.402420232493, 32.31767472362279, 31.65790196195144, 26.048354261541903, 25.489498889822592, 25.430508772038724, 24.61976232773109, 19.14539024998703, 18.92008463157485, 18.464963098382224, 17.861783905206714, 17.72780352847158, 17.663469245487082, 17.58643101501064, 17.408860877295364, 17.2841712984419, 17.141827589091193, 16.871778392779333, 16.883910198801743, 16.807294298552755, 16.854031285014006, 16.923823356987242, 16.957222812013697, 19.1089431887644, 20.191732899937755, 20.29451771195145, 20.36897842997199, 20.40793270315904, 20.40997050380616, 21.05744280388461, 21.16542355454404, 21.341754082088396, 21.275299815048243, 21.224146764628077, 21.28176329432532, 19.25427425909262, 18.334458581232493, 18.395611828976037, 18.52781782710862, 18.54100886118892, 18.63783884258676, 21.066198277469816, 21.11604678828198, 21.117722773342678, 21.181117011594825, 21.34451335862123, 21.439594828000185, 21.630372292561468, 21.727143991461777, 21.84137394708995, 22.02429398176199, 22.350678166199813, 22.478120147722397, 19.68178643731716, 19.747675832010582, 19.861541376439465, 19.98872372914721, 20.218567245235505, 20.334954004823505, 20.234811594771244, 20.30918856886088, 20.386686051665112, 20.512897164604087, 20.40486999397762, 20.45972791464364, 20.58248703555867, 20.6948252605042, 20.891586090550764, 21.070624376128237, 21.23669088577653, 21.16661399929972, 20.776301201291627, 21.4422762648602, 21.30010140242764, 20.80183785977799, 20.489785805940063, 20.099654911998133, 20.16892437698413, 19.806914306800493, 19.235621257236225, 18.77498171109555, 18.18629086623224, 18.102182554310613, 19.43183296374105, 18.509879038671023, 18.49417181431165, 18.520208110333023, 18.45750970782758, 18.488894020463743, 18.605341204092745, 18.455838467164646, 18.503511112122627, 18.447227360644263, 18.39873253432348, 17.359883646329365, 17.434449296763148, 17.275133141067542, 17.185875238484282, 17.132418125661374, 17.086659733660134, 17.07697692882042, 16.421363106909432, 16.465485133131033, 16.47453300132275, 16.518435956271396, 16.46387702035805, 16.46677379026535, 15.929586221055088, 15.961456293495177, 15.91345981364768, 15.934808203781516, 16.034726681917213, 16.372854649159663, 16.40591222152194, 16.348136933162156, 16.392805431995022, 16.629068425070027, 16.607775332088394, 16.597175320999327, 16.639698638518045, 17.611505692888265, 17.552618669678527, 17.606608365935262, 17.521391095704953, 17.171115892468098, 17.18208217351385, 17.146115884842825, 17.017784700669157, 16.823652796685344, 16.842770740585124, 16.85621831178027, 16.50178540343915, 15.71847155318825, 15.959698593292872, 16.09721032492997, 16.36703520717724, 16.5250349178338, 16.694449090102708, 16.955935979380644, 17.247077597338937, 17.403877181061315, 17.666076339013387, 17.76111594856832, 18.389699406862743, 18.172344093649496, 17.911820821661998, 17.775613926937442, 17.556321115857454, 17.380597520930596, 17.250492455804547, 16.98492325575786, 16.69518233504513, 16.510009767584812, 16.321467935340802, 15.91761500217413, 16.14065403976035, 16.122898750855903, 16.171948943121695, 16.00949776003735, 16.002758758813826, 16.125312424525365, 16.06599404746343, 16.12926673498288, 16.155852543417367, 16.14690680104264, 16.435699834500465, 16.432193970043574, 16.201442241596638, 17.285263540305014, 17.327528086756928, 17.352850133597887, 17.424061553999376, 17.36387946903206, 17.314150367958295, 17.296218570105818, 17.237836051087115, 16.964444964985994, 16.834364913320883, 16.65442339363523, 16.662996817154273, 15.577525189231247, 15.506444191409898, 15.488353711718023, 15.39614323858868, 15.354602566577192, 15.294601251011514, 15.281512929971989, 15.351540100625716, 15.359910720531351, 15.329775365779648, 15.330235190598742, 15.34274917359166, 15.36975439884843, 15.549093955804548, 15.517412885620915, 15.470356605859338, 15.467935976423906, 15.513549912695169, 15.466819954092747, 15.49723569172113, 15.4712437393603, 15.486358083333338, 15.524180072751324, 15.299651571584189, 15.351687106442578, 15.302697872471212, 15.331614838235296, 15.374257048703836, 15.510239930005072, 15.639545076719576, 15.909766292328042, 16.100594729302834, 16.225760801976346, 16.347882381341424, 16.437135746187362, 17.113065528555868, 18.09442863326268, 18.01353197447868, 18.05155014877062, 17.998093060768756, 17.82986676423903, 17.74164565873016, 17.499999925905836, 17.247896741051974, 17.137721637332714, 17.000707303839885, 16.898893592436977, 16.541983978446936, 15.423396501945222, 15.507240427404296, 15.501554084811705, 15.532114419156551, 15.642182161686897, 15.544922507740694, 15.560935379940869, 15.596201598350452, 15.598080848817306, 15.692396975256772, 15.630835970277, 15.442319811935889, 15.46728947175083, 15.33982915592904, 15.469467328275757, 15.69544059072518, 15.74127419810146, 16.27978259508248, 16.25326847564581, 16.212337307806823, 16.190057930750076, 16.131099215764085, 16.089614581294175, 16.275375648381576, 16.395212205649585, 16.34323512978525, 15.99422223669468, 15.541670990740744, 15.284399353330222, 14.537571652816684, 14.295147340258325, 14.120198820961717, 14.009989740585125, 13.7767637272798, 13.538339228291315, 13.368947569716775, 14.138925314587876, 13.970706288048552, 13.942064912464986, 14.009170568938687, 13.916780184329289, 14.367504001723484, 14.754009583022096, 14.830636588478464, 14.824443765094928, 14.90581173583878, 15.16208170736072, 18.484167001089325, 17.468340512170883, 17.544920822368766, 17.54792031318083, 23.89166376011516, 23.891646014628076, 24.789411529100526, 24.54207243902922, 30.82183858395581, 30.79223082212885, 30.85386921890238, 30.066781395736072, 27.41791361227825, 27.39094132531513, 27.43250766013072, 26.85070286537957, 21.10917255636607, 21.06436845256399, 19.863616652873095, 19.10877955619165, 13.818712921811215, 14.409170678338, 14.610559622725392, 14.580559615779649, 14.59833739832906, 14.78444855742297, 14.940410174214128, 15.286353446778714, 15.440872582321818, 15.715270393790853, 15.868337745642702, 15.819935104186118, 15.846122331930877, 15.488262704793032, 15.422275500466858, 15.584816096016183, 17.972227168378463, 18.91191693370682, 18.875943261593527, 18.778065318082792, 18.979449727435416, 18.96580124315281, 19.027831967475883, 19.1038894746343, 19.10294414807034, 18.9520710743075, 18.890465088624342, 18.901246913471983, 16.73798316918119, 15.835670247734466, 15.823476171225622, 15.875986903361344, 15.67629019382197, 15.495079792794895, 18.211867661297852, 18.2007890332244, 18.114215799253035, 18.225105344926863, 18.596674013823407, 18.75309785159837, 18.938333670245875, 18.7430815235761, 18.694362879940865, 18.447988130096483, 18.812505245020237, 18.82417640571181, 15.921055570326322, 15.86798504450669, 16.068146178338, 15.892293917366947, 15.405517326014758, 15.36537290789631, 15.046420875272334, 18.432934356131344, 18.274909047774667, 17.830212968098348, 17.75850370471522, 17.718702146717114, 17.19923891721133, 17.81514938437597, 17.510396792900828, 17.49190007026144, 17.9808965898641, 17.686729787192654, 16.906657536414567, 15.164474191706224, 15.219478819195462, 15.413288580454404, 15.619628287270466, 15.812175135698723, 15.866041549719238, 15.445977475568004, 15.406846009852556, 15.306659032441084, 14.76502036278368, 14.774435440009336, 15.601040544662313, 14.720687816760035, 14.641809351696232, 14.37304062752879, 14.127206104575162, 14.006170906006846, 14.088719767148042, 14.271917893168377, 14.3925039894958, 14.488615145559065, 14.64469807544292, 14.6676977022198, 13.81518810823218, 13.835664195455962, 14.064448360177405, 14.189966492608155, 14.298897348117023, 14.383855435729847, 14.224774686397076, 14.231092809212573, 14.19389283745656, 14.145414529878618, 13.980902136535835, 13.863666016106444, 13.795071408107688, 13.605441404761905, 13.476116829754124, 13.373607522331156, 13.343126727988514, 13.617391536181142, 13.589303209577627, 13.32988336371836, 13.234909097183316, 13.29656280095316, 13.318596023187052, 13.421107722455648, 13.384961642312485, 14.293650048708376, 14.275690028011203, 14.22691335558668, 14.121392821272954, 13.703612471988798, 13.671668018120398, 13.803178232026143, 13.811406724945536, 13.724233277544352, 13.695696769443147, 13.607064809679429, 13.652615609182124, 12.736470766651102, 12.686464628384687, 12.79287689169001, 12.909895988406474, 12.94293997941399, 13.349385081699348, 13.579846277077497, 13.602496557656396, 13.616698401804523, 13.62744301283847, 13.69070771902298, 15.275685820650482, 15.182366301841505, 15.281213318082788, 15.255599420323684, 15.180846796991393, 15.15340268946014, 14.753474834500468, 14.551296906622849, 14.590522233348894, 14.571999722611269, 14.609646910364148, 14.619494912449785, 13.061948080921256, 13.131968897305873, 13.085570699735449, 13.065624325474632, 13.059805191176473, 12.99913513974479, 13.020442366402117, 13.234993091114225, 13.224130522253349, 13.560472946311856, 14.007377713818862, 14.147744157820656, 14.528437610177404, 16.037859133053225, 16.368225526377216, 16.687138110333024, 16.989453766339874, 17.36240198313968, 17.75208925940969, 18.14903866658886, 18.192056583566764, 17.591368278711485, 17.427782632975415, 17.331899839960716, 16.898270090024898, 15.40855076752129, 15.020665547152191, 14.755511481326527, 14.469283665421722, 14.139166946922678, 13.692780333333332, 12.87315859197012, 12.879662642934951, 12.96781403742608, 12.98256181870526, 12.897757783302213, 12.926217134220355, 12.966889492799735, 12.976856771942112, 12.951077349050736, 12.939032419000933, 12.933096232492998, 12.97760786764706, 13.223597493020566, 13.25696186686897, 13.1563386573296, 13.312683308278867, 13.29973962114846, 13.371948119981326, 13.464919461554668, 13.824062943588547, 14.288813376206038, 14.65579299167445, 15.048615304154996, 15.307067487949448, 15.807504401493931, 15.916369828898224, 15.97556000666176, 15.994726679582945, 15.960580870664748, 15.934005273935334, 17.186330580532214, 16.831285870681604, 16.366523920168067, 15.993300266184256, 15.588092281901652, 15.281484020767213, 14.65848293767507, 14.512225971719706, 14.460288625739183, 14.677345123015874, 14.764527733271088, 14.965774256224716, 13.92633198066838, 13.916581570650484, 14.110549924836604, 14.938360705882353, 15.747340791861191, 16.736972237185523, 16.872749740418488, 16.89468723391366, 16.943338055501094, 17.37811161266729, 18.11072402894491, 19.7217117596483, 20.39445013507625, 21.35680311117893, 22.02186865577342, 22.06379677474323, 22.110805490033997, 22.013869112278247, 22.779114430672276, 23.019849999766578, 23.213227570728296, 22.72861743082789, 21.268536422710408, 26.02242760589792, 26.069005679582947, 26.14324713099131, 26.243930831508067, 25.74611345915033, 25.31359232823037, 25.00977757165357, 25.06407759920635, 25.22831665709617, 25.46026129380641, 26.17108785714285, 26.936181591726896, 21.97980696282421, 22.827013746420796, 22.62762211048864, 22.46309416059757, 23.433608177326487, 23.80171983014317, 23.88614792289138, 24.02609204629629, 24.609152387643945, 24.913013076973755, 24.87511242491441, 24.87621579489573, 28.44256839223467, 27.54701037706193, 27.701713653594776, 28.60273180176564, 37.58082505874573, 40.92012105541421, 43.39889832843138, 44.32264767724868, 50.89817945712729, 51.194892786181136, 51.46589660161843, 51.558721689075625, 50.24938604590725, 51.21173689993775, 52.049178565904135, 50.27130766682228, 42.66574913361993, 38.46523879092748, 37.08844600342359, 35.46162272510115, 29.66917492156863, 29.619144154684097, 29.29059844928676, 27.708779854263923, 27.307164399393088, 26.860658741907876, 26.22378883208839, 26.47893792605148, 26.39073830585058, 26.58311145442798, 26.690595427559916, 26.69313957135077, 26.51489502388733, 26.168914497587927, 26.392974113289764, 26.738494600451293, 29.295495442032365, 30.35073101602863, 30.572418890989727, 30.79212786904544, 31.04205758224531, 31.62183865094927, 32.23250895533769, 32.24042194848662, 32.81841940522875, 33.44176909049175, 34.13694642857143, 33.3154577194211, 31.61037910449735, 29.929573882586368, 29.377096680827886, 28.72741405247238, 28.287943976735136, 27.75208008418923, 38.294928488772186, 38.19010825058651, 37.69631726182695, 37.11153651823912, 36.00386124455533, 35.382114974634305, 35.68710605018674, 36.0811676100996, 36.10950563398692, 36.02131701073763, 35.770371327381945, 34.4340225140056, 24.186640539371307, 24.156057811727138, 24.24427127696831, 25.174056779256148, 25.22724988849985, 25.260230860877684, 24.932327622205364, 24.96109519691034, 25.092194803921565, 25.28861813904451, 25.485284871898017, 25.76494179691877, 26.00445168532525, 26.06401797587924, 25.950945159156166, 24.940025580376595, 25.336380119149457, 24.88417102038593, 27.19694711383442, 27.483235757236223, 26.98858083745721, 26.469712706967137, 25.86270364021164, 25.39035469172113, 24.738032587457205, 24.140466306158626, 23.813930136087773, 23.767198038038188, 22.97945995852786, 21.952815613463684, 20.99306755034236, 19.75103234803921, 19.551672049953314, 19.586672115312798, 19.484710913554316, 19.325842927559915, 19.27707781683785, 19.152038384531597, 19.06344352039428, 18.86392898856209, 18.97585708274329, 18.262169007481976, 18.17833837705416, 18.32897782508559, 18.33644733222068, 18.232505072673515, 18.23169473739496, 18.246029572580163, 18.205341030189853, 18.214965381341425, 18.134906847776616, 18.09727373392079, 17.939099110877688, 17.75443521093993, 17.743651016417676, 17.856325734049175, 18.026393684407093, 18.059727246887643, 18.083846875579027, 18.393252059725462, 18.41257015390601, 18.359526499144103, 18.348501671335203, 18.29061417343604, 18.42000726151572, 18.376305289371302, 18.293417478776973, 19.136998468409587, 18.8832870733738, 18.734400364813933, 18.586664707905385, 18.21139395845005, 18.17067483963585, 18.2900118311093, 18.289012919856827, 18.336295722533457, 18.176398313768647, 18.16230420284781, 18.17786909134765, 17.116335060068472, 17.126393650560225, 17.125196149465715, 17.27045289589169, 17.458473427093057, 17.5948155532991, 17.61150793635232, 17.550165790849675, 17.53270312729536, 17.49523346810069, 17.41815828026766, 17.96491845193161, 17.970184586756925, 17.96199123194834, 17.97302762775703, 17.823492200746966, 17.565247646747586, 17.39500455091297, 17.502383343837536, 17.52658264526922, 17.526972366479924, 17.47587767347365, 17.014671085653983, 16.85943016308746, 17.80056495876128, 17.869148091814505, 17.824715400638034, 17.868564633520073, 17.93583831893869, 17.965382874649862, 18.40752364056697, 21.93853775918145, 22.019450580765643, 22.41945069281046, 22.44631565739902, 22.43704854302832, 22.241478936196703, 22.23250619078743, 27.118392082119517, 27.155189557889823, 27.164213830379197, 27.12980198910676, 26.199274264610576, 22.63640211601307, 22.264549863445374, 23.8411177578587, 23.80115969684421, 23.77118292581181, 22.82706979917523, 22.688905605741645, 17.89141717149082, 18.28641941269841, 18.251146285947712, 18.290074816915656, 18.35276872897928, 18.500534777237657, 18.55133558776844, 17.280142284469342, 17.389628830610018, 17.415758950574492, 17.349412206971678, 17.49277329691877, 17.622493223467163, 18.125282828737426, 18.149729443225027, 18.12151297845474, 18.05979021872082, 18.02831489612512, 17.900084598583877, 19.559414653828195, 19.504162610955493, 19.479589705493307, 19.52999353073452, 19.48091318930906, 19.25265686959228, 19.377017372393404, 19.3595826423702, 19.54997025295674, 19.7992046879085, 20.158380877295365, 20.406825857142856, 19.46694959492686, 19.827836977092414, 20.20667228913788, 21.39861706660442, 21.640103902583256, 21.78516856769374, 21.57924011928105, 21.83600974719888, 21.945984012600505, 21.89770810908808, 21.647438279641303, 21.33670434048073, 21.112162618658573, 20.899060113990043, 20.91111692880485, 19.79601344553377, 19.52666723849597, 19.068837856664977, 19.154045872782447, 19.138754125622803, 18.88935151120448, 18.68775945364796, 18.572775799253037, 18.220210455104265, 18.684213713743663, 18.427666032368503, 19.43655278478058, 19.408548498366017, 19.44329872956243, 19.04336869276766, 19.30360693476764, 19.024923357467717, 19.09869335628696, 19.326583188686588, 19.41934456053532, 19.142280845627138, 19.60261953540305, 19.052278666841744, 20.191949918222846, 20.753406591094773, 21.871352948040546, 22.801515465513795, 24.32348946782993, 25.13250700925926, 25.91084054178338, 26.260023571973232, 26.43746514635661, 26.953359618505573, 27.06402244125428, 26.66111167693744, 26.53584072478992, 27.11908052964519, 26.450915350762525, 25.723653344304385, 25.12376029564725, 24.885097891223158, 24.351975129267707, 24.469075016693463, 25.22946116446616, 24.97859981989125, 25.476799681289037, 25.26628445907252, 28.844139561702463, 28.364725320494863, 28.448063478057893, 28.278088758682827, 34.7297154807034, 34.70410598762838, 36.517269654761904, 37.17040703571429, 43.4657585330688, 43.69284379292783, 44.27817984998445, 44.45177230472755, 43.28787140748521, 44.17589233621226, 44.67241420051355, 44.37718566744476, 39.42306650591348, 39.110446773889976, 38.369560135098965, 37.17658091867413, 31.13154648022617, 30.63641982088391, 31.019163347849247, 29.53905762177093, 28.5736816394939, 27.959167167366942, 27.80244007368503, 27.859967792872705, 27.95846702597132, 28.006001965816612, 28.06536230189853, 28.22473464978214, 28.265170853786053, 28.56556096350763, 28.444447644257703, 29.846889607142863, 32.4824131942, 33.94856866394336, 34.524890080065354, 34.91294176844071, 35.37525220277001, 35.1394985742297, 35.41491410620916, 35.43497235823218, 35.7123534344071, 35.16359531921301, 34.95003253423592, 32.77293938771592, 31.19289980501089, 29.50939608003489, 28.733198609394776, 27.36302349968876, 27.309729817693743, 27.230170850062244, 37.578221941487705, 37.22252842934887, 36.761090572906944, 36.3985018793184, 36.26397111165578, 35.910707501322754, 35.52970340660448, 35.37834537107065, 35.23215229598506, 34.84969935901027, 34.65684652450981, 33.928336512060376, 24.08605006963897, 25.088545604964207, 26.35510108107687, 27.556548195689384, 28.865033506302524, 30.310010586134457, 31.217945053582454, 31.577231018440717, 31.94734535792095, 32.006438650482416, 32.61101272323374, 32.612803168767506, 32.191508376984125, 31.147425756458137, 29.68950142584812, 27.923018744699917, 27.474372365941115, 25.93486265437612, 27.33908503454002, 27.72845286165577, 27.090301187052603, 26.48626326562338, 25.672474639027527, 24.99552256254345, 24.5311372605042, 23.879451092903828, 23.36096103260193, 22.639776207983196, 21.61168885208528, 20.294171777155302, 19.1699326721334, 17.76439596101774, 17.32272483558205, 16.429052569638966, 19.668665295715364, 19.56400371607532, 19.306202431528167, 19.29781296872082, 19.2075375506536, 18.742549494631184, 18.94405742234672, 18.096344783500644, 17.96182781668223, 17.842875890745937, 17.862465152104086, 17.86084976672892, 14.76863139354705, 14.701313498755056, 14.632303120136944, 14.717756081699347, 14.81309435094668, 14.718704856753812, 14.93451836911635, 14.882884420738671, 14.73469592484645, 14.730412448334892, 14.67870600793594, 14.44760784997536, 14.608916077108622, 14.947658071117337, 14.834196329100168, 14.583663713040773, 14.615274555477749, 14.441725414332398, 14.900342329909742, 15.043867084578276, 15.09883209753022, 16.014520949735452, 16.195433748953477, 16.099124951525052, 17.865287169000936, 18.555723874416437, 18.711158008062952, 18.7993770749624, 18.653494791005294, 18.474841892545907, 19.283856908963585, 19.24145213266418, 19.163620897374603, 18.150588299097414, 17.929997602474327, 17.70700496317372, 15.955238455648926, 15.334543970588236, 15.241327554855276, 15.38964928252412, 15.497321952367988, 15.28179773708372, 16.601827654290513, 16.442074688128955, 16.93492522852474, 16.912177612900717, 16.96244160059654, 17.06151721697598, 20.080317965141614, 20.105836467009027, 20.15505672805789, 20.044533782127957, 20.065005597413503, 19.959451910364795, 19.23739310628696, 18.822535522490018, 19.151893579754123, 19.44551417250233, 19.33385913803299, 18.90179535473078, 15.973454380796763, 15.86921065538438, 16.075557426003737, 15.899359539449112, 15.728771680983506, 15.40306072595705, 14.99541906806724, 14.938474940320573, 14.326999275210085, 14.929151890211642, 14.872191120837224, 14.819029223544971, 15.284098335901026, 15.220727506830972, 14.996717319016495, 15.145998343443985, 15.161021762527234, 14.635758854407872, 14.652900710862124, 14.736537517731351, 14.752151518674138, 14.010211538904452, 14.195769485527546, 13.92389872641288, 14.029999124961096, 14.134723715375042, 14.33646490958606, 14.362930929660754, 14.405456831883738, 14.21648031714908, 14.585339861188922, 14.583995387339847, 14.65309805035857, 14.606944659430438, 14.582781839013382, 14.290973846327418, 15.179411177185782, 15.18198084142546, 14.983103761204482, 14.901063767035616, 14.82470503322051, 14.723200708718542, 15.094861568316215, 15.270398464130098, 15.253150706582636, 15.29033084327861, 15.16442051073763, 14.915266455026453, 17.570975809835048, 17.542871359243698, 17.455742235572934, 17.518893775132273, 17.798338297307815, 17.897782768751945, 17.743102266881937, 17.489248423202614, 17.547815229691874, 18.68658595963627, 18.96633329560056, 18.912689426626205, 16.524154907329596, 16.802948060224093, 17.147987633208842, 17.365049118892003, 17.466568619514472, 17.484951461795827, 18.68180721962053, 18.943214655462185, 19.28694962698413, 18.381090406931506, 18.555896624027387, 18.77217363227513, 20.66111687114846, 20.57673295284781, 20.471158752645504, 20.45601165452848, 20.31278343653128, 20.372942107609717, 22.37370368727565, 22.31405970751634, 22.916542192875987, 22.90976581053533, 23.161448881294778, 23.03743722934337, 21.417956256847184, 21.540547370525992, 21.71857949907157, 21.994761077126427, 22.20121504855276, 22.1559994300498, 19.199722866013072, 19.22201265398381, 20.462715200280112, 20.61931420883909, 20.459589904917525, 20.016947377049647, 23.29470045285506, 23.45971215087146, 23.69945104299007, 23.82681549657641, 24.115632939253665, 24.296296290694052, 25.910499684717685, 25.315058869747897, 25.361113044195456, 26.712588920090266, 26.80986487427193, 27.48744696016184, 24.75079353151261, 24.951854396872875, 24.990704745251712, 25.1372336546841, 25.33957931048488, 25.190198894179893, 24.47582379489574, 24.68526315639589, 27.93736958807968, 26.97944704504292, 27.307832011369182, 27.122299535558668, 33.70646575076568, 34.04777304149258, 35.30225276065982, 35.43242368270915, 41.79280537177093, 41.86360214479976, 42.17034292289137, 41.44459665289449, 39.71056426089325, 39.6367651589655, 39.74117582570807, 38.73607650848117, 33.16367071748509, 32.18398983971366, 32.13699265110489, 31.66159308606588, 25.605585792383437, 25.4457173059446, 25.165625265795207, 24.30703175894802, 23.90791042281292, 23.980601834962133, 23.80359170619359, 23.45279934850607, 23.523401658223445, 23.429039937986307, 23.158817250311238, 23.152226001789607, 23.488972143713045, 23.407297643168377, 23.118322839091192, 22.67615447798074, 24.277181972455647, 24.615867706803765, 23.960930821117337, 23.47658310221044, 22.836689174758792, 22.296476610877683, 21.731000269607843, 21.16771510823218, 20.344288706803734, 19.46551646809835, 19.462423583184204, 18.63236762877373, 17.157861413165268, 16.164661876359062, 16.223620955571118, 15.984729573757004, 16.16860812955182, 16.351495969965764, 26.97627492923968, 27.084369918222848, 27.534741065904143, 27.93347189495798, 28.413009455648925, 28.668607091970124, 29.18711335379708, 29.59126848117025, 30.17272990764084, 30.709641132041703, 31.971532782684303, 31.85810058263305, 22.15906054392648, 22.45997511126673, 22.170869640834116, 21.80439376237755, 22.064469058979142, 22.00151386858077, 21.96364040928001, 21.676223648615, 21.273457420090256, 20.549867449024795, 19.854746027699967, 19.356849138110803, 19.121737027452284, 18.800861623015876, 18.84787383497853, 18.4028900245098, 18.89216960537924, 18.86135425443511, 20.8422322843, 21.58312134974903, 21.364965953672584, 21.0037514615624, 21.02354427544352, 20.91355359158108, 20.751772660831, 20.55884777527691, 20.35522358448128, 19.94390086975647, 19.87011964091192, 18.69860211865857, 18.188117461918207, 17.156629367791655, 17.05851764832711, 16.711319584205715, 16.861404909897292, 16.685399109321505, 16.807782423268105, 16.861855542002548, 17.215788959383755, 16.972757115624027, 16.658398290305012, 15.77221321204482, 15.486845803376903, 15.487226528789297, 15.728967600918146, 15.90485555166511, 15.973057421179584, 16.14204440460629, 15.929276202610149, 15.810998679193904, 15.309574532212888, 15.13065633348895, 15.587417954715225, 15.636348672969188, 15.617289363211952, 15.6821095660844, 15.48305736912543, 14.98668987502022, 16.560904058205676, 16.85061379816371, 16.80952828415811, 16.796110976385012, 16.850508762449422, 16.771389365157173, 16.994717500800125, 17.033214184407097, 17.089244404799018, 18.12074488634973, 18.06358177906822, 17.95397810325241, 16.862394710877176, 16.543608319094307, 16.485032347997095, 16.529367136109173, 16.349774380046824, 16.28557383224401, 19.145950377840027, 19.175285125583567, 19.18208740873016, 18.1446675869132, 18.14782476151572, 17.85174169989434, 17.97924834376819, 17.965861679271708, 17.982925075469446, 17.894727212418303, 17.844958286114835, 17.54701733909119, 14.460173071999172, 14.37220002902272, 14.833026941643324, 14.712233015109195, 14.691392980314347, 14.423436323685028, 14.665820893557424, 14.46659326915876, 14.473225162961512, 14.52424059064737, 14.67676399089636, 14.419811373482728, 15.556675337457206, 15.065546570644658, 14.87119889522968, 15.022723385926218, 15.087410704158886, 14.961076468409583, 15.06544291534392, 15.217683816133675, 15.234033025132277, 15.202462997665732, 15.172749310379707, 15.029423749533144, 15.336115382976711, 15.483381828577269, 15.467440967834849, 16.338248944677872, 16.30480367328042, 16.003978073218175, 16.248321279022722, 16.168960817615936, 16.19709814558046, 16.199105732804234, 16.124712334472587, 15.46351096575371, 15.103502856048328, 15.027700111019689, 15.11521192394377, 14.065384259570497, 14.012751164799257, 13.639507745409274, 14.371869038359788, 14.461460440320572, 14.516983371226267, 14.592471218098352, 14.724355000311236, 14.485044820369096, 14.693059648725916, 14.65694851984127, 14.55500405096483, 14.609693446389668, 14.642669674058514, 14.4504697167153, 14.954572077419858, 15.022219265950826, 14.695508129240585, 14.56068754454137, 14.573892942858444, 14.264020198412696, 14.38704407913165, 14.308088731995024, 15.353097035058743, 15.26422908496732, 15.288573253968254, 15.08247482990974, 16.194502235727906, 15.99833533714597, 16.081372952769996, 15.99923682199024, 15.863524351151572, 15.867355788593214, 15.95773770751634, 16.004763784454227, 14.61625744494924, 15.63338899546115, 15.727149317615934, 15.31036676268285, 13.878320758332707, 13.878951055555556, 13.870486864301276, 13.883540043416096, 13.853775794506694, 13.423758422332453, 13.710003818215078, 13.76493380042017, 14.042666029308196, 13.11800432850918, 13.070559193510736, 12.836333036729046, 13.059389514161222, 13.021497415421724, 13.033999718176162, 13.04111474011827, 13.148570405661356, 12.894570739325266, 13.231868712714624, 13.002321929911432, 14.148996442448649, 13.990145079350167, 13.959322238391564, 13.693289418300653, 13.999875400093371, 14.034009253145053, 14.293495881886091, 14.6687503843643, 14.866115243919234, 15.167439794889251, 16.05860377544351, 16.739682338041284, 17.15888662822907, 18.01889391129785, 19.145283119281043, 20.027668850295672, 20.9468286940554, 22.16031844102085, 22.87160517948698, 23.873290847416747, 24.981687528955305, 25.54899467475879, 26.10939321762372, 25.55559365281668, 26.299470235371928, 27.635037634892758, 27.71282745385932, 27.479066764628072, 27.870227039139195, 27.843473765019752, 28.282603133201704, 27.914946522007607, 27.54025000217865, 26.870754575474635, 26.841148841814505, 27.13382140196079, 29.338355032776537, 27.35668101252723, 26.9248392010582, 26.541067117024586, 36.30302564528154, 36.00227384796141, 36.78738631505862, 36.883980658574544, 43.55820521747588, 43.48953825629409, 43.81082408370943, 43.10044608577459, 41.72112733950623, 42.65079142989419, 42.42622086834734, 41.68080807951681, 32.67830941801467, 31.88676050438782, 31.237590190553995, 30.311132493930906, 24.212059185416667, 23.769916308901337, 23.67535191814504, 22.83085477664826, 22.366441636165572, 21.9247771984127, 22.0207738881108, 21.939440024505263, 22.41767416622705, 22.51790530571117, 22.412784007469657, 22.114666578275752, 21.93695055143169, 22.07448480607494, 22.85186210226684, 22.57489400412388, 24.66074915408713, 26.143011475023343, 26.582276170726345, 26.43030400051681, 27.108023250233437, 27.15747200101152, 27.404477720199196, 27.345903783707467, 27.22973646584189, 27.103835641223156, 26.921370416977904, 26.881384884765016, 26.036176506296687, 25.20645913040772, 25.17826524094306, 25.582633537503888, 26.25591503083503, 26.314708197406443, 37.29603738390913, 38.47001072477824, 39.55925463149705, 40.24032992203548, 41.43497867794896, 41.97542011878372, 42.00822111064425, 42.24623239635854, 42.74737643467561, 42.63524092343605, 42.171089735371936, 41.68623552666188, 32.073064478291315, 31.83492133446416, 31.730173132352935, 31.30569879707438, 30.636956544662308, 30.521784806567076, 30.896483082656395, 30.835533456115783, 30.61314808948024, 30.530616978369125, 30.986953066059755, 30.92632425443576, 30.65411169125429, 30.561016624105203, 30.26005423240806, 29.568906150800192, 30.377855402115102, 29.746275056567068, 31.3713947805789, 31.759032878618115, 31.224711594669444, 30.28464796101774, 30.083124557889825, 29.60004536990352, 29.03203830726735, 28.50848312421997, 28.004288436819177, 27.608293997324058, 26.91855772204845, 25.79832441409897, 25.01946759453781, 23.909442734669685, 23.88975446934329, 23.74535779614068, 23.407893625094676, 23.392893734198317, 23.37505357547012, 23.486749710901027, 23.493673351540615, 23.19171382212885, 26.445002628929352, 25.93767566938998, 25.55858067289138, 25.70529412572752, 25.462315358324258, 24.74418801164347, 25.32867862130408, 24.878463729147214, 24.477184399815872, 24.024502262838467, 23.647520277388736, 23.14919025995954, 20.031863357719946, 19.46314706162465, 19.16827289604731, 18.66847140421724, 18.510467085511987, 18.43158051462807, 18.17537829738562, 18.594440137038983, 18.574827665955397, 18.44958007920946, 18.43419505423281, 18.171711435311643, 18.77944967460318, 19.45917208667912, 19.93666038180828, 21.45722820152505, 21.906651652661065, 22.0394666826953, 21.94097014464675, 21.99816876065982, 22.405687606053537, 22.85235219218799, 23.179413298397137, 23.568965483839463, 23.408843868806414, 23.02026171381886, 22.791234956349207, 21.80861717701525, 21.788598324696547, 21.76941591013072, 24.41752051618425, 25.66556126618425, 25.66421561640212, 25.62477579295052, 25.545990729914312, 25.18029932765328, 24.491119998132582, 24.51282180042017, 24.719421256769373, 24.195007863056336, 23.74618910325241, 23.17764252762216, 19.891386663709927, 18.835658120136944, 18.362168384220357, 17.916176314347965, 17.720501598428264, 17.465760860488643, 17.445422323607225, 20.05739524712107, 20.055752213040773, 20.016564619747896, 20.037031490429506, 20.065371855119828, 20.30370541238717, 20.76061722253346, 21.11278366223156, 21.405911575396825, 21.65851443145036, 21.902473314892625, 22.181371487706198, 22.038340845704948, 22.23984270837224, 23.21167313686586, 23.143062009492688, 23.00556404512917, 22.660185754746347, 22.88315741674448, 22.52726548887333, 22.30510864067849, 22.068154852941174, 21.600562873482723, 21.69606088040772, 18.704477561553983, 18.427404548474943, 17.565177480781202, 17.830231088857765, 17.869941794740118, 17.9374021424681, 17.405452880718954, 17.42096689985994, 17.32987848638022, 17.295263715452847, 17.407866285290876, 17.23437890973521, 17.243947161998133, 17.400406502256455, 17.3462816127451, 17.150069850373484, 17.020798167911607, 17.069619378540306, 19.451986978913787, 19.476912338313102, 19.45574757189543, 19.33333611834734, 19.279631742841584, 19.450168562489708, 21.017146225723625, 21.127568616324307, 21.065199345315904, 21.13770649307501, 21.152981941176478, 21.02920258348895, 21.544125765246008, 21.904095596016184, 21.90666323288204, 21.856329274843937, 21.97117071374105, 21.852589813330617, 20.13416964456894, 20.110635600529104, 21.482587469465194, 21.576366744864615, 21.65082988017429, 21.899809940476192, 18.99559353283536, 18.82194968720821, 18.87951030913477, 18.932785287970773, 18.82046249206349, 18.75574977505447, 18.768004716619984, 18.8313003881108, 17.489855071584188, 17.46252316721133, 17.47533400478071, 17.457177988795518, 17.38641450311106, 17.469745609321507, 17.51654775583567, 17.85306052279801, 17.9337374178338, 18.075226774136457, 19.151807327419856, 20.05222780641145, 20.04528336336757, 19.97528333885777, 19.97945001151572, 19.857036117491443, 20.007024663157484, 22.18784665740741, 22.19359839071416, 21.955960635698723, 22.11925677925615, 22.71363831788957, 21.32964815950825, 22.10072942561469, 22.865484703937128, 23.76750662721756, 24.471197195300345, 25.10566054684096, 24.97883589355742, 24.08253928369125, 25.029941558590107, 25.573037003579213, 25.86552745277, 25.980445673555664, 26.080663498210395, 26.436505828976035, 27.732164579725836, 28.077451654761905, 28.27288423550161, 28.68833963881108, 28.757819752100843, 28.692983986150026, 28.765714948564423, 29.009020648459387, 29.523318095374265, 29.974349591071427, 30.95171015126051, 34.41556514816134, 33.508438700625014, 33.3030505350802, 32.79684358642042, 38.46162585324073, 38.79021118326071, 39.55700170573216, 39.11848843152817, 44.8770081167114, 44.51732996148849, 43.72831259067402, 42.0757122478019, 39.58487765087146, 38.93432875244519, 38.44413740896359, 38.15731362519452, 33.87612055774719, 33.15653874891067, 34.74306982500778, 33.93026385517041, 28.33251223420482, 28.3615038671024, 28.868014257314044, 28.405560833528508, 28.40010355547775, 28.40409983003707, 28.4327786360359, 27.616256346739345, 26.68006807437013, 26.29457297032888, 24.401792379544165, 24.51213559191971, 24.500485208600864, 24.2144166830648, 23.84704267953287, 23.205891987198683, 25.1277260606903, 25.97507445065943, 25.915723583566766, 26.046692471599755, 26.09645442561404, 26.01471287232468, 25.86418278586991, 25.83494627061936, 25.85436736912543, 25.95711017506356, 25.77587076089325, 25.659923603797075, 24.46486190757405, 23.596272736147547, 23.643444574004054, 23.538208871087, 23.472137414736363, 23.445937523673365, 34.34237612970744, 34.28322591199813, 34.243132681942505, 34.19098282275132, 34.30237838839415, 33.69730139499106, 33.50632787153751, 33.45338454088404, 33.59300638472676, 33.828828061665504, 34.00769364013124, 33.90522680788982, 24.057349771993348, 24.367506781123563, 24.61830482752318, 24.689619347805788, 24.873699687130404, 25.17049950357921, 25.404743144802364, 25.602086883753508, 25.600116411686894, 25.43404977933396, 25.0752706751686, 24.72455372447868, 24.13314840970796, 23.75734530322129, 23.30634612000017, 22.916316933096677, 22.757559539526923, 22.245174013071896, 24.174840799097414, 24.74862941844852, 24.56921767391848, 24.289724134298165, 24.07574648653906, 23.518673499767885, 23.34425202030813, 23.11338392055712, 22.969268600140055, 22.938108556875065, 22.48684549247718, 21.6693516267507, 20.793084061780267, 19.73885896444133, 19.32686777513228, 19.19626569351074, 19.237194890756307, 19.29820308797334, 19.2350495659022, 19.208343300108933, 19.139318831932776, 19.00818662317149, 18.94439569615624, 21.096230571973237, 22.60173792030748, 22.417454456193592, 22.40320845059135, 22.32204600272331], [9.676643856598194, 9.847481650617286, 10.043550804648438, 10.166008341814504, 10.143021241594694, 10.71454731154684, 10.701263410597573, 10.316013410999329, 10.399496355945251, 10.470758663166592, 12.46099464013383, 15.829070597471862, 16.09320226268285, 16.21586764670053, 16.83684591293184, 17.24848011095549, 17.050833598661686, 16.60675014954871, 16.594997554544037, 16.953262948525538, 17.234033331559942, 17.8138452763701, 14.970791561056648, 12.779613169389975, 12.913859715919704, 12.687167239987954, 11.935938942343606, 11.664778655228757, 12.009298015717398, 12.658254276065982, 13.071114752645505, 13.13353965740741, 12.890575345898174, 12.246861099361968, 12.450268946000625, 12.130182630796762, 11.856603492415836, 12.617507726579523, 12.835122192265796, 12.847069001867414, 12.410850176704011, 11.847679866946777, 11.459370202192916, 11.3926497867258, 11.402612747276692, 11.151470795751631, 10.755240664332398, 11.232234123793962, 11.13830792495192, 10.381517544351077, 10.392850485527545, 10.84104382446312, 10.822423501011516, 10.861508515795208, 10.8023698205688, 10.534697048319329, 10.556025302273316, 10.963726128229071, 10.84978556329225, 10.549825384142544, 10.406300359202229, 10.1544608365235, 9.723025461503555, 9.297784779723, 9.20642177404295, 9.094122518285092, 9.074323492919389, 8.992661129707438, 8.98685349937753, 8.640966382664176, 8.578382455095706, 8.464477457431398, 8.589098889978214, 8.589563476700127, 8.46232071959358, 8.341783239573607, 8.306295932384065, 8.317201630947425, 8.346437457344528, 8.258192814814816, 8.215233024976659, 7.985002201291629, 7.84035290115483, 8.12879821636711, 8.34329173653906, 8.926101855586682, 9.000942865299189, 9.069890404917524, 8.983945509648304, 8.977399959570496, 9.067341279800807, 9.009353247432308, 8.961124941643325, 9.1182725843481, 9.131062558434484, 8.925840187805404, 8.580944824437832, 8.021048527933395, 7.964320526688454, 11.186688236500158, 11.197035692799846, 11.112764444145366, 11.090499916290591, 11.12135461493123, 11.223531943477855, 14.371542063557987, 14.370146248894544, 14.396649602184231, 14.491878214973028, 14.564856880951409, 14.545421781668225, 11.358516183784626, 11.296763058901336, 11.348545916744474, 11.399615504590724, 11.412775923669466, 11.46161608296122, 8.242637292639278, 8.285557998132585, 8.261473030189853, 8.384974775054465, 8.441031393401158, 8.464182737861812, 8.458844472611268, 8.611513129396203, 8.617211095082476, 8.603611197945845, 8.667856869714214, 8.684715776455025, 10.953443307656396, 10.899955957159376, 10.81431200420168, 10.73062129746343, 10.781211683862434, 10.720712528600638, 10.753515525639331, 10.68182112877373, 10.667420641644268, 10.65358792013956, 10.55802765515095, 10.41348523439347, 8.157394724833374, 8.067137969421104, 8.154414524198568, 8.124990505835669, 8.016470125972612, 8.121372193899782, 8.118013329598506, 8.025124229751533, 8.068952385563863, 8.062957317460318, 8.15371130042017, 8.222656276453732, 8.130772566369053, 8.056519833177715, 8.015408874883287, 8.160824422191098, 8.352037786647992, 8.320128196467476, 8.328855766651106, 8.361503458527855, 8.560730826330532, 8.589956092816314, 8.582581404019502, 8.644948373482729, 8.456794794506692, 8.941692304699659, 9.084335169780331, 9.337518675925926, 9.194799414700697, 9.16761216721133, 9.187857176514749, 9.14664377482104, 9.041018293904322, 9.230417926704016, 9.35472482586368, 9.36466404466231, 9.756559493606051, 9.227000677806958, 9.164743427559912, 9.04506353881562, 9.237929587707924, 9.38406616328382, 9.274110493575282, 9.424327975432863, 9.379608027414282, 9.505779537453371, 9.343734715023226, 9.248265310199224, 9.144841071610369, 9.171622456586624, 9.087131587145969, 9.131071559912854, 9.125497204407244, 9.080487978213506, 9.06873277628568, 9.058478570572673, 9.038375648848428, 8.91237693051665, 9.134864747821352, 9.224696384298165, 9.239304545770455, 9.26502180667148, 9.387673320235526, 9.23930911336368, 9.04304629635543, 9.0042410663684, 9.284969398908109, 9.177883227121605, 9.11599970562126, 9.213447780164955, 9.043239650106104, 9.127054225470095, 9.200754107843135, 9.093814721659257, 9.113321880096482, 9.164724770697168, 9.248356446623095, 9.22652878968254, 8.891783440892702, 8.831104649782135, 9.005941171646436, 9.022511764939308, 9.203001636505345, 9.054785010037348, 9.09942317429194, 9.137231717954426, 9.012276042561467, 9.173060736129267, 9.420702717009029, 9.418613708743775, 9.527705178225848, 9.52722999411248, 9.283130817460318, 9.397799036245331, 9.290812495642705, 9.219703697478993, 9.101636437881917, 9.070121034702767, 9.091711209694989, 8.952932007391846, 8.62249258489998, 8.621312039524978, 11.510658745422251, 11.473257003568747, 11.50870487987993, 11.365625939386868, 11.362794842890212, 11.457547146265822, 11.52121900497977, 11.548559912620604, 11.544330507158415, 11.509919024431994, 11.473231413813032, 11.555703085386194, 20.37565425770308, 20.5136469987784, 20.666205110333024, 20.735474536959234, 20.61817063634736, 20.572505749221914, 20.67023193681917, 20.53370514862875, 20.52570818110929, 20.48390824891068, 20.68355125816994, 20.66163945108039, 9.25911283410364, 9.218622913206476, 9.084241774665422, 8.976003710862123, 9.049339318088636, 9.09011961469032, 10.263760760270776, 10.267376564011457, 10.238989530578896, 10.343308115343278, 10.20055834430439, 10.139486858621227, 10.007353075817656, 9.870724026508212, 9.982495420012448, 10.096353950564124, 10.064218396358545, 9.97500277134103, 9.028235125661377, 9.049941492361114, 9.060238252567691, 8.982595783457828, 8.980023405408382, 8.912738509103642, 9.009428197245567, 9.037222595238095, 9.011872190554, 9.005034774976657, 9.057306086766518, 9.217388409741671, 9.122654161012118, 9.175375856131344, 9.238552981325864, 9.438319345393712, 9.476463554777466, 9.633342751711796, 9.427936472844696, 9.206314336679116, 9.279757646981013, 9.6373789213352, 9.683252143357066, 9.56682806100218, 9.565502120710788, 9.473282168454352, 9.36701957500778, 9.19024989500468, 9.139941848117026, 9.06437449197531, 9.228711616313934, 9.564722425303456, 9.28079368409586, 9.180331332399629, 9.398739674214132, 9.74561395331466, 9.760903396903204, 9.81035987605042, 9.700648995268695, 9.85898477832244, 10.973873169545596, 11.718758840336136, 11.783878034673608, 11.71520130967943, 11.825689237317148, 11.55085909929266, 11.230003132897604, 10.872848224400872, 10.582950759726112, 10.543623301431683, 10.610222289523692, 10.821335778190194, 10.067504987013695, 9.280835870759416, 8.917026369096915, 8.821375260818694, 8.865959722766885, 8.961872208293132, 9.046500804232805, 9.324563421879862, 9.44997454226257, 9.448772377840026, 9.61997468366921, 9.329262409208692, 9.054654638499846, 8.989040419988465, 8.881052814892625, 8.831909617958294, 8.889958437130407, 8.77298589531461, 8.714563138275507, 8.443669353641456, 8.272299080610022, 8.196358664721444, 8.075796369207785, 7.991648018811599, 7.959901745876129, 7.916071160650097, 7.836143285169624, 7.831024828353564, 7.772472398459383, 7.768637087826153, 7.729866478913788, 7.7861132805789, 7.953332962107065, 7.863380127684406, 7.793485415966387, 7.900702795596016, 7.9544466626206045, 7.986549526221601, 8.063533631175433, 7.918142035635301, 7.896508052742115, 7.916190238724199, 7.956197283073985, 7.862945596093993, 7.754810736060535, 7.8336995864456895, 8.0462957316371, 8.0223481013033, 7.953613328509182, 8.008328438141923, 8.030910097340882, 7.950978225091454, 7.815032803688141, 7.864286118808357, 7.874787367802677, 8.013781277544352, 8.045882186056, 7.863254248054777, 7.453693138129606, 7.613188738484283, 7.754168800809212, 7.811773587290586, 7.617359665421724, 7.617957100451291, 7.640142777544351, 7.698984989962652, 7.718136947245566, 7.560230523731716, 7.588781225178961, 7.631336968098353, 7.828867945144725, 7.715690560068473, 7.589959859991971, 7.458220964596951, 7.749747485527544, 7.718433850673716, 7.977523762687392, 8.251004217242452, 8.348463921743742, 8.36715247945845, 10.603058515873018, 10.49624936476813, 10.53020373288204, 10.957164506237037, 11.181615833488951, 11.326392052131965, 11.162456164254593, 11.170731084191916, 10.896438388266416, 10.66706871607532, 10.597582303532525, 10.578387422342791, 8.363951651882976, 8.385039655211907, 8.110852386554622, 7.726636644413321, 7.61261386686897, 7.449229181683784, 7.328811559835046, 7.1975024394646745, 7.166830346560847, 7.166757016028635, 7.097921873638345, 7.093094870992841, 6.934112259850358, 6.945384527388734, 6.908373313766992, 7.081563523489211, 7.134138071106962, 7.258619761982572, 7.578372562311962, 7.590203498455496, 7.683753631560587, 7.902932058356676, 7.918631679660754, 7.916825040227203, 8.249026496430554, 8.23707706722689, 8.425903868036103, 8.341094693821974, 8.229850332477437, 8.191920904040263, 8.261804140367257, 8.370511677637722, 8.548018517818237, 8.716475788437597, 8.89416914785315, 8.90570266665305, 8.714234227513227, 8.773069581914001, 8.653809950980392, 8.702700800887023, 8.822369181683785, 8.85220808940243, 8.680364190308902, 8.406629578074101, 8.448676871163388, 8.290613789215687, 8.293988942343605, 8.416215949891068, 8.446960703092907, 8.527611852510635, 8.596064834967319, 8.665280175536882, 8.829425670946156, 9.030095872979564, 9.071836923124804, 9.150740305910883, 9.234068994553375, 9.259473020308125, 9.568524909119205, 9.683506259414878, 9.890490578275754, 9.873296391631165, 9.918359749533147, 10.08510113554514, 9.731293313822263, 9.63778046739807, 9.562502460239651, 9.421184075598214, 9.434050346093994, 9.608760549564272, 9.35385609483738, 9.139635731248054, 9.038648356442575, 8.93309097230976, 8.845009637877373, 8.833011320961718, 8.873452352253217, 8.814974171179584, 8.82514460882484, 8.72952879791602, 8.69152910480859, 8.449829886399003, 8.470625404706794, 8.505987316673803, 8.441972745038012, 8.40109044761581, 8.212327487472766, 8.239330545112304, 8.28660108204755, 8.17905884982882, 8.170835516918252, 8.215238583926633, 8.071132472904347, 8.098200498422425, 8.026299889900404, 7.977502224634299, 7.873568860663714, 7.820067387326193, 7.930366727746654, 7.964353847416744, 7.925380176198261, 7.994659721686664, 10.817698998988485, 10.722799194366637, 10.77003076641768, 10.739211469109868, 10.6027807394958, 11.25722281154684, 12.097811485060692, 12.068301394489213, 12.05622575342359, 11.872998095938376, 11.80218321646504, 11.684685215530656, 20.60101398236617, 20.659356437286025, 20.67402031761593, 20.74315908667912, 20.68065211437909, 19.960388109702876, 19.045219877139747, 19.042600917133523, 19.126258695144728, 19.149104043261747, 19.18417196700903, 19.315005273460724, 7.858711072844724, 7.735418397214441, 7.572852873474946, 7.618911936507937, 7.706297427404296, 7.834641176520516, 9.268058143090569, 9.301067318627451, 9.190226786414566, 9.628767538359789, 10.056669474789915, 10.05943311170378, 9.883396551198258, 9.871807192577029, 9.972439833177717, 9.980450700669156, 9.985836028483254, 10.000002777504765, 8.77324236647474, 8.857947801782732, 9.142362693588543, 8.901923800070028, 8.524301927326487, 8.379553900071326, 8.203178971444133, 8.233273183707466, 8.199890655462184, 8.195492996094641, 8.17540798184913, 8.167868689526275, 8.117039823918455, 8.029568573120358, 7.828536906006847, 7.843398140445068, 7.853435660908809, 7.881946645064973, 7.932644357677058, 7.858469112200436, 7.884136497043261, 7.967045232726423, 7.980557781502241, 7.929724434610697, 7.945191793028322, 7.935597178198597, 8.005315442317668, 8.038450450669156, 8.091556573822492, 8.25139119195456, 8.640345536664206, 8.816048250365064, 9.0030022910831, 9.006946950124494, 9.19878376851852, 9.31805114441332, 9.281001501191136, 9.376709195533769, 9.267173427562511, 9.26444063878551, 10.375815080778636, 10.510009488406473, 10.167493186663554, 10.004930254590723, 9.925574793012766, 10.306015977746654, 10.15905734714118, 10.054689726657331, 9.958746594846474, 9.754801511904764, 9.761576113834424, 9.821741404371505, 8.61203356162465, 8.359624119358855, 8.28628841293184, 8.30852750054207, 8.450301403983815, 8.22535740865235, 8.12963342297507, 8.062224443510738, 8.220151663243076, 8.144466030189854, 8.008345259492685, 7.951928379396203, 7.959318209038801, 7.973613310301898, 8.015410403428824, 7.723464165421724, 7.387308983893558, 7.419637761904762, 7.476390974789916, 7.545391589321389, 7.346327850606911, 7.453744639187805, 7.858184527884131, 7.9152337586238195, 7.975074556333645, 8.014135917826675, 7.961155347105509, 8.136902256978821, 8.130294776404451, 8.061204840491751, 8.044413782368503, 7.95874607438531, 7.970557780112045, 7.765138152661064, 7.326480060068471, 7.477080004435106, 7.438057630718955, 7.400690613600996, 7.336390555788983, 7.205128465686274, 7.236139224789915, 7.257091599906629, 7.232193581561889, 7.228212109204466, 8.448253799019625, 8.498111540616247, 8.489164505835667, 8.361740992439195, 8.281150492374728, 8.261944139044507, 8.35706088453159, 8.281286532368503, 8.259484376828508, 8.363799808434484, 8.461542918222847, 8.504307169790701, 7.663914146143943, 7.659937111500155, 7.920462342741726, 7.996739425014267, 8.185233309835045, 8.247912749766574, 8.32805308068783, 8.459426127295362, 8.54422082005009, 8.723609052011408, 8.90626507858699, 8.987430356442577, 9.030242867335824, 9.017757202155307, 8.904820799097417, 8.94575441075319, 8.888057753034548, 8.924582257467078, 9.0841829446915, 9.03921129512983, 9.13898471249611, 8.973760860589158, 8.87697691075319, 8.930609512670532, 11.420498042091376, 11.518399467553689, 11.554797422735763, 12.146856690398382, 12.571863828431372, 12.762500637155709, 13.426670417133522, 13.573990587135595, 13.643231810740872, 13.735057066299028, 13.816040064839754, 14.025614312314556, 12.24318728537193, 12.351084174914408, 12.550570120901302, 12.396994352552133, 12.432094507140912, 12.682291082867922, 12.183651530112046, 12.458008990412647, 12.809353933162154, 13.580626603719264, 14.107926244274568, 14.519634852868164, 14.074966445300344, 14.157699889157335, 14.190294680797413, 14.15026275241208, 14.182886222300032, 14.33919070017183, 15.955004448459386, 16.07126114169001, 16.22405053532524, 17.056601125857846, 17.130473820157473, 16.911894873539612, 17.17117657594149, 17.485446466826822, 17.75209626151572, 18.085361921957677, 18.33097086009702, 18.242847960845115, 16.666048733971365, 16.471237929990828, 16.036616048417216, 14.853700563414254, 14.7222728964811, 14.705103990551413, 14.709823612278244, 15.023928807405325, 15.074090438986158, 14.968198507469657, 14.81862674642079, 14.750680354609544, 14.887720605357153, 15.319983222689077, 15.990511952782969, 17.360522942532956, 17.993172595751375, 18.778511125972614, 19.464034648004223, 19.47551188537909, 19.80472240795207, 20.34460415943044, 20.662330626050423, 21.45639485019973, 22.286395104368992, 22.425598364456896, 22.64196110128645, 22.15768934663865, 22.9667820312176, 22.86568716037777, 22.46119131971677, 22.56186062397835, 23.216879538437592, 23.38672394832452, 23.67798696863264, 23.121404187001385, 22.428619206504823, 22.106970409808454, 21.46703552963352, 20.76272660955493, 19.4553717735346, 18.69098987481845, 18.6587398068005, 18.05533679211732, 16.920679998366012, 16.63288821879863, 16.62225197495851, 16.95891433392534, 17.224420468565203, 16.85715279036013, 16.97070326891729, 17.52299714503579, 17.753735016262063, 18.110833166084547, 18.001919090942398, 17.904224865622737, 17.989589829209464, 18.71247707773109, 18.58334750140056, 18.63334528548086, 18.467957370915038, 18.893783800264558, 19.70556103586991, 19.55768670329652, 19.77472773918456, 20.051312591844997, 20.134575900560225, 20.49482588842204, 20.61953108461978, 20.18856924159664, 19.763151963741056, 19.157979040294823, 21.725661442187988, 21.606896205684603, 20.4516202858699, 20.24446394443669, 20.29265736461252, 19.845827129551814, 19.22782467242453, 18.46198476388825, 17.85757984204793, 17.329642425848117, 17.13657793499391, 17.165581605080273, 25.942317956941853, 25.64788698334889, 25.55594287130408, 25.39305978750389, 24.78958859064737, 24.522058158963585, 24.37456278361344, 24.53546607065048, 24.57299914427264, 24.785034802443203, 25.196902452057405, 24.961825138284976, 13.233338261967011, 13.097096780440284, 12.924748471366325, 13.093761694989109, 12.874365647836912, 14.681112276623734, 15.8986224890711, 15.492298420948108, 15.363329916888423, 15.172167479388596, 14.651854632975414, 14.564513356236152, 14.450288370759411, 14.174626687208216, 13.990805362356054, 13.65354911048864, 13.957018040258328, 10.845646824310757, 10.41701473241519, 10.663518048008092, 11.23137295471522, 11.438966104563493, 11.68153449572051, 11.839153341736694, 11.74651332228447, 11.740929177004228, 11.617670836760828, 11.891146699735453, 12.649034460849157, 12.956163524898848, 13.213336958061005, 13.718387220519512, 13.11817558638606, 13.09417720401494, 12.909725822673517, 12.714758175296348, 12.955759830999067, 13.006298075941489, 13.03889239526922, 12.92751179963042, 12.1417095856676, 11.839428661764709, 11.609596457537103, 10.78616734842826, 10.925810169467786, 10.658520194240198, 10.583971203314658, 10.438095450206232, 13.36247079917523, 15.6560078283458, 15.612543738717708, 15.376276225723624, 15.077436394646748, 15.20717959394259, 15.32960260714286, 15.500475662889706, 15.535702170332124, 15.538627843849865, 16.474626230703393, 16.489300171291116, 12.15281772454676, 11.099797306178028, 11.117199271319638, 11.157173637011102, 11.191392011504698, 11.047673333022098, 11.133408622624884, 11.190339236150017, 11.00876335683162, 11.106212132970889, 10.176417317927172, 10.315205677212916, 10.180058833350335, 9.904304952147523, 9.889853287924712, 9.976281854263927, 9.984876499455336, 10.089860213280732, 10.910245540927484, 10.9137002692188, 10.966113900560226, 10.911594675466269, 10.926832996109557, 10.96778083005953, 11.146093195566191, 11.108305808123248, 11.243945424680984, 11.385710140756302, 11.479517588529024, 11.198892007936507, 9.95609957244009, 9.684229851073765, 9.38234836484594, 9.272103327777726, 9.127868883831312, 9.325558145113602, 9.403303287892935, 9.31511230524432, 9.022710372082166, 8.911872534418768, 8.639502713507627, 8.743067694401002, 8.38639122742634, 8.720940730777963, 8.594769398215583, 8.714727155139926, 8.759836536803611, 8.265588024354837, 7.816675673280424, 7.793966019140989, 7.776064782679738, 7.867882954481792, 8.013022515795207, 8.070520382275133, 8.486900054232805, 8.164619297385622, 8.494836977046374, 8.679372005668395, 8.708949487005912, 8.72427402692188, 8.933272514628074, 9.072780308059713, 9.206716076797385, 9.015863994236758, 8.781186385993106, 9.061111232492998, 9.191279000364206, 9.369983865962512, 9.2609668173047, 9.044573190631809, 8.986040973191596, 9.165221728446936, 9.138107114534703, 9.112703283273031, 9.06184918479614, 9.226699669589042, 9.28744881240274, 9.145082722051448, 9.516526881740882, 9.496783564659196, 9.530670460473075, 9.497824685185185, 9.446725285869904, 9.32413190087146, 9.531881640756302, 9.60805823373794, 9.785201106665545, 9.720994475723623, 9.74853911048864, 9.701013275149789, 11.57415526738964, 11.434619942987483, 11.402859896825396, 11.547995420712729, 11.757503281398488, 11.987887656071042, 12.866966380860957, 12.690413669998836, 12.705665579607595, 12.734508588468724, 13.073145366394336, 13.222633344070962, 11.673565027466545, 11.704237153751688, 13.487478025177028, 14.230837296374103, 15.078893103096796, 15.13415192059962, 14.620309777155306, 15.244962203081236, 15.926234409975102, 17.070560312169313, 17.805581408730163, 18.661394071300137, 19.082783107843134, 19.807705900741365, 18.873550785792094, 18.129958555322126, 17.951323858854654, 18.205005082710866, 18.18413437457205, 18.423324583878, 18.350098774339923, 18.171235771708684, 17.687549009648304, 17.111821006251947, 16.887523226346094, 17.243655762743817, 18.17990712340492, 19.142280986349107, 19.89429776672892, 20.993857074074075, 22.475885821487584, 23.412601116144067, 24.112020832321814, 24.50746431676004, 25.745186566068263, 26.401396230314347, 26.960371311313416, 26.170807955649607, 25.19438869103123, 24.63943942841581, 24.0837740314348, 23.172986024509804, 23.741584133040256, 22.877322818783068, 21.98156891370993, 21.188728225412387, 23.04201814096445, 22.32604615170597, 21.256919798153334, 21.128801099517588, 20.88816866216299, 20.86463912838469, 21.28891789262372, 21.528462631652665, 20.003112419156555, 19.825574784702766, 20.83495895222533, 19.771134960514267, 18.549752862122627, 18.81623280205416, 19.49764761181139, 19.66585489855731, 19.399003579217243, 19.533284918845315, 19.02119809429468, 18.518861404606284, 18.19315171109555, 18.403130767040143, 17.564243828742608, 17.926995888903157, 18.12914599922191, 18.27677904271709, 19.14967618391042, 20.42018977870299, 20.67543939510582, 20.69152971919676, 20.736837909041395, 21.21093944506692, 21.42859797385621, 21.048159288944664, 21.306195701195666, 21.144204601839544, 19.99146425241208, 18.928196208916894, 17.92165975326797, 16.53176513875274, 16.42162708448361, 16.83736432352941, 17.21339690802988, 17.139914175848116, 17.558403166277625, 17.959038697401184, 17.258259257391845, 16.978673602629943, 17.190501863942707, 17.390142235138498, 17.586864747727983, 17.652619179660753, 17.35535269117647, 17.05324282570806, 17.23428562184874, 17.419879239729227, 20.55367209430439, 21.36390136263877, 22.497606497691677, 23.116446535558666, 23.72033075342359, 23.413513822440088, 28.662320798268755, 28.609134819016493, 28.559687698790725, 28.068987131341423, 27.30363025520153, 25.60629221112812, 34.12458434593838, 32.850937697922426, 32.949336301653446, 32.36311326562792, 31.807324268440716, 31.704518257549054, 26.141010531434794, 26.276442748443827, 26.35489505975724, 26.531288600529106, 26.698368784158117, 26.87617897144212, 14.96726816215375, 14.540952880131506, 13.353419927404294, 13.033578581543727, 12.65845348311547, 12.652190655539991, 13.910003850217862, 13.62473988974479, 13.34068875552443, 13.05531325210084, 12.701704440941782, 12.41473027404295, 13.717190498577883, 15.580338943510736, 15.511961121381884, 15.61386963250856, 15.56458857010582, 15.144248765873016, 14.232137176643072, 14.079233225123046, 14.572106767507004, 14.55766494125428, 14.440090164565827, 14.327221285838132, 12.212491353120855, 10.590103292950513, 10.81786218557423, 10.972768812947402, 11.05476713585434, 11.087965013513276, 11.033740215219424, 10.899022410787564, 10.35660166837846, 10.34859746872082, 10.62336654668534, 10.605224696700905, 10.864048291938998, 10.81230639596172, 10.83650359897292, 10.878326733417628, 10.786807028272516, 10.603592726434291, 11.470416281045752, 11.580703228446934, 11.5788446826953, 11.675675158417633, 11.356655570796375, 11.363166015795208, 12.794618152116405, 13.010190354497356, 12.47187215989729, 12.297353835511984, 12.492781243930906, 12.641597703159045, 12.894029848648072, 12.8670333286246, 12.872449158885775, 12.875315579131655, 14.068126839558046, 14.200731828898226, 14.097997754046062, 14.634474125978624, 14.746601815200618, 14.605276708294433, 14.571392684640522, 14.488591540771866, 13.26170062037037, 13.168558669293366, 13.120415853708243, 13.221478321495551, 12.53912562612823, 12.549543280656708, 12.045091459850608, 13.397928378234262, 13.205124661686895, 13.259798171569283, 13.258241251945222, 13.169648504979769, 13.139823587379398, 13.072512880796763, 13.014025412542797, 12.71946558812766, 12.137519371693122, 11.88851632563025, 9.620810424502672, 8.700126050127741, 9.008142349427455, 9.03074009554933, 8.815462217709308, 8.685266261126673, 8.810501680738408, 8.691781170078587, 8.74604124712107, 8.862304326719578, 8.950788912464986, 8.972110042639278, 9.267710244242142, 9.465878342981638, 9.205546649237473, 9.182483529333958, 9.253891439542484, 9.287770716931218, 9.53619290024899, 9.734260355197634, 9.536034502256458, 9.450843363678803, 9.5903317316371, 9.852224970899472, 9.534677891378774, 9.417674887410522, 9.215035421646435, 9.313851863134143, 9.510271028791903, 9.53298582640834, 9.36886150280112, 9.23042963741052, 9.515868539562886, 9.593020755874248, 9.551804704170555, 9.324986186118892, 10.520754181995024, 10.478363886087768, 10.488298706832271, 10.476188591658886, 10.413235839558045, 10.729963212107064, 11.925628845238096, 13.953528507547466, 13.665070563369518, 14.11889282684928, 14.17687835216309, 14.375106685345346, 13.738000877528789, 13.93855664028945, 14.13310105975724, 14.62036076696234, 14.784726354566084, 14.735893440554005, 13.169360814425769, 15.368898369134453, 16.271960237005917, 16.00121551562403, 15.97353352044818, 15.901297152771058, 14.98171753320884, 14.939270786258946, 14.89569729761905, 14.811752399377404, 15.190244287659509, 14.864019170114098, 16.860326625816995, 13.65757128828198, 13.255835937777729, 13.416462455259882, 13.589010589635851, 13.817468045754898, 15.121934346638657, 15.958978042009672, 18.914417015243952, 19.111361064030294, 19.17975750396825, 19.3301757183026, 17.91971046413402, 17.951167842514785, 18.6976984896391, 19.16306778887333, 19.25731590709617, 19.19683929786813, 18.294393141067538, 17.33063048140367, 15.285142568082788, 15.836557414728595, 15.327222420127535, 15.68688085230156, 15.28586642611137, 15.114092700742424, 17.674430942614645, 17.607878275054464, 18.082763648459384, 18.264052959803927, 18.470448201447244, 19.08068217180205, 20.86909986671335, 20.48085045513345, 20.780254690460648, 20.60070115810769, 20.457183226657328, 20.141848875431247, 18.072703326953, 17.8518651267507, 17.422133219319555, 17.465181797930285, 17.236442226190476, 16.1863030402272, 14.995585936118893, 14.729504406940553, 14.711244309912852, 15.061670865546215, 15.73443579466231, 15.597393183551198, 15.65515845678309, 15.82535246026901, 15.915247149415787, 15.942289544030112, 16.32454467217878, 17.53712435745409, 19.03191692670401, 20.131587495327643, 20.0570216586862, 19.881160950124496, 19.370156642468096, 19.28982084056956, 21.157269984014167, 21.558049760192965, 21.97695056659924, 22.132916808590103, 21.824613459173676, 20.15505158162153, 18.81302093720821, 18.54362525978512, 19.459302660942527, 19.365838689993776, 19.165665412075946, 18.60851144790825, 18.19432559494761, 17.775506642623714, 17.54075140402272, 17.46663383431188, 17.38770545199191, 18.69567262029256, 20.86223704901961, 23.637487246887645, 22.895975394233304, 24.13791256396087, 24.13408178581545, 23.75605817351385, 24.307189025599133, 24.48855236196701, 25.043965634920635, 26.32329831473701, 26.72670912939621, 25.270777928571427, 24.2986863802508, 21.765219902965832, 21.966329192110173, 20.83532422369334, 21.21007100373483, 20.83490930897915, 20.98960609407096, 21.673660483971364, 21.76553018160597, 21.2049148618892, 21.304530039282945, 20.811450221206822, 20.23858371615832, 21.136183749292616, 20.96165281274431, 20.92170274027389, 20.76673291705571, 20.48198697472313, 21.0802266434861, 20.300612348039213, 19.84159255081637, 19.19808412011555, 21.877057690398377, 21.939681446311862, 22.23128721277493, 20.918859172644343, 21.287580479261717, 21.02522687970744, 23.933087579898075, 23.16710263300929, 22.941175522408965, 22.657521553299095, 23.123115370940997, 22.681256132942654, 31.179726093495493, 30.482005259827865, 30.20881845043997, 29.8317028503814, 29.028157021268893, 28.86810530443104, 25.30184642785539, 24.64916754846969, 24.37535569526339, 24.371105714792535, 23.279173171568623, 23.225771804944447, 11.264078475101153, 11.477260074618735, 11.567621767740428, 11.552887714052288, 11.473889545518208, 11.632139289729356, 13.152300372782449, 13.003864098039218, 12.815330791589515, 12.732080718720823, 12.805280911920324, 12.761031572727209, 12.843112738242429, 13.03532789674759, 12.961448420712731, 13.232550207205104, 13.442872260037351, 13.484667410959617, 12.001992107492672, 12.066062978829494, 12.017864649452743, 11.866975516686788, 11.8430027570028, 11.746669937363832, 11.878214017299266, 11.741725516106442, 11.277215631711018, 11.116008757314036, 10.774111112090855, 10.414015110631182, 10.319239257936507, 10.54602033147713, 10.816990822235526, 10.98964565592904, 10.986277233271087, 11.097257809212572, 10.893592686303718, 10.235602472533458, 10.630607269374416, 10.818004693836244, 11.051890806596743, 11.151669776057556, 11.501114078792034, 11.060415949337976, 11.067943998046347, 11.10357425770308, 11.098182015594857, 11.109711080291005, 11.41678157438531, 11.676044153257818, 15.08310582388578, 14.954133234228532, 14.938708639198827, 14.882638065970276, 15.266511953703704, 15.678727982955555, 16.315887042728956, 16.152852690398383, 16.952339968270454, 17.01188568923125, 16.66575339807034, 15.736496299719889, 12.784062411585785, 12.821949695230447, 12.71697047852474, 12.523222348117026, 12.456947909352632, 11.44107191557734, 13.199745353903236, 13.467148834795069, 12.544645487311872, 12.29885018549642, 12.478336816760038, 12.149318809990664, 14.16227742141301, 14.072851630641145, 14.036544213896669, 14.286535229769688, 14.096721776161946, 13.600985752169573, 12.5075685, 12.25657436834734, 12.179447239554486, 12.29075250280112, 12.008614464830377, 12.29758470546944, 10.49916924291939, 10.371244310768754, 10.34690989939309, 9.926751081465271, 9.62080080960162, 8.927308753034547, 8.81922056302521, 8.958043940009336, 9.088891422268908, 8.89403834360411, 8.869199243775288, 8.48961509662439, 8.424301722066605, 8.306319077653283, 8.125597222922503, 8.06413600393324, 8.056295991051977, 8.253034445447533, 8.921816394802365, 8.790334092359165, 8.955520428649239, 8.981605815349104, 9.008429121683395, 9.20444450773586, 9.615705281969731, 9.897374263217786, 10.102348662533071, 10.501790958019503, 10.45376338170972, 9.855453128036103, 10.03782232429194, 10.033942663888023, 9.973058338571995, 10.01654544379564, 10.06046475463664, 9.748090805391511, 9.455646846755778, 9.372185100082994, 9.422315581822778, 9.069169121304078, 9.480198436507935, 9.184608367569249, 9.18087559477124, 9.226466184484904, 9.045128484593835, 9.116594387969574, 9.163751057111734, 9.12247486967009, 9.196893299953311, 9.251083111733584, 9.235497231014628, 9.290471828616196, 9.347871408963586, 9.227058965602632, 9.118823918222844, 9.234932441332088, 9.736947159741677, 9.825051754636142, 9.822829313180828, 9.740871248210397, 10.01800011679116, 10.076323905528971, 9.987780529333955, 9.97290189599027, 11.753695846780658, 11.810395350144631, 11.816123204507113, 11.749806927243492, 11.58746348521631, 11.638707305633366, 12.502041246940816, 12.593780162608946, 12.55292299509804, 12.553056341546066, 12.708614660237709, 12.803863325429246, 11.36139205929038, 11.555156979691876, 11.885677541783382, 11.835598062313906, 11.68121929309511, 11.70488874068115, 11.059410039523748, 11.20271025427949, 11.3267349223947, 11.715834135831, 11.864384600918148, 12.805465427598318, 12.645559074074075, 13.049002049063054, 13.304644088857764, 14.204135123375108, 14.491967131107996, 14.960963352672737, 15.752277816243264, 16.29857561749144, 16.50238605361033, 16.74780306178027, 17.180480841736696, 16.93492989600387, 17.110879535227337, 17.496620069561157, 18.06011627699969, 17.746867218253968, 18.13589437700164, 18.182058655073146, 17.6246356538282, 17.333532464052286, 17.79957951641768, 18.323137321973235, 18.26127987353273, 18.871643697790237, 18.64662261258106, 23.7514349624183, 26.1260174011827, 31.35757346981015, 31.176716891456586, 30.711665474556494, 30.6725085699502, 30.765930043962037, 30.43286063177885, 30.27807783053221, 30.93539588481495, 30.75769055260994, 31.29942476659599, 25.07281824937753, 22.84260670323685, 17.90839184274821, 18.41159675640303, 18.822761826719574, 19.01845021389667, 18.79971087457205, 18.91028711463715, 18.955366630329905, 19.389853188997822, 19.33146419943784, 19.305198831388108, 19.501849291549952, 20.31016379573348, 20.81217176131341, 20.95929821120644, 21.38415853050109, 21.983752527528143, 22.41415186000557, 22.80104420867441, 23.10130856222961, 22.48625010529232, 22.62938276201889, 23.131019247510118, 23.70864768923125, 23.406169654995328, 23.54494463225892, 24.045076518518524, 23.965335754046063, 23.73651675427949, 23.741201501789607, 23.75097173451603, 23.538362886399, 23.18323918806412, 23.12611723593229, 23.363616326797388, 23.80582013927793, 25.01326069770336, 25.53189599315282, 25.820284969032063, 26.515863794351077, 26.78253308852255, 27.65043935309096, 28.26315186974789, 28.871123791861194, 29.47983075147837, 29.446786433533045, 28.52791590118269, 27.24613016013072, 26.019468274976653, 24.963989703703703, 23.874876958994708, 22.929640057515407, 25.44876961749144, 24.09068687099284, 22.65415070417056, 22.52960660169624, 22.58155528921569, 22.763066146747587, 25.78138628610333, 25.52549703773732, 25.49000710395269, 25.416234495564893, 25.001622135932152, 24.985336430750078, 33.98568129248366, 34.084091779489576, 34.23183926844072, 33.36010691845627, 32.32079772331154, 30.58445924836601, 28.30355109648304, 28.17019181512605, 27.89515177956738, 27.469825266106444, 27.365635058590104, 26.621319101449075, 14.328576680283224, 13.863012589169, 13.330360078431372, 13.08156747307812, 12.934658021864305, 12.46725690051582, 13.415243637254902, 13.118356782300443, 12.58411781170246, 12.302983363409735, 12.145488623171492, 12.161613806956115, 11.920943684938791, 11.817680613600997, 14.862756016184251, 14.801476535247431, 14.76262298887333, 14.87030498277343, 13.610300174557162, 13.636885126206035, 13.589068829676314, 13.561434374260816, 13.717891111596137, 13.856849911316663, 14.103547057734204, 13.47489979248366, 11.12177671879863, 11.139809215841892, 10.997288125816995, 10.79549991293184, 10.845787053532524, 10.94400385418612, 11.337266985118005, 12.249386821817616, 12.305957923275889, 12.01511952868429, 12.38159285418612, 12.337607678692686, 12.338018474167445, 12.214101489742196, 13.111730808745722, 14.291415909586055, 14.880060001011516, 15.326887961406785, 15.57098836686897, 15.564798717631495, 15.719619165421726, 16.214420078987064, 16.14628063530968, 16.254179835885466, 16.40664954367284, 16.901332726336086, 16.300269418300655, 15.35880545339182, 15.064655321117336, 14.833492559835044, 14.32124088958593, 13.94710439910605, 18.198002230314348, 18.37884713593215, 18.07793911061315, 17.79771484508248, 17.944401472171517, 21.539197951914097, 21.447767337690635, 21.33438635620915, 20.71813957874261, 20.138576046996576, 19.77352466565515, 20.04630259127759, 18.551744006761595, 18.04204480912699, 17.85217063390134, 17.60288739961744, 17.45320934636752, 13.533728951758484, 16.452572108844926, 16.89467556800498, 17.031785625038903, 16.755784175614693, 17.068769739035435, 15.902124644102084, 14.337862284158108, 14.624824101410956, 14.43180826984127, 14.26840471165656, 14.01047397388409, 13.979786472066603, 13.587836352941176, 13.513537754483735, 13.27465354749977, 13.31077382280645, 13.028047324074077, 13.021261725129037, 12.67510845588235, 13.053763341114225, 13.150937274431996, 13.105514683658836, 13.348803807967633, 13.269882093711097, 10.472432747354498, 10.385836166044196, 10.28929784500467, 10.232766437530884, 10.336716187363834, 10.533354480859009, 9.306634297074384, 9.472451030890134, 9.335478584033613, 9.281449785548292, 9.059393303999377, 9.424488634765016, 9.431461425925926, 9.575873280034235, 9.681937760356368, 9.466897828746502, 9.34035016923436, 9.070765688920012, 9.763492319249922, 9.59781055018674, 9.525492753812635, 9.4567484420006, 9.31568653400249, 9.039243936741364, 11.808413578553033, 12.417118196788444, 12.530241484282612, 12.736331545129165, 12.940229765328354, 13.125608057578589, 14.170655091892314, 14.19368953890445, 14.319175196457104, 14.843526530189852, 15.090130165410054, 15.430459259947868, 14.073161005171698, 13.764331555711172, 14.390580435253268, 14.492156230625584, 14.25204627388733, 14.278523893745652, 12.62972565585123, 12.767008609866172, 12.801114676081546, 12.4752812603635, 12.349780995253658, 12.255980913165269, 10.840558579598506, 10.435908479655245, 12.366184501633986, 12.280593714830376, 12.320985190967892, 12.40123971799202, 12.365369814170954, 12.384739013772178, 13.42512965490433, 13.590344224011826, 13.650565213253453, 13.513509626439465, 13.657214261360105, 13.730313106442576, 12.1950033908393, 12.251595288048552, 12.42908050449284, 12.618114370358056, 12.982498694444445, 13.030586797634802, 12.15276712074256, 12.087857749660238, 12.313691442732647, 12.56586711056645, 12.575339270223186, 12.628782352210552, 12.299865645541225, 12.493803496874028, 12.904944232415188, 13.059652575941486, 13.196278057889824, 13.382918904061626, 13.594361579715873, 13.965967429738564, 14.72712312247121, 16.02821399146439, 16.041671142779336, 16.195013646097895, 16.176225073731093, 16.01858707228447, 15.541815260754968, 15.688801007023605, 15.307423848535995, 15.345834859632744, 15.595826269606274, 15.510354053765951, 14.438201582077877, 13.627273569450084, 14.273535346638656, 14.406796544895736, 14.517781826871952, 14.842781918451992, 15.0371410842816, 14.901281822829132, 15.083955914560642, 15.370229472295492, 15.776290434192184, 16.553906789717356, 17.294288813839557, 17.44065589470416, 16.927212449326973, 17.900245400018278, 19.103608836169663, 19.96919320086368, 20.28252659498793, 20.811765786968348, 21.208425271756177, 21.23128221405259, 21.03317744547197, 20.5806425753811, 20.27808190720765, 20.403616799326933, 21.33619371239236, 20.36089475901328, 19.1246083285418, 19.38894762397552, 18.66872111678733, 17.638853862019616, 17.311440266376376, 17.203069591153863, 18.182320475192828, 18.58022663438158, 18.1966788828172, 18.601671752567693, 19.058490268362902, 20.072012636194327, 21.042424085119706, 21.29144136469032, 22.856642677559915, 24.36556236079988, 25.400963802209777, 26.045009813530363, 25.76426218696442, 25.923982337145976, 26.110954295430023, 25.70171309739924, 24.52319741369826, 23.62858941870268, 22.7898653208061, 21.61664617513681, 20.39895716573296, 19.85372350186741, 19.137902438842204, 18.24756803026766, 17.246020703192116, 16.57221576231997, 16.73343113048553, 16.81425487682851, 16.839859384298165, 17.01823518899782, 16.837873049045125, 16.417782336212262, 16.4803313677949, 16.255182333562868, 16.012738334293232, 32.7052095938356, 55.32033712312325, 59.72902175312793, 60.1342973876206, 59.85819103497413, 59.771879070130886, 59.28149672161454, 64.42601212278755, 64.26337680234788, 64.06911428213508, 63.96991981201369, 64.5253632050641, 47.075668203937134, 39.02033908647292, 36.47636608029878, 35.82420892187986, 37.32606746693121, 38.37495680031164, 38.187311934206924, 32.86973140363045, 32.918041062713975, 32.92707254933085, 32.885842491146, 32.108064502468494, 28.7408595698095, 16.0202503505291, 14.979790565981949, 14.526104376361657, 12.805261802676627, 11.686980090879512, 11.843676849906627, 13.154072188044667, 13.535645557111735, 13.617131870915031, 13.498292419234362, 13.274090407874262, 13.22772535496421, 13.236474109477124, 13.325745893415426, 13.490070683239962, 13.650530098583875, 16.120188868892004, 16.355655513791053, 15.105811830143168, 14.843758576953002, 14.462540078965011, 14.20802175614107], [27.90445220338793, 27.872722305477748, 27.978882358305466, 27.94407395160286, 27.97107645992842, 28.006709414799253, 28.159087868036103, 28.038560551487446, 27.78249565143817, 21.19899869766833, 20.0651706556178, 19.83890080603693, 19.65325656959617, 19.630441632897607, 19.73968066370604, 19.66130798373275, 19.646029817224942, 19.68594556567071, 19.584722587846247, 19.594648051276064, 19.363020941565512, 19.74585515779645, 19.95920906061313, 20.080275818773345, 20.221121336514425, 20.382078465919705, 20.377461169701217, 20.529235378530583, 20.53549734508248, 20.58542348817305, 20.756867469376363, 20.895231961795822, 20.692448896669777, 21.167753048622785, 21.04677915639589, 21.04255645728291, 21.328507258792406, 21.3680614614846, 21.40500593983233, 21.429450145969504, 21.366060210910117, 21.345366804990142, 21.29949357415188, 21.27220210029567, 20.85484882220666, 20.93505480555556, 20.873616915148094, 20.91403171380071, 20.79342979652972, 20.959363200259368, 20.920971966854054, 21.093339200202305, 21.289538132664173, 21.422739025832552, 21.659732838313104, 21.780608272642397, 21.66876562426081, 22.060283913087464, 22.229515042557576, 22.310376401956244, 22.292334307734205, 22.179492468292555, 22.323170448101465, 22.124118998132587, 22.02093885142909, 22.21706400357921, 22.45288796444133, 22.623759368502952, 22.517430276610643, 22.96999226120448, 23.031288664595653, 23.277840887955183, 23.571733464207902, 24.00737828413737, 24.256969506613757, 24.546726831812837, 24.820333259181453, 25.089920861763005, 25.12724259744529, 25.319252723622785, 25.326701900949264, 25.64368814526922, 25.69795309204145, 25.58149203174603, 25.61305773517289, 25.7798039204015, 25.616281753887204, 25.73293663040772, 26.0600216101774, 25.778298915893767, 25.60681906925252, 25.458305260270777, 25.06047655851229, 25.39911978034028, 25.424204319172112, 25.539451016394988, 25.368895594615623, 27.073417784158107, 27.964489019841277, 27.97375646584189, 27.543310345938377, 27.510371684075768, 27.642638191954564, 27.80014997346717, 27.66357436645723, 28.01075455552287, 28.138723654450665, 28.220180457357475, 28.43390337093449, 25.964675738095234, 26.871575653361344, 28.36317962558357, 28.390385538449927, 28.275497927793342, 28.22083167678183, 27.78312382692124, 27.3019520786648, 28.65384268389421, 30.65822455376595, 34.14302747114652, 34.080683858232184, 33.95225713261361, 32.25183969345908, 30.85201090660079, 30.76980302513228, 31.29462768432929, 31.21749201867414, 31.22562433613445, 30.889421759025836, 29.44475556364768, 26.97067291440106, 24.37128208325553, 24.55160606652661, 24.35685783571753, 24.289341192970085, 24.660573697401187, 24.220714360876386, 23.263373240585125, 22.25926533149835, 21.124151457127297, 19.937778120525984, 19.35301655547775, 18.593312639344077, 17.336578565515094, 16.214823097416744, 15.440501992530344, 14.725336464528874, 13.648431735916589, 13.103931415810768, 13.288256839898466, 13.572799745331466, 13.935411992219109, 14.517565752703211, 15.318846089402427, 15.167602963507624, 15.342747710208853, 15.39411792421413, 15.53118042779334, 15.18936777544351, 14.981119937052595, 14.863506294662308, 14.5406867640056, 14.328495549408654, 14.14104354302832, 12.94909684072518, 12.734671054933084, 12.704475189143729, 12.508123750588766, 12.399662184282604, 12.21091602412076, 12.243847394802366, 12.322328012838469, 12.441048360021783, 12.398714279256144, 12.4749095148615, 12.36060787122627, 12.023193687830688, 12.160502025633503, 12.019461234827263, 11.923135462807345, 11.76491172782706, 11.781114390828948, 11.974020397602198, 11.968116848194834, 12.08509860243444, 12.155763880718952, 12.289344943657278, 12.446940370603798, 12.324692479761904, 12.76182192724868, 12.96868707142857, 13.049814542604915, 13.44889263671024, 13.592995873171493, 13.517953839013384, 13.330922579209462, 13.225453442982936, 13.25924617623716, 12.983975361344536, 12.8005611826953, 12.473510957049484, 12.672755423280424, 12.496562072673514, 12.368375738344229, 12.045464881497043, 11.742362657018363, 11.645068466386556, 11.631120819483352, 11.469183396280734, 11.23788988821215, 11.243203224712108, 11.19887517597846, 10.729260011909362, 11.798996908263309, 11.58877234949143, 11.547367321739808, 11.543590561661611, 11.424221063725492, 11.299092355742298, 11.212225238173046, 11.084258192314836, 11.118475826530892, 11.18316997743542, 11.168623280734517, 11.29384720954398, 10.299519408885777, 10.278524967709306, 10.18756786423515, 10.151153226968567, 10.373746644679184, 10.25426021047308, 10.261895774743229, 10.434087518240354, 10.5229950961718, 10.658434024298431, 10.741760661064427, 10.40554434955456, 10.654641104333315, 10.692519317046637, 10.6707193680361, 10.681015962807349, 10.493184457205103, 10.496856317691808, 10.56064688507625, 10.383202985994398, 10.29986713951136, 10.030275813886302, 9.92885887507847, 9.552224914951628, 9.95290893417367, 9.9263332249148, 10.136907283691254, 10.10303711640212, 10.06330344886011, 10.110957290771864, 9.945299160023083, 9.863870604964209, 9.884360706908785, 9.822255241129785, 9.77250272024458, 9.412295020930594, 9.818884610177404, 9.644085168268882, 9.600415912698413, 9.491571269296609, 9.425310514161222, 9.422591005213198, 9.45573558636788, 9.50751188537245, 9.531118336445688, 9.695098137254902, 9.69891462605042, 9.42170194640849, 9.452138481465273, 9.316508287659508, 9.31451019615624, 9.398907776766263, 9.43718955150625, 9.295217220121383, 9.245959295518208, 9.068326628598662, 8.967028760893246, 8.868032498132587, 8.951680745642703, 8.601921242872058, 16.142427395969502, 16.564925110433535, 16.388253723700593, 16.17669191020853, 15.925190885854342, 15.872361834111423, 15.740784034313728, 15.525050667211328, 15.383080550385811, 15.292139966110986, 15.025736927482106, 14.721187214386129, 7.125838418300654, 7.193478422891379, 7.21282463313103, 7.202514377684407, 7.228335348088517, 7.063057208683473, 6.986113057889822, 6.9384644115371295, 6.945030709694988, 6.959745739106753, 7.00607784842826, 7.105835308994493, 7.063864952899461, 6.818716480317619, 6.67071457850918, 6.668307927093059, 6.616859876595083, 6.609569963818861, 6.557420083800188, 6.73334911258948, 6.726145521630876, 6.619513671490819, 6.598180856676003, 6.08176347021199, 6.370118389718851, 6.2671429715803, 6.264773657718643, 6.333799338546529, 6.4445885708839095, 6.467861055866791, 6.4977288799408655, 6.449387859007676, 6.534007198957361, 6.460536065555635, 6.51355203540305, 6.538994214509425, 6.545272552209773, 6.596867647447867, 6.426833980314347, 6.569306119981326, 6.539310838827304, 6.5565704221911, 6.55277484879902, 6.533611408520724, 6.32842460709812, 6.318408106760312, 6.30372018199502, 6.457332246031745, 6.545699727591035, 6.7321703343448505, 6.914423673358232, 6.80035646739807, 6.776033631107999, 6.845188643323996, 6.855464087379396, 6.839993273264861, 6.946522215686274, 7.057075314503579, 7.240916844218813, 7.204173827820675, 7.290053784235916, 7.222764001867413, 7.2188143117802674, 7.315240713507625, 7.407224287581701, 7.461113192032369, 7.478080950870813, 7.604790045334709, 7.873394172917968, 7.881498380174293, 7.790534227513228, 7.80140721435754, 7.738608587238704, 7.782799022408963, 7.854652434562714, 7.921993257236228, 7.968361156629319, 8.025016169545598, 8.030039505524446, 7.828197958294428, 7.768919253112355, 7.788783541861191, 7.782938606753812, 7.531276938498554, 7.799472004435106, 7.756503023731715, 7.829113267584812, 7.844936471521942, 7.92357586196701, 7.867989981792718, 7.847705195144725, 7.853903197323374, 7.875229068222856, 8.077217390989729, 8.044082889822596, 7.777692301956765, 8.140963813414256, 8.03243707928727, 7.837432477124183, 7.808039377029247, 7.931642889744787, 7.925786291607664, 7.950621336134453, 7.973155552598818, 7.884839197167755, 7.86080970689387, 7.818795151027079, 7.739885747743542, 7.652352528244631, 7.687018802521008, 8.587513792328043, 8.51526367142664, 8.245513320799619, 8.39965668635232, 8.416279117024589, 8.328933283795003, 8.489920506224713, 8.380436437597261, 8.512329558745721, 8.57219183827995, 8.644068547930283, 8.718506348039215, 7.9354531308745715, 8.042126801898537, 8.190527169000935, 8.140083826719577, 8.148879423591659, 8.223265957983193, 8.205833641456582, 8.3194331870526, 8.328613433699687, 7.960266989616856, 8.191117800653595, 8.167996841892313, 8.109521624494242, 8.022656013483827, 7.936750277456095, 7.958805172595706, 8.002194041238718, 7.957600507238175, 7.951778833955805, 7.791157424758793, 7.818554888422036, 7.801027288515406, 7.778274802054155, 7.801036054232805, 7.704112715686276, 7.852168265788079, 8.077145521805965, 8.072877904295051, 8.045800501945221, 7.979573079676315, 7.971522104717054, 8.019444617258014, 7.985599656406277, 8.230835618944395, 8.28399610473078, 8.221946737784004, 8.36394283488951, 8.286988487394959, 8.045051057267353, 7.947119300778484, 7.923001729245126, 7.937981057734204, 8.030863909634688, 7.978039442575085, 8.009378734827264, 7.59337561631134, 7.861017587379397, 7.868396139589169, 7.93611831932773, 8.027081918145038, 8.167263976968565, 8.243396115512503, 8.286757596293704, 8.283601648381575, 8.482441591892313, 8.67838923093682, 8.738457016586267, 8.636417095004669, 9.082476845818425, 9.432479279723, 9.690889625505756, 9.826804699212834, 9.815252495409275, 9.815964274509804, 9.81747705010893, 10.001678625816991, 10.269559043495176, 10.614822969498912, 10.944940016028635, 10.886218926392775, 11.53571497520944, 11.662161727435418, 11.7581865375817, 12.024473223389355, 12.381301290771866, 13.017295835855265, 13.55288170751634, 13.743226208950905, 13.698851885076252, 13.71909577334267, 13.807991568705258, 13.468051281939571, 14.652700139978212, 14.812214565515095, 14.6765339921413, 14.749052565515097, 14.674014236850295, 14.021746211934596, 13.559254310272072, 13.070434420234214, 12.559176243075006, 12.0140408105055, 11.70183555590311, 10.613655573685028, 9.96818186676717, 9.38095707640834, 9.071358740662932, 8.689467807967631, 8.397532602240895, 8.385284696545284, 8.319080263149704, 8.32015198934018, 8.271720623638345, 8.283032320339247, 8.252331686585746, 8.002362578953989, 8.092971313966702, 7.955926376906317, 7.693800206660441, 7.681111123106003, 7.74488759500467, 7.661435091503269, 7.676409532475492, 7.619549090734922, 7.671790125194523, 7.688079070572674, 7.612616431513258, 7.399993276361656, 7.833059956582633, 7.923335543767525, 8.171440059056955, 8.118785867537497, 8.031391078742608, 8.17777769677871, 8.198335616168691, 8.284043266442973, 8.363476052131963, 8.363550672253346, 8.368057887877372, 7.963891563414254, 8.249243648749223, 8.236150858465608, 8.276475331101516, 8.283244694833488, 8.250807416717905, 8.14087525287893, 8.111295370759414, 7.991069288593215, 7.895593068394024, 7.852817086912543, 7.808961026844071, 7.611365836601306, 7.883823382975412, 7.743473545129162, 7.717182638577653, 7.757192121693121, 7.833900323996266, 7.796932443821973, 7.81190926556178, 7.838826126984126, 7.824549703781512, 7.905541153983816, 8.082385507391844, 7.773616738162424, 14.72186918557423, 16.004182800887023, 16.175111724867726, 16.246642712074, 16.252707596171803, 16.462042393246186, 16.523977469187678, 16.53863661072207, 16.66003722455649, 16.590720752567695, 16.55843335326733, 16.575830909250026, 8.878107068723581, 8.721995867958293, 8.548552897992531, 8.54350819327731, 8.456708484516028, 8.26001386196701, 8.189857318545751, 8.103685852769997, 8.005004716308745, 7.998076785148874, 7.818505873582769, 7.519892796903075, 7.766577649961752, 7.707004796607532, 7.523632264690969, 7.442108072038075, 7.486292913848688, 7.488706902596876, 7.472728498132586, 7.47970138523187, 7.408074473155929, 7.44024294187675, 7.555097780345473, 7.238240113193796, 7.47794325077809, 7.544512389744787, 7.572803733971367, 7.597722021942109, 7.8591104924091, 8.047009708761284, 8.073204627606598, 8.051094860722067, 8.120707534469343, 8.133165327633183, 8.207826512085022, 7.897019451213819, 8.238253858776844, 8.14896555182073, 8.135429565981948, 8.153193135801825, 7.974759426859634, 7.803736920557112, 7.794145263772176, 7.82388906014628, 7.829049974712106, 7.832974026065981, 7.773984272564582, 7.558466630702096, 8.10986212535014, 8.07374670035792, 8.298776993235204, 8.458085622315593, 8.49180198801743, 8.58984364067201, 8.618863272175538, 8.584755119890552, 8.619140810613134, 8.708700109554933, 8.71641230602241, 8.437017112044819, 8.415532135076251, 8.425280379707438, 8.2071127119722, 8.1015453173047, 8.095557808901338, 8.123685502723312, 8.161668942343606, 8.231703737550577, 8.25643582998755, 8.24957505804544, 8.297238278944912, 7.984090059679427, 8.469939190499534, 8.54366283788387, 8.667164239184562, 8.740053523187052, 8.923604083411142, 9.02282930820106, 8.959775949346406, 8.930478703229069, 8.784946634220354, 8.733398922735761, 8.680198486227825, 8.435434503559758, 8.49803664456894, 8.412509262138189, 8.283041759259259, 8.106113669925563, 7.861472466444913, 7.714663587595317, 7.770599493399978, 7.694731622860254, 7.980261163087455, 8.316671517040149, 8.469369700026634, 8.310065714052287, 8.766855717709307, 8.84818193199502, 9.00867223443822, 9.078335411453471, 9.022759089791473, 8.950280257334795, 8.96333582239341, 8.911032115001555, 8.776136688053745, 8.518386995876128, 8.516076046238107, 8.015070286695725, 8.242152087379397, 8.181554806567071, 8.863718557332843, 8.86562331590414, 8.93100372105509, 8.951872172918613, 8.87213825889745, 8.926736913943355, 8.909068703236851, 8.79274280026455, 8.622439116311348, 8.350305904516159, 8.559640303633875, 8.576312012293807, 7.855128582010582, 8.340142238328664, 8.39381639267105, 8.456300137566139, 8.489610106131343, 8.502808449190788, 8.500191590180517, 8.549934983115469, 8.59577969475568, 8.515345948490507, 8.927575017222408, 8.86728749502023, 8.930971310068472, 8.51881172936249, 8.56586599072518, 8.656946855897916, 8.658321636700519, 8.792542355742297, 8.78731103898226, 8.867476788904451, 8.913527045030605, 8.52047658924681, 8.70663166153128, 8.727350430750077, 8.70971782578587, 8.61704460776533, 8.65083116207594, 8.583316740040459, 8.545034981248056, 8.375149715839946, 8.45308139519141, 8.401038658107687, 8.422702900482417, 8.062792525117773, 9.53732275093371, 9.64759574431995, 9.632472203470275, 9.731771946988797, 9.566006294880696, 9.657521120603796, 9.665177760192966, 9.575462534702767, 9.596069366013072, 9.75125839853071, 9.808336069016498, 9.800553630791578, 9.120492665966388, 9.087210669000934, 9.1277384624183, 9.195114307422967, 9.304923005202836, 9.248335909663869, 9.257502582010584, 9.261624820339248, 9.158734767584814, 9.016218433317771, 8.885760920946156, 8.86018685558668, 8.358489543417368, 8.378685572362278, 8.436711277372527, 8.651118285815441, 8.644215597416745, 8.77265398638344, 9.120742433162157, 9.255765963507626, 9.279927811391223, 9.400100564029602, 9.594724885776534, 9.640002679610804, 9.714316261671334, 9.712619334578276, 9.377733626206036, 9.226078499922192, 9.27153389772798, 9.25202409022332, 9.074953424525363, 8.942682264472456, 8.802918095315905, 8.73766815558992, 8.606547520514319, 8.280546661635142, 9.348384863023911, 9.189166748988482, 9.190058472766884, 9.269206518129472, 9.42099935550887, 9.51455889869281, 9.494201903205726, 9.635037616713351, 9.763354647195642, 9.87060724502023, 10.074897762527234, 10.289344584578942, 9.77192831792717, 9.908569198431522, 9.915569881652662, 10.104983950669158, 9.990135744864611, 9.790110092359166, 9.72185377552132, 9.755523338984204, 10.04524314589169, 10.01623056014628, 10.007411750311237, 9.533714199190786, 9.502026378695923, 9.325964071973235, 9.199395585278555, 8.866636269607845, 8.686017728250782, 8.56694015787426, 8.554378899548707, 8.37603202116402, 8.158415064970432, 8.04131197455649, 7.920914843526299, 7.6343187140924975, 7.982245307734205, 8.11554590554392, 8.276286298705134, 8.441391243775287, 8.509848303532525, 8.693162992452537, 8.718447713429816, 8.56896622447868, 8.530586141223155, 8.717990151338313, 8.689365097284023, 8.379731953314659, 8.550634706971676, 8.511940030137344, 8.448524821006183, 8.441872328976036, 8.485233224951374, 8.386374625583565, 8.360807489573608, 8.455590798241518, 8.351916608776843, 8.367042354331277, 8.36157771039527, 8.027003196855869, 8.502040070033216, 8.499831890989729, 8.382549276412508, 8.488092847650172, 9.090613815437289, 9.12454471635739, 9.013132931019168, 8.968494680905694, 8.979594122303503, 8.898578728875533, 8.967257106435452, 8.72154778623366, 15.879210706921752, 16.50646329466231, 17.093482742136125, 19.103537074540927, 18.41725063295273, 18.50618862942799, 18.5795149624, 18.68273615662932, 18.68175115757989, 18.714127131341428, 18.661671879511623, 18.387383804181564, 11.317715231792716, 11.370173494086524, 10.52968998793962, 9.032857523653906, 9.176141289838158, 9.168074335950308, 9.21179292554662, 9.071666742685965, 9.337217713040772, 9.423702096093994, 9.63689319475568, 9.77436980780745, 9.550522851067289, 9.439997721599752, 9.366594678260192, 9.325349989391407, 9.207317822973636, 9.06500482306256, 8.93358791511049, 9.031538383364458, 8.7603082989418, 8.633718151960784, 8.445968552088157, 8.100446025521318, 8.388216486072208, 8.44344105236539, 8.679279128695923, 8.74299692779334, 8.90833811116558, 9.137883025049048, 9.368683738406476, 9.458018355508871, 9.616919029228274, 9.758424607531902, 9.8615549473746, 9.5974469169779, 10.208772566993463, 10.363788653050111, 10.453158719965764, 10.487009959183402, 10.393963832839896, 10.269727014344072, 10.219780774632351, 10.114846124416433, 10.550037787531773, 10.6201938644726, 11.038901286046276, 11.207182747587924, 11.639452167366947, 12.046779287348272, 12.160238614791473, 12.261751299019608, 12.60437780399938, 12.86549376416122, 12.892330377917832, 13.20181438453159, 13.199725626150466, 13.383060840576736, 13.2289694929972, 12.76015439931528, 12.867066517553718, 12.332328144179892, 12.223469690778996, 12.305054020487251, 12.49162539126719, 12.652722829636115, 12.788474614611244, 12.941047013519956, 12.462313792848091, 12.795826484126984, 12.75878226626206, 12.538243025054465, 12.759059836756924, 12.934945241382673, 12.864712973934669, 13.09735533332944, 13.401270513060872, 13.551070374260815, 13.98622460504202, 14.085598178804856, 14.567216828275756, 14.385631910187785, 14.516471437130408, 15.232876557734205, 15.751024342933665, 15.829913358465609, 15.941143368325948, 16.27573035255798, 16.189497806022413, 16.299130945066917, 16.28953051859633, 16.443787748366017, 16.690882757547463, 17.008064297474554, 17.504649891654154, 16.63375392464079, 17.117714444640914, 17.680732633597884, 18.089747606537397, 17.965487509828115, 18.047474201914103, 18.251671751172328, 18.349631260816327, 18.254283957049484, 18.45986930174292, 18.471734233525915, 18.44530115345812, 18.31168321584189, 18.56627238157485, 18.336704561780262, 19.023217130881708, 18.91889365146216, 18.874734286181138, 18.82116307181761, 18.667180716901505, 18.59321657625273, 18.400866351540618, 18.321237237736675, 18.122798967715795, 17.787995224798355, 17.654201649004044, 17.127402189075628, 15.95994420961718, 15.730181418220251, 15.65372956660572, 15.334222011593528, 15.242782016544124, 15.185446086056643, 15.318457403361345, 15.53245271529723, 15.749015171936277, 15.6079042351385, 16.4470539411661, 16.691290388785152, 16.763533946778715, 16.828512667289136, 16.441586688182124, 16.29421040256168, 16.055104569249924, 15.635782056489262, 15.156344608854653, 14.589089675614687, 14.060623672944548, 13.087168940554, 12.74723625925926, 12.515325299278324, 12.325240734748157, 12.17375661406785, 12.368675100451291, 12.704074206790771, 13.059664777388733, 13.448991792561468, 13.894438628245933, 14.213008151960793, 14.425027127373168, 14.584005900404604, 15.189875698879549, 15.529642214484127, 15.771995419934642, 16.080230699579836, 16.047690955536755, 15.896710572698158, 15.816771076875192, 15.59934179590725, 15.379528571817616, 15.3120940961718, 15.013199603500484, 14.193791324385309, 13.94795874019608, 13.357488539838156, 12.9321266040305, 12.471184439931529, 12.24299969424279, 11.901407855004098, 11.666466204870837, 11.302913402349828, 11.070107429505136, 10.9714683828976, 10.831218999530554, 10.489682957671958, 11.04000307088391, 11.36805872385621, 11.39674453742608, 11.634477757876857, 11.521459462624495, 11.402262612223783, 11.31323131162465, 11.317049729280786, 11.051186053999375, 10.92722526626206, 11.017503072829133, 10.909977161879478, 11.077294733998604, 10.915749994164331, 10.989988706971676, 10.962397896358544, 11.021436188530968, 11.02055862169312, 11.041151406756407, 11.107682399652454, 11.207428109485626, 11.208394451188614, 11.318259445414656, 11.062042829983426, 12.16479772363665, 12.095724530039844, 11.909437825319015, 11.78976025589986, 11.715080171101777, 11.738875501654087, 11.695665715917755, 11.659953556354395, 11.66629108761282, 11.692164268051664, 11.636921942092672, 11.6393704190944, 10.78547685135258, 10.829895405929038, 10.862892383986926, 10.98065430197635, 11.117822749766576, 11.085684597829994, 11.114276851307189, 10.94704999704326, 10.880502190791969, 10.900322392701526, 10.892773379984312, 10.493237816215377, 10.581776874494242, 10.578083853330224, 10.701363362978524, 10.642579550887024, 10.499003741830062, 10.472798930202822, 10.483191313569876, 10.4363543505291, 10.599138999610958, 10.480665479147216, 10.458758616557734, 10.24851821226268, 10.656114083800189, 10.675572176003731, 10.743366534764368, 10.831566671646437, 10.9336956267507, 11.11692631387139, 11.16770597323374, 11.232080374961091, 11.19172805166511, 11.187811019763462, 11.155756734343552, 10.90328728190165, 11.200700977124182, 11.164113392857145, 10.920807977513226, 11.02153641643324, 11.04790676556503, 10.977103643323996, 10.876265649470898, 10.896085696545285, 10.81381684087042, 10.819337654684096, 10.79355554046063, 10.48720848358232, 10.67734170308123, 10.675761493775289, 10.765887418655335, 11.975416280812324, 11.983593417600376, 11.91135467271644, 11.88403913748833, 11.776853794817926, 12.287923163943356, 12.662837154061624, 12.6021226302521, 12.1659551267507, 17.314327586990352, 20.04470647400989, 19.852969547852474, 18.591975210239653, 18.422505136557223, 18.336538497082824, 18.30868379342969, 18.31861826563959, 17.574512398352397, 17.471122580532214, 17.571907318394025, 17.498123810457514, 12.095971551898536, 10.201660047401973, 10.30226207099674, 10.275404336912542, 10.29841321879863, 10.336902909897294, 10.480002906006847, 10.475542026133422, 10.583842417398987, 10.71736518215064, 10.891606667989418, 10.715775252183194, 11.073870592981637, 11.262224976735135, 11.519442524198569, 11.59009419791602, 11.847423916086353, 12.07966883699035, 11.995558898897066, 11.94990951626206, 11.655714790522888, 11.534192782485874, 11.464543321739807, 11.1999722590187, 11.653247478057889, 11.42674373019764, 11.26065838881108, 11.29403636056645, 11.493798468150242, 11.67832231356987, 12.02605843565204, 12.410273968487394, 12.936194000855895, 14.274186717086836, 14.590323840024896, 14.609820855042017, 15.0017314554155, 15.325036466931216, 15.988370281901648, 18.04914788017429, 18.229736054310614, 18.38530829974518, 18.61919255431061, 18.952535517357237, 19.458506664894568, 19.535068007002803, 19.597474625894804, 19.393945710497928, 19.549722987784, 19.620278564036724, 18.789041400560222, 17.05369544467787, 16.75833799802561, 16.493708927015252, 16.123775182021827, 15.633615404316451, 14.26141506463133, 13.787862306255835, 13.479839821717116, 13.041041403007316, 13.316777234749456, 13.206020153983816, 13.498385503144137, 13.671021183629009, 13.734154146280735, 13.97957888764395, 14.525283809774743, 14.84971591153128, 14.572185202380952, 15.550881788904451, 15.711631141300964, 15.526380079053844, 16.111318459772797, 16.241215784154868, 16.40349844537815, 16.678863384142545, 17.009483769091712, 17.01138853361345, 16.77249072082166, 16.8792341573296, 17.045444175445997, 16.657674773187054, 16.70818601844071, 16.544506045051353, 16.86702949727669, 16.741177118658573, 16.626777291238717, 16.731287106364768, 16.555125974807574, 16.380867664565827, 16.17600695611513, 16.03565983488951, 16.357836866462428, 18.39348728338002, 18.34390506224712, 17.873086829750232, 17.659967009881733, 17.614624311496268, 17.87045780890134, 19.40778473795556, 19.91160873357714, 19.864372339791476, 19.74066790489614, 19.790350151648905, 19.235908715624028, 17.95440683667912, 18.233739335434176, 18.313380612044817, 18.313268251322757, 18.515239224219425, 18.345348374027388, 17.05589940207491, 17.097058618425148, 24.603340190476192, 26.28765158154373, 26.02470099673203, 25.66965875287893, 24.97389772657952, 24.797791268517223, 24.648833113750776, 24.944830186998708, 24.72882905098563, 23.561620560331832, 24.96040795785661, 26.337787086511444, 17.761043689876676, 17.204290707827575, 17.18972130427835, 16.860146894102083, 17.052574655306568, 18.67030165048241, 19.73456610239651, 20.815129342881143, 23.17471700420168, 23.716082675593952, 21.99237218331777, 21.053633138266417, 21.584676671466184, 21.81250608426704, 22.21435177577638, 22.24714635364145, 22.58865910255214, 21.290292578275757, 20.61605214116905, 19.70132453500306, 18.361944625630883, 18.96741673132133, 18.70203368537523, 18.48514022429351, 17.855917095397125, 17.723179402816687, 18.641638919467784, 18.538994171689232, 18.16003769422336, 17.08945357165508, 16.258140699083413, 16.373561696002984, 15.383550657985174, 14.417538709868223, 14.129215925332211, 13.652000259792318, 13.647975000479978, 13.505008856085809, 12.34541607452355, 12.410670675868772, 12.392498548552757, 12.614758349984438, 12.167175910327842, 12.394039354686113, 12.595651748643537, 12.418546863211953, 12.511259118580767, 12.497496001720956, 12.2683761118892, 12.070761486227823, 11.960466922580142, 11.90795056590414, 11.982733644562453, 12.26450107236228, 12.376039163632118, 12.885945873560535, 13.992534003890444, 14.69223257406623, 15.168201868482855, 15.267592957368509, 15.334792412300136, 15.451670973544974, 16.572726179287923, 16.93030809640721, 16.55626552651987, 16.130515133831313, 15.475707814270152, 15.35992685901027, 13.812248342871415, 13.346814039876415, 12.750905782057266, 12.524461106006717, 12.593059061469033, 12.59731908722344, 10.983862029126245, 10.818826494513814, 10.83183743277311, 10.747194631953532, 10.693151483385629, 11.713630509736664, 11.535170869596824, 11.3014219038282, 11.221669789060073, 11.349725384079004, 11.216433646293265, 11.032108472377844, 11.092129057033924, 11.222447123944306, 11.262911399631134, 11.205023940166916, 10.96489097853776, 10.064285995020231, 10.09599688305322, 10.36994715580639, 10.991916853174605, 11.368492565359478, 12.088336702303144, 12.558318141145346, 13.049221558278868, 13.357519923591662, 13.64468600420168, 14.011843024665422, 14.125187435959315, 14.664091192032368, 14.837356880490724, 14.954306900715842, 14.829161220899474, 14.617043944366635, 13.87549384500467, 13.423780256535949, 12.716139144491128, 12.245855575517496, 11.82702638103019, 11.432885817071272, 10.723522567460318, 10.705983326408342, 10.432250631419237, 10.06971767187662, 9.566470956777817, 9.21064212464986, 9.27988564737006, 9.249437574306205, 9.306095023809524, 9.328646065670712, 9.422528072517895, 9.44128164379085, 9.186006276081676, 9.625805417678183, 9.801022616635542, 10.061818621065466, 10.251818722144412, 10.546265681995022, 10.6322227578587, 10.84922329123872, 10.977362598194834, 11.069090216636852, 10.966060296374105, 11.072729506224713, 10.872570371090768, 11.043924246148414, 10.757689318082788, 10.623267337978495, 10.49617913569354, 10.242733805322128, 10.10835926493931, 9.877413944517066, 9.908279918630695, 9.900334066760038, 9.883770168179405, 9.72654329816371, 9.588840127840024, 14.514824113980316, 16.864038325521452, 16.816928031417937, 16.849430339869283, 17.000982682306255, 17.121631942640764, 17.181879210161842, 17.03060687394958, 17.078690268440713, 17.060338416511048, 17.1591572245111, 17.006162770852782, 11.290079796840958, 10.52371174852163, 10.58167184290383, 10.499171739651418, 10.435705157937806, 10.395229189029596, 10.27059565242764, 10.049148173358232, 9.98674872831224, 10.179538234928463, 10.294284996597508, 10.150957394179894, 10.422694193043885, 10.12938087634583, 10.26618785073838, 10.345331712729536, 10.310441607298475, 10.455836247510115, 10.47065401081544, 10.869968233734074, 11.906580591962342, 11.942175934004206, 11.776785829071647, 11.181613496031746, 11.436058271008402, 12.501791115546215, 12.51358171720679, 12.7004773032991, 12.7344594886399, 12.75848832996468, 12.99774898877565, 12.470662537580942, 11.887523868036103, 12.087175570854347, 12.24860030112045, 11.89413221879863, 12.18046675588974, 12.152801960550889, 12.826905253112356, 12.917736928026766, 13.02160447084716, 13.081485765617572, 13.051251956855786, 13.785953478369125, 14.027522476501714, 14.088832037270464, 14.187445596313156, 14.15302581100218, 14.638608135545056, 13.659986521293671, 13.4207898024432, 13.380444789060729, 13.739053675381264, 13.825166804777467, 14.011004874494246, 13.671945095004668, 13.701434054621847, 13.81077593915344, 14.00417057018363, 14.170852676081545, 14.65805725925926, 14.74751300568005, 14.91285652771294, 14.858194040227202, 15.087176286492374, 15.148262854357306, 15.078953547074388, 15.140032168923124, 15.33982324333113, 15.639917843604106, 15.527361782913164, 14.927099283769063, 15.140732483893556, 15.452856270074696, 16.098508003249023, 16.283626707999545, 16.030727613834426, 16.142779499610956, 16.416799934640522, 16.25995726276066, 16.385898054077188, 16.226325211122788, 16.31405880407719, 15.831776799074726, 16.285132456735035, 15.584774188707984, 15.013701102270089, 14.774605769292071, 14.836287729925305, 14.535854630560092, 14.162711452225336, 13.862376496489524, 13.43102964721444, 13.291963208894208, 13.25658122603486, 12.98296017262619, 13.194914857920946, 13.212413889491389, 13.4104557464986, 13.425609620358705, 13.364905619638968, 13.674726036336756, 13.95250389114535, 14.363159487702324, 14.832797989573608, 15.556876042483664, 16.0538464579885, 16.709032198633814, 17.294719792794893, 17.41247830200424, 18.23861582410873, 18.557626221055088, 18.780999479461048, 19.126202616013074, 19.0719098994709, 19.128926234516037, 18.84259544919079, 18.29285230003112, 17.701710917989416, 16.29098553610333, 16.15259777474323, 15.830907654075892, 14.893532025321615, 14.612762899004046, 14.33954862970744, 13.934440241674446, 13.931217558823532, 13.729038899269248, 13.611226696899974, 13.265145203392468, 13.190837009103642, 12.817941929582943, 13.146450900587483, 13.371753645035792, 13.145281438608777, 13.105169225490195, 13.023913366644, 12.796800697790225, 12.741511299719887, 12.58162732360722, 12.330997069552083, 12.32993777419857, 12.38597215600685, 12.13656668288688, 12.461130759337069, 12.347175811224584, 12.386259264550263, 12.475966663009649, 12.614578659508249, 12.738479114456895, 12.674002118269533, 12.493413822051044, 12.552470683006536, 12.504463982726424, 12.453981044736876, 12.067951100706118, 12.18509432158419, 11.994552656473704, 11.738429575619875, 11.351391739884845, 10.976870051587303, 10.636687870759417, 10.496400948101464, 10.293219307810716, 10.291389127840024, 10.144944285091814, 10.073088501945223, 9.81137536041278, 9.960455481617643, 10.674304787975323, 11.420689352552133, 11.563189388266418, 11.620428044117649, 11.549748510348586, 11.53848357678442, 12.8174427597929, 12.80955762394958, 12.84972095607002, 12.870946528478058, 12.669890848007178, 13.02708575723623, 11.911342766144054, 11.370105779878616, 11.378693407857403, 11.37906943207283, 11.411212238717711, 11.316779355217903, 10.235406724556489, 10.260339022097726, 10.44729971150342, 10.35015423015873, 10.035635206931476, 10.299584586848365, 10.413499598739495, 10.59303739721444, 10.65440062130085, 10.718051198101463, 10.839353681870538, 11.155238520075349, 11.262430767273576, 11.267040648070338, 11.400343953838574, 11.497867326797389, 11.29777828133153, 12.641413280812328, 12.752986734749454, 12.66945687917382, 12.498952745642702, 12.427113551198255, 12.272160085667602, 11.985334691643326, 11.88046769701214, 11.67854863895892, 11.402752496809835, 11.3538986171024, 11.204631551313064, 10.127257644799773, 9.991979809679428, 10.016520161064424, 13.873656899237476, 13.834023351851853, 13.875974578609693, 13.931731221513518, 13.985792837223782, 14.028437472689076, 14.008355779956426, 14.00469108986928, 13.762682622315593, 13.933713025822186, 13.84913546101774, 13.705388717135062, 9.76784314379085, 9.707226806489262, 9.664321081777157, 9.660730957827576, 9.473389567304702, 9.350374003812636, 9.396234931582438, 9.348135102396514, 9.04248381154684, 9.27077046833048, 9.312098763927796, 9.39933267911609, 9.64263995530268, 9.639768891845629, 9.60391454684096, 9.440912954367024, 9.461741576641767, 9.484223192888264, 9.483683689931528, 9.455525140375691, 9.159589423897058, 9.445849652321316, 9.378027508481171, 9.290350260426392, 9.108221151047184, 9.145553213313754, 9.116507906629318, 9.139752583099908, 9.04892874642079, 8.988331348506069, 9.017509222422582, 9.057873504123872, 8.736489491920205, 9.012203567649667, 9.032635586601309, 9.175859371926547, 9.206153074385307, 9.26783170253657, 9.325051609243696, 9.389432845938376, 10.163973406006848, 11.152304681839404, 11.114242113445378, 11.195420946700905, 11.072477151960785, 16.611951344537815, 20.01176080601398, 19.892059412486383, 19.84778296615313, 19.78986546195145, 19.717804277233117, 19.715311173522284, 18.914781089713664, 18.3811348111578, 18.49402933154373, 18.595315327462654, 18.4298532334267, 12.06211537802418, 10.079806688686585, 10.19870030804544, 10.3423602456427, 10.410681918145038, 10.483989808979148, 10.441739182328504, 10.296557241348298, 10.230355224945535, 10.139864895580454, 10.197023903906008, 10.219120685418613, 10.867036161686896, 10.924869847405162, 11.005549047074386, 11.23154295463741, 11.384503321739809, 11.576273052287585, 11.836023338307417, 12.161025787777522, 12.517701551665107, 12.890703508926812, 12.854846191332088, 12.630574503890443, 13.04722962637735, 13.517878940087147, 13.842874439443928, 13.867639152505443, 15.519184062947405, 17.13686518285092, 17.207878266421574, 17.099633611655776, 17.091596571302784, 17.152677385154064, 17.081458085901026, 16.789227780261832, 17.105066904269766, 16.828113267507003, 16.965076425303458, 17.296642817735243, 16.2051500677949, 15.97183168425148, 16.604422929505134, 17.10436968479614, 17.884012374329995, 18.28905921102184, 18.47601355267663, 20.0330513364816, 21.382678689020054, 21.41849335544425, 21.38307759798058, 21.27682897191591, 20.98083907682624, 20.41034877980238, 20.0162100331538, 19.503070240351693, 19.1288987194211, 18.914243676081544, 19.220777621922007, 18.880096273229203, 19.76154340375039, 19.68489744203237, 19.86908307236228, 20.00128683667912, 20.050532901305264, 20.16577825140056, 20.12594368386243, 20.18518515707868, 19.77972750653984, 19.68777096700903, 19.401902917989418, 16.863434650560222, 16.39829297105509, 16.161981188920013, 15.882640287970744, 15.637631181061314, 15.308397725568003, 15.155769314737007, 14.984115765415275, 15.02149921529723, 15.252485172580144, 15.313262654372862, 15.2710591381108, 14.681550462347628, 14.798388325241207, 14.848688719265484, 14.597272771630877, 14.43490595697168, 14.318243934562714, 15.41895384608816, 15.61273262978136, 15.128136387021478, 14.732701343215064, 14.536139280501088, 14.59562672175537, 15.671501210392677, 15.803974363518652, 15.780146593215068, 15.899913154761904, 16.095762607998754, 16.13439512491636, 16.360070793976302, 17.45150543075008, 17.671850959928417, 18.02551335061738, 18.54836884103641, 18.74980878602552, 17.579183419000934, 18.31568202634092, 18.691319021397447, 19.578156169156557, 19.798590906162467, 20.018037788826643, 18.364258192421413, 17.60790621234049, 17.806671630174293, 17.551802538204168, 17.560527020930596, 17.59367846140679, 17.167273798636455, 17.308725383597885, 17.08092858146592, 16.49416212441643, 16.58771647510115, 16.615340363600996, 16.541607720666047, 16.58663239028945, 16.48996723140367, 16.542623863109526, 16.302028113600997, 16.05756012301587, 15.52796264992027, 15.854089366013072, 15.779016864612512, 15.507138694136453, 15.193853082244011, 14.92274179349518, 14.7735078173047, 14.459362062975288, 14.334868147681297, 14.362918365935265, 14.015224948957362, 13.817055644724556, 13.291905478369126, 13.303014889744787, 12.946980486772487, 12.711610686585743, 12.845628497899162, 12.596865846544503, 12.61441699291939, 12.43556777474323, 12.416125495487083, 12.243959856987235, 12.160442080532212, 12.044384762138192, 11.778511015433404, 12.099309955259884, 12.040903238026951, 11.78968259880382, 11.691858080170787, 11.731159158659835, 11.591614539555671, 11.65574409381233, 11.395004387618346, 11.264840728446934, 11.152745765250543, 11.114685520074696, 10.68906638203198, 10.792846032990976, 10.92633356755983, 10.881564347591866, 11.03570100702605, 11.018812020287282, 11.0067370633059, 10.888546445891084, 10.916139638671025, 11.126744385694666, 11.246567073801096, 11.427885967417035, 11.230553849468308, 11.671256752256458, 11.595726571817616, 11.48302340639589, 11.328670162542794, 11.318700613226993, 11.482643245175847, 11.732080310457516, 11.680775567149082, 11.579106251478368, 11.68292336921491, 11.598128203405444, 11.25127531667447, 11.436266022331154, 11.520548997547722, 11.269052982679527, 11.18839934850007, 11.538875338558205, 11.672955942530177, 11.685743148869374, 12.003147507829002, 11.900012146708614, 11.908254862306569, 11.983885215647373, 11.782136508948922, 12.895108575770196, 12.761133229037371, 13.007071666835902, 13.039480164572964, 12.717178193588548, 12.45847918630954, 12.19028786414566, 11.8882012535014, 11.85976043331777, 11.638679319743362, 11.56361661336757, 11.828012020106486, 10.972850844075667, 10.868350496274902, 10.983235600217863, 10.940294216542172, 11.053198687908498, 11.044870020619358, 11.13042555018674, 11.28013606652661, 11.35611386181139, 11.475436863048566, 11.617925735449736, 11.350073116168687, 11.544867793206642, 11.514454611378255, 11.201811687986304, 11.18913431084656, 10.894652358776844, 10.851366173280423, 10.67053275225646, 10.496465945767197, 10.351361463274198, 10.27554223023654, 10.00165761355065, 9.426286841814504, 9.662546572630074, 9.757876120370373, 9.891351716542172, 9.841556810535328, 9.855735647292253, 9.745030691098664, 9.750586271630874, 9.645093940696649, 9.65201975961718, 9.555175315126052, 9.529740819297258, 9.225056268674136, 9.44718477559913, 9.341456777777775, 9.311410104341736, 9.420231025132276, 9.391858020930597, 9.34006053260193, 9.375083976346096, 9.434311376283848, 9.418978104521347, 9.556832568238406, 9.559206382041705, 9.209078573911324, 9.545203093837536, 9.652017083877997, 9.63267291557734, 9.631335289311652, 9.73372794530034, 9.781769678960474, 9.698013743308437, 9.79359008288334, 9.889474814581389, 10.062861896280737, 10.104692312636164, 11.648490354964206, 19.77240968731427, 20.38459252567694, 20.376340753501403, 20.71315228423592], [83.90716662519452, 83.73360744364281, 84.68197936310055, 85.21690181537065, 85.32637414554083, 85.71034081767715, 85.21862176792914, 84.48229239169001, 83.908126673047, 83.58239031419235, 82.59794050105991, 80.40065978392468, 81.87720277308007, 81.76445133691253, 81.03504961813856, 80.18497146389669, 79.6645985645814, 78.96424456642481, 79.3574739029723, 79.55173916853406, 80.30584211902105, 89.6115968925459, 89.47999517023098, 89.58714182897602, 89.11762576369438, 89.31164374921414, 89.74565961896981, 90.50649792281357, 90.00302876174071, 89.64547303174602, 90.3847228478058, 90.55105124872917, 89.87678750377957, 89.80604903555867, 90.70946966830066, 90.04475168835914, 90.6063453513072, 89.7844186283847, 89.60466209025833, 89.20048666456583, 88.87209031442576, 88.10127849245254, 87.8413890971258, 86.89451393650792, 85.39611195339248, 75.12537847315592, 74.94562478275753, 76.31563660644258, 76.75856218837536, 77.80313708948023, 77.04726236354135, 77.00060549097418, 77.59278343145034, 78.25338000739185, 79.29005679137295, 80.03813348117026, 81.95482639137879, 82.7011550235761, 82.44673958042264, 81.98467464563103, 81.82006178789294, 82.21142993596327, 83.32441458169936, 84.388649160999, 84.68837625365684, 84.45173087875149, 83.28271540884096, 82.41431192884998, 80.76747354820036, 80.36793596201964, 80.52595966692446, 79.73953188761185, 78.30771605364211, 75.46048956722689, 72.88499144736487, 70.14754844833489, 66.86236712669948, 65.41704295066914, 64.32700528197945, 63.36763134165888, 62.13227540238031, 60.55629738366207, 57.81980442584812, 55.81583669553377, 55.561751661839246, 55.241645805322136, 54.64711214410208, 54.56733624758792, 54.18653523031435, 53.94933866386554, 53.757602836445685, 52.98225521389667, 52.5630991834734, 52.05539939931528, 51.7781667167756, 51.29525110054272, 51.9264225314549, 50.55003395797801, 49.46745935690944, 48.10673483717739, 46.5196666074541, 45.56573538803299, 50.365321462262685, 50.81825637449296, 50.10131556582634, 49.6601115198938, 49.21469795238095, 48.58174270199191, 50.49602702233116, 54.63819147253346, 57.47267004419546, 57.414452666499386, 57.27690867969215, 56.030712308116776, 50.69922428245539, 50.04866916811976, 50.80062052692188, 50.77257409075372, 50.46401860884392, 49.5751391855155, 45.741511111041085, 42.32925869102, 40.17567754158954, 40.36303388632513, 40.69038402900003, 41.04163478952693, 41.21871505991285, 41.55860784469344, 41.41762013523187, 41.50667743277312, 41.59673124066293, 41.546406071804, 42.30186712249844, 42.50419883520075, 42.73310405096483, 43.57971737356314, 42.9716109737784, 43.309464549408645, 43.76590841856718, 43.55650515024899, 43.47679718556645, 43.305305933562906, 43.956157552730446, 43.82229076377217, 43.17843290077095, 42.873085765094935, 42.342996364593056, 41.2438899030501, 40.9195785183629, 40.53944768162867, 40.22907279953599, 39.93900397191099, 39.69263198385855, 39.17267587500194, 37.46595765919701, 37.22257475233233, 37.3463056582633, 37.14071193222845, 37.10195173062558, 37.123209784391534, 36.10116507718642, 36.04280711881419, 36.19267982172165, 35.80323687190774, 35.412494944911295, 35.040151895813885, 34.385065799564266, 34.01973975466853, 33.7526406153906, 33.07429643957751, 32.84002283244311, 32.33575744296607, 31.908557464519134, 31.520185306878304, 31.40154360434174, 31.187356635932154, 31.01050319514473, 31.03223700062247, 31.48673456862745, 39.46636880921257, 39.43660658582321, 39.48481431893868, 39.40889731979458, 39.42686185029568, 39.71197817561469, 39.60955055291005, 39.73224414612512, 39.73446391037193, 40.21305953050109, 40.40842395634922, 39.749213755057575, 32.01266157088391, 31.805138795751635, 32.23330450723623, 32.34545398379046, 32.3591096371771, 31.571424674912464, 31.990374689075637, 31.957783676470587, 31.95417556481482, 31.458665803232964, 31.214256385698725, 30.64749192911609, 31.016445812204324, 31.331259625427947, 30.723154243230628, 30.507146478446938, 30.367447394179894, 29.751737607998752, 29.91331553120137, 30.205134263772184, 30.17898744203237, 30.33008994172113, 30.330175823840648, 30.067600676063886, 30.171105159062797, 29.944480775443512, 29.98094581421523, 29.991207379551824, 30.24181970463741, 30.482229861422343, 31.263778385290586, 31.72266522735761, 31.95665389052288, 32.01767847080026, 32.112258497707884, 31.52040788440385, 31.06388596794273, 32.10148595899471, 32.419731236565646, 32.52118552840025, 32.289069292405856, 31.645762095315902, 30.901636684513434, 30.69696843075008, 30.476835766651103, 30.40423798910675, 32.47222617234672, 32.82481304956427, 33.36931260278556, 32.60371511444847, 32.39684586266989, 32.403589710706505, 32.89027506691566, 33.12937768852383, 34.36441047916473, 35.435009876187245, 35.99468497665733, 35.638469721755364, 35.67764005384377, 36.36637104375259, 37.58011548817305, 38.3926267320054, 39.19084424626517, 39.91834445020231, 40.431628823218176, 40.37686369623405, 40.65807816464299, 40.72310648311547, 40.97657923008092, 41.02817127310925, 41.94266964503579, 41.38599720557112, 41.55169218386695, 42.05663326059435, 42.05347982919325, 42.24467960885466, 42.41278474175227, 42.383733076267646, 42.75795355524431, 42.79536341184252, 43.02501195518208, 42.3187871355094, 42.03617101398078, 42.131987759103644, 41.50755962902144, 42.51514460418612, 43.48893601252724, 43.41601021804455, 43.30561876820728, 42.6316155407239, 42.94429153906007, 43.489454057422975, 43.46600787055648, 43.66421132858115, 43.63093378921572, 43.26384404878618, 43.56520965460629, 42.79743134148187, 42.07376190180516, 42.61287285099595, 42.51249267116849, 42.11546690818549, 42.38491440156136, 42.40490880897915, 43.02756014954871, 43.05560405734516, 43.200240502518426, 43.47573824351203, 43.98992571311858, 43.9732116436132, 43.70631436983678, 43.24156892265795, 43.10469185948687, 42.61074748868727, 42.484935706037966, 42.38933385877685, 42.453837398408815, 42.6387909403906, 42.44738050933708, 41.829518288482994, 41.62636617639278, 41.58691372875817, 41.77052690802988, 41.54745028591918, 42.4633632037037, 42.46791369021747, 42.6060188182384, 42.10353764410208, 41.897244849517584, 41.38488952715531, 41.605641225112336, 41.11111232282913, 40.62749105174292, 41.52096940402467, 41.22348219716776, 40.139720901571735, 39.92820795339247, 39.39145315203859, 39.45151603982259, 39.47603933862434, 39.27528870946156, 38.9198493478836, 38.79409051223616, 38.81501080086564, 41.00213688779956, 41.4095467291537, 42.096021913787744, 42.97223419218799, 43.88965430026455, 44.1440671451136, 45.222222607516336, 46.427503148381575, 47.3020133557423, 48.34295438126362, 48.910739054115496, 47.858435055322126, 47.546717069016495, 47.85278580999066, 47.73220924843216, 47.3348726652661, 46.97237474058188, 46.679326507703074, 46.255094394257696, 46.021749355275446, 45.751036751011526, 45.54866261445689, 45.53818209780579, 46.26556588390912, 46.44711082445144, 46.13843478323879, 46.15306840196079, 46.176996666900095, 46.38108125303456, 46.23091136212262, 46.13919057858699, 46.27950992116792, 46.298546885343406, 45.94598371872083, 45.97188147829132, 44.84301193261749, 44.27463663686586, 45.21900362634352, 45.32907085939932, 45.53079872408251, 45.65881181178028, 45.35847149470899, 45.93375887971198, 46.54444718394024, 46.60136597121071, 46.79801888775226, 46.4091048225957, 46.37574306676004, 46.97290292910248, 46.39445735611384, 46.10362393807904, 46.07778054528479, 45.68820751252724, 45.090481704092745, 44.48942134158107, 44.015915252256455, 43.44836121521942, 42.82056885760971, 42.489420458839085, 42.05945659529518, 41.56294452474323, 41.031472490974174, 40.62071814277933, 39.764044253658334, 39.391471931605984, 38.76181671288515, 39.11237456045752, 39.13592747883598, 39.06986330835667, 38.98786726229381, 38.97047011733582, 38.36879587449424, 39.36236810854341, 39.62202494654528, 39.71369403322439, 39.984042348723285, 40.032001396047306, 39.6911908611111, 39.227098960317456, 39.89989190500247, 39.92758814355744, 39.621070223544976, 39.29160907961407, 38.44316580438843, 36.626011731747326, 37.22665343456272, 36.89389915371797, 36.578811569716784, 35.90492518067227, 35.45628013569873, 35.086135322025754, 34.136364948023655, 33.71695383308823, 33.62475432438531, 33.39500928205727, 33.14445360364145, 33.985233372704634, 33.0354779720666, 32.61318328291317, 32.420547501167135, 32.72533510843967, 32.21811488071895, 32.30347898210395, 32.515244319638974, 32.20607763351813, 32.06702270759415, 32.223150783224405, 31.902750547731905, 31.797974332166195, 32.19341451906318, 32.23884173272643, 32.19851925221107, 31.77900031395892, 31.37872895868347, 31.7573891529723, 32.028553974789915, 32.19441533115468, 32.272065242841585, 32.222221192255425, 32.22042336375661, 31.989076161609084, 31.993346634269663, 31.86754601198257, 31.55687827341205, 31.52016210348584, 31.19644524766676, 31.201427071817616, 31.28733790094927, 31.05816671226269, 30.89616853190165, 30.58649233123056, 30.332194631326548, 37.38238637286025, 38.11827333488951, 38.21146698793963, 38.3661777158419, 38.32242608192759, 37.86070773040127, 37.51373575420168, 37.78511978936872, 37.77221589542484, 37.99367290110489, 38.03892046857949, 37.86885028408638, 30.934678856676005, 30.1970133356676, 30.29241031467932, 30.25723057088391, 30.3653700733738, 30.28910910690943, 30.349653193588548, 30.28503588173048, 30.3071066660442, 29.95187976569797, 30.08587904380641, 29.956160479568695, 29.868719331455544, 30.11811509905073, 29.951333293806417, 30.040812845554544, 29.922804476423902, 29.367918637099287, 29.593203515950822, 30.07179336227825, 30.130832181995025, 30.170976910172868, 30.029758400793654, 29.50973888881108, 29.90135947203613, 30.00420516013072, 29.994977911907355, 29.879676312852737, 29.91129156769375, 29.79536239223467, 29.91169112535014, 29.664972579754124, 29.63639713625377, 29.993723973696056, 30.341310890911924, 30.148093955329905, 29.511163335122937, 30.508864073918456, 30.525183035431585, 30.67695298692811, 31.074980597727983, 30.691513927326483, 30.99429108418923, 31.139219596716465, 31.18023681939776, 31.098222523965138, 32.881803476423904, 32.81144650708061, 32.94515043090571, 32.83070703003423, 32.84956269933409, 32.72396551890756, 32.8265099073296, 32.88046077861604, 33.371127904995326, 34.567994420245874, 35.18958722751323, 34.82904843954248, 34.49986477840026, 35.31983084321506, 35.9381315032563, 36.12445448926238, 36.66445641051977, 37.18520579595069, 37.39635205166511, 37.73391984206223, 37.75072894937884, 37.39610928478058, 37.294676076084784, 37.017266798008094, 37.83528831131341, 37.482656674525366, 37.73333148669469, 37.90573361971549, 38.39995684749456, 39.2211170458203, 39.601677693744165, 39.77517864433551, 40.79357250466855, 41.52890045471523, 42.22237868821974, 42.16999219693433, 42.52788469802366, 42.74165621272954, 43.21844256948335, 44.59806233691253, 45.64235844540995, 45.45224173774253, 45.72605554668535, 45.55877996763149, 45.68525794436663, 46.10427206069095, 46.740136340413954, 46.8474545454404, 47.08029087319355, 47.30166311070977, 48.11703818860877, 48.21154379411765, 47.5538503531383, 47.68473023840647, 47.75328037488329, 47.47342348327109, 47.82650239558045, 47.854087722462175, 47.968497524433296, 48.27520896101711, 48.62903737182346, 48.25563313756613, 48.0192515375817, 48.98215788897903, 49.00966082611009, 48.913733870126585, 48.861165918048926, 48.834851199112975, 49.645013748755055, 50.4291824613854, 50.21594439931529, 49.691817560846566, 49.40499213811079, 49.204909646669776, 49.279331316370985, 48.01647223778401, 47.87930077567694, 47.965397902661074, 47.82354702461159, 46.84684745124494, 46.271503488765084, 45.66371842958295, 45.15446750809213, 44.94360884279428, 44.42670602583256, 43.78244948755057, 43.60302984974447, 44.1219378968254, 44.19963786756926, 44.00932028968254, 44.04857112519453, 44.0570613934018, 44.17653391781825, 44.46140341067538, 44.16800710317461, 44.05300894728966, 44.234118246342994, 44.05570329307501, 45.67888293687949, 45.71934887005913, 45.4646016223934, 45.6108460272837, 45.8573400157174, 45.5931290550887, 45.78943577053506, 46.34795132519392, 46.91634790893831, 46.83223522268908, 46.72667967413632, 45.02954849891067, 45.05745908752853, 45.79612520064258, 45.878079337846245, 45.635952386009954, 45.325477084811695, 44.86113728563648, 44.803157057216886, 44.67952372971395, 44.37069300272332, 44.50806734767742, 45.28155232656397, 45.36334818337418, 45.08503055399937, 45.55402205508871, 45.66907136321195, 45.936394374843424, 46.21641802575475, 46.34819465965155, 46.06142959064737, 46.83304757679739, 47.07986779555844, 47.21551511182763, 46.71191267563431, 46.43963451890756, 45.25334062145321, 46.00241202988641, 46.0434601564737, 45.89631013508732, 45.61067443067227, 45.35155218993153, 45.35721831318082, 45.31866462892936, 45.28273167421413, 45.41935625855898, 45.31701189335188, 45.75746038935575, 46.00544370207491, 44.91023322817689, 44.60239298544973, 44.46402954159182, 44.11951476019298, 42.987682425614686, 42.45699379435434, 42.37002016583801, 41.88495632438531, 41.37241942678183, 41.036268680516656, 39.96270836434472, 40.11811281263616, 40.38403523442914, 40.00278101928301, 39.75666516692216, 39.69282821957672, 39.59019730539216, 39.51473218526299, 39.69912571381886, 39.94646724315282, 39.98560555220978, 40.157813711562405, 39.89174229026317, 39.68296323177458, 39.8672986354653, 40.17139293432929, 40.61533108107688, 40.700611214986, 40.42154211197869, 40.71040999665421, 40.9657767307812, 40.19721881613757, 39.73486164472456, 39.099736719265486, 38.109725209446005, 37.483131209928416, 37.64400896576409, 36.833837944755686, 36.036921461095545, 35.28347513250856, 34.46958705415499, 33.97544841651104, 33.89292465063803, 33.75593109375973, 33.80123632455269, 33.793813299953314, 34.0043032289916, 33.81578924447557, 33.65000618189452, 33.66121581497043, 33.70117119545596, 33.63984773879552, 33.554643495175846, 33.30550904613614, 32.97365743098351, 35.350532664186524, 35.392017091492896, 35.51368363600996, 35.11581753640868, 35.15786690240237, 35.32106694615624, 35.213730028322445, 35.23806537278245, 35.44244886328976, 35.02548451112019, 34.80966861940684, 35.056200866903346, 33.215916346560846, 32.902132618502954, 33.39095620401494, 33.16614933955285, 32.71902986461251, 33.53574627326486, 33.62094915507314, 33.48608230539994, 33.86781957459803, 33.97152869568939, 34.017993301276064, 33.66450673506069, 33.702805564503585, 33.14454619179894, 33.10314860704819, 33.02427570658264, 41.12591083909119, 41.51236662169312, 41.4544811004513, 41.47963461234698, 41.09625722401184, 40.39941746358543, 40.100553728240094, 40.712858469343296, 40.5204775391061, 40.38288414309057, 40.30777893977592, 40.58955303991596, 32.26614935788399, 31.818754691824232, 31.645801788281982, 31.304221636032697, 31.23327603034548, 31.40457175980392, 31.39795835487732, 30.99114541571937, 30.87459001203448, 30.873927183162152, 32.446745524120765, 31.69262174696545, 31.625738288281976, 31.66874758776066, 31.575907157173983, 31.42217716417678, 31.397304987628388, 31.22647150272331, 31.48519446708683, 31.547120888655463, 31.55607482197324, 30.315108621459693, 31.64105624190788, 31.577962785714284, 31.81336396093993, 31.73108721802054, 32.22764864449113, 32.424989905339665, 32.34069256302521, 31.86953861153712, 32.11552908971367, 32.164800822440085, 32.18346096731575, 31.11643655236539, 31.95750851898537, 31.31212292258014, 31.647121206115784, 31.9997188400249, 31.67631073739496, 31.38425230726736, 31.34409124447557, 30.928705461328978, 31.36440526181398, 31.64553130356365, 31.676953265092983, 30.884968237550574, 32.11062025925926, 32.001319756146906, 32.53892004041657, 32.39808951447246, 32.57814826089325, 32.79084233270114, 33.378342629785244, 33.504402959694985, 33.864592460960715, 34.95362085200747, 35.69000748037983, 35.3489434248366, 35.25152234570496, 35.52028114777276, 35.790284899196635, 37.06461112270463, 37.64817338165266, 38.35417733941933, 38.79028857438532, 39.24400444203238, 40.5197417646177, 41.319616502723306, 41.83639063562092, 42.35311571311858, 44.08348794833488, 44.66599683169934, 45.94422859430439, 46.92417973630563, 47.96414026633987, 49.00772356598195, 52.67993525474635, 54.30004289137877, 55.03392530376596, 57.10251591370993, 60.67220871613627, 61.48720571638655, 62.34414656800497, 63.24001460276094, 63.07263253633675, 64.2137479886399, 65.44835157376284, 64.94196456828509, 65.78385763671025, 66.08440846657395, 66.35160243705259, 66.29908218401805, 65.09601152916471, 65.0265229694211, 66.0511410118905, 66.06139449605595, 66.72007113437597, 66.3480412526455, 65.75112934842826, 66.20874788779956, 65.25597825396825, 66.10767303649237, 65.87611050046685, 66.06640091495487, 65.870573055432, 66.24421015087145, 67.48854119522252, 69.02939968735801, 70.57589140149392, 72.09841608496731, 73.78964925574299, 74.58996226003735, 76.30630198583879, 76.55335166159746, 77.2870265097261, 78.38858510630594, 79.13759318286067, 78.85210696957672, 86.26992458488952, 85.70493450801432, 84.51116774906436, 84.72304300972611, 83.41872759321508, 82.55751195238096, 80.66877645370369, 79.52046714814816, 78.81020752335371, 79.66018158740407, 80.82536036352319, 81.21421064237539, 74.46462229450671, 74.67763453551393, 75.24002760667601, 75.48448021296295, 76.89738737044819, 78.3128731326642, 79.77482691106442, 79.29246599797696, 80.0381701740235, 80.05701149556488, 79.16410769537815, 78.54028925840336, 79.14156019779024, 79.2887555796763, 80.27295654053844, 82.89098141120577, 82.01149941658885, 80.75222276219331, 79.61401769950203, 78.87460569218798, 78.73475189503579, 77.23362352404166, 76.3287497212885, 76.56945473412698, 76.05394432200956, 74.9846751096295, 73.43166329731041, 71.79272034943004, 71.56307408551197, 72.60091412107064, 72.18902097401184, 72.10627166386554, 71.80868910776532, 70.98334824922192, 70.77350404154997, 69.14434172159976, 69.21645166277622, 69.50520832454093, 70.55173294109866, 69.00272557780889, 68.6067020864457, 67.07656741215375, 66.44244046793692, 65.46065248022552, 65.30048882936507, 66.03671222370059, 65.29653878999444, 64.72933279365078, 63.64643573327108, 61.22757036858077, 60.262353261593525, 60.857172516908726, 60.81233591789994, 60.71638397510115, 60.72051113165266, 60.73695818853096, 59.577188139660485, 59.58674153244631, 59.09283796084527, 58.51459535675382, 57.65421713701628, 57.27413527606599, 56.91591297019919, 55.80916304675539, 54.678852638693385, 54.00977154769686, 53.50725524959606, 52.95113718339558, 53.24608044856832, 52.204400056800495, 51.99216617400469, 51.84453285659819, 52.43098742623717, 52.29106726182695, 52.307393445689385, 52.444085444600056, 53.13725315998223, 53.57829323311547, 53.454181544720704, 52.68381459134765, 53.39629193837534, 54.20140398039217, 54.753500183258176, 55.35493903540305, 55.385623687651744, 55.30484034321506, 56.055659684082286, 56.53053324642079, 56.79622254926731, 56.40940155539994, 56.76445482920947, 56.97434081792717, 57.36935242639277, 58.15041715343915, 58.64933185784314, 58.20569958099907, 57.71809834648304, 57.286169750155615, 56.22333422183318, 56.88103476945548, 56.430864846094, 56.78316460019037, 56.626247193199504, 55.57363012122626, 54.059629235527545, 53.04285798965142, 51.65585515404282, 50.96864796265173, 50.80168506412167, 50.40661498544974, 49.60528333621226, 49.03150670364159, 48.19553823739496, 46.86462968401805, 46.2723533915344, 46.09826386118892, 46.16998892472118, 46.36782972727139, 46.282808715115046, 45.956548117874654, 45.63695858776911, 45.7932660664488, 46.27399302035807, 46.47667960509454, 46.73084634018051, 47.56584656370022, 47.963810556489264, 48.217734727513225, 47.79654451431684, 47.73602771999237, 47.38554743020541, 47.25302802339001, 46.81393765318043, 45.57900407428156, 45.00128644495346, 44.52912035652039, 43.91266777840024, 42.9092426355431, 42.18307267869851, 41.45448187192654, 41.54628882016936, 41.63432036803611, 41.65052182570806, 41.57798501648576, 41.553564017507, 41.44260864737005, 48.23074061507936, 49.12564341690009, 49.1975137079832, 49.16501342569251, 49.21373421467476, 48.72968325202302, 48.722515012527225, 48.63369141604419, 48.64665839602333, 48.51535393686069, 48.56918020012449, 48.37937296638656, 41.20414868853096, 40.8274261118302, 40.750342505680045, 40.52965637503891, 40.49986857671959, 40.22143639517, 40.32003790032679, 40.57002940831907, 40.41484757539683, 40.3569533119307, 40.26514368417367, 40.03342259897292, 39.88919072392883, 40.00308941923437, 39.98778889137878, 40.01648403261104, 40.11491297911999, 39.58935685037348, 39.31639861974789, 39.97905629481793, 40.30556676984128, 40.22453022806309, 40.17601435535325, 39.89565479676315, 40.083878429218544, 40.2681575995954, 40.286871059091325, 40.36548453096794, 40.39112235333022, 40.51917794362681, 40.66522065732959, 40.507009210784304, 40.18449926243646, 40.258304234827264, 40.33896538958917, 39.891373130485526, 39.32303535091814, 40.24799641534392, 40.34974910205221, 40.18606105967943, 40.18340688677508, 39.98446176112408, 40.158473967709305, 40.43474981629318, 40.62150232827575, 40.872595249766576, 43.19014970666044, 43.43581735058876, 43.351081922410906, 43.74727640561781, 43.8862842412076, 43.5841548488601, 43.634005518362905, 43.26793714329677, 43.11465331356988, 43.7677782211329, 44.01882303579209, 43.01124975894802, 42.31221514659197, 42.734558576980895, 42.92752934889511, 43.78959898000311, 44.18959672089948, 45.17128936492374, 45.6261371240274, 46.03174942810457, 46.476553873638345, 47.6919132692188, 50.25920632695301, 51.8743771468254, 53.71058813702148, 54.27139650474635, 54.99001330112952, 55.99231170977281, 56.98186224758793, 57.874915534158106, 62.08536504411765, 63.07964819179894, 63.77369681325863, 64.98004309570494, 63.83980959422659, 63.48561335806813, 64.44771399284159, 66.08054246335202, 65.82963036251166, 67.00271422144414, 71.68687318285093, 73.86095041546062, 77.01111355278987, 79.17228834912854, 80.71657675295673, 81.38180071716465, 82.39979990133833, 83.11658556090947, 83.99141178773732, 83.97037489394647, 85.27607157499287, 85.36250290281667, 83.15502778742608, 81.43861519343291, 77.04195029417276, 75.34095396475256, 74.97426767133518, 74.79180236647929, 74.2669651160429, 73.52221421078431, 72.75397364701503, 72.28812331223935, 71.2915420367258, 69.96956230999068, 68.29508771303298, 67.10102342709305, 66.2794213235294, 65.86569136733581, 64.52793271350762, 64.52635137656267, 64.72366005251648, 64.84739772743542, 72.40479773689827, 72.62679399697973, 71.83631117966075, 72.76306382205104, 73.95161699914411, 75.2413251406785, 76.37108975023344, 76.16256292654839, 77.87372884383757, 78.87208997344189, 78.86681919247718, 77.20471363342021, 70.48372112356054, 70.03236762924058, 70.704462510582, 69.43839615343914, 69.04332175762528, 67.2546751476813, 66.55711258302209, 66.52075906758678, 65.83740184446, 64.85488579528479, 64.14214167356897, 68.56858221568628, 72.25090581504826, 74.30958689270153, 81.74591746226267, 84.58371658045441, 86.75594127972302, 89.01977464371303, 93.57845382858702, 94.75705986227824, 96.18411801609216, 97.61614605921255, 99.03000530890137, 97.19008589410208, 94.2035925625441, 91.25166913879944, 86.08020128376906, 85.8191351275651, 83.87075030434886, 82.49826215258325, 77.77460188655462, 75.7002550585901, 74.32371880812325, 72.74644226525055, 73.96961487916278, 71.67244029707439, 72.77415731744023, 71.64596441456581, 69.70588739347961, 68.75898104643164, 67.6407266617647, 67.10117485247433, 67.12161938764396, 67.09217813437597, 66.49817664737006, 66.22327782664176, 63.44032409696934, 63.31458749696546, 60.78929496913581, 59.93658715787426, 58.89481231255835, 58.76158920402015, 58.521248211095546, 57.7605291416122, 57.07149964573607, 56.08096700980392, 54.80815061959228, 54.79602677116404, 53.92514547844693, 52.73921464246811, 51.98442559640523, 51.5109075935263, 51.199938256069096, 50.22306666036414, 50.21968789091193, 53.52899653327758, 55.16607779528479, 55.11785584168756, 55.96719038628244, 55.6632241014264, 55.80713447945845, 54.7199443971934, 58.08336758478253, 62.31506925967856, 62.33676269725971, 62.75704767001245, 62.45658546551314, 57.835302689620285, 58.96512929232805, 61.576312210565135, 61.05687176453489, 60.945194002627055, 60.57870002711756, 59.95217320597979, 58.04965993798112, 55.70255308274422, 55.5080185922444, 55.03187865761036, 54.51149360496032, 54.38529292513423, 51.22185774346405, 50.30528536631977, 50.79418602209772, 50.680044326719575, 51.08735896848739, 51.359140153205736, 50.480673439464674, 48.587232254824144, 48.43574398832866, 49.57998301020476, 49.4473933527499, 49.30180731624132, 50.88751035472431, 48.1029099679343, 47.33005492771553, 46.745312755757865, 45.518630128040485, 44.99158665639589, 45.73112018394025, 45.18481141523629, 45.22864430253749, 44.38253376708555, 44.01765811780267, 44.07279574035171, 44.17690171125117, 43.79211643111296, 43.65104167577031, 44.45146335506147, 44.43610112193246, 44.55715682491876, 45.55474305497847, 45.813018946589374, 44.92561111125434, 45.05790356240274, 44.713102495876136, 43.77205806325864, 44.19140281676003, 44.99835423114819, 44.32080133068783, 43.94705672603487, 43.38583734399708, 42.33838037818752, 40.23835761469032, 38.5579301212796, 38.91562579014939, 39.15089169404287, 38.80270088890618, 38.55854524817084, 34.91773021249611, 33.977335699657644, 33.86989750772597, 34.17867175764669, 34.58745778800917, 34.692703278478064, 33.434249880874575, 33.129944359866165, 40.18568557055025, 40.3440555533769, 40.31627314022154, 40.81636072438679, 43.344182261671335, 43.26574825096008, 42.94712302550579, 43.10589181567071, 42.65727515258326, 42.56361101447245, 43.64673853089015, 43.60831650925926, 36.74594139822595, 36.35466397906098, 36.12442664602752, 35.50490852696282, 34.61175806061247, 33.98078019911298, 33.627853751945224, 33.6636996607532, 33.404171069172115, 33.18627884964221, 32.233677380952386, 31.76320345027302, 30.51326178371876, 31.373408827951334, 31.41525283714208, 31.44445458193277, 29.917809230003115, 29.77311509173669, 29.56155319942421, 30.001480441176472, 30.07709667001245, 30.20317085543106, 29.35091250973864, 29.502083129232087, 29.38804911756925, 29.899633994374447, 29.89466728431372, 29.96533655031773, 31.0926081984127, 30.955908546679936, 30.801441214985992, 31.328581697117645, 31.581777409663864, 31.666497198257083, 31.97563854933085, 32.01536576933162, 31.499125532679734, 32.058904751867416, 32.30434119510516, 32.61826179575164, 32.08345408807968, 32.69881242598624, 33.47885060441954, 33.83011828244236, 34.30533806165408, 34.96829868222844, 37.8778698899004, 44.00776208928638, 47.54432581364768, 48.206674949850864, 48.61900193946468, 49.096611941721136, 48.84552693510738, 48.96190360255213, 50.06136649206349, 50.43249902818888, 50.62764612542795, 50.24233803003423, 47.69145988359425, 42.18237245178831, 40.344625140678495, 40.26294506473702, 40.2882950628696, 40.207057946934334, 40.379795402272016, 40.562801360517824, 41.58493796560847, 43.64095238990884, 44.56807021817616, 45.70103295248381, 47.5173816171024, 48.10687664236062, 49.04613137543539, 51.654750531959365, 53.30830527762216, 55.546054082633056, 61.18005649338624, 62.7584626250389, 63.72759487902825, 65.3847399371304, 67.69513370290733, 68.17370709679426, 68.88032512362648, 70.50632713231862, 71.54288716503268, 72.35835348004657, 73.84628539379086, 72.97401774678195, 69.64490785280795, 69.57868140675187, 69.73803914737006, 69.36446452146272, 69.13031379808591, 69.94007410893246, 70.51865504520697, 70.95372820712728, 71.41883569917199, 70.3635786599751, 68.97170051400495, 69.16652709802041, 69.16370304393475, 68.67235559547218, 67.75959252668845, 67.3784691118114, 67.23576618301288, 65.974108099751, 64.74149079502102, 63.523730412620594, 62.73438760978836, 63.37033316098663, 63.55549498926237, 63.04952174813258, 62.966850610099605, 63.39840641095355, 63.40195310869903, 63.274703694307945, 63.61608587215997, 63.510639830368014, 70.56735264519142, 70.11519623845342, 71.24303737286026, 71.20584366386554, 70.87991624156133, 71.48525535467456, 71.50944550745345, 71.63808391508346, 72.9577001154994, 76.6950184730003, 77.49765901665111, 78.61044649712107, 72.77082543292872, 73.78331635037348, 75.04569680793787, 77.1833548278893, 77.92611978681478, 77.90279403665684, 78.37405046930373, 78.87191346326772, 77.4829821196143, 76.31711007486908, 77.7616584885621, 77.36598372313351, 76.92910456136788, 76.79191469265484, 80.05165547810739, 79.54455295284957, 81.52835604946137, 81.80950154930048, 82.12349311572777, 81.87121786699046, 82.46354708455388, 80.99478060783353, 80.0100244758972, 79.4118308977079, 79.75508048570558, 78.83185785729587, 75.17167701984127, 73.76876219098973, 72.07385804270785, 71.93890985597572, 71.24572088977449, 69.9180964746343, 69.68559602225334, 69.54688041728915, 69.15287649408653, 69.2975784869281, 69.00174497533457, 68.33470623646708, 66.69552575863678, 67.35650085001387, 67.22579253205727, 66.74527643118647, 66.49455280537921, 66.28820093921827, 64.49548827209773, 64.35928418444539, 64.24322444638966, 63.92674676401405, 64.0867797997977, 63.5926342682851, 63.89610976872536, 63.516260071255445, 62.80838689379085, 62.36201498699546, 61.85988834624961, 60.36804581450358, 59.46175170759415, 58.66871435836691, 57.2459156835512, 55.83268536659728, 54.41189736733582, 53.573763161686905, 51.92004493495175, 51.93172690756303, 52.00883986888746, 51.17013520221431, 51.08192311085564, 50.97301279427326, 50.75439924221911, 50.68502528123059, 50.359351982493, 50.530605882275125, 52.267686166564864, 52.91379588834423, 53.39022715658652, 53.30248051758481, 53.31661323187053, 53.73594855446624, 53.65194203609814, 53.81396892374727, 53.66769995533769, 54.71872579046064, 55.32913687433862, 55.15114034204793, 54.28222199992219, 54.004225354652974, 53.699505551120446, 54.036701436235646, 53.95738373046997, 54.13228854442889, 54.49846917929831, 54.95498898568316, 55.59574402583255, 55.73047002342048, 55.58867980182074, 55.77277874354186, 55.940783259726125, 55.579499291271134, 55.767228078509184, 55.107043076019295, 54.41984341052501, 54.09656650652236, 53.260812569644806, 52.27671234391534, 51.65014607734204, 51.44737144825708, 50.51653747836914, 49.5649507412076, 48.66651204730781, 47.31817345221332, 45.94433403906007, 47.09859806676004, 47.17925166534458, 46.61572674968876, 46.45445001136011, 45.67351417190645, 44.878689460059405, 44.38862658201059, 44.70945689721445, 44.57447450257818, 44.19047642063492, 43.54899820367194, 43.55430968036103, 42.32012249486462, 41.302522815131255, 40.60932015057644, 39.945392559757245, 39.08377047237784, 37.86306488927928, 38.015597614768126, 37.02252897385621, 36.40469845137205, 36.11344739316838, 35.60440766495487, 34.56320763881108, 35.20289151237032, 34.98108471825397, 34.86697415709618, 34.58476657944289, 34.29897941230937, 34.08917178703449, 34.0981182486805, 34.113024855431064, 34.32019557928728, 34.30298517755992, 34.48204000754228, 43.69632721132897, 44.27239323003294, 44.73308173595389, 45.49518748439477, 45.48847121949891, 45.12912333247744, 47.00480257321817, 49.01709030407718, 48.52680535582011, 47.93958080220977, 47.35360665810769, 46.91004020767196, 37.08252401735138, 36.10359643362901, 35.26632737162767, 34.108118236616875, 33.747079684640525, 33.523180201857045, 30.656630254123872, 29.102386129474016, 29.35392900538568, 29.473009347250755, 29.71588072315593, 29.55022291207075, 29.595245524509803, 30.576459663467425, 30.868070580143165, 31.26056426563959, 31.711007833255525, 31.588087190554, 32.400444973700594, 32.54012728680362, 32.67444559127123, 32.7618247954404, 32.922060172191095, 33.05958881131342, 33.016427363127654, 32.89143276618425, 32.87141360060691, 33.07717986585745, 42.83907746817616, 62.57485256426886, 81.48815392180205, 92.38536102591036, 92.132489823296, 91.98425443517093, 91.63682420541552, 91.09004792740429, 90.62204374151884, 91.54172227061936, 91.58365925124497, 91.45458626027076, 79.82757617701525, 59.46687047338935, 40.6272490463741, 32.39734070736072, 32.71173178034029, 32.94552453104575, 35.31084316798942, 36.071069506769376, 37.64046512674939, 37.94528832647708, 38.85180751478369, 38.94036098879552, 39.52838817063492, 40.18184303773732, 41.687195553843765, 42.80908273716153, 44.26251233839091, 45.06290772580143, 45.89880576068641, 47.235029337218585, 48.44963236413594, 49.789736083233485, 50.91102467685963, 53.20218786258948, 55.13706153026767, 56.37954824937299, 57.06987746763149, 57.7576366984127, 58.30867400443511, 59.10648643751946, 59.9912769535108, 59.453164676704006, 59.56092831357442, 60.42059959025832, 60.81603402810848, 60.57611805831782, 64.33488188313103, 65.77755080298786, 67.8244838496732, 69.36354621113965, 70.72074787169312, 71.02410866588858, 71.58993816023515, 72.37601892593631, 72.8072920122938, 73.7643456765484, 75.29796911258948, 75.82977578446933, 73.43197678026766, 72.71307858022098, 73.48145810831, 75.76026321132974, 75.98200703548933, 76.3125929233724, 76.32688854786709, 76.6842950835668, 76.61662242447488, 81.84223253770722, 81.25891152057397, 81.16740563273821, 81.5500991616643, 81.62492254686883, 79.07155278729903, 78.15793216639075, 77.44258208488952, 76.51262021537505, 75.63050221894582, 75.16923820017507, 74.35214345982472, 70.10043274416432, 69.93146603446935, 69.74153488973445, 68.47580856131341, 67.2332941591192, 65.03236254302833, 64.54128049349323, 64.71226279162777, 65.29979497991027, 73.55555322121072, 73.78282001610646, 73.72660973770489, 73.78567046646435, 74.28352279100528, 74.68334404684096, 75.50912891658886, 77.07326495790538, 78.50514094238446, 80.70462161719387, 81.44969226945223, 81.62554164314179, 74.82616929481793, 75.50038591036414, 75.02272838865547, 75.4029152840479, 77.51509174688763, 84.08400805446624, 84.04004626213819, 85.12582394117646, 85.52475729921218, 87.02106543230626, 87.6782769990034, 88.1260584063959, 88.82813775163399, 87.43156634757237, 89.20752749509805, 88.67973299903193, 85.49436241114223, 83.92721455376595, 87.43443378835981, 84.665612343881, 84.31665348249298, 83.15528304396203, 81.53679809461563, 80.09839892242452, 78.77317454076214, 83.80698082446311, 81.48537422673513, 81.09616004396204, 80.54811514648497, 74.96218343215062, 72.27071505018674, 73.01396140092464, 71.30781390883132, 70.04653290577342, 69.65564914284487, 69.00389085947714, 69.44806416051976, 68.39818977552132, 69.22673415048241, 68.58806820270648, 70.67371077388734, 70.32350324502023, 69.1777344143324, 67.05781307648616, 67.07856947993116, 66.54052120055148, 66.31352775496421, 66.54430299175226, 65.25676363842203, 58.92048996794273, 58.69674197432306, 58.96207901276066, 55.632147232593525, 54.86834559796141, 53.91901992563221, 53.31000123708372, 52.53896756170246, 52.55266436425203, 51.4676478724712, 50.20343242125739, 49.67834399019608, 49.15726224542613, 49.171413323218175, 48.25210636509516, 47.61238880994232, 47.24074364472456, 47.14975877124183, 50.87812300972612, 50.47045805112045, 49.74365960488641, 49.65153770401494, 50.619992771864304, 52.37834985418612, 53.73905993417368, 52.85376394335511, 53.35338693528246, 53.284357925529136, 53.24655693783068, 53.23145559072518, 54.16381988040772, 53.41378657835355, 53.8314800209306, 53.57993240957504, 51.860766597576905, 50.15638582383221, 48.84850665351696, 48.632731892234666, 47.719196036181145, 47.29552666923437, 46.94206190888578, 45.51598838671024, 41.053668696449314, 40.2816234624961, 40.6864966018486, 40.68208858877996, 40.67106291677852, 39.50401609726113, 39.284057957905375, 38.592925800186734, 39.331868638026506, 39.64759732878994, 39.62439131325864, 39.08354640904075, 38.78163745898238, 38.7629023610333, 38.476646279878615, 38.19970642774536, 38.17227402950777, 38.05135186640212, 37.69489818962029, 37.9624303483738, 37.15832933935448, 36.800082475642576, 36.80158806893869, 36.802075802632174, 36.630192034080295, 36.714713947323375, 36.795476788284006, 36.48368200645814, 35.83013894086523, 35.63024952299513, 35.190684628974736, 34.47644525560095, 35.118638847338936, 34.7605430996732, 34.27451544876219, 33.90966086192358, 33.339202516651106, 32.99314925622471, 32.41687564900405, 32.31106795584052, 32.252991410052914, 32.04388120714676, 31.6413241601782, 31.60432938010167, 31.347516627908757, 31.297613710524956, 31.29989608356676, 31.369482360122294, 30.656580565203857, 30.739844918222843, 31.06714853703704, 30.83780001377217, 30.75597241248853, 30.81087672868037, 30.82548640346469, 37.68167406421311, 38.12597637472767, 38.31940779244606, 38.13106787139097, 38.0782270478564, 37.932033403362, 38.03221304295052, 38.11772274027389, 38.13435398934018, 38.30290492253152, 38.37307297673514, 38.5272135444477, 31.578577205648926, 30.829017391767813, 30.62333692693744, 30.76841183582322, 31.06584196529723, 30.835846091503267, 30.857748285014008, 30.95112139869281, 30.87103960725957, 30.72887617514784, 30.46861694063181, 30.02713447097728, 30.342036755171076, 30.247136381801152, 30.3000034545596, 30.14506578400249, 29.929387211092312, 29.7142906521164, 30.0419026262015, 30.02329684223965, 29.99877506279178, 29.952001531668223, 29.80751504894181, 29.506342579127114, 29.488717093292877, 29.91265276011516, 29.678840858193286, 29.62980248490508, 29.718485614612515, 29.021141731170243, 29.136282266573293, 29.70801178890321, 30.057535691332088, 30.12454101198257, 30.33565954296421, 29.971613449371908, 29.4774510603019, 30.306952881355688, 30.59539811522008, 30.60242665756303, 30.488740358665968, 30.614884149315284, 30.618770380162616, 30.684188330765643, 30.662102346171807, 30.79607297821351, 34.51639080710201, 34.874584172386925, 35.57979989538791, 34.892509717787114, 34.81473845666044, 34.437787375194524, 34.676398550108935, 34.28037234713923, 33.76501452505447, 34.61139853166823, 34.65277328003424, 34.95571756629318, 32.563855454948644, 32.45926043723937, 33.08851401867413, 33.3320376704015, 33.66176699618736, 34.75622340017119, 34.865959173669474, 35.46112098187053, 36.30077147595705, 36.03538742551031, 36.66370442040149, 37.0840946846723, 39.15880818588546, 40.07447106319125, 41.83797342500167, 43.11862312080255, 44.24289482671958, 45.19037650703069, 50.18179731006847, 51.86146737519452, 54.52790145543432, 57.13612704003593, 58.93112753482015, 58.98127006255835, 60.46658995977281, 61.38799491616805, 61.723013609243694, 63.67158636507937, 65.43809695121381, 67.55233697860255, 66.27117750995954, 66.72616701369436, 67.17394090172736, 68.4070486056645, 69.78902298716153, 71.23692100497978, 72.68281801711797, 76.49319790896361, 77.94209411741363, 78.79735486842517], [610.7884571692342, 609.7424511167911, 605.8655525399938, 608.0092749588372, 609.0772483694367, 606.1146848011205, 600.7822098355119, 597.3254805673824, 591.2206431577063, 591.8660561479147, 597.2210966446468, 601.3921633695144, 605.0534603729379, 606.80731367507, 609.9359710570922, 612.5800614809369, 613.9920440609243, 615.0616087291343, 618.8303244605509, 623.7929701063648, 624.25698067507, 623.5770845203081, 619.9865138677537, 613.4815022662619, 607.7297654366636, 605.8675263496663, 600.5057726124339, 595.9133444672426, 595.1440874011184, 593.417720259968, 590.2730201552937, 585.7909841462671, 583.1513102531895, 589.8857492645502, 597.0106512974434, 600.603524757971, 605.336983401572, 605.9607827129628, 607.5450328791629, 607.9861387523441, 606.9190402430712, 606.4485444033614, 605.043614838391, 605.5733136019168, 600.8049517544338, 591.2881606265951, 583.1314031059758, 578.3989656993464, 572.5558613065671, 571.5097916384221, 571.1193238648459, 571.2404140335332, 568.447274109769, 573.8225105508093, 574.2849098245409, 572.639237017896, 574.1111749426075, 578.5105149276377, 582.516308056787, 601.7038768502068, 632.7404513049331, 633.0795309426549, 634.4675528064115, 633.5287905746188, 636.1472855852786, 627.182236033815, 624.2966260091038, 623.3963198333211, 620.4719431945981, 626.2328769424163, 619.8946595617023, 597.4861695051354, 572.5938808136477, 568.8184054495799, 560.9383741266593, 554.9401783034216, 546.0682049948647, 543.083541714204, 539.6211253569095, 535.2311164767326, 545.512821416511, 544.622152390912, 543.3876912880374, 539.6047486935885, 531.3494428093682, 533.8067621283069, 535.7127226885309, 535.9134400677716, 535.1635313178494, 531.9944049901183, 531.8445704894181, 528.7715171814505, 499.63564359998446, 487.7729155865235, 479.2565645006225, 469.4149280344693, 458.1090872012916, 443.5907904829528, 428.2248208285091, 419.3046793590103, 409.94995792195766, 402.749999017896, 393.4670754373638, 386.85752221280734, 382.454178908876, 380.8267423690476, 378.6762745835668, 378.2247239779023, 378.0897924772019, 372.5076207089947, 379.45330513071895, 380.6834053702148, 381.0433837513494, 382.5175902172425, 382.47245547341976, 382.8995722368503, 380.6085345298008, 379.80513471304073, 379.5975893029101, 378.2723072852474, 378.2653786852474, 384.4410548393247, 374.1737220391378, 370.802837548086, 367.6015480743853, 363.6358199195456, 360.31963688951134, 356.9743760812326, 352.93435673653903, 361.5243768412698, 360.313036239418, 359.37650319607843, 357.3646170723623, 356.53268203571434, 359.1582654919079, 361.3382182847028, 360.98307127668846, 360.0984646647992, 358.8813718404918, 357.47520949276384, 353.35194240203856, 348.9409038089694, 345.3684230606131, 341.86089675412387, 337.7561388650015, 334.16212003283533, 329.5541079281752, 325.5882206081544, 324.4510838165266, 323.2389333667912, 322.3341118867103, 321.56985339044513, 320.50336999268467, 323.0319463674136, 325.0282947401183, 327.1055897697537, 328.8027689396884, 331.8860202998658, 335.28637450160164, 338.27894942896046, 337.3799444779022, 344.5013358368348, 344.9355223133364, 344.1427068510738, 339.8619084481014, 340.8269716483037, 337.4100033894336, 333.2325631826953, 331.5577099683318, 326.7823183952692, 322.79098579434395, 319.228935051743, 317.4999511855742, 311.01005476688454, 309.86984548918133, 311.3440836817537, 309.6243368330992, 316.4910157994864, 319.83976820206976, 321.2242891094771, 324.6407428292095, 327.85527639153435, 327.952028094071, 327.8075530956272, 327.7545941349984, 327.2248476773265, 326.0245980649704, 325.39068358915284, 321.933235881178, 311.55219045883064, 306.9439815654288, 302.4279634068627, 296.71364008527854, 293.06757295440394, 289.777837605042, 288.4931580876907, 286.99940750770315, 285.70939646125123, 284.2479291049642, 282.76807781637103, 282.73365537075745, 306.61220389293504, 326.16036947704646, 347.25380722043275, 367.8783780698724, 386.67311315305017, 406.011779711718, 422.30291113639896, 438.4663942147525, 455.1582411241053, 459.52115373599446, 457.3017239446779, 452.9697221487706, 429.871422106676, 407.7974217781668, 383.7849582757547, 360.7982675467632, 337.222565186897, 314.76050879676313, 294.5381156483777, 274.54517704116085, 254.063636699572, 248.03815432072048, 246.9292104440476, 245.0084581174136, 271.7705853271086, 293.4028206587301, 312.35462230975725, 335.3012393359788, 358.23485572292253, 377.3856147937286, 397.06403284064737, 415.78840097720206, 435.200355702381, 445.3211823259416, 444.991153174292, 441.80639013445375, 414.4861561910208, 392.9002209257703, 374.6086420167899, 352.46457458053214, 331.0050506591192, 312.4240794548709, 296.1139484103641, 278.8396303060224, 261.3205890912698, 254.46345339145657, 256.2848933104575, 258.29128442561466, 285.29275131108, 289.2489638718144, 292.03791496948145, 295.4450744726113, 299.1650833187681, 300.3624681996394, 304.916561309446, 304.1220784460525, 303.4027187481326, 302.8658007072829, 303.03850291254275, 297.5488494989106, 278.00058581901646, 275.49215876392776, 276.69492153618114, 276.0742531182695, 274.9383606777934, 272.3751756511049, 278.17709631434803, 280.4396236202926, 281.6606905897915, 282.8993145949269, 284.7438414772798, 286.6984940266016, 298.78519039114536, 305.3496826845627, 308.58334565133833, 312.05883350155614, 314.67911823412703, 315.3471692124183, 307.4245640631809, 306.8352331325085, 308.4165899381419, 309.49740603338, 309.6315502892157, 305.16861680568854, 295.4592883456271, 291.5520076105516, 287.68813856528163, 284.5591741736695, 283.4086673120915, 284.27138993471834, 285.0309779350296, 285.6658457199658, 285.40146873397134, 285.8351150112824, 285.6007915427171, 286.2743585493172, 288.955823776066, 292.0769798870993, 295.0438840446624, 297.4020203748055, 299.36039549821044, 301.8028604742452, 304.3535935168068, 305.82725820782764, 306.8332720365702, 308.43728931434794, 309.77679975957057, 309.2397418018985, 311.22715696265175, 309.85710649245254, 307.3078179793028, 307.1577880624028, 304.37029602855586, 303.61816614737006, 303.14313112083727, 304.8624450112052, 307.3806016240273, 308.5010122545045, 308.6901704839714, 309.40029920363304, 317.52384239153434, 319.447357734127, 322.0970665651261, 323.0189555890134, 324.5036611587898, 331.6684333126362, 329.7508686225582, 327.3195427343604, 323.8505140534548, 321.4242687636166, 320.8733221813726, 318.512651161056, 308.7967903810302, 306.5638239400094, 303.5841500848117, 301.5120780019258, 299.53798373334894, 291.3715538996265, 292.4723018878599, 293.293342298475, 301.82100437317155, 302.2777697987084, 302.41040341153126, 305.27893598568323, 307.73905823544, 311.3457674216464, 313.7859264361838, 316.6753307436975, 319.59398065413944, 321.7877745295583, 322.6526090312792, 322.1419452110956, 314.81947368269533, 315.43048467001245, 316.1563281104887, 313.44885486811, 312.5044645156817, 308.8833604453782, 306.50005522121063, 304.2057310874572, 302.25459348436044, 301.1176120155618, 303.04019008169934, 305.13035694895734, 305.9899585302677, 305.8809184742408, 306.7702870674558, 327.300526493464, 341.81769722587933, 345.34706266643326, 348.0042451486929, 352.062235423047, 354.8847846851852, 353.1037822379325, 351.2415349410915, 348.5310774778174, 347.8423563867841, 350.40944548615005, 348.97337153680354, 322.5223094991408, 311.82813465919696, 308.5685123975711, 306.0945936237939, 302.6823104579832, 299.4399164601327, 299.61091008806727, 301.54839282306256, 302.6256170311236, 303.05621244514214, 300.56448737223786, 301.26785697222226, 303.0889574966542, 306.3607074277933, 310.06169749338625, 312.4375627413632, 312.8829402422969, 313.7537925309679, 314.119015954262, 313.73125836640213, 314.00045372891384, 313.99194476398947, 314.4802347727202, 314.5941845004669, 314.0875855012449, 314.985026150638, 315.18629544779026, 313.49538687729535, 311.99809671661995, 310.61546701392774, 308.39125129123875, 307.46499624112977, 306.8547838485839, 306.10057059173096, 305.59257146187366, 303.8454096593526, 302.3772423653906, 308.03158486476485, 307.5556470496421, 308.2770620000778, 311.75398500108224, 313.92093703884035, 317.8957876584189, 320.34459377824464, 322.7166841117336, 322.029110335123, 320.62115432259566, 321.287849735372, 317.8431081264356, 314.7789076083878, 310.26553870020234, 306.72050350326793, 302.22653654050544, 299.0422681503267, 294.53839703625306, 292.1361109054622, 289.22288686803614, 289.1047642152972, 288.985008412465, 288.407873339169, 288.6693532780112, 290.39712179201683, 295.4832713257081, 299.6572495791148, 303.7390674901876, 306.37879589977376, 309.1757535291005, 310.5236128314659, 309.5091420495345, 315.76722482759106, 314.21348748908457, 312.84452829346026, 308.0826750777311, 316.20057573397133, 310.1765760233427, 303.69655204318195, 300.3902230108154, 295.2465265192188, 289.2603343976813, 285.355085587312, 282.8299209107532, 274.90769738141927, 273.5034952100374, 273.2511278963586, 269.90350865024897, 268.1069555692499, 270.12756182041704, 270.3533624119981, 271.59961108885784, 273.0059838717709, 272.2801582970744, 271.602173931606, 270.23320013040774, 269.1087530322907, 267.83348721148457, 266.1363417368503, 262.4186620609244, 253.3742601172496, 249.7479664448251, 246.1944387151332, 242.6816057962185, 241.20553000140055, 242.03470272370063, 242.0133261467476, 241.94642401672888, 242.79236025357923, 242.8511678292095, 243.06148040919703, 244.84242422440087, 268.7765020318213, 289.497076321509, 309.44836622805786, 329.60344988095244, 348.2505174734672, 364.8348343151261, 381.346015071662, 399.72115887877374, 416.42115390087145, 422.40500586157793, 421.9278408622005, 417.4536683198724, 394.6166162457205, 372.0480714458722, 349.9477019498911, 328.6321347321818, 307.6406659943977, 288.601506654295, 269.6464642421413, 249.08495621646435, 229.914637120915, 223.0566910538438, 221.894835405376, 220.84644071926547, 249.63945125031125, 271.60000579396205, 293.6898633265143, 314.60247358309994, 334.2527379333956, 352.1943738073452, 369.9531439800032, 387.9568409042173, 406.4126281771709, 416.2216597126517, 415.89301415647367, 412.9827741425459, 384.6921905002334, 362.9227059643635, 341.27266603190554, 321.98973769265484, 303.7806967492997, 285.6961914287722, 271.07000400568006, 253.3149659644413, 235.49867578127916, 228.4517166164021, 229.932855922658, 231.67017340445068, 260.2673046286181, 264.283157100996, 266.99354200357146, 270.4365311738173, 272.3742862530268, 272.0162338308882, 278.39178316044195, 278.2317409814815, 278.2187559661531, 278.49678539900407, 279.86448908551205, 275.20164815981946, 255.4888346549953, 253.74773505298785, 254.71470607819796, 252.518122460394, 251.6514305344693, 250.6075932937286, 253.0124241178805, 255.0491886921102, 257.1558439185341, 257.80572992942734, 259.2203087605042, 260.9417057335032, 274.14802278159044, 278.5368576480704, 282.55551925381263, 287.26170702910053, 289.4738477698413, 292.3767039472455, 291.2342573678805, 293.3878244309835, 293.98972279505136, 295.9640824060847, 295.1842439315283, 289.4216949895736, 278.07929524120755, 274.47086615118275, 269.2580239019608, 264.9522605671491, 263.14006812184874, 258.5149933888765, 253.68161406380327, 251.0106195588236, 249.34561846086217, 247.76695207430757, 247.1175562378618, 248.43425061974787, 251.2512895044351, 254.7331077205104, 256.63088296615314, 260.27899292696344, 264.2870869136321, 267.981060958061, 269.152704158808, 269.7498353134142, 270.4829768980704, 271.2343698977591, 272.6159676968565, 272.2956132773887, 273.7062381640989, 272.67727907150635, 270.9090410707283, 269.13138336802507, 266.1044506161687, 265.5093477996421, 266.9714366386555, 268.48357976820733, 269.1590165064581, 269.63981316122005, 269.99076319802367, 271.7382399953315, 280.1676534901183, 281.447525961329, 282.8312601611422, 284.9556750010893, 286.876741465316, 289.2491226135232, 291.2796755029568, 291.35721670284784, 290.8466290810769, 289.9223498828198, 290.1995704685568, 285.9843205666044, 275.855916461718, 273.6961751708684, 272.56216365966384, 271.5221125358699, 269.41844376556185, 267.7481065788204, 266.24757211367813, 266.0413243053221, 274.2725640424837, 276.14868167164644, 275.44019555368817, 278.87309817242453, 284.2678452782447, 292.7970965695612, 299.71336815639586, 305.71829328944915, 312.286496279723, 315.4733429758793, 318.0651931111111, 320.13079754092746, 316.35703728018984, 318.4869639199269, 321.137285865624, 321.39726114767353, 318.9605204122315, 313.94553928400256, 308.75669922447867, 302.7961334656863, 297.1257236732804, 293.07581549437697, 294.4646997726424, 296.7297365641145, 295.6169659969654, 296.3320042302366, 297.99948661134454, 317.5038027461873, 333.3387065088702, 337.76485273529414, 341.94917292615946, 346.08844769981323, 349.4509526944444, 352.2359612002723, 349.87761222198884, 346.68664990802205, 346.1471540477746, 347.0791859798475, 345.38828338569874, 319.9924705652817, 307.5695882934173, 301.35001143876445, 297.72954641565514, 293.7729533167588, 291.11847889005605, 288.95835326285044, 297.4927791335979, 296.75323237566136, 294.2885438092126, 290.16815406310303, 287.9689212292873, 287.1760394947641, 287.95176024151885, 289.12831502956743, 289.4899235121298, 290.9778238804077, 291.3066437379396, 289.93113684495603, 282.081638740196, 281.6681193417367, 282.0200950740028, 282.46792496654217, 284.7942662020827, 283.82568028430984, 283.9357310055017, 281.18757815149394, 277.5132414311391, 274.9166747546686, 273.7620845776533, 271.46134343526296, 271.61982336802765, 272.6485167155288, 273.3778655762527, 273.26319218479614, 271.5315503020542, 271.97181453275755, 281.67811306846795, 284.8675633558201, 288.90618849828826, 291.4571296791939, 293.8239097864146, 296.4008933242297, 296.73290599638835, 295.2853036434796, 294.84733914596944, 294.5207972187208, 295.0345882914722, 291.008176770775, 288.056468877451, 284.48781188849983, 280.6031475326797, 276.9573429000933, 274.6001148247743, 271.70327648739493, 269.9102938237628, 269.5603032299253, 268.15047053695923, 267.6855297159975, 265.96941227785567, 264.91288444825705, 266.973916503268, 270.4762651310211, 273.0784365694339, 274.62240550450383, 275.9537549864522, 275.9409588159041, 276.14807781652667, 275.372537786648, 282.72538150894803, 281.4751766585745, 280.6398866918768, 275.73965887278246, 279.02958827349823, 274.1239905734516, 270.59417620546094, 269.44249611925744, 268.5272505672269, 267.8081869492686, 267.6349581028634, 266.7434081584189, 260.2904459400872, 260.61105872782446, 262.38701455967947, 260.76041107998753, 278.9689985603797, 282.49733052139743, 284.2176063403361, 285.248681427322, 287.73740674097417, 287.3890915828652, 285.7321868962807, 284.43261819351073, 283.3241525521319, 281.27397215717394, 279.09207705446624, 272.0645382607266, 248.8639904180672, 244.75898119724556, 243.56958849797692, 242.07947321101773, 239.76498218899783, 241.45541595985063, 244.48934024556488, 247.64762993176168, 250.670920870526, 253.51094685947717, 254.76893868347335, 257.8643547728758, 282.3310284684874, 300.78676408434484, 317.3894056559291, 334.13061844708994, 351.6683920987395, 366.7339884231248, 383.28550807617495, 400.4893692452537, 417.379915121771, 425.7887525312792, 422.9476521881264, 419.2184044472455, 399.2701871631652, 378.45157174945535, 358.93716280205416, 337.86758180298784, 318.11701927342045, 298.4601452930283, 277.7790117793339, 256.920116565126, 236.64140961375665, 226.8484617648544, 227.9020210825462, 225.66041590756305, 255.59863078492648, 275.25656305936826, 293.45121619709, 312.28921099618736, 330.54305663040776, 349.6593036771709, 369.0300591373328, 386.8947648870214, 404.9420950108933, 416.8948470247432, 420.6390733758949, 422.8180487400515, 401.3356007473545, 387.8749827396514, 375.4427474136321, 362.0815490349362, 350.57538358247746, 337.1374562801075, 325.58200049361966, 309.2524888405696, 311.45213681356984, 308.7429882757547, 317.2678818390912, 314.0806026290071, 338.62222822222225, 350.4956039180536, 358.45968778406666, 360.4180616902428, 362.84766329114535, 383.09345670900575, 414.48073631629313, 420.23967515554193, 405.2014385895509, 406.312171802132, 407.506074703159, 414.3221677877373, 423.6949187244788, 427.26725360675374, 435.0697698134921, 444.5499909441332, 455.586328459306, 446.5169525192784, 440.4835386239496, 456.0918139268824, 472.9452448370682, 488.1034143666356, 500.7070295561002, 506.7375397412854, 521.1062859445748, 529.7976122928727, 539.7573583822751, 553.2508238768286, 563.8007883168378, 573.654478624572, 575.4734834186119, 584.1757683174604, 592.9546086591192, 600.0629135218209, 608.6718165764083, 616.0112323409586, 617.9506202880485, 622.2101494835823, 624.7776068899738, 626.4880140729848, 629.3586591310302, 635.2402942647514, 639.6975406176472, 638.2174135541551, 639.5406441572952, 642.0041899641301, 643.9301824169772, 640.1641751833955, 634.5130158593936, 633.9938168838235, 632.1097933383741, 632.6019232691409, 632.4017974162776, 626.6646404126984, 628.7440781880454, 630.4462662215219, 627.3733991062855, 623.3302613302988, 622.1321760592126, 620.0958905843448, 623.6589046577892, 627.2451411517396, 629.8703420243543, 631.681861978369, 634.7305628735451, 636.567977886477, 635.5371056701679, 635.7683858321003, 638.0858249863056, 639.256970493464, 639.4369481894648, 633.9032629384532, 635.5105634174447, 637.5035922367724, 635.1577795325773, 630.1281152364611, 623.9594306365507, 619.1072528302988, 612.5912647301587, 613.6996600083255, 608.6142839828821, 602.9148172783224, 603.3364993650795, 608.8463176032576, 613.2804038393247, 612.9878064415655, 621.2005632173416, 629.5819356960005, 637.128628173038, 640.7686869977435, 646.9437432077808, 647.2257105673702, 656.632230886399, 660.0064958254338, 661.6180019456058, 656.4095030922949, 653.1135953478395, 650.0501233399829, 641.9032485172735, 643.9977305779645, 639.8926844544519, 639.8816351915655, 637.285692397837, 636.9755579778246, 631.8606390916589, 632.0024109285715, 632.0130736854186, 631.9974140232648, 631.4335104338625, 632.2261149347962, 636.4094268147369, 632.4766062296011, 637.1606619843604, 637.9262629998326, 642.3713166846386, 640.7020897015251, 640.3220642387176, 640.5614088178856, 638.0238581617647, 652.7508385608077, 653.2514480647369, 650.9740427467319, 649.2698882496525, 643.1062365855897, 639.4549973080454, 632.7195177801632, 624.8706535933707, 623.7305155457517, 617.5334456847183, 616.8243489316839, 615.8026416242608, 588.6191062677404, 584.4968785228759, 576.8143586283821, 569.8595296788826, 563.082586168534, 555.2887295425614, 544.3629461778444, 535.8857627738658, 525.3159204340959, 516.2512095287115, 502.8717561793685, 489.5407581018382, 477.1001594245254, 466.5797202034703, 456.6643857139596, 444.83549619319945, 434.2561027507781, 426.4988734824152, 423.401257698652, 419.9712923782656, 416.48305589347257, 412.8290258166823, 408.5159070224499, 408.44188235620913, 409.6544355468941, 410.6745402485138, 411.6695913699814, 410.7425276476036, 409.5584244901183, 410.54051478369126, 407.0201293294805, 404.54269520494864, 402.7896081617648, 401.0670630650483, 398.562864023654, 393.0587638492064, 384.6276994930751, 390.5977207333489, 385.839326401105, 383.3396846325558, 379.773573940943, 376.9573051970121, 376.8679039929973, 377.29463522175536, 376.45446859593847, 375.6179756008404, 375.0561377501557, 385.1273846760037, 385.012172460925, 383.818609485372, 383.4348933840647, 382.5098975011671, 381.7097554624961, 381.0966169760349, 379.3267946095602, 377.87145251237166, 376.27392278594766, 375.6144587058823, 374.8022647315593, 364.0685853671024, 357.0490049753345, 352.3180165790538, 350.0180591303221, 347.42022116401336, 342.2468195273809, 339.3684968875266, 335.4346246641768, 331.945894012216, 328.73608892467973, 333.3642144212247, 329.06897019195446, 329.2429905716341, 329.34465201112664, 341.21323121039524, 343.4371435332244, 344.9286685299564, 349.7520852699191, 351.7956597404295, 351.01997689635857, 350.13832185496426, 349.1432506904761, 342.2843851031642, 340.54346010426394, 337.36999751131043, 328.5699022672963, 322.95114511375664, 317.7194498043106, 311.72419040880794, 306.767260454404, 304.1913237842359, 303.7377458990041, 301.516817138033, 300.107704375817, 297.3844257274355, 295.8709217751322, 300.3159511650677, 303.4588031345238, 299.1438908650716, 301.45660609009497, 302.1752722903828, 303.4967312957516, 303.8049458438375, 306.2960197904606, 308.8274925812325, 309.4007018402584, 312.5709769573608, 312.3311746778711, 308.6989812716308, 304.82821908543417, 324.3039040189854, 341.38663929614063, 358.7283989190009, 376.73494145401503, 395.0562463647681, 411.2550344875506, 430.3240137848584, 450.3030180937598, 467.70964267732654, 479.61625292047927, 480.6735686730471, 481.1998441636322, 464.9011131875194, 446.6886112280578, 429.1034389136321, 409.66444017063486, 393.50827186453466, 376.08734752497656, 356.58236764690315, 337.1991144535481, 315.7854341419234, 303.73090786741363, 298.7233219989107, 292.8874999992887, 317.19758931979453, 332.3953615829443, 347.98607880695613, 363.5908653334889, 378.863462990117, 394.1487899182229, 410.9196805603797, 428.8062627967861, 447.482312701992, 459.6224875182852, 460.4722712544352, 459.63964646949887, 436.7163001998132, 421.36856687535015, 406.7668476020853, 390.7160259751011, 376.6400925804544, 360.1984996607532, 345.18010074735446, 326.82849676854386, 310.5684581118892, 307.01152208022097, 313.4809605542328, 317.80235954092745, 350.2436915763306, 358.4769281341425, 362.0975668961621, 366.8025591919448, 371.7263774898725, 376.5730550099433, 384.3135883572207, 387.383544558002, 391.1876088315437, 391.7598519883287, 395.2030822713974, 394.3486751886088, 376.6427793834876, 382.7412900050576, 398.2129610330688, 412.98105050023344, 426.1682254253034, 440.6690123653128, 461.6081841861189, 481.6947856729692, 503.0114223225957, 523.6259432794118, 541.6103723126362, 558.8345149279346, 580.4603029867725, 599.3248890021625, 614.951539647754, 627.2891181946001, 639.0066691940553, 646.1820348474945, 646.5521242645502, 654.3500095813882, 659.0243263011206, 662.2400985325241, 669.5475300689386, 677.1836678352785, 679.6532046391222, 680.0460356651882, 676.6182063515861, 678.5640558460361, 681.4123928541082, 683.9769699326189, 689.4832062011627, 689.8299281297127, 688.795701726424, 693.5286711260505, 694.9894687843139, 692.2073471097104, 694.4954505143169, 699.9652675686928, 703.63511900568, 705.3557325205414, 707.2299565992842, 709.0016734805479, 713.2589381225488, 718.259562640834, 723.7677793177717, 724.7642179317614, 723.904253509026, 725.5522784236477, 722.9189735368036, 720.4576913308434, 717.2211503830531, 718.3816232897603, 722.8405644759271, 731.1774532478557, 738.3064926772312, 751.3211125653594, 772.1466907262683, 796.9120676049642, 829.8960395136165, 870.20109499922, 932.7990779138656, 991.1795743555324, 1054.4106495251324, 1102.7141278877996, 1148.3218161032523, 1186.7407974680204, 1224.7567442482105, 1251.967891370059, 1254.405177750545, 1230.6038775386198, 1201.7370782795674, 1157.8689583520022, 1098.5859679646749, 1040.498900589247, 979.0652810519764, 926.869881871068, 882.5373674026611, 834.9143735921718, 786.0372493441263, 744.939673909664, 730.6247861540617, 729.6676285246655, 727.0651347955961, 728.0882037381731, 728.443953476261, 727.9664022570806, 724.4212006930438, 730.6544622664903, 722.0419812890601, 724.0593370272331, 720.9366361769374, 716.6828966900873, 710.6500607698309, 706.8208410922038, 702.8101897515561, 697.7183233072673, 696.8602384894958, 694.2414420413166, 695.2868414998942, 687.1974677352941, 690.3299352436197, 689.4123441439627, 691.8661609419546, 690.7375382397611, 689.9215825535241, 693.2011361794274, 695.5312585189077, 714.4264197838974, 725.6633704403205, 725.6403907694522, 721.9441406875214, 722.834035036181, 726.3397557086834, 727.3556372384842, 724.1093574282603, 722.3969142246345, 716.1677732304621, 710.1195926938636, 702.092474602938, 669.672835400171, 653.0551678064627, 641.6421314115313, 628.9272574269374, 612.2421796523498, 590.8647769214857, 573.4998146733562, 566.9744055501867, 553.154538702377, 542.1257480175848, 529.85502804474, 520.4704825114379, 511.9283137177034, 504.1341920785091, 498.14732857189546, 493.7056626510271, 488.97452648957096, 483.5077997175337, 478.895699285261, 470.2231034522254, 466.6055629450668, 462.1985027820572, 458.468138864846, 451.9520772216776, 443.7646371549175, 439.22528876027405, 435.6331124076196, 431.6260608742608, 428.8120760847339, 428.2605545150988, 424.2555280045129, 423.2560750029567, 423.3588577291473, 422.58735708224407, 422.7574034386089, 425.3689881086115, 424.06378648428256, 433.7639091500156, 434.8967734304389, 434.9310724470121, 435.8807549631185, 435.68874366421903, 434.44186809772793, 432.54567259916223, 431.0677371965446, 430.0697764344072, 425.7557534635076, 424.06644607788667, 423.2422124824152, 421.8198895978836, 417.970688930364, 413.71108638834414, 408.72222097268906, 405.04767403579217, 399.71788043372953, 395.0862811671316, 390.3833680043573, 386.8692338611889, 386.1671244198568, 383.7536299412543, 381.8418555460371, 380.9116842952847, 383.5426870891528, 387.2080790914851, 389.0210330595076, 392.1202819474012, 393.3218321005292, 393.0668946487706, 391.63223073873286, 398.6877112061035, 396.7832473847242, 390.5230912213664, 380.210887540305, 386.93912116836754, 380.4969384376506, 374.04037825365697, 365.35237588873326, 360.68784604419545, 355.0055625359477, 349.477344310302, 344.54757553338, 332.2574539158056, 326.00401724641887, 324.5608112705415, 317.6692866933447, 312.70149173652675, 312.777647838805, 309.9666527364612, 309.8153870256774, 309.5398032355276, 308.5376604347962, 310.1289326210245, 311.6671653027545, 314.00214381676005, 314.63555573586046, 314.8324688407508, 314.68746021545286, 308.35110772230007, 305.3486142631498, 305.3082072315528, 303.2810216258948, 303.5255257336524, 306.22249418892, 306.7738192267351, 308.4479510405385, 304.6174218415172, 304.43919244023493, 304.31532384624967, 305.0458335161065, 326.5765831877529, 346.2623186756147, 362.7017829152661, 377.47566177009816, 391.3265822564959, 404.7729330802988, 418.9674573351229, 431.7356096973987, 448.6740021685342, 451.9381501495487, 447.90814744709, 442.9786799375084, 420.5796173649237, 397.8525700682306, 376.060936576564, 357.9752690584841, 341.4194530054466, 322.54659130928906, 303.48651944670087, 284.19925569444445, 266.65078660449734, 264.2377441160909, 267.9367611166356, 269.88544054341736, 302.6245977055711, 326.7890258826642, 350.2075252609711, 372.44501420305534, 394.4166951619204, 415.90417012457215, 436.5320417171647, 457.2115261773437, 477.7318576034858, 483.5987292000236, 480.2240747788671, 476.6954481970899, 445.37691837830687, 423.5550890014005, 403.5512033548085, 381.4844898291317, 362.6720138278867, 342.90363046031746, 328.193873589169, 309.7070591102552, 296.0375125767591, 295.9836800381257, 305.01260387815137, 309.9345448301432, 343.6948683181606, 359.8261162509337, 366.3707613590103, 372.234828526266, 377.0658115462029, 381.5060948403219, 388.15649268215066, 393.6313557139745, 396.2800860377637, 400.09582930874245, 402.2901160001557, 400.7998743891223, 390.89360117973854, 388.7364969366636, 402.39768522572354, 416.5225761377996, 431.1651273535637, 446.4010857909275, 463.1515731861968, 480.719130341507, 494.1875331769373, 511.6737275226288, 527.8195983968254, 543.3262378866325, 573.0010688768964, 593.6077958868643, 604.0904459596949, 615.4347367022019, 626.5448967394959, 635.2993434873385, 638.9366375461408, 647.1040351454249, 654.6597901417658, 664.3282998195612, 671.1844528618291, 674.4996883584122, 670.4731782917834, 669.3840820448179, 673.031529527737, 676.4960056846728, 679.5847858481949, 686.116039370491, 689.2024350611196, 692.3170168029102, 699.0200984614997, 694.7127854167376, 706.1378369382977, 702.3196160140691, 704.2805344384533, 701.8805630958718, 707.6011191990353, 707.0166844621849, 709.7473373526163, 705.8116529628851, 704.6670675554, 705.4842444884843, 707.4040197802676, 698.6631190337492, 695.6490402121848, 684.7648574574722, 685.1233559747061, 680.9191885926678, 673.4122406392779, 671.2432531098749, 673.8116692057268, 675.7590512914721, 673.0155978438376, 668.4037247026922, 664.2171707579366, 670.6087955401135, 673.673187740274, 678.7890816610645, 684.6107119724713, 684.3954326493146, 695.2236322276682, 694.6735543622004, 698.5157026914807, 698.207329103019, 705.2001857294513, 705.0533421135847, 711.1752639325948, 714.4218721999453, 716.1068575196078, 723.8373034171904, 716.8572227641494, 719.5613338540207, 721.7090135077808, 721.4512329158108, 720.0792882411492, 720.1931332906939, 715.1802180313523, 714.5191641357096, 720.7866452098507, 718.8322631459051, 720.1558700308125, 719.5322407871926, 724.1668359873146, 726.4706328448269, 725.6429600396709, 746.6708549220837, 754.7130289209462, 756.3949424421882, 758.5212846004515, 761.2182125462963, 754.7548478872361, 754.5152238196662, 753.0445883830196, 750.6097004961024, 747.1926202867257, 743.0835889302055, 735.6979292944288, 710.7200747004357, 708.5676968993931, 705.4166084460784, 705.5022825182074, 704.3430048942579, 703.1671481912265, 700.755561564492, 698.8266018385466, 714.5832732138966, 723.60262186967, 722.7356294781358, 722.61971351634, 718.2895195573451, 716.9543581868193, 712.4601346448023, 706.7490381942109, 697.4056147184875, 689.0863348142882, 681.5498349935418, 674.2855390978058, 644.4703785305011, 625.7630964247205, 610.8931679687208, 600.1816048832088, 587.4123649712885, 576.0271343852318, 565.7429226161939, 558.8192580816993, 550.3400483380019, 540.0152089587502, 530.3293124285714, 519.9636779929972, 510.4681628928571, 503.0611654634291, 496.08295123529416, 487.7798806117933, 481.6785107440087, 475.84156434189225, 469.8492351699346, 461.1675914958761, 452.2545076155463, 444.8086137978525, 435.9210999527701, 427.678710582244, 419.443399469032, 413.32026937760656, 405.8710500124495, 402.953423757314, 398.2762325593682, 396.4062281209928, 393.11482127840026, 393.7739722228447, 393.5086587466542, 397.26724625418166, 404.1724830824775, 411.9905558111578, 413.7800885010893, 427.95085094078746, 435.7719222018363, 438.67064295906346, 443.1750561833956, 445.63736667600375, 444.8373131745254, 441.0799713161377, 440.2926374586835, 437.3830976816838, 428.0025728539527, 419.4698823145555, 412.96219157321815, 406.6024286097883, 400.9927688257466, 397.2605452979271, 389.1559679353388, 382.7891594996935, 377.6171231057423, 374.6422083781513, 372.7233971780268, 369.5861169227357, 372.67206121459697, 374.4958900917367, 376.21347998366014, 374.6195240956272, 374.6387532392352, 373.8904835458295, 373.7200649797697, 371.4102838753502, 369.0249342242784, 367.3191915797528, 366.5267539974323, 373.9580693373794, 370.2258070242764, 366.345727140912, 361.1100945753968, 367.93152062776215, 363.71432754162777, 357.91154072439576, 355.710753919779, 355.7087101129008, 355.0899099483875, 354.74992110066137, 352.16224143082786, 342.6355313144258, 343.20321961704354, 345.9846799939309, 345.1288076239496, 343.7613344188453, 344.0019302058824, 342.1916705000778, 338.4801314645969, 335.8185780229225, 332.73969250085594, 329.05247063655463, 326.14291249898787, 323.9076613280423, 317.6614694897993, 312.9481232978524, 305.05221072089944, 293.8376815857454, 289.80683095168064, 290.65905119452225, 290.0507738411142, 293.1418932446312, 294.9876637026059, 296.7170990568784, 296.5610276179584, 297.2388032386399, 297.69943513982264, 297.0902898516184, 299.5267733512294, 323.1603930532991, 343.99013331683784, 362.2999063462496, 382.9103863722378, 400.2686096825125, 419.3072615469188, 438.6698702213663, 458.9232817225336, 478.2357651293185, 485.5622939476346, 485.14910589215685, 482.6242910294117, 463.6373110146281, 444.0858083811858, 422.538441521164, 399.9574068319328, 379.3681563995487, 358.5184597432306, 337.06022536297854, 316.16590899027386, 294.6535698425926, 286.7060306756147, 285.0216972619048, 280.9910634104445, 306.9349350147837, 323.72482454365075, 339.937097553766, 358.5009786537504, 375.0064473607999, 392.1271211021631, 409.8401267874261, 426.8623378768285, 445.0670683581544, 456.6657739426548, 456.9400119976658, 454.2254846936664, 428.9849215560224, 412.22375276167134, 396.4129118971366, 379.1610746984904, 365.1069044971956, 347.68103107529174, 333.072690651494, 317.00520451929657, 301.8655205629474, 299.05037520704366, 306.0405257384006, 311.3338639489898, 344.12268980399944, 358.5466759730781, 364.6053855786648, 371.03514330648926, 377.91564841806735, 384.42373847893015, 395.1017593073452, 399.45764200062246, 402.93749744850993, 403.9963979071739, 405.7891112281079, 404.6989258636788, 394.722117330999, 398.8127919708217, 411.1726631234828, 420.4381817524063, 430.7251532969966, 442.7713016399004, 458.7231833137333, 474.9470985873016, 492.2926370161136, 512.7671502671957, 531.9188620019452, 550.7001250942882, 573.955043495954, 591.8086445648148, 605.315206901105, 617.3899583155929, 627.0413714817928, 634.3374487823685, 637.4061304501245, 650.390496488251, 665.4097888733219, 674.1138849957206, 682.0723961150353, 689.408700820028, 689.669701659695, 695.0234084298163, 706.0442928201837, 715.2494593585435, 723.3118411364743, 734.5775802164645, 739.0974760049824, 741.3203718059445, 739.1172465392158, 740.2207062165422, 743.3138681161687, 736.5854707049466, 731.2756118960505, 725.4846296841736, 714.3605292303921, 711.1486995324462, 706.96210733878, 703.972841590414, 701.9338751217775, 699.7644059225491, 695.2814975535326, 687.407823864311, 688.530572040305, 692.1232244736766, 696.9703684916065, 700.870931409586, 705.4275103853992, 704.9992429608582, 704.4461595447161, 697.1281009439153, 694.8608516218487, 694.009964890572, 694.6016452826798, 704.2569826305635, 704.3116791962339, 699.5331538274198, 707.1866199645723, 704.8160970670713, 703.7904126864827, 707.625830883987, 714.968778807423, 726.2228805830758, 734.2721096728914, 739.9250951031363, 744.467934578742, 741.861825007314, 736.2519538225179, 735.4023062614378, 724.7073736475256, 724.2111304044456, 725.1293904661719, 724.1050634302054, 721.7684686229383, 719.2164036032478, 718.7185373694367, 715.248613688842, 723.1241661107999, 726.3679609288049, 733.0321695635156, 733.2888011857299, 732.48925015904, 733.9870276637099, 727.5825063906008, 729.6378247305478, 724.6773132403902, 721.1284003954229, 716.5389613214286, 715.2273808371459, 701.7953120371926, 695.7773538197932, 694.0293233181152, 693.4818436092439, 693.6239183625116, 694.2859139937754, 700.1704754883287, 699.761407190919, 708.1604489183221, 709.6072629063025, 720.2789730133055, 723.0164709246033, 728.5658253479525, 728.4650870900251, 730.7041912022254, 748.8130183987985, 762.0587589574384, 765.6577417183298, 764.7650739347157, 762.5059570983504, 762.1803039858388, 757.8229041030098, 752.519182638811, 749.9135246678326, 745.6290460995274, 744.9211904859166, 735.9029798229847, 707.3664257821351, 690.8209437392624, 678.9842307765316, 666.9847347026922, 652.466514126595, 634.0427027590257, 615.9617539076253, 596.445560423436, 575.060944586679, 554.6545397781667, 532.7530368420479, 513.8014235054051, 497.79128705625584, 485.2059957253781, 474.8707002615157, 463.67831964737, 455.4834512958294, 449.4559148751893, 442.0244161667568, 437.7287177621, 435.8010756511049, 434.8951329850892, 433.6340868884999, 433.918651401883, 432.1244282101618, 430.0188692320261, 425.9903401292406, 421.7213114410104, 417.70908533380015, 414.8506668574541, 413.8092119673203, 412.8850388405695, 412.3143357961407, 410.4673773498288, 409.6702334329287, 406.531597028089, 398.237762148921, 399.9208675254435, 397.4320802624813, 395.40789340872686, 393.1453685945378, 392.13955960613134, 389.4124611052754, 388.31400481372543, 387.2559668495176, 387.0060953116732, 386.3292718681917, 387.2913797496109, 387.89655776042633, 387.8908446642547, 388.4599139256147, 389.1015104656085, 389.3965584419905, 390.0241478576876, 390.32107589061815, 388.06793490413946, 384.4365984228136, 381.2967126020736, 379.6073261494709, 377.7241648765173, 376.0876078017429, 378.2159978729205, 382.5983398706706, 387.1820499400761, 390.9474250407083, 394.39113901540617, 396.664871483738, 400.81185555438, 403.9992117575474, 409.83804855516655, 408.6953583183162, 405.45499062667295, 400.3659680613912, 402.7745083258423, 393.8298635587069, 384.5645621077653, 377.1819464478613, 370.8651357285988, 363.79183514275337, 357.2581439442085, 348.46463193692693, 338.12162926929665, 332.7340002948568, 330.6643477799281, 326.8793567273803, 324.5913307405073, 326.59476845969044, 324.9956148672626, 323.0079562665314, 322.7667215450384, 321.41733499879376, 316.2624838547892, 313.6211254233441, 311.71800356577927, 309.17961395567244, 305.6448340822489, 298.95823982660824, 287.85792242521825, 282.45555638564, 278.1445586902768, 272.67899487154955, 268.47397262163474, 264.9614875463412, 265.6638784844427, 264.9483493867603, 264.06811780651304, 263.2861144584533, 262.91776922478994, 266.5179477218332, 292.665183698724, 314.97255296848743, 335.19781950520485, 355.798900377451, 375.9642900534548, 392.73262685768753, 410.0188495243543, 428.7617158720043, 447.98332790079377, 459.6724536413788, 461.8441384083411, 458.02633246677567, 435.7454197376284, 414.1161096037193, 393.4157305071584, 373.29553780283226, 354.61922911671337, 337.22058962494486, 319.44404972603485, 301.2740745087924, 282.29515579186113, 272.30646925186744, 270.01340436399005, 270.646571491441, 302.79857412418306, 324.6545541104887, 345.0146298892779, 365.124197774432, 381.789235029334, 399.997960279723, 418.23609817678187, 436.1246299256147, 454.5405780946156, 466.7269354428882, 468.18055307375903, 463.0044513175381, 433.871021646981, 412.1970209924525, 392.7571067705416, 372.2354324767352, 356.8002461174136, 339.4038575803001, 324.90052016310693, 308.3727828752334, 292.2800968952692, 283.7078494690282, 285.4606816969344, 288.681439278478, 319.4257324512686, 334.2880316960846, 339.178042543562, 344.68504138117675, 349.51919862071406, 353.92386320154185, 362.03406543807534, 366.369282384924, 373.4054377774666, 380.37505968370687, 385.5868542655657, 386.63688631444535, 372.05218739534575, 372.364546989807, 384.0375924140024, 393.83710507368767, 401.9221513022098, 409.60327914192345, 422.30706213407007, 433.2886467551275, 439.452337334272, 449.2525608571979, 462.05492327463537, 473.3171016997725, 501.8376349530035, 515.8792011469034, 525.9981268178493, 538.6361205254526, 553.6880075788204, 569.5705141108776, 581.7357074754902, 593.5276796731242, 604.7881484252367, 613.2691762093059, 621.5943621648763, 621.3283983877354, 616.3238923644569, 618.3807837089948, 620.430941790495, 621.1531282062856], [548.8564619270153, 543.3340143806412, 547.0094002143635, 551.5211211464364, 554.9069953519297, 569.9072934127762, 571.2134927114845, 572.4667340741519, 575.6667571734359, 585.7601549829236, 596.0268555749299, 590.7430736878657, 600.913643416511, 605.1660401736843, 616.2872195966387, 623.4960635822441, 627.3841576818394, 623.3462383833645, 623.2940907275912, 624.0450623101464, 617.7072310671491, 611.0683649021942, 600.885044799253, 593.6799166886801, 592.2666168971289, 585.076129953159, 568.4748380395949, 560.806704719032, 557.4226313470192, 557.3962344197012, 562.9491691479925, 562.4232974442111, 557.9066267277467, 553.4638043412698, 557.5693211619204, 557.1857235666822, 568.1606051412232, 576.655373639237, 588.4399596625595, 592.8034837084898, 592.1413963255525, 589.0272151582892, 586.8920925178961, 587.1753864372082, 590.7402521150793, 603.5525065263772, 601.6554106442577, 616.5361922748988, 606.1458790748522, 607.6132071518831, 604.5810963631342, 603.914966889217, 602.0251676996577, 601.9323735608465, 601.9894530125051, 602.4300876071428, 602.5567236129784, 594.484868188531, 590.8488816728913, 580.8348893882663, 578.1630823746486, 570.629347441721, 566.0809383845316, 566.8906761183287, 563.0478805280111, 557.7941019439776, 552.0119309435106, 546.4264501253501, 541.7144353469498, 537.2530613993775, 535.9983110760193, 530.319109542328, 527.2673934509027, 522.8399932085933, 518.1851570382041, 515.3561885371926, 509.6107574074074, 516.0042720504201, 519.8978339056956, 519.9289831163243, 512.8270115385153, 508.903520530968, 500.7946061553844, 498.5679054118412, 501.29437146086207, 501.78933302746657, 497.90961627941175, 493.96762409656094, 488.5003973719265, 479.355619152272, 469.8533802677605, 464.8498289221911, 460.6387686500156, 456.7570030522876, 451.1427036431683, 444.42031001921873, 434.3633908129474, 424.7061871284625, 417.5180887244786, 412.1192462643168, 404.8047205652816, 401.31764665561775, 402.50649883294426, 395.9843269968876, 389.3871503325552, 387.2355248382314, 383.50233508263307, 382.4945129134266, 381.14552222300034, 370.342703792876, 376.147230005291, 373.54878109484906, 370.66037000638033, 367.9257441741363, 363.3272296749144, 362.7190792528789, 361.4669535570339, 362.8469602359165, 360.71375423225953, 361.2356957448646, 361.86229524004045, 369.615541151276, 361.6934621710239, 366.2293079715998, 365.7105914046063, 367.8907708717709, 367.919081605042, 366.26288143775287, 365.98903324992216, 365.7178065227202, 361.0926021088378, 356.73850057625265, 355.3706452215997, 351.68196506255833, 346.315900488562, 340.1170385437286, 332.6713513093954, 329.10398283512296, 327.035653788671, 322.4857857216776, 313.5872514536304, 308.0514122897604, 308.57140908341114, 308.2636599630407, 305.4991966988017, 308.9458758653906, 310.99174537309364, 308.68193570401496, 305.63451953903063, 304.3096665590569, 307.09151158341115, 319.58037309095863, 323.20307771086215, 326.18219716106444, 321.1802227553688, 319.2341914354186, 316.9974544225801, 311.4041649815593, 305.6095230843449, 304.273374256536, 301.5268228390879, 300.29708800474634, 298.62586009243694, 288.46625070339246, 283.20314360558666, 294.92006277583255, 290.64131118790846, 287.33541128236845, 289.8725621441021, 288.70163234041394, 287.7059816784158, 291.3028800480859, 290.8326204460006, 296.5238247247121, 298.1409082538827, 297.132829286259, 294.19448422526, 279.1627399800809, 281.54986424361965, 284.6421421383442, 284.2897137629941, 283.29853659749455, 283.55067842779204, 281.0174917975412, 282.5371191016301, 275.62923773988484, 274.38825626455025, 276.7406551891535, 286.26532330563333, 291.73648672992533, 289.3449755953159, 290.12814440709616, 289.41074322774665, 289.86217602777776, 290.5181515479303, 293.1797928723156, 288.316370681995, 291.7089095934485, 291.6847884067843, 288.4053186871304, 279.9193872039372, 274.7963210577342, 272.3080346241052, 273.6137154068627, 274.94826970323686, 275.16922402046373, 271.7242498171491, 263.37738191479923, 256.11231879652973, 253.91201035006225, 253.0505409874728, 251.58165867250236, 254.1978674604731, 258.6398696809057, 257.7040515824774, 258.51854880376595, 258.2669353401805, 257.97833497136634, 259.3417661758481, 261.1749655300342, 264.5856998581543, 265.1052752551354, 266.2644342591814, 267.3543165477747, 264.1519770160286, 265.61410652225334, 263.17614374618734, 260.87089584228136, 266.13128337122635, 267.1469017636944, 268.35120114635856, 271.6401630098039, 268.847740133131, 268.3581927670401, 269.2136729727669, 268.1614367102397, 268.1541176566293, 267.9445890017896, 264.17876942701525, 262.4337484528478, 254.9765379036726, 251.0911859455338, 251.68119043860884, 248.42388326571745, 246.4508262816682, 245.27966441417675, 242.8134571346872, 239.73384974634297, 235.6596469873172, 239.92000272759103, 237.9978343621226, 242.20472613476505, 244.06786950350144, 244.46035959998449, 244.5287755259104, 244.29694577170864, 240.0816266951447, 242.79357946786493, 245.01290380220985, 246.0803985052132, 244.17581545362583, 244.154439303766, 242.06300483364456, 242.402463788671, 245.18253489760352, 245.60085061313416, 244.66349979863065, 248.8443732035481, 250.40801988064115, 255.1283582474323, 261.43838961998136, 268.82569989744786, 268.5154784520697, 271.32191766573294, 270.5812987282135, 268.8268641992686, 277.9547653597884, 293.14886853859326, 293.5043244304388, 291.16514343829755, 289.4814282911609, 291.00307132150635, 292.4619024035948, 288.7524504412543, 286.41623069109863, 286.63369873576096, 290.01017615880795, 292.9406245830999, 284.23373944117645, 272.2306811305633, 269.77189984889515, 267.499035390056, 262.43042424361965, 261.37673130009983, 263.6928047685185, 265.2310449170557, 266.2351654537037, 269.5234719138305, 270.3621906864301, 271.9541593368347, 274.34344657741985, 275.9825487051043, 277.541241667367, 283.79628165040464, 288.85439917374725, 293.4443910632586, 299.81989139309053, 300.3079109380641, 296.7346807127114, 295.243905356676, 290.7236033593993, 295.7298267570806, 299.9258726167912, 302.34893469047614, 304.37081561344536, 304.5337440084812, 301.01507210395266, 297.033803923825, 293.126028648226, 293.11554994740123, 293.580690456427, 295.86958605711175, 294.76202187215995, 287.980467888033, 295.2429096289287, 294.5301528361345, 291.3496792999534, 286.2215240580455, 281.4251376846405, 281.45084949260814, 280.07654326073765, 276.21304098043566, 272.75250330322126, 267.6666496283847, 263.46610035613134, 265.26850336679115, 261.1176664591503, 263.32367826416123, 263.86351078431375, 263.2624182120293, 259.4282693691254, 258.7960082765328, 264.7987383751167, 270.1047120878462, 273.5373742942733, 273.3173511008404, 272.435796812714, 267.8675986335979, 268.97085680329906, 267.37317363515405, 270.3737317370059, 274.6298931636321, 276.88463741713224, 274.7813357688297, 272.97144956185804, 268.67223426122393, 264.3403163117025, 263.9624721277071, 265.8940313681528, 267.6035572813552, 267.7334053801273, 266.79381485726805, 261.5138031265436, 257.30742318480264, 253.01289903342052, 256.10288970910767, 258.7605812572165, 260.9383124059291, 264.72799107741986, 267.87636508006534, 267.4531534794584, 263.9011147386399, 269.2761860702614, 265.4408657069717, 264.81752181847185, 264.6931587513228, 263.7286453237628, 260.8291578134142, 263.03101638134143, 264.1202226015406, 260.8734998511516, 258.8314248244631, 254.9219906038749, 258.583343786648, 256.67326601120453, 259.07654021062865, 267.7851957371616, 271.21888292647054, 269.62043918643013, 267.1224624207905, 264.44437328976034, 263.8798830218644, 264.2484603339558, 264.24133255571115, 261.3513354975879, 260.09888499361705, 259.97935558683275, 260.25962865102707, 253.2221851408341, 250.04660537169315, 246.78026833099904, 247.12551646646435, 247.729171706038, 246.86680471895423, 247.085865609944, 254.1958178313103, 254.53188180026453, 254.8146056408341, 254.0561282180205, 252.99043965919705, 252.7080348319328, 254.5034888582322, 254.9828902775444, 253.40409384523807, 259.35156587620605, 259.8145818203393, 255.9917101480645, 254.65844291672573, 254.7386137299253, 251.89889841456585, 260.0041291601308, 263.88015565445073, 268.2845684404762, 271.71143300015564, 272.11001094646747, 272.6551696163995, 273.8612038792406, 273.58814067016806, 271.8387122933396, 272.0632590026455, 271.57704320066915, 276.22838980656707, 268.9505749800064, 266.13051867499223, 263.31107098506067, 262.607965510582, 260.8644334452225, 262.9313278627451, 261.7072530418612, 260.1858425606132, 260.11538315904136, 261.4638618947245, 260.17796549618737, 258.6127394563492, 262.37180500023345, 259.7522505290227, 256.7372701033303, 255.0530554214908, 254.95849601548397, 257.5529597406629, 260.3315564147215, 259.74742769296614, 259.1899466209916, 271.94394726042646, 268.0825285922035, 267.32406073330674, 270.8874471276066, 276.22844495930593, 280.0737674973545, 288.87132094117646, 290.75167998482726, 298.3657760280112, 305.3836426750701, 310.5769260044351, 311.6842781488484, 300.3841559503579, 299.3289030472981, 291.7476042493775, 292.40686640157173, 287.5633364324619, 284.1676362329598, 280.9366798366013, 277.9358593542639, 268.75687727194145, 269.4055253839091, 267.3315235927888, 265.0230935894802, 265.0344673706038, 265.94898924688766, 270.50547590764086, 266.0863918124027, 266.39936509593844, 263.01669071272954, 258.42273794460004, 250.70093589737004, 247.8270792745098, 244.7954306540616, 240.11885074371827, 235.94923873474943, 230.76841845121385, 226.0968261877568, 226.60285518323997, 228.65652548047, 227.0723467942733, 228.7357118867881, 225.56852733846875, 222.5823048140367, 220.86011538017428, 222.1574257053377, 222.3512534606287, 222.43534282882044, 229.17129365390605, 230.6719046769374, 232.58057013624335, 234.55064234547152, 233.22264088126363, 230.8711855907252, 230.581142833878, 230.6316799706793, 232.77285660908808, 234.304328978836, 236.6747333554311, 237.7147816690009, 236.7649767187986, 233.86760954520696, 228.0733374825708, 232.52194511546844, 237.4890854270931, 240.83721466837844, 241.62589556427017, 238.5635610172736, 237.5695123578431, 235.8455320992064, 232.58709788935576, 231.73115969670087, 234.7149251774207, 234.6361715258325, 234.7139808703704, 236.2425866637877, 233.6516346293962, 231.59947055166512, 230.60773624284164, 228.1222983832088, 229.1256613222845, 236.0516715575008, 239.32990033496736, 240.75049152769995, 246.84725521238397, 249.33664804699657, 253.25602421973232, 254.32329823148152, 253.8642068863212, 253.9665092440088, 254.48718859757236, 255.8766611219265, 256.22334852738874, 255.9482727566916, 255.06303724091228, 247.65152904271707, 244.2131942446312, 238.9504547990196, 240.32863918868657, 239.5857876567072, 240.3882250758637, 240.3505271377996, 242.8883783527856, 240.8386129301276, 242.44273589123543, 242.52727005431063, 243.49537453929352, 242.62737790087144, 244.4808172528012, 241.88129859352628, 240.64982345347028, 247.1080026686897, 256.5523159889511, 255.66198059126984, 254.5182909701992, 253.1752954548708, 253.9017809079521, 258.05882123218174, 259.08550558597886, 259.1484230400716, 257.969880398615, 258.4276037067383, 261.3403021325864, 255.4651044642857, 245.1297593562092, 244.82744262005917, 245.24073935371925, 243.7112133532524, 246.2625487738873, 248.02414930656707, 250.24369391036413, 250.2788082004357, 256.25827054053843, 255.47306617966075, 257.62095550474635, 263.8017998593993, 271.02061648334893, 274.34154014863896, 279.72561811393933, 279.9381099327896, 279.7316704156967, 277.92817739180595, 278.43748911023795, 281.3881134934065, 283.26128064152414, 282.2026310705384, 281.97700302087696, 280.0552873177798, 279.0717607331933, 279.35239115056606, 278.55377815966386, 277.6136406430076, 279.38505551914096, 284.48862107897605, 284.30188099984434, 277.4339574388422, 277.95397022486776, 276.9873997815904, 280.1222785511983, 286.5583835298786, 287.1300655349362, 287.6523864779801, 289.0361933979925, 287.8640310100373, 284.3724149321506, 283.1905901241052, 282.4653235212419, 285.2454794351852, 283.03214422587087, 278.32611626563954, 273.5994102552132, 272.221215085123, 268.7855656636321, 265.3987622646995, 262.7846213770497, 262.20551678376904, 263.4613024199346, 266.8285668472612, 269.1793542772332, 269.4587974538593, 270.85993391573294, 272.3551720182851, 270.7566510308901, 271.9903009156552, 273.0061188466629, 273.09473712924057, 274.6827179056911, 273.6528925387488, 276.08908094436663, 277.79586623327106, 275.3226864070184, 273.07385957508563, 272.2445451672891, 271.5117188895113, 269.97383286366386, 274.7975712492997, 277.11354295279205, 280.4306101655774, 281.2728152885154, 280.9001671448024, 276.8877113191721, 276.27776014052284, 275.4172179687208, 274.74815899400875, 279.1879582161531, 281.5536266645658, 277.2677704558045, 279.8249733004202, 283.0034329589169, 284.8866968357454, 285.5551464809368, 287.32854663297536, 290.8887245563336, 294.29855583644564, 296.01294161725804, 295.7455695923592, 295.2505455991285, 294.1340242853252, 297.51551140834107, 292.6077187660286, 286.49048868837536, 281.4137133039994, 280.79308686142235, 274.812931468643, 270.645401782991, 269.03630002552137, 266.70967710597506, 264.88903680003114, 261.69434111492376, 255.2695669680205, 255.8106080169623, 260.5969566845628, 262.74169501120446, 263.8394431606754, 260.69364947066606, 257.41478631100216, 256.42066113523185, 260.24993367950515, 263.9895060763364, 264.0561489032835, 270.07660801867416, 269.2045455597572, 266.9843254099751, 267.2508106440243, 266.01604178906007, 263.5177897062714, 262.7933910343916, 259.4830397482104, 259.7349772509337, 259.9076418397915, 260.71801731652664, 261.2013373846094, 259.0807326311041, 259.5431228145036, 260.06457670191406, 269.7609756914877, 270.1884175177742, 271.4038942998755, 274.5913818392468, 274.9900588467943, 276.22876459835044, 282.77142694957985, 284.5696492046374, 281.8611215175848, 280.4863334980548, 281.3158654453781, 279.24259478127914, 273.110835207672, 273.5982144956427, 274.1836116007625, 275.4278021718799, 277.3901878009648, 274.2836132587146, 272.8432121532057, 270.73598438359784, 273.33451062013694, 274.49051370689386, 272.00662325591344, 271.2368565447401, 271.5486337460317, 272.31277763429813, 272.1246649026611, 270.31518713764393, 265.96226616892113, 263.18944305936816, 263.0480762886704, 264.6784777970355, 258.9579733924666, 286.7366787568761, 284.89115967229804, 279.7953931614772, 282.93756130401545, 278.2212385129552, 274.9409622826651, 279.6744873769063, 280.51397779357296, 287.9330377508559, 289.91646033688335, 288.98242954474006, 289.4724218606442, 273.83386944992026, 274.47613141223155, 272.43703945697166, 276.2813842229225, 279.613031318005, 282.261402177949, 281.97131043129474, 283.3908447858699, 279.1490854377529, 286.22630384803927, 287.24524453236853, 284.6320571480703, 281.0082362238562, 284.6220313573763, 288.92649779909743, 286.4042220542328, 285.11077152093065, 282.98557533691263, 282.0490091314284, 279.844311971522, 279.38741763017424, 272.489917282991, 269.4232597010582, 267.4022227336601, 265.8321618709929, 260.10462358644565, 259.4671236825397, 259.57299996086215, 258.41044044631184, 260.6526000645814, 258.3674704534976, 257.451555133131, 256.9467630140834, 258.37724888266416, 260.34702406862743, 259.7645451415344, 260.3066824362745, 258.2012226601307, 261.0143125954715, 261.724635470277, 262.9865061059757, 259.5013254889511, 257.278352104264, 251.13834251556176, 249.65130745294653, 247.59003904225025, 245.86849739651416, 245.0561017661064, 247.56549795315905, 248.25616953711483, 249.89921319460004, 252.04373849610957, 251.64737741168693, 252.7737561255836, 253.9661462074385, 253.2371603530968, 255.75549712365972, 258.5973628992375, 256.934041265873, 256.0771547528789, 264.22434785589786, 260.8302057353719, 260.00994970245875, 256.4673854960318, 254.94843572424523, 254.3440313304544, 254.09888887986304, 254.8091311552288, 253.5291447900716, 257.14012762877377, 258.4307535157174, 254.6447254424214, 267.23126614635856, 268.2140706952225, 270.7777481665702, 280.0611839732312, 283.9422715030657, 285.1958792257217, 286.30322014617525, 288.34399921742767, 287.9359819402555, 294.38117421280737, 299.40472377956746, 303.2650209383753, 299.7370135120604, 302.3642171952212, 308.08191198513845, 315.31041150155613, 322.0443722949736, 330.9968518148149, 340.667148617411, 345.4628798069561, 352.2884531111889, 359.45418540608466, 364.9123940890912, 367.2466802938064, 378.5619404668535, 387.90055853548085, 391.5287687860255, 404.80501705042025, 421.9302966177658, 429.7506010967164, 437.66689685192966, 450.31259275840335, 460.81145289993776, 474.17366327419865, 491.1426494919857, 504.8099938546529, 525.2392488558202, 531.4174809264706, 544.1958139779802, 551.4570662139745, 553.8501122315469, 568.0740097448647, 576.2928543270309, 582.0787452200435, 589.5081265471982, 594.7114682438531, 598.2411050315125, 599.0820368179991, 600.0333834292717, 620.0498301513338, 618.8846623755485, 617.39400896662, 614.2888015846561, 609.5944599188539, 616.0251620201524, 612.2373543430595, 605.7414176138935, 609.6377111673669, 607.3312084347183, 600.5538719365858, 588.1389124077971, 570.6681561500933, 566.9488568166043, 567.8072983092729, 561.4083030000706, 552.9601723238407, 541.9942683376822, 546.5921619110644, 545.4670457006691, 534.3138718068004, 531.7539221897758, 525.2690077629941, 526.286715886845, 526.1104218641859, 527.2613172012916, 533.1277596116422, 542.1315086835511, 544.5862025452848, 542.9630121721133, 541.8489979025833, 544.6034681252723, 556.3620894807606, 558.9356752978381, 566.0601656581855, 570.9953446667956, 573.5223348790073, 571.6855622080259, 580.3220736582633, 582.9678573551056, 587.3366295771865, 594.9664297874261, 592.5725005548553, 597.5329483035202, 593.2375528679058, 593.8674189568939, 593.9936627205103, 592.710664176704, 593.1608137460316, 586.0234390734515, 580.2996237342048, 575.3583800852784, 573.3820262554466, 571.9407973069094, 569.3496830289449, 569.1819768976812, 567.9701977767662, 568.2311711907873, 562.553348760791, 557.3734903218177, 551.0574868301433, 557.7749126789605, 554.6084193878773, 555.9904382084501, 558.4930092774063, 556.6772631241053, 550.7888722365676, 549.4350661686118, 554.3321602010316, 557.176138389667, 574.9956121541198, 578.7121535644258, 576.9365114371888, 571.8478559561157, 574.0987039568939, 568.1038290931372, 562.6500187239341, 553.8551280948387, 544.9572193513072, 531.3572287982415, 525.0437600668379, 508.8390889559602, 478.6400763359496, 467.8262574971859, 459.739585767258, 456.3859120698594, 441.94397941129785, 433.1337386994242, 419.849331713352, 414.420920143324, 412.1659976269063, 412.8894982997977, 402.79475485550887, 397.4615310695612, 393.8433092485994, 394.307466019141, 388.5799800312791, 381.04418023334887, 377.0191468192499, 373.4278458527077, 372.3514288300654, 369.41576683691255, 367.1685268439932, 367.0755213730936, 369.8166936944445, 369.5055425946059, 365.3587582862589, 369.0049168105139, 371.10778996234046, 371.1444460734516, 374.0534748508403, 375.0166693248522, 372.2999525995954, 374.7325477962185, 365.7088518773732, 362.5134669697324, 360.0323655645068, 357.38744773117025, 354.8328466296296, 354.8559373217397, 342.12940420969494, 334.8405644351787, 335.039809529334, 331.5655413780734, 331.3773470149393, 328.0156264368191, 325.12066020728287, 322.520043561469, 326.49194550420816, 329.6816965881575, 327.13506937837815, 319.636184370915, 321.0914748625117, 323.09934145642694, 325.4279177559913, 327.83904746732026, 324.7048065167289, 324.5473198992375, 324.637916714597, 320.7979887089169, 320.26372597611265, 318.357567960162, 319.9749012815126, 326.1141137125739, 326.0903787815126, 324.020602114379, 321.78441240740744, 320.3071194178338, 321.6866822244009, 324.55360865172736, 328.5789654951726, 329.60546457306253, 327.8011962053377, 327.1137926100996, 320.58924088554306, 332.9074428839092, 328.60230563198587, 328.9437310381263, 332.6249653819639, 332.35248033815753, 330.5829980204566, 328.55316413601, 326.909818462107, 338.7270764713663, 345.56549029046056, 346.843002171802, 346.4348093846872, 340.0445676467476, 340.420375035403, 337.6501930267662, 340.625622664488, 338.4429811203703, 334.3572521232493, 333.53422013304606, 328.2765892494553, 318.0937404659138, 315.5065462040149, 316.3479413863212, 315.1558100823957, 307.60449894903513, 303.57057982555244, 303.5651494412542, 300.63476615196663, 301.3591143183162, 303.9913631896981, 307.46076326516624, 303.4843952517118, 298.98051441511046, 293.0142266026299, 289.04391821210703, 288.3620574964986, 288.78792542756, 288.3576870670661, 285.8630838154373, 282.46174575816474, 278.5702400835668, 275.0459257701525, 266.00252614488016, 260.4359770424058, 260.36966631761595, 266.37174933450046, 269.3642951567072, 268.09443119763466, 270.63490358982943, 272.1927596357765, 277.2736754579832, 284.14500567250235, 287.6388684918301, 291.8434788395885, 298.4222232111734, 305.070913291939, 308.6011357724868, 310.33055916977906, 307.5351005090226, 305.25988643923125, 303.2226109992997, 297.6152515134609, 291.8757146623872, 296.4595673345497, 297.376335041063, 297.326419664488, 296.43746305493306, 291.56673132384, 289.1015681480204, 289.53153317117955, 289.94425648141794, 288.7969951552288, 290.38750869679296, 289.1161374881731, 286.84597914954867, 289.2070174081855, 288.818621200358, 287.64836156800504, 284.14873306691567, 280.619243053766, 278.3473429101307, 281.6696905620137, 282.8087375169624, 284.9246284459228, 294.651928468643, 300.04687604497354, 299.5554637386399, 305.0544929091192, 309.6344149577497, 315.6888946276066, 319.9265929737784, 322.4527080759416, 322.1007023661596, 324.22675582703084, 327.6588993304511, 325.8574263128903, 327.2461472399036, 329.6146523858543, 332.08269428776, 329.46252674058513, 327.95341564674754, 326.3765576847961, 331.34106611904764, 336.8716772477422, 342.2935917791005, 355.8765018935575, 366.6686154982104, 372.4817796763928, 384.0590670131387, 396.54701043464047, 405.5131032798008, 424.4405999882508, 448.5693884948646, 462.30694251898535, 473.1619451617647, 487.7543072727202, 501.8591066002178, 514.9737294111422, 521.0178797123406, 532.0862580751633, 549.2706698807967, 558.1336583267196, 570.6612583029118, 580.9881810405384, 584.4348985624766, 594.5208248169935, 609.354616042406, 622.43337083177, 630.1125095553998, 636.928134838599, 644.2427476521165, 648.757239643713, 656.0679643787739, 668.1968072359945, 668.7695155470743, 670.8774182878152, 672.2080650047743, 670.3696782367725, 669.539984848117, 660.4001338457789, 660.8510405040461, 656.3401624129318, 656.0698426139122, 651.6876456816059, 644.1307311943665, 631.526093254902, 626.0877278516184, 626.7502016202149, 623.0798238075007, 617.5501410971833, 611.0568153476773, 606.8026821588468, 595.4031763141145, 597.4488864039059, 592.8209649176005, 587.5118870938376, 586.2612999389199, 587.7409042067383, 590.3506073436655, 585.8248552720198, 586.7336445750078, 589.5361806625427, 588.9808013260192, 597.4431952188764, 604.3204730197043, 615.0756097567695, 627.7928041507159, 633.4459972380175, 640.8414086311857, 640.2892867600475, 641.3657897173456, 645.6522994878401, 646.6914997375916, 649.7788906032656, 662.4878069598267, 658.8526064999262, 657.5328711690171, 649.3133638509667, 638.4534099971211, 637.122372000389, 632.5931018705882, 633.7127882527233, 637.1865127482104, 635.001319951992, 635.9322087840026, 636.5930857817339, 627.2465551049643, 625.6393119814037, 631.7933385136165, 634.4272061543728, 639.3209400641924, 639.2174790225308, 637.3609226395369, 632.8523651598593, 629.2333102604399, 638.2409924090867, 661.8147436341819, 663.285548358642, 663.5233381668277, 664.7483228035325, 658.2575269805477, 655.1830284846715, 651.8042700706505, 650.6949078965752, 650.1643679698102, 649.0992580933265, 645.6709365662155, 639.0375323729193, 606.5132671544505, 594.247889248833, 583.7730797220665, 573.1625881120448, 559.1357623670245, 560.6977045768411, 551.7942079379804, 538.9858861228603, 526.5199623656416, 514.0232153297541, 507.7994037623716, 497.1517405757534, 489.73601656660446, 484.14140228018977, 476.2397273439646, 467.8328814399315, 461.9614963760504, 444.5704830809044, 435.8682521903984, 430.02360660473073, 426.2230594185127, 417.1724078899762, 403.2948444558824, 396.8445007762994, 391.8785581387332, 390.59943981263615, 386.4357819158108, 381.0656726998132, 379.9824532417522, 381.91644149159663, 379.7226343169156, 374.74670625075447, 374.7270577282913, 373.76362201335365, 375.5848635188531, 377.18509960006224, 375.3616061884928, 370.3752262203548, 374.4150120436508, 374.3366710855897, 374.39114720269225, 368.23078094677874, 366.9573469946519, 364.7267748589642, 364.7418903758367, 363.74203457026135, 360.13671144475563, 366.6624666494709, 367.4988348507625, 366.4749039005602, 363.103773809446, 357.8588815319794, 360.5862375469966, 364.60768732531903, 369.0268442948964, 368.4370813501374, 365.4258561041233, 363.2138811655773, 362.3868210434173, 361.2249407572362, 359.7647820485528, 358.8123166926548, 358.39623462012975, 355.96508938149174, 355.20546875513537, 358.99686921249605, 355.59545518459294, 359.45703470014155, 365.3215307970744, 363.0066802065048, 362.2255019273264, 364.21830402552126, 363.5181210711174, 361.6397945790538, 359.1134794211018, 359.9774695404784, 353.5272639889511, 352.2178306357765, 356.1019732702303, 350.4925291027644, 361.4756069090414, 356.3159643323218, 351.97709317717084, 350.99525316075324, 348.2719275038918, 344.74334074166933, 350.883769166406, 347.96171409095666, 354.1571168053623, 351.7037520217086, 348.5829883753501, 344.8395600014783, 335.8671175037332, 336.21138530547773, 331.3240984808181, 331.792784219888, 328.81276898294266, 324.64739090164625, 319.7201381804362, 320.400959048864, 314.96187832018364, 319.74639145393706, 324.708645399301, 325.5471442500778, 319.1270214407875, 320.0899191254029, 325.93526658924674, 325.8621467878929, 325.9004697514006, 329.34534160603766, 331.1955022006692, 325.5294895047463, 318.68110372595703, 314.0125077212107, 304.9865319724557, 300.9124658774339, 299.11798339005475, 294.066226426704, 285.84832513678805, 290.6516088754209, 292.4958894728447, 291.73358590787427, 286.6758449834267, 284.834809212204, 283.77961294366634, 283.28422065505026, 283.788162991052, 282.4201630723297, 284.1137560857936, 287.28488118759725, 288.7067828592437, 290.16087567366947, 288.8164585558413, 287.6065191039527, 288.0633479465453, 291.87274051385, 292.12727340561713, 295.0699909926081, 295.64689650894803, 294.50487685050973, 293.24548317149083, 288.55587229699654, 281.037255402272, 284.55455709484903, 284.9142383678254, 286.6188673607999, 287.1560711381108, 280.0751059801587, 278.23464686142233, 279.604077524432, 281.1809940224868, 282.3574634705104, 285.695831003268, 286.88265974736044, 286.76583723210393, 283.8565793267974, 283.5091854978992, 283.42360145206976, 284.67572375778093, 288.8107622655618, 292.728889563103, 297.9484954921413, 305.0759729584501, 311.9899086816059, 319.3637994808591, 320.52341936990354, 320.8505647302372, 330.7122307164644, 334.0065512425304, 335.0985035191008, 334.25979218705254, 330.8385467022856, 331.06902345073007, 333.53742140624024, 331.076575398615, 323.7475063562408, 328.39132575809214, 333.478230692577, 335.5180125444361, 340.1892797059205, 343.08898029582946, 348.54951231465924, 357.5333346769374, 365.0735677756257, 369.8295465797541, 378.1228328839869, 393.26699508652354, 398.86471034446646, 407.8474057587923, 419.0746366446467, 423.9298292950513, 434.7710207055712, 455.02558028765696, 464.54730994179886, 471.896699268779, 482.1975854628073, 489.8442542114464, 498.1441069737784, 501.05969234648313, 514.1394372884375, 523.741878127161, 530.6451519257703, 544.2200856076097, 548.1472065774976, 545.8061113071118, 554.5993535667601, 564.2986725613913, 569.5785515200747, 578.4294423938686, 585.3080896417679, 591.83033506544, 600.1497973135698, 609.1312687044039, 621.0525231239496, 620.6144302927949, 631.334465607518, 632.7497092506212, 634.0531624232028, 634.2446208465486, 637.4222970532991, 629.84300115156, 632.1854616977862, 629.5681164653084, 618.9110763894369, 609.4403239364757, 593.5335694252257, 589.012423658808, 575.5970577979302, 567.8047741271098, 554.6524188261749, 545.7239224101306, 544.7688700092592, 538.1943598656239, 535.9323870592126, 538.4559670616338, 534.3345800341596, 547.7813920150094, 549.7121526910233, 553.8800838942881, 568.9747089428884, 577.6944707349298, 587.84989081925, 596.3577945189271, 596.6665560908808, 604.0141979323062, 609.1604257121072, 600.759420294351, 600.6806515503865, 597.2643038554311, 593.0300205242763, 595.4323301562408, 587.81862232384, 581.958946057812, 582.2298843171226, 579.3786024651188, 579.8893381085194, 580.5043852163998, 578.8402540394491, 582.2566506080765, 590.1063736013851, 589.6863127660878, 597.159885059835, 600.4853671693122, 604.1663058282059, 607.2963127548863, 606.0474527011359, 616.5739225425019, 617.7709121511828, 624.8837944615624, 632.2422916480891, 634.9038560490975, 632.9965775299564, 636.1633560011671, 627.7037805923592, 623.972962878229, 627.2952555922035, 630.0460413220745, 627.3045800287114, 617.6910917533186, 616.2066713912743, 607.6546719236694, 604.6941724791116, 605.9704832772727, 600.9520558195611, 592.6253975943043, 591.2101699119204, 579.6764443485328, 569.3415427853253, 561.4120157465693, 554.3585482458761, 551.1327349341756, 539.373359034625, 532.884958338459, 522.9485893481169, 506.2599259390795, 494.3547355185885, 486.10139448941794, 471.8117742325707, 470.4557561133675, 467.61883671055085, 457.4287513150482, 449.4810782425303, 438.05784165966384, 427.6746978979925, 417.3763628522409, 412.5119226642546, 405.222087357921, 393.8445189191343, 386.5075632480549, 380.3995759782913, 373.518172108699, 370.3284775141613, 369.23390217685966, 367.5410829814815, 362.34106820010567, 360.11142253649234, 357.4049691806722, 359.39068644851, 358.7891607517838, 361.0646408473305, 366.16291366591, 366.0584139908963, 364.47695272541233, 364.3692910914254, 364.07864931349206, 362.8017542572082, 367.0564007001245, 366.2008483883442, 361.0489161703185, 360.43756482819794, 360.9401004452225, 361.3891695286901, 362.351799099362, 360.310995675214, 359.57179889635853, 358.5293009656863, 355.99580360239656, 353.5703364830442, 352.13114036616867, 351.53053622251184, 356.0841324894958, 359.42188775575784, 356.83073371778715, 352.26444858932456, 349.61346892172423, 346.7461675517429, 345.7185481252723, 350.7797420774199, 348.97681157041706, 344.70459130189846, 336.617135237006, 329.2999979927527, 324.2505517920129, 322.17705288857763, 321.8572605082018, 320.89104487798136, 320.51143396817616, 317.1332298485839, 313.15875410018674, 309.98928495230314, 311.0430951960006, 314.5499235126828, 319.22323975879243, 321.6611921086212, 317.5121317920652, 319.37691753563644, 322.15751685659825, 321.5040119852163, 339.20692864682536, 339.5367578107687, 336.16962834967313, 343.8340203394984, 343.245881780112, 337.6053456607532, 338.1379590257048, 331.5014294829598, 335.192690803325, 337.88344759243694, 337.0377278267196, 333.5415893612181, 321.0137399125246, 316.5661368001518, 311.8360407642098, 308.8550011302879, 306.56488667303404, 305.6288466566699, 304.9603520325824, 308.88933166120586, 304.4497885124023, 303.9471756494166, 302.4197657838809, 297.4462170041033, 289.9343228366912, 290.99944557531904, 294.11211244140986, 288.89775975319014, 286.97118786834733, 284.913852049646, 282.5302808180828, 275.67735873132585, 269.9488598609555, 264.50054598225955, 260.3686412387955, 258.93992453338006, 256.93525109313725, 252.03771874346404, 249.6254866309524, 254.49092016472147, 254.46532975855905, 255.09126974961097, 252.73667821879863, 251.7816162584014, 257.50394020152504, 257.63508274284163, 258.9867474082633, 261.46347889355746, 269.49005368378465, 273.7473011353875, 275.3321175437286, 273.2920351118892, 272.55483278789296, 271.0553900326019, 269.12922038700464, 265.5791532739651, 265.5185482973078, 266.5497013985372, 264.17770815351696, 262.1201001064491, 258.2569212454093, 255.44052402108625, 251.70616457570804, 258.6926989020386, 260.5945665888079, 263.12292987216, 266.01979134718334, 263.2516176987239, 261.7311856411454, 267.2292919742453, 270.8827713006692, 271.0180815667062, 273.990629220277, 273.4510453515406, 276.8490529296608, 272.9909619042951, 271.487970867258, 271.9739153475724, 272.62568461360104, 277.8068675657485, 277.3073466308668, 275.87267110169626, 275.4964562246344, 273.40442776704015, 282.47135759897293, 283.71078860294114, 291.61653768993153, 297.7390435430284, 302.62352940375047, 305.0140832688298, 305.7112836060535, 304.03165413825343, 309.338165162465, 313.23531131971674, 317.69102779450674, 315.92967592334395, 313.99821097408955, 310.7740793820417, 308.7106262524121, 325.75953956543725, 335.688588734354, 340.9417581049629, 350.1973397351145, 357.1400448948023, 364.8896370337691, 374.8226742835856, 380.6661358199502, 387.6621249249144, 398.1390037151416, 406.13394813709925, 409.7522444677242, 406.1659450098039, 417.5811663114691, 426.02087925093366, 432.08502873333856, 436.3609592083722, 439.6673933509985, 451.2250048377685, 464.4360838640679, 478.055924231248, 493.58569299953314, 507.9309508928111, 519.4400711698196, 531.1609191483471, 536.1795843551199, 546.3845588151261, 556.1626739063181, 567.9727493431373, 577.0781049414877, 584.3511438312324, 587.0663152023031, 590.4163805669934, 600.0723540237317, 608.2957565968723, 609.4244739377968, 612.3866296403673, 616.6804373402583, 613.5625431918767, 612.3006295038904, 613.708217228058, 611.5544004727669, 611.8273721418456, 618.3185558953303, 618.7311572296036, 617.879079739029, 617.1411000969498, 619.3399862243042, 621.0750888192498, 618.1325468825974, 617.6460958787736, 619.8822974869973, 619.7951849919078, 615.08622320329, 622.2454970305012, 617.7481428210266, 614.0831194046062, 615.7634584981326, 611.025846335901, 607.3305893138032, 611.7175974567383, 615.7347334714066, 621.0987854850837, 626.7620705007002, 632.6397763355121, 644.3903130974944, 654.8848337705415, 658.4919407576252, 658.9907220096483, 655.7519117263553, 662.2365967845757, 665.3259554603953, 664.524074852473, 667.7404678169936, 673.5625283792472, 670.1113427576252, 664.5903937828355, 656.5510252893777, 652.2777743382354, 654.4165931721133, 660.9590915853563, 662.0464357533866, 660.1223207005427, 662.3339170863678, 663.254313034723, 658.3586890542327, 650.435555539514, 650.0319691662776, 649.5500740720512, 641.54207682493, 637.0079688994995, 633.7846820662769, 624.7881715298274, 617.208132903362, 613.0631637191098, 605.2678100911921, 600.256878415266, 597.3992910354809, 593.8033922450202, 591.5473330375038, 588.713662171051, 592.5768412211179, 586.2484455969005, 585.1395989362745, 586.7401286618425, 588.1322866878481, 590.6412677457982, 586.7311986637034, 587.2961632279801, 583.3121316629318, 575.871161565904, 567.8423465398738, 557.1711136858854, 547.4022002302294, 546.1507252668067, 532.3677953091347, 519.022905695456, 506.888031192577, 491.68223845160287, 493.8282935397603, 481.0564014817927, 470.9980990416277, 464.0077680982727, 458.1818088184718, 450.072050881497, 442.0312466266728, 434.3267137302365, 428.63196223934017, 419.585063390056, 415.00300038646566, 407.6452464063181, 393.3614167159197, 394.3982956778712, 393.9765920296453, 389.9113982255674, 383.9159000134609, 383.4265617985527, 381.2734989012605, 385.6811859495214, 386.3691575452849, 389.4283595668378, 396.6804029476625, 397.7092297432306, 396.073713989807, 393.051833147837, 391.24744580298784, 392.0120310294896, 398.5344918785403, 395.52969422408967, 389.326446773187, 389.1608600481235, 386.0828927331154, 378.4988439049953, 372.4525314586835, 366.7724695722844, 357.8408600029567, 359.8978461781046, 357.4330667746233, 353.50716093989223, 348.2781026335979, 347.74348290546214, 349.6614713591659, 347.15789706995014, 346.4511365284003, 344.7660288721599, 341.9170225673825, 340.10028391542164, 342.92456195183627, 339.0427549661408, 336.1998980453626, 334.30694537339195, 332.2759702445534, 328.3120314097416, 324.840182801276, 325.3133455730626, 325.00083844926866, 325.2914848164488, 329.1230293091347, 328.0429163237628, 326.4627141580298, 331.5615942589643, 330.19067444156553, 327.1958212149082, 325.5911401851852, 323.2440651731222, 323.5076490867569, 318.1687689001712, 318.0450319327731, 312.4526013169156, 324.6083559088812, 320.12040661299505, 313.6811211813094, 310.0025584252257, 307.9655967275651, 306.88944899976656, 310.0403123018985, 304.2380107535014, 306.71435271638654, 308.44089665608465, 305.24321993464054, 300.3752440262216, 291.2597333582321, 291.5387468736313, 285.8906362250376, 289.2122283988298, 290.302587211899, 289.43079656113014, 287.18325703051386, 291.0655619629446, 288.8462045258782, 288.4085008216153, 291.73158741175325, 296.3997744677197, 287.24603487511945, 287.3589757473545, 292.0345722616713, 286.1460300550109, 283.76574156528164, 282.9344743295207, 286.62906921584187, 280.010391994709, 274.53907047268905, 275.02523026276066, 272.9455470440588, 268.1364792982415, 269.7962543920013, 266.2457123309991, 267.4763873357454, 265.608502643324, 265.0304003637301, 263.73203438655463, 255.62092362169312, 255.0730168825085, 256.8324118425926, 256.1323540381264, 254.04844105006168, 254.05950506567075, 258.226756951136, 257.4680783309874, 256.34634239643634, 260.49755117032373, 259.0125516391224, 256.7450270494061, 254.4855750255992, 248.08970583146592, 245.36887446374104, 246.2404444229692, 244.1102227673514, 239.23549868168377, 236.88030442989415, 236.66358459111424, 234.4430168228291, 240.20966846218488, 242.95830910014007, 244.82227759644485, 246.29098558626356, 246.40863696988797, 246.74690515024895, 248.40893177917837, 254.6012373383909, 257.84369705999063, 261.3953802544352, 259.58337037815124, 260.36934475054466, 253.9365809039838, 250.0919835185185, 251.72950806535948, 254.7083831255836, 254.74838399081847, 251.87010369133208, 258.2662575618581, 254.55167702933397, 251.705263638033, 258.58757160908806, 262.1487352606598, 271.3030452542795, 275.1278332733427, 279.4789752148188, 281.40741941526613, 279.0407920219259, 285.6387908859321, 294.35208131151273, 291.40951298879554, 292.2498484911084, 291.7412547814735, 295.28067611012585, 295.5959461592127, 300.6740683920084, 305.2067317204326, 309.95693425552446, 316.86190859226906, 331.11207387278245, 333.55014812153746, 341.6144225653595, 356.8101366507133, 372.06689164612186, 382.4481686861967, 394.8939381623872, 403.7025479000933, 408.57920164114535, 424.9649272130408, 446.2374815570126, 452.7475564785247, 462.24695303618114, 469.16647673257074, 476.13827995611575, 483.7585532198102, 489.6434003643792, 500.952292717009, 508.8236426173904, 514.4264366184914, 522.1411404350997, 522.834623511432], [124.343697529723, 125.50823243038695, 127.63194229863056, 129.64849798739496, 131.2151925037348, 134.51104541487706, 137.2321719603175, 140.16972358837145, 143.6719316854964, 148.53868017102397, 150.3768428551198, 151.8257171478045, 153.35465759173672, 158.03137987970743, 158.0763994472449, 159.9811433103797, 161.83995465149394, 160.2638009833489, 158.50895552419664, 157.66692608473392, 157.84998161788047, 156.40114711072204, 155.05372230306637, 154.82035593360308, 154.13257871918768, 150.3716927348273, 148.854092685652, 147.45305661990352, 146.25006666744477, 146.4317071676004, 147.35142130480992, 148.11202734173668, 146.38608992919387, 145.5850569565826, 147.10475124626518, 148.92959730477747, 150.6250346493153, 151.4038875529879, 151.2313984982712, 159.615982497977, 162.63084176011515, 162.3392043349673, 160.55874107671957, 158.98847245323688, 157.85410457314038, 158.24070133854653, 159.202095863601, 167.91081257475554, 167.46526426112666, 166.94660506209152, 165.6258751927515, 156.6404248172269, 155.10093927643493, 154.81120056676002, 155.54517329520698, 156.19691760963275, 155.4039167590641, 154.56280660620914, 149.8292083590103, 136.34572515445066, 135.26696886651368, 133.33293459108052, 132.68973801455027, 132.12878145477487, 129.53186314422723, 128.73013103633676, 127.86445899224958, 126.64055319800678, 125.94936994257183, 126.18329237270464, 126.58556482617492, 131.1978241582633, 130.8568453818083, 133.42157024867728, 132.30684033932462, 131.3166233105556, 136.78782243062884, 136.51988735885467, 135.96234368907565, 135.12296997144415, 133.4022579970556, 132.74532747346714, 132.2616136854186, 131.79076237153748, 130.33009548479615, 127.87767980403702, 127.25602250941488, 126.54295429579965, 121.21142798482728, 120.54218269989109, 120.12435404143972, 120.10330902466542, 119.68076642474644, 118.6634512978194, 116.74162472313648, 112.68849416907874, 111.36380218938687, 117.96231317958296, 117.11633008775613, 115.98584348132586, 114.97948699369746, 117.09531635258912, 118.07676012394958, 117.1515476397448, 115.72550860519443, 114.56050822533456, 114.65049417086834, 113.86815854962718, 113.1721486135232, 102.49834672672154, 102.47552933893556, 102.0800145048864, 99.3073614354186, 95.81822879733376, 93.25828926447244, 92.04585893157812, 91.42034937877374, 90.42719038865546, 88.07002602746653, 91.2036305857454, 90.94974408862434, 94.50409006722688, 94.20641490320573, 93.3341122700747, 92.5136561434796, 92.02030337005915, 91.06268763322116, 90.64051640211642, 90.47301022914134, 93.08695848311548, 92.57333504846716, 89.3843868316598, 88.52248854217241, 85.78162740437288, 84.82844039215686, 84.96532374540928, 86.36669740063803, 87.79701665600686, 87.66323111350114, 87.82183298349284, 87.12356661787464, 84.4691130823672, 84.9248613673838, 84.86207209064739, 84.84063573280423, 85.92608045028012, 86.46363444047618, 87.48937684484905, 87.32582938079676, 86.66710763694367, 86.69389804030307, 86.36909193440711, 85.94714331955144, 86.21124269483349, 86.36122542245178, 86.2655275497977, 86.07907515896227, 84.82007474540929, 84.00057052182966, 82.99451794476865, 81.8310412708528, 81.18784766533355, 80.7171622500629, 80.48157907578589, 79.80834334230599, 77.20503813966697, 76.88159533232181, 79.8497272708502, 78.92489786313416, 81.63705758185496, 80.94515595894008, 79.66080938126362, 78.62154164284537, 78.3170313068083, 77.72096530921257, 77.55544748202615, 77.62147108325554, 79.21029981076875, 79.21562051276065, 76.62165274089637, 76.076262153906, 72.97828334749457, 72.96806661908848, 73.06235887651727, 73.31414671127712, 73.10978672603487, 73.11535884212574, 73.04833123778401, 73.00251953818459, 73.2801068616655, 72.14102583426704, 72.06655287612823, 72.07163877614379, 72.32557568075008, 71.94674735379706, 72.09608682874261, 71.60195549883287, 71.98494515943044, 72.10856755726736, 71.95297927731093, 71.89273712664935, 72.00639551984126, 72.00798254030501, 71.64128963001869, 71.3497875650087, 70.91176972961406, 70.68633700466658, 71.95369799704326, 71.7050804684874, 71.525672804605, 72.04322675396826, 71.99528546521942, 71.09689837130733, 70.59747317794896, 70.0153320692188, 69.79441453625117, 69.9572509404762, 69.88823349361968, 68.89743785673436, 68.10573862642325, 68.25813195182916, 68.50431623311546, 67.58620170035792, 67.50550368168379, 67.55213924832128, 69.40489559546504, 69.84038568347339, 69.8193885237317, 69.62052346366326, 70.12260306722689, 70.28122641394854, 70.45251311904762, 70.2382932762994, 70.09318690803379, 70.10557507749768, 70.06136617258014, 69.68269335901027, 67.91653561694677, 68.0863230157952, 68.28224121778712, 68.14793143028324, 67.75781442662621, 67.73258519024276, 76.28346413149838, 76.31251814184563, 76.09602942997199, 76.06011916735595, 76.01479705571117, 75.90199327458762, 87.85190346838755, 87.88927672414087, 87.4787468574541, 87.55098367468099, 87.35714737737317, 86.44212241350633, 78.30865893207283, 77.88427664363523, 78.0305649728447, 78.05830583372237, 77.98724392522566, 77.51613336904762, 77.25383871350762, 77.83661807477438, 78.25135699704325, 78.52373082062326, 78.85672354271709, 79.11669648570278, 79.91042834150326, 81.0328279507742, 81.45350920681605, 82.71913516627762, 83.17310441304727, 82.65531160269673, 84.84768831854963, 84.83761068969811, 88.54045323990819, 88.38706855191539, 88.44069150739185, 88.67525971304015, 88.5095826459695, 88.00345507336603, 88.10810728618114, 87.4862894929194, 87.714150893324, 87.23008461436028, 76.61068100638033, 76.85488983877995, 74.47252073552755, 74.97710529637409, 75.18221274844383, 75.18040580281537, 75.48063020206584, 76.32265111095549, 76.43315612316177, 76.33132814021165, 76.09737088748834, 75.50995281568967, 75.30445963849984, 74.74354611928105, 74.85319894257702, 74.75536246638656, 79.13442664518169, 79.00562152972299, 81.435213230859, 81.67377041549952, 81.92198997510117, 82.01600193471833, 82.05404396451915, 82.09357888445378, 82.05124617063754, 81.86061696467476, 81.34659704699658, 80.47119223934018, 76.28935958815748, 74.8456273925459, 72.69292719685652, 71.26424957220665, 70.58921785208527, 70.04785926562987, 69.74430880274342, 69.1149608420998, 68.71475842710021, 68.17174698809525, 69.01057402718126, 68.54603827877698, 68.163370239418, 68.20653649354185, 67.7710645278556, 67.82407362204845, 67.58448287807344, 68.59215571584188, 68.60908958605664, 68.21271487603343, 67.82145939978213, 67.47786509452355, 66.58140741246498, 66.48251851221599, 66.46465185134998, 65.89920495129162, 66.76674817086835, 67.29848198373794, 67.86298041884532, 67.035255949113, 67.2840076457675, 68.26756272675917, 68.11039889583141, 68.59599869623406, 68.88817743977592, 69.1395004282602, 69.13499258912428, 69.11443592328042, 68.9145766976346, 68.42782030407524, 68.17635338025212, 67.86930386733583, 67.38885575909211, 66.67357315044191, 66.47055014091191, 65.85545863335149, 69.58056871537504, 69.86439367335824, 70.26595030936818, 70.4545919141651, 70.51507050015562, 70.45112301953003, 70.53606035854341, 70.57327055198738, 70.6100989676315, 70.69255679637412, 70.62751962605041, 70.01695861842514, 70.04613060963275, 69.76945444460006, 69.40800641798941, 69.39618457689612, 69.94459860526766, 70.2889628515406, 70.38484878633678, 70.43751962765005, 70.56039763562092, 70.62241199060976, 71.81864208286648, 72.02940059621072, 68.96630282990975, 68.79606950295675, 68.44306921039527, 67.30273924050537, 66.29876644047619, 65.64702260107376, 65.30821521436353, 64.90474025357922, 64.82296267075101, 63.66958523209621, 62.927697474712105, 62.827415873744286, 62.228214460939945, 61.79478944981327, 61.62120754466231, 61.69487044843167, 62.5405667788671, 62.732265128151255, 62.85087357355149, 63.14002614045221, 62.97329186297853, 62.935276449579824, 62.220144219498906, 61.72060383934733, 65.37556903431373, 65.39916611640213, 65.47183120479302, 65.58106028874883, 65.02183303306877, 64.67092998218176, 64.43509256963897, 63.884184427326495, 63.64232628096795, 63.59729499961095, 66.40850806707127, 65.72200352824463, 62.95196194934641, 62.96478166565515, 63.12501754269375, 62.97483313103018, 62.65230354512916, 64.87995438173047, 65.52354894428882, 65.53724042289139, 65.42390005610022, 64.64660122267935, 62.18264239970432, 62.81665303976034, 63.35059238087457, 63.64024465763111, 63.866038214130114, 63.31855959749455, 63.45006290400548, 60.82227929839713, 60.92363357485216, 60.78243843021839, 60.92404616448801, 60.73835755314347, 60.58111729598505, 60.72814280071714, 60.02739373028388, 59.79722588624338, 59.75342338347015, 59.55143408078964, 60.2015778052709, 60.21096286873638, 60.59900437262683, 61.12085033411143, 61.21510970007782, 61.571395747665726, 61.749604474859936, 61.905964144413325, 65.67252508061003, 65.86623995778223, 65.53748261157797, 65.41430042678182, 65.15503870852785, 65.83954365118271, 65.46223416956964, 65.11224614643635, 64.91277664472456, 64.86563379889253, 64.2715740183629, 63.24639629467723, 60.81308145736073, 60.87694437612824, 60.79232431411454, 60.79920773171491, 60.68283792723636, 59.82796753175252, 59.7847899789138, 59.79211208290344, 59.88409874074073, 59.64336275474634, 60.36035264145658, 60.4963933331868, 60.250348142389, 59.86469619382198, 60.03399148124807, 59.85415178135698, 59.891377057812015, 60.49875730703392, 60.6038232579365, 60.8587091330435, 60.75981839915967, 60.51015119467787, 60.483512017757946, 60.41308473008092, 60.34404692187987, 60.43240347300032, 60.52287334749455, 60.461471820183625, 61.0993523225957, 60.96646121431685, 60.7180039968864, 60.9927082630719, 61.22839896257392, 61.139012619281054, 61.04506819779024, 60.869731936741374, 60.80711669750886, 60.67605689397832, 60.73040556707127, 60.21126321311858, 60.36260659889511, 60.323370321662, 60.20387680265977, 59.16184324183006, 58.64689483081752, 58.42660575054078, 60.132938777544354, 59.92642588931324, 60.01957661111111, 60.25968661492376, 59.73424478048488, 59.04713435531436, 58.79807823972922, 58.55700679637411, 58.51128089386866, 58.57362742810073, 58.79438797922501, 58.389840536538166, 57.173847481559285, 57.47273729753024, 57.21999124404762, 56.7147533129474, 57.0712828565982, 57.08637351091076, 61.896547886710245, 62.8025978243691, 63.233296785403056, 63.607029388266426, 63.87971386562403, 64.78104910279727, 77.49923250575786, 77.71254682096173, 78.0547312489885, 78.48127483285546, 78.35380439985995, 78.02639407310406, 74.31160274390172, 73.6550991844849, 73.29775767125737, 73.08574557236226, 73.079045774432, 71.67163199757164, 70.70585883428521, 70.12037903940073, 69.97736014180028, 69.73927183636788, 69.58964757804235, 69.46650436801605, 69.348048447479, 69.87822186772486, 70.34115502446313, 71.80127512762479, 73.02084846996577, 73.36225540377198, 76.0845284980548, 76.65539401343177, 80.21976088848558, 81.15898324416433, 81.51392677567692, 82.2030730478381, 83.23443002116402, 83.66687405610024, 84.3769043698938, 84.13227991293184, 83.07228669413321, 81.47028833496731, 71.0835952441086, 71.78561056572713, 70.33911719646748, 70.41952853103602, 71.0317136651883, 70.6352165035014, 70.48896965881059, 71.40476695424836, 71.05707576027078, 70.73696414222243, 70.83936115196079, 70.27775628314659, 68.8838580524432, 67.37822446646436, 66.71315231283005, 66.32266918440709, 70.68815382875258, 70.86672659997147, 73.18783534375972, 72.2915625943822, 71.9869653784625, 71.46229533413283, 71.26538797847877, 71.56148335137854, 71.89435234516029, 72.11406278983816, 72.05783903793962, 71.42237530150949, 67.21297785787561, 65.87578073630563, 63.87096281971613, 63.70286463110801, 63.779358720729, 64.08001783442266, 64.83390395868346, 64.80173540669209, 65.656455570028, 65.78817105088702, 67.39839345331465, 67.52809712099285, 68.087682227202, 67.83850507734205, 68.21604537986306, 68.98426266184252, 68.72751910200748, 68.35547673076239, 68.14473827178651, 67.59484196311857, 66.97098470968591, 66.29551664900404, 65.23795884111422, 64.92140694467788, 64.4688389675537, 64.16053807888072, 64.03396776525054, 63.00518540966387, 63.20991468923124, 63.2356309577498, 63.70835107111734, 64.73890435468347, 64.60540027233115, 65.23588818503384, 65.0077553024432, 65.01712585088897, 64.80266915935263, 64.31618875574038, 64.61653977069717, 66.00873176299409, 66.10604729995332, 66.3856942429194, 65.61751696988796, 64.59125443262536, 64.65192730671157, 65.43023289595654, 69.76412516417678, 70.70918635045129, 71.33653006461577, 72.33048884351783, 73.53554314893604, 73.36849521078432, 73.1269529229692, 72.72017546903206, 72.59307574929971, 73.43140449439777, 73.9912669197492, 72.4110771782602, 72.83188461220043, 72.51451127310925, 72.49474236181139, 71.2349049852909, 69.4260014703967, 68.47866749361968, 68.13636453470278, 67.77609645136944, 67.51667310239652, 66.36138051753119, 65.49908546786492, 64.02797025661376, 60.11625459013278, 58.916741915110485, 57.63629137474842, 57.05696473241518, 57.27763329622035, 57.80309640074658, 57.9928496325974, 57.76696918604108, 57.49022544211086, 56.70179549323063, 57.158915508890345, 56.9877435682384, 57.21266237644271, 57.17325348809525, 57.724721864067845, 57.53110034562713, 57.565613151487504, 57.27653284126662, 57.25795472673513, 57.49418267647059, 58.1025266870526, 58.21759482839834, 61.24004675404607, 61.90116041829612, 65.12079709500468, 64.99130370339246, 64.5302956381108, 65.14511550318693, 65.24728695681605, 65.45648393681917, 65.37385560441955, 65.15848827643676, 64.87095403888112, 64.8404677866454, 63.64165885379707, 64.90479886967009, 63.8289788198724, 63.9985278803993, 64.195040621412, 63.4286995445845, 63.08959056892766, 63.35145712869592, 63.25303096016185, 63.22668427201826, 63.11812157897605, 62.18286204275633, 62.75807395113601, 61.91889886134454, 60.34400995603798, 60.37390568952629, 60.11896383520076, 59.82847196910986, 60.15558237169312, 60.15249800023867, 60.28004461694678, 60.41501683769064, 60.24890501859633, 59.51121713857765, 57.32653720658264, 56.26568675357921, 56.00791841207595, 55.92697352840026, 55.87723778781513, 55.31728223311547, 54.87956450451291, 54.56601928601194, 54.39557646918768, 60.78176929435108, 61.957327459429145, 61.65262433722378, 62.07119841246499, 61.69014991316527, 65.07162169032058, 65.01198067522564, 64.94913281753813, 65.00845799190787, 64.86737461056644, 65.05974036344473, 64.13815232446312, 57.139356620448176, 56.4805408845316, 56.20112368550557, 55.98980766954559, 56.13877086819172, 53.57618143137256, 53.94695478485839, 53.89222280773291, 53.81504744277479, 53.74566645446871, 54.24238590600685, 54.30135691293184, 54.55185654256149, 54.87828512138188, 54.45986994143389, 54.80196644740118, 55.24280652598818, 55.149794989884846, 54.64766882872186, 54.4774538377521, 54.420063911686896, 54.04725811707451, 53.31875151618426, 53.59786905582336, 53.28839318059446, 52.86445897580143, 52.640073476346096, 55.64391793417367, 55.34262674424213, 55.09881715631808, 54.968969484360414, 54.949174880146415, 54.67208075189227, 56.01198046290593, 56.72351419568938, 56.72524164402428, 56.92600967701525, 57.35556384736493, 56.58918684741674, 54.08180601229381, 53.689085214519146, 53.90564476696234, 53.87062610939932, 53.88567701307191, 52.98008514845938, 52.48644363927019, 52.09652856248055, 51.8833607998435, 51.93574972622684, 51.83941159500468, 51.73136821241831, 53.87545331667703, 54.24175346887644, 54.40731617577032, 55.10001533465415, 55.76916287907914, 55.87177288759164, 56.44251569631186, 57.21100001602864, 57.66164456625107, 57.938545018776594, 58.02693201346094, 58.209457340266106, 57.3120139030501, 58.79023219787711, 59.33614318742938, 59.0947263301529, 59.09714466059759, 59.34412618419832, 68.03526582267352, 68.36213545253658, 68.41292674456842, 68.57503955999067, 68.98921316192033, 69.25551929326174, 82.29765768347339, 81.34268515460629, 81.64149511715107, 82.56879460068473, 87.16294851545805, 87.79216501023352, 81.26826659407097, 82.04349794631186, 83.57168445017831, 85.85742746545091, 88.16352822657953, 89.3798099718455, 90.98623372650172, 93.99455395074698, 101.4516527063492, 107.47075305827886, 109.6450234859166, 117.93698169412154, 122.13961827552131, 124.94182515509844, 128.2112607204132, 131.69111033014318, 134.26759567849362, 136.4782822463495, 139.34504018596328, 141.26737349206348, 140.5104964551043, 137.20444473171494, 134.56907648327106, 129.0588009317616, 129.7025360358699, 132.15125941339872, 135.85642615445067, 136.38614908364454, 137.4399785575008, 137.85980009866168, 129.30090664729224, 130.39807327855587, 129.95518067499222, 132.9434993064893, 134.54531241931218, 137.72919077855585, 140.5430663649238, 144.08887021304076, 142.31361536640213, 143.48743328042326, 144.84040728462497, 145.4212621153906, 144.2287599460245, 146.05678450684718, 146.2682396005291, 146.11099158847003, 150.66612566207596, 149.3198167349712, 150.48720033621225, 147.3528348925459, 145.9190971984127, 144.29971048117025, 143.10348204350962, 142.35925318705262, 141.09396943844018, 138.7211089641839, 137.75764879045158, 135.4689869082633, 130.57180854652975, 128.26492595539344, 124.97932162908496, 125.15051241044196, 125.86447042553688, 126.55888387791784, 126.66192535663262, 127.09205068592796, 129.6146700027233, 130.26781729839715, 132.36902598747278, 133.94643390666695, 135.1498374672333, 136.97964482360723, 147.2213621065204, 148.35583348848428, 148.73129330804417, 148.1578576784923, 148.096653728836, 147.28497097152194, 147.2969119291939, 147.97029514915965, 147.92725113553146, 147.9461611057423, 147.4824534623055, 145.61001064217697, 137.5941516074801, 138.68888052060703, 140.69229400676937, 140.9877654814815, 140.45040781637098, 139.7055487009804, 140.8763052938842, 142.4342082419857, 142.7546259010271, 142.9326912124961, 143.720121691146, 144.53749634593837, 149.04020722315593, 156.23103162612824, 160.51257761951445, 165.3138842739652, 166.8084115793651, 166.85415011048863, 166.17310199118535, 165.1724472261127, 167.47659278018986, 166.62537492359166, 168.98226930555558, 167.85518048965145, 161.53761071109554, 156.46604769335514, 148.89230429505133, 143.71905726641506, 141.9045688206505, 140.91113227488395, 136.7442024638746, 135.96133345323685, 136.72166450622473, 134.9305388303714, 131.62007495393715, 130.07949580713202, 127.54544440132727, 125.28522969350944, 124.43999575925928, 123.12836374805477, 121.60083517418602, 120.48857830457152, 122.43732838577652, 120.46436289877062, 116.19835737370708, 116.14854384772798, 114.95408877178647, 113.75130509366636, 111.71476844351074, 109.68840940079365, 108.68017912024328, 106.86823333998538, 105.41930575590509, 102.69234682749766, 100.85417951664982, 99.37113511710238, 97.78103464417988, 95.80801657461872, 94.87259754512918, 93.8981847640834, 93.66897454639874, 91.05422359429596, 90.81341121708684, 90.28577670953938, 89.91689394459746, 89.71960748643535, 88.94142080610023, 87.74231439847172, 90.01035931683784, 89.58686247268908, 92.8950566326642, 93.18133749390212, 94.11711639643634, 95.7175741721911, 96.20789550350142, 96.86380735976569, 97.14530480189852, 96.94593388375353, 100.36492311258948, 100.19601550365702, 97.45822916013071, 97.10865719973545, 94.6022312307812, 94.40424949172376, 94.81688815624028, 95.89393645557112, 95.8629963103019, 95.68755381668224, 96.12055109150327, 95.7586094204597, 93.03342209778504, 92.4612293567538, 92.10581017580468, 91.5654144675537, 90.75221235692376, 89.23723528625894, 87.72941703423592, 86.25912390515094, 85.78103163818861, 85.53558281917212, 84.52406631248054, 83.42060633699035, 83.35723676368659, 84.08503834617181, 83.85146414230991, 83.3040438792406, 83.18240538958139, 82.79173208932134, 82.13732780989666, 82.71229123551068, 82.16379810652039, 81.82767269840558, 81.78415569864613, 81.73251464277932, 80.79891515024897, 79.85798518713041, 83.24691818632357, 83.02688107454094, 86.05636902170868, 86.02893216643324, 85.92473743051666, 84.75605485978836, 85.30495483629007, 84.62003411352318, 84.28053142763773, 84.27956230130135, 83.93997952373171, 83.20679620238094, 80.24113711277623, 79.20840713437597, 76.15331640687126, 75.3391998155929, 74.96821972595704, 74.20893367545906, 73.44353902661064, 73.19616524455337, 72.55338532734204, 72.11266240624028, 71.7933480743853, 71.49972587430038, 70.95843387729536, 70.45787361258948, 70.47447545300602, 70.289832903906, 70.12766942526585, 70.67362888931879, 70.30363225279012, 70.20940444895737, 70.20986712562183, 69.38584186585746, 69.64901999112459, 70.16973855586616, 70.20641047082167, 70.43817541581076, 70.36427431769374, 69.95971813317446, 70.79984238495211, 70.28016155516652, 70.3799300375039, 70.73511178057889, 71.6426505445067, 72.08548624712107, 72.39647822987668, 72.31120795175849, 72.95888688772177, 73.19239082594149, 73.66740077738874, 73.43337948731714, 73.47968391042184, 74.27781189871425, 75.02634359056955, 75.4644737788671, 75.44304778361345, 76.19384932843138, 78.17704838803299, 79.46736960893246, 79.8764243487395, 80.62882445261438, 80.6308557752101, 80.94074767549576, 81.1102764606287, 80.64772682477437, 80.5280140245098, 80.16616000132275, 79.65892034379671, 78.44559891791161, 76.91597706248054, 77.08086965110489, 76.69861353952693, 77.00369703392468, 77.84747641643325, 78.0347302868639, 86.75957577785559, 87.69376119809304, 87.80015662955182, 88.3200991292406, 89.50662149089635, 90.40015292180206, 103.5470120850367, 104.45128437247122, 105.524269879474, 105.64792800070028, 109.32325640475024, 109.34645024816852, 103.50919544257572, 104.6346297217314, 105.81602109002488, 107.71058558006536, 109.02590276501712, 109.68564890170208, 109.59561074525364, 110.77227099081855, 112.20872598756358, 113.77348735906928, 112.83587869063182, 115.33177455426004, 117.85419712208218, 121.620311664488, 124.76027468899782, 129.02978851820728, 131.7936478296763, 135.08287443152815, 142.84054603423593, 148.01419847500586, 156.32571557096173, 159.09331571428575, 161.2249930864457, 164.01386664877063, 167.76206774968875, 171.7513336346846, 175.977583842579, 178.36366247782448, 181.46423336655775, 182.1264547784774, 170.58570399914407, 172.06706576283847, 170.8302923581544, 173.3697705120604, 176.52661735083512, 177.41931942989416, 178.01438752085278, 178.7119435168054, 178.28047413731585, 177.16031490336138, 176.0187634496304, 175.8463994416433, 175.81664658286647, 175.53773143565203, 174.55648785379708, 173.54180498117023, 177.92026882422968, 177.16252775163397, 178.76256498951736, 178.10056743180832, 177.8513936809835, 178.55514736163522, 180.17163634025832, 182.03894930493308, 182.34479280377568, 182.26326778065675, 180.9430906443355, 179.05492649821036, 173.15349271140684, 169.78316640787426, 166.85912085290678, 164.69072206699346, 162.2191936622316, 160.1897708560218, 158.7390319004046, 155.86847787605043, 155.07963877030812, 155.29635451960783, 157.62894890382822, 158.48704956567073, 159.0486553310769, 160.513279225568, 170.2218539387644, 172.6939853309213, 174.30156656707126, 174.13302495569948, 173.05100725210087, 172.24862182869273, 172.26659047938062, 169.553891743075, 168.23392935869904, 166.98269607454097, 166.05435178898227, 163.79538787636164, 154.30347519802365, 154.36181918845315, 156.5335191056279, 159.20921852832245, 161.2356004333178, 161.3667594784469, 162.24506762591295, 162.60489436095546, 162.75698970284262, 163.0797948555089, 162.94203859150326, 163.65338117117955, 163.96036261562404, 163.76762829333956, 159.8664826163794, 156.03985751766265, 160.83605072564583, 161.04205284710548, 159.37376573117024, 158.70606731403348, 161.8845903013539, 161.67764138554313, 166.75457546700906, 168.04478651027077, 167.2341866658585, 165.43166242911613, 170.83474362091974, 174.24679571988796, 169.3192911643383, 169.0215693657699, 168.9941626681451, 168.69963375053428, 168.4572118276533, 167.053974085427, 162.05106106069098, 159.19408233862433, 158.9123886678727, 158.3220701564737, 151.9409981913101, 145.92119778018986, 141.1594870456725, 137.90862922836914, 135.94511867958295, 131.28859432469653, 126.37500116051976, 123.75760490755135, 121.45581804883416, 118.32697771444133, 115.38643206224712, 112.95374249606247, 112.3198187237784, 110.7330781704404, 109.65472822292251, 108.5119183209029, 107.8561800874396, 109.58678681034016, 110.74811389978214, 110.26711676399005, 109.33680146218488, 107.99887383837785, 107.23267152762216, 107.83773092172684, 110.00027965569562, 110.169957809446, 109.90516441464364, 109.21038669201684, 107.51150006503462, 103.83694208050396, 104.78431047634608, 103.97818344926404, 107.26001746630877, 107.54084638095236, 105.8347002344382, 104.06293175840337, 101.07885933859323, 100.06747591806204, 99.46348570131126, 99.42058416654515, 103.05962421568628, 101.91344776159352, 99.53226257765328, 99.97698631784937, 99.33370045802344, 100.022651527613, 101.06920489488016, 102.78518690791708, 105.81488906185808, 108.13139205220202, 108.26292892071274, 107.01063771903206, 104.51353172463428, 106.90391768938686, 108.73923301721456, 107.02341044786805, 104.922953471911, 103.807440164335, 103.75093223902894, 100.48240453572984, 97.27995240552572, 95.29137966038722, 94.98448565943043, 95.02309496462742, 95.2654918514628, 95.16758776712642, 95.33411020907252, 95.5017455224868, 94.63467232347882, 93.67244344089292, 92.84233954847495, 94.69631845852788, 95.60649574015584, 94.73510567374728, 94.24031697613282, 93.2550593460162, 91.70965504567384, 89.50931758683473, 89.49712670580455, 88.22602938437598, 90.61621204575164, 89.56791419288827, 88.78022465234723, 88.14117459064737, 86.48411578462495, 85.53640391293183, 84.65414248202615, 83.44012669545594, 82.30761950555343, 79.13709924447556, 75.63039351174916, 74.78421613600996, 72.23656222560368, 70.82659912878232, 71.80371198467164, 69.85747089252216, 69.62781029964208, 69.42703201448526, 69.35122966464364, 69.3576138144381, 69.58346427554248, 69.7481654964208, 70.03057474950202, 69.59834291884532, 69.2234663307353, 69.0249074107477, 68.54601358343338, 66.82539735939932, 66.67128998599439, 66.67108695743853, 66.47729791911073, 65.85094152878145, 65.85841101532836, 65.99038552895918, 65.27656684368192, 65.28717867896442, 64.8994900830221, 64.48661372247135, 65.08754233811858, 65.74063566370992, 65.66404339350686, 66.28364237861811, 66.62957384259752, 67.16495065683668, 67.80816750762527, 67.84734324439778, 67.87729163762761, 67.64296662927224, 67.74164779819614, 67.1259607662465, 66.90279610792095, 66.66551289500546, 66.44563081886089, 65.64113525550304, 65.33879149506438, 64.5118309800712, 65.10382308600826, 64.88592584674615, 65.02903940413555, 65.51913170164441, 65.71751530865428, 66.12791654740377, 66.38309423576096, 66.71854232111733, 66.77974948965141, 67.03283534982882, 66.77840729901962, 66.60164267802676, 66.50406599679495, 66.6494554231248, 66.64666325149787, 66.65276498708371, 67.40311062099285, 67.8440599241869, 76.16262277987862, 76.06308962047258, 76.77399778594771, 77.45373247575037, 78.26739089900404, 79.2078509972767, 93.65530390413944, 95.68339240163463, 97.39901075754749, 99.16539627769998, 103.83181616531864, 104.5855146964571, 99.03124746101774, 101.16542989951706, 102.47100404956429, 103.98725122525676, 105.78104485068472, 106.8818035975996, 106.62092137698411, 108.57290830765642, 110.05345612550576, 111.62719697712416, 109.85974553781514, 110.69813677553114, 112.14892011539456, 115.39576977995642, 118.10051070471005, 121.15402745385931, 123.72752972938066, 125.93546294002748, 131.0703442576136, 136.07571308954127, 142.34540320852784, 144.80132871101776, 147.34476328571432, 150.42686287799248, 152.27561079505134, 153.91710570829443, 155.83865453384684, 157.1007182065483, 157.61105743376518, 156.75840410107375, 145.34182363705457, 144.50692614102343, 143.94155737519063, 144.79616685996774, 146.7899717840025, 150.0380972733511, 151.427014991122, 153.54100884103644, 154.08515015497227, 154.36455265631812, 156.43347519964706, 157.81994845490652, 159.6030656862745, 159.74613425575785, 159.0134348128696, 157.94558403679645, 160.68020212001375, 158.45037649976658, 159.76245147860254, 160.48858423900322, 163.57716968853097, 161.62659529847497, 161.1533559754605, 159.26342942542902, 156.51223048650476, 154.82008123198918, 153.66111044864613, 152.1190757548969, 147.91158672860257, 146.23069164145656, 146.21106443043885, 146.58651545867764, 148.5426101612906, 151.08527717025524, 151.70367068572713, 153.64313475217867, 163.55486843909475, 169.60000421967723, 178.6587642963438, 180.78809159484905, 182.26979436150012, 183.1874073806412, 183.5751431785912, 191.9101486403472, 188.2726510943044, 186.0308095475977, 184.765607401999, 183.115509627995, 172.5755743708917, 168.6073492831466, 161.82874925617855, 159.50309334267044, 159.6137465408497, 158.48265688358217, 149.71614156167715, 149.2331397857143, 149.78802638785675, 151.86295070120994, 152.51131720432693, 153.10989489145658, 154.36591139448058, 156.00333191993462, 158.48817607081665, 160.8246777938842, 160.94567929606288, 161.65508209586056, 163.6698367381659, 163.48463562783354, 163.69484657374727, 163.9296039589169, 165.0041922277467, 165.12415479341735, 164.5384165447401, 162.39716472067255, 163.30975628345786, 163.46147696086214, 165.47291526781694, 164.94154232088388, 163.56981164254591, 161.72730076299413, 159.98134128983816, 156.64227167342372, 154.19097817343606, 152.18737966448802, 150.56589278477088, 149.48866848731714, 149.87509706006847, 145.31396708339236, 140.877664787572, 137.476568468798, 135.5714864931528, 135.4583957539527, 134.38636922596157, 133.77366110270776, 131.97658804078353, 130.25556416093474, 129.42105853703703, 126.3735362204326, 122.089564386399, 122.08708569211016, 121.86019554612773, 119.98036754156176, 118.7830401696234, 114.9266835605308, 113.82316810563724, 111.94888599719889, 110.44712336328978, 108.78309819509371, 108.20661158691252, 106.65721827524256, 105.32002490467242, 103.76453010859592, 101.6295110374261, 100.80391639978212, 99.99799423039217, 99.2842551406556, 99.12428504501864, 98.89788838336446, 98.80550719102084, 98.87067875448312, 97.48546630991284, 97.74198475139733, 109.1696276359672, 109.1304340926704, 112.73910367079054, 112.95102463188611, 113.28140140351697, 112.55079905299696, 112.36253125289451, 111.54454190412062, 110.4071056076097, 109.05887978172252, 110.65732518160016, 108.3470132902272, 96.65628163352008, 95.10244399354184, 92.2164145454404, 93.09776685247432, 93.55322849696545, 93.9730073617926, 94.02174093574928, 94.14635348194837, 94.4469707447868, 93.74828695930594, 92.276300473934, 92.75587293876438, 92.70414954217048, 92.5486458235294, 92.90752586476812, 91.1148972920946, 89.74792966666665, 89.13756685846562, 88.76612756610325, 88.68346977071157, 88.89258204139435, 88.76573101447246, 88.84661676470589, 89.9770478610333, 89.94058058224401, 89.90124097298606, 89.32565861150015, 88.56176457156992, 88.6890071093993, 88.48982284539372, 88.346438033133, 88.08274563826191, 87.60470142787115, 87.74783963890704, 88.01667406501582, 86.7106317926088, 89.83078738624341, 89.66782258582323, 92.69256033901338, 92.61929840933058, 92.4513343007294, 92.07452252061935, 92.3054171146125, 92.45669930197636, 92.78641472268907, 93.49845881427017, 92.34269829225023, 91.03760721374104, 88.06667642600372, 87.31858242404034, 84.60739917514785, 84.44405216215374, 84.07093830561261, 86.468345442188, 88.4452855787302, 91.28765612363836, 92.8109323925178, 91.5173355979102, 91.63121028330222, 94.21645660978837, 97.50108157391848, 100.1442983618114, 103.1500892106462, 104.21266863725492, 102.54715337962962, 99.27445485068472, 96.2365586950345, 92.4739344186897, 90.29177077551616, 90.38001024229692, 89.5165971853408, 86.02494500638032, 82.62551876353875, 79.48163105175402, 75.77638758877995, 75.4462664938531, 76.53784011461254, 76.1685870131374, 75.94402603828199, 75.85843593394023, 75.56338892779334, 75.01841647611266, 75.62390993347339, 76.36712580353252, 76.03812519825709, 75.74247086754525, 75.95436624797698, 75.20273996266599, 76.1713278513072, 76.0389751616091, 76.2505720699275, 76.13018683694114, 76.11026382998755, 76.34551984663865, 77.78986432881135, 77.29202639737007, 77.43627216262061, 78.16502176198257, 78.16912530633363, 77.58832583162155, 77.22894529777469, 77.6811838331693, 77.77645945160288, 78.51363296171803, 78.79925620922813, 78.61857059056956, 78.21166267528595, 78.93929591581079, 79.82104653898224, 80.00337348895114, 80.67100922851957, 80.70326763958917, 91.05780316479928, 92.62018916277624, 92.79083098560535, 92.96277100202305, 94.00162735993295, 93.732116078208, 110.56253083465607, 111.1253550838002, 111.3544652726424, 111.96864227910054, 120.26727895588236, 124.09485274587612, 116.96366937807348, 117.5937807096911, 119.86717591781026, 120.97933314659198, 121.37775085449736, 121.65193275124491, 118.93169980890136, 120.08846687184877, 121.11664410131306, 122.07616475739184, 119.36096354512917, 116.74793465289449, 119.63981610340802, 120.81889410426392, 122.52520884105934, 125.64445353390654, 127.88719939137876, 129.61696187301587, 135.59337112371617, 138.08337182244009, 143.1800138572985, 145.49698108185495, 145.0300236611422, 146.2060811118114, 146.9994853869255, 148.07621520339248, 148.73893663907742, 149.6011432528789, 151.14812094374415, 151.02942614137876, 143.0573688706816, 146.4419297769997, 148.55112301766263, 151.52723818308434, 154.26416749447554, 155.6219115526766, 159.3663534954871, 164.12781306848805, 165.78190104829795, 171.52202206274904, 175.4303266206038, 174.6540526312636, 172.07439915616249, 168.70794764456895, 165.85490860465296, 163.95603730189853, 166.7601147657174, 166.49415392507, 168.05033259166603, 164.43622472454672, 163.761889230859, 156.93880285276936, 154.96670217351385, 154.2714019833489, 154.3905723823439, 154.2294238485061, 153.32193863515408, 152.2598477475879, 148.40097359998444, 146.6692607681515, 144.49243368300657, 144.12110884936197, 143.44958228009716, 143.1685155568783, 142.1470457929505, 142.99448527668844, 144.22365590762203, 145.51221871628152, 147.79016023840452, 148.03866892351385, 149.018690482493, 151.47947130981757, 154.3155843713041, 157.38639285185184, 160.38576321385912, 161.13512422619044, 161.6680817609711, 160.43863123054777, 157.82553028728157, 156.6976606598195, 156.0110132490663, 156.66792741914878, 157.54529103120137, 154.21112905757855, 150.65246929232805, 147.570076300887, 144.96203448825085, 145.39809546117334, 147.92628038305324, 151.14730396078235, 153.35167405146086, 152.55510333560667, 151.79729963108855, 152.49506070860565, 153.95996517545908, 156.45742728733725, 160.77193372696854, 162.3463424810924, 162.86551709897296, 163.0390957722877, 162.97086603990547, 161.8721793058882, 160.3542020586679, 160.83579901003736, 161.6606990531435, 161.89600403819898, 161.3969291728914, 160.0556843916122, 157.68325348825084, 154.95440872610487, 152.8594885484938, 151.5964569373567, 149.8224305709922, 144.94690445619358, 143.37618154769686, 141.43730072406763, 139.32396389962653, 137.24846773303764, 134.57623636095548, 129.58601445666042, 126.55641104102024, 125.94220850816993, 125.1079715391379, 123.27385116931217, 122.66683437503892, 122.2602284888034, 122.48588693292872, 121.76031165367262, 119.56340744530036, 116.48007183921892, 115.69476488422038, 116.37112702028152, 115.11599397945844, 113.1770748243853, 113.30506313954768, 112.08532424895348, 111.14250746838998, 112.83688556427016, 114.6082183384214, 115.89285882633052, 115.32944337371616, 114.76755623856208, 114.13046970572674, 113.68718221693057, 115.09860465460628, 113.62899516868968, 111.90092889939308, 111.16195476672893, 111.13600781823196, 109.66324563656956, 105.394438314737, 102.96872519436664, 102.8145604870059, 102.43203714036726, 100.91905887978524, 98.89002151268284, 97.2357925925926, 97.7066190830221, 98.52189919537815, 99.08049523809524, 98.6330677814348, 95.98631515771864, 98.3503211462736, 98.02472359251476, 98.07588852474323, 98.42478774797696, 99.10857927061934, 98.58528029536258, 98.20211625451292, 100.84743603952693, 100.92131785807658, 100.38724569988328, 99.410895115779, 99.25086065538436, 98.07676543106132, 98.29447600412388, 97.83451713054647, 96.62523613141924, 95.6096174735136, 94.82186655244254, 94.71903579394416, 91.16585269747898, 91.25591637348272, 91.0182555726735, 90.1005898032978, 89.12531666394335, 88.35502455101864, 87.6693550908808, 88.31561909414877, 88.96346363748833, 89.51670489908577, 89.49172513523186, 89.8674595820106, 89.95295937027116, 89.751147778089, 89.60555776190476, 90.87564765141612, 90.33074549657644, 89.8400901617608, 88.5181952683108, 87.53117578633524, 86.14661030117796, 86.11506397436281, 85.42219342921983, 84.43010850069022, 83.39393467447748, 82.77947478166823, 81.06517201898798, 81.69186186026937, 81.47002265040462, 81.53594232694847, 82.28513718503993, 82.32673386652831, 82.32821350805906, 82.70943942928884, 82.57998979245382, 83.00522765220589, 82.68588570367841, 82.36538156909062, 81.79098963100412, 79.38887522534448, 78.91505616128099, 78.85907880329911, 78.07434327388863, 77.08169821265173, 75.72102308714597, 74.39136923319327, 73.61161138492064, 73.8159936949113, 73.7671931967009, 73.45171426844071, 73.20694143170974, 73.24011470767196, 72.85745883948023, 72.72694456877595, 72.74073486834733, 72.80446470082478, 72.6089985962496, 72.77767191735722, 72.0269542814348, 72.18636368794613, 71.67048630820105, 71.5539235498755, 71.10682898163384, 71.5718049533098, 70.74244527415154, 70.51953105334016, 70.27258454023227, 70.25426956093409, 69.28484449205759, 69.86712665476804, 68.65203409084829, 68.61242743303507, 68.07708347463847, 67.83298229206376, 67.43958133396944, 66.98583263585435, 67.03259087161531, 68.29811350342361, 68.16433483006536, 68.126336435263, 68.17081069218798, 67.96939097821351, 68.2683128103797, 68.38818810840013, 69.15180869264577, 69.32987832133911, 69.24311295347027, 69.82076762869595, 70.48286036741362, 70.40430808432929, 70.87454026610644, 71.41711055283224, 71.8606084773576, 73.82675411943667, 74.48052221132897, 76.09533548972924, 79.59667607290694, 80.41561681123561, 81.53836911912543, 82.81113525044286, 83.3275216286233, 96.44597378649236, 97.194029125865, 98.14354900529102, 98.89061984584224, 102.89614341923112, 103.94478892818238, 104.02131349228785, 103.0116081256614, 103.8666900962496, 104.46116669157784, 105.46907147074386, 105.1057580770185, 105.95621901098274, 107.11338980929038, 108.5530988987706, 109.22876325544078, 108.08541736328976, 109.08003583932462, 109.80616582664176, 111.36268471848742, 113.28508155125144, 116.01992675217087, 117.99620096785974, 118.70523110441565, 122.8936590062404, 125.64331660075992, 128.4468423476651, 129.72425577870953, 131.53860632855933, 132.57420354702614, 134.02212408000028, 134.5614959099738, 135.19597874424215, 134.9401982003579, 137.269154146592, 140.38620446667056, 130.5833582759882, 130.42704195798322, 130.1385617237784, 130.82763406152478], [58.941782641384606, 61.4012143492051, 64.873267278089, 65.00210737484994, 65.45264151171712, 65.95495003021648, 64.50182501073763, 63.882343294117646, 63.35379262947401, 61.10174886256031, 62.33368565110488, 62.81942437278245, 60.51315838911392, 61.86667579723, 59.47005002246009, 62.40167144230211, 61.03067032232143, 59.72082284134765, 60.2309294058039, 59.87017553797074, 59.962049886015855, 59.263034078942695, 56.581702482648616, 56.99978450816994, 57.52460710676874, 56.0642122839526, 57.04255095182851, 58.38604873537193, 59.3028743077342, 59.81398787643947, 58.955899503812645, 58.90034904870837, 58.57096632241609, 57.08670075531496, 57.45938183800187, 57.85651183838962, 57.52529584010272, 57.06728987192655, 54.85784424552341, 52.1290941896981, 50.38587553446936, 49.13251369794585, 49.52425281769374, 49.844140817436326, 50.478618557889824, 51.04947698232064, 51.846377864845934, 52.31363111041083, 53.7106364490877, 54.06179975630252, 55.04609467950514, 55.635898895035794, 56.62295803773732, 57.55407281318084, 58.11654846864302, 58.46487092766949, 60.751287518207285, 63.78229713702147, 63.23825402445537, 62.88819820684719, 61.59939389430316, 60.92628317631497, 60.34115069089664, 60.05453519946765, 62.127677625583566, 62.4654545235761, 62.319671088624354, 61.15315320687896, 58.96870392561468, 56.7969475576564, 56.6496331817616, 57.428756181267325, 57.902740807967625, 58.92673030718954, 61.533561579118064, 61.75793354754124, 59.44487224533147, 59.783141046374105, 60.4136151669779, 61.61639820618841, 61.39149354691877, 62.343261569148126, 62.01404486502297, 61.04555340925346, 59.96724454357298, 60.16648421708683, 57.400585066837856, 56.48477477661064, 56.71954919553378, 56.1365464631964, 55.5970516966231, 54.40000096153194, 53.5464077107065, 52.291696279956426, 51.70017640296517, 52.1621735177975, 53.117925032679736, 51.304607045440406, 55.20102524369749, 57.18021346802056, 56.34889145222533, 55.67545528018986, 55.10494177673255, 54.60595656956116, 57.78139942654839, 61.15953102567694, 60.83242289775911, 60.24887366627763, 59.26642137215998, 59.22428027349828, 56.81394618518518, 55.1748913610333, 54.72275758264168, 56.31140458047778, 56.11255035406293, 55.07212611912543, 52.17565964588909, 49.7171657796452, 49.03744240087146, 48.10591636756925, 47.93863257002802, 46.12724882640834, 44.63836630182073, 44.26280591845627, 46.2228575765724, 44.469537465997504, 44.33645224867725, 44.33251566853408, 42.20986595510427, 41.92028944817928, 41.71831199665422, 41.7245861916349, 41.68877414799253, 41.92460673319327, 42.24897181266907, 42.57344658146592, 41.28835529310613, 41.582987494553386, 42.25618099891067, 43.86711691254279, 44.13454203369126, 44.00098323288204, 43.96459825412388, 44.55543687648202, 46.22909288422037, 46.06792572673515, 45.6231615762722, 45.39435046061961, 46.75218159687208, 46.09182814145658, 44.46027019662309, 44.734803646358536, 44.23228959134766, 43.85736023762839, 43.43984543399991, 41.95431058467813, 39.82435362413179, 40.09908481170246, 39.2734482587146, 38.24451729925303, 35.27130575124494, 34.573867623404915, 33.311464150171176, 32.1726791004273, 31.7337923600996, 31.91568549080753, 31.84123112122627, 31.293490678710874, 33.07102675225646, 31.685143460335787, 31.42055436048864, 32.74303876353876, 32.77405659975101, 32.656750203843764, 32.37605881596642, 32.46261340452848, 32.11419520136425, 31.970244375817, 33.00588622362279, 32.74630922318405, 30.316382420698464, 30.349688515974837, 30.163864263460944, 28.420098673561185, 28.082364815515096, 29.58655469801847, 29.366358731888685, 30.238912492608154, 31.88830473716153, 30.31194028129799, 30.132353911375667, 30.046600303882663, 34.19058097401184, 37.28513394211018, 39.308624286803614, 43.04854361142235, 46.83960833048293, 49.23149115336134, 53.09301431637098, 54.14730465266041, 53.69743973148149, 57.48921678563647, 61.29143597032499, 62.86515233263305, 61.17298063545104, 61.001700220651365, 61.74420187636166, 61.64219491153128, 61.8789153199502, 62.726039725412384, 61.02416944965764, 61.08837585029568, 63.03740768930907, 61.47598801587302, 61.43897610037348, 63.43473046421379, 64.92388822642391, 65.08749472281941, 65.57815759640525, 63.01281398358232, 62.79659043596327, 63.24136217421415, 62.551454640765385, 62.47728622257889, 63.04916960549331, 67.49155650832556, 67.51796149470898, 69.68678351604163, 67.15411694624389, 68.83769404162777, 69.52321213828473, 70.2898584441332, 70.36659194841269, 70.34035553820416, 70.38473470424837, 70.4468026346094, 68.91012422563868, 67.15092879785247, 66.95857087269621, 65.0285352491441, 65.43687355967879, 63.6378514475568, 63.46421211311405, 63.31453394475568, 61.700878574618734, 61.67495609103641, 61.87275967413632, 61.90503801385, 61.66065225894802, 61.34794371405228, 62.1125241739807, 62.930295262662106, 62.84202956621537, 63.17740966791162, 63.40084145230316, 63.06957849836602, 62.98815693362901, 63.265295348316094, 63.275573142779336, 63.29825752287517, 62.58717837270399, 61.92108601859632, 61.42413990234983, 61.04363783972015, 61.20577782438531, 63.048192007936514, 63.10653011111111, 63.51685925420168, 63.73387133068718, 63.579571219651285, 63.43564065624028, 63.24858606590414, 63.15467904411764, 65.5451224572051, 65.45765017740429, 65.3193098596736, 65.02181468152038, 66.19215736562403, 65.98091553882664, 66.67564758411142, 66.6261610280112, 67.01699049081856, 67.77609020004668, 68.34553946916239, 67.17997545111267, 72.45056753867102, 72.67931500766029, 74.28928530541552, 74.47013189130097, 72.51628476291629, 72.81711342724091, 70.70095021458788, 67.25578770580454, 64.550383674681, 62.099298550381256, 57.82816177170868, 52.06853534126984, 48.28216973731715, 43.4808154248178, 38.60710436647992, 35.478523425807914, 31.221674822362274, 27.37024860714285, 28.108737625001947, 28.15131223107413, 27.21785993043884, 27.54928801727357, 27.639918421335206, 27.727377474658294, 26.571519298552754, 26.87344268261749, 26.890840829365075, 27.526952129551823, 27.643341046885052, 26.96369181781889, 27.24477171615313, 27.217402740070938, 26.79509592259453, 26.69168979752633, 29.87445278050109, 29.768193690775757, 31.061691631963896, 31.24848130991285, 31.56483308504513, 32.914695821817624, 33.06320423957361, 35.06238596560004, 34.788468908263305, 35.25857857692058, 36.04501005845135, 36.40289348727679, 33.66671082985513, 34.012964513406914, 32.615855917274914, 32.745286923460895, 33.041953259526835, 31.89669102291933, 32.32069525926445, 30.64644831143196, 30.30902072544256, 29.74721316666667, 28.933836104173157, 28.573007201680674, 28.37276618063988, 31.330456589327216, 31.66487717351385, 31.11896007541056, 31.16670996490819, 30.81271378423592, 30.35539786423397, 30.22235192117961, 30.49643936172256, 30.42073140701837, 30.56692719747445, 30.498835840490457, 30.13394829139434, 25.871422598117025, 25.90165456404451, 25.91566239855665, 25.56779571449192, 25.683696867335826, 25.59668704604733, 25.83967787177093, 25.62249248327109, 25.753680543183943, 25.603078182928733, 25.518090556722697, 25.482917173568968, 25.80812322626829, 26.046633642001247, 26.14773526065982, 25.953896126828518, 25.46639586834734, 25.562229350038265, 25.219301350529104, 25.92858950954456, 26.121874461251167, 26.58341310597573, 27.11876501812948, 27.430628458216617, 27.39240479240585, 27.54977591153128, 27.85640113569873, 28.222402416163856, 28.969297804866976, 28.986252159897298, 28.84136411204482, 28.128688149859947, 27.59490699745889, 26.96680459936197, 28.090740671879864, 27.73263125138177, 27.324517317217165, 27.365420190087143, 26.80050885301899, 26.283981945338603, 25.432035400404608, 25.142107771188225, 25.480606893580777, 26.394661709305947, 26.69638206940554, 26.99278514018636, 25.751659767507004, 25.823896095721167, 25.98248146654217, 25.38329604474012, 25.484708286181142, 25.713321698490503, 26.083896173280426, 27.89615609723649, 27.813041698334885, 26.948890917444757, 26.855702646943413, 26.787259345411965, 26.536811101774045, 28.59014737192655, 28.78242863997821, 32.55982410620915, 33.52181993899783, 34.224967363289764, 34.85724112340492, 33.5429106919818, 33.54010462994086, 34.417329553373015, 34.82579095774977, 34.89051613058165, 34.735184703587635, 33.79302936391223, 33.61412690460629, 30.469615774647146, 29.41954305943368, 28.47523403516962, 28.034691821106247, 28.096342958605668, 28.096548434173677, 27.02558324115961, 26.545660061780268, 26.478144335366093, 25.491050910986612, 26.58176742896047, 26.434493132741984, 25.96409675088837, 25.990739329909744, 26.30730127233116, 25.765286494678563, 25.276043285091816, 25.080518100918148, 25.44396353051731, 25.654559058391044, 25.55643483378273, 25.26157594800874, 24.67854260451305, 24.871254083800185, 25.38868303754735, 25.44963918069108, 25.370991600150568, 25.79778496739807, 25.610606928026765, 25.222127567693743, 24.96679018502892, 25.01590537208216, 24.969871468291583, 24.484130486461247, 24.099513990411356, 23.950029901055405, 24.814266879772937, 24.44624820122942, 24.30254866643454, 23.840878894855532, 23.966818009726115, 25.8136181853408, 26.19399873763033, 27.87766064589169, 28.10267066522296, 28.28611419584633, 28.518158680283225, 28.208373767305936, 27.066216697089946, 27.188340318938685, 27.22513779450669, 29.32667485389175, 29.23906664954871, 27.523340993832434, 27.446801943123745, 26.068879401960785, 26.189269175975856, 26.28474070996553, 26.3169867106287, 26.40077252264239, 26.584643179582947, 26.63628580544014, 26.71617864690321, 24.6257514038282, 24.805840258092125, 24.837229134765018, 24.67836042930876, 24.31674294607843, 24.075902948801744, 24.418895667833805, 24.59512529302832, 24.42147927787656, 24.504897010037347, 24.655155270061083, 25.99206281535948, 26.54313218198335, 26.353730218565204, 26.43389848054778, 26.48195167203548, 27.819831842359168, 27.746073584171725, 27.127150239722745, 28.371557758558986, 28.5651643524523, 35.64853879326175, 35.359286039524335, 33.72550182896956, 33.141992913943355, 33.300564859521884, 33.28472432955601, 33.34242750051486, 31.752449816370987, 31.82015593804856, 31.910781530656703, 30.282363692851003, 30.163639932935325, 24.66858756053532, 24.843062490433404, 24.93753184053066, 25.69361826929661, 25.59489462885154, 25.517461993056205, 25.69866719148771, 25.587189380940064, 25.535254479380644, 25.54687680625584, 25.63473862916019, 27.002334803324384, 26.74647285978836, 27.138632092903837, 27.80075896724245, 27.880479243213127, 29.67188730827887, 31.29827850134616, 30.959448352217557, 31.365305126283847, 31.283064286570184, 31.282307984827263, 31.139530158263305, 28.694760504435106, 29.78311285776533, 29.54640398879552, 29.49088577482104, 31.06879184430439, 29.64389716588858, 28.205278112122627, 28.850369743619677, 28.694526801665116, 29.00195253734827, 29.36584153057889, 29.7022303793184, 29.900588909686167, 32.75584869786804, 33.044837205096485, 32.56056845642701, 30.446684071106347, 31.516420630252103, 31.75506227038593, 31.236530449502023, 31.083985961015145, 30.9813856171024, 30.72017601929661, 30.592821195580484, 30.614213678260192, 32.17687531408093, 32.24136498058863, 34.15946756216932, 33.92335319328185, 33.95195382920946, 33.74520058263305, 33.77473164822596, 34.97284503874883, 36.5087513015095, 36.55936346890194, 36.752788040917125, 36.61503265406602, 167.97568359555754, 371.0068673414255, 369.7306167499494, 368.75140300951546, 368.6183893338992, 368.9123254821818, 368.9947586052755, 368.70504684671647, 368.94933989737007, 368.9703622191852, 368.887628218643, 368.887360381108, 196.52521276316676, 28.93426535558668, 28.81139691849908, 29.703833988207958, 29.64537687423567, 29.070201984901843, 29.12411096025652, 28.87276699976657, 27.298809912075946, 27.345683642770258, 27.435840973544977, 27.07700823918456, 26.50357338671024, 26.271750729737267, 26.16740367110178, 25.416600582295235, 25.47549882454093, 25.409440321291264, 25.406752160130715, 25.17676685122938, 25.220370390211027, 25.262359780257945, 25.087683763633425, 24.9263572447868, 24.82480837375016, 24.671575401805168, 24.727373729400096, 25.159994431372542, 25.12436251329689, 24.778072215011928, 24.753405420479304, 25.13280539651416, 25.30410765283808, 25.29311151019296, 25.356244022564585, 25.56376974320831, 28.47632658928313, 28.8919935427949, 30.699627437441645, 30.394361725254186, 30.2806682872549, 30.326807255835664, 30.576670391612204, 30.3988712237784, 30.182143482337377, 30.153859754046067, 30.24181509342324, 30.184643256597337, 27.635013786647995, 27.468744495331467, 25.709681902038596, 26.098090057537743, 26.05084059190269, 26.265890401882974, 26.173225952830947, 26.33285182617492, 26.396674022071156, 26.39595943140243, 26.21256024828821, 26.02893681656617, 26.42799034484905, 26.633905344382203, 26.868695515717395, 26.740567479916955, 27.138289368036105, 27.1556690996732, 27.243268240974167, 27.507997676937443, 27.94917445634921, 28.43161846559685, 29.03478375832556, 30.1154276437902, 31.454790713663243, 31.23585759819484, 31.105841986616877, 31.259715965764084, 31.00187127577765, 30.984767894646748, 31.59195324004046, 31.4748730497977, 31.497402663149717, 31.484175445689388, 31.79037021971229, 30.314308131574847, 30.427513049253037, 30.81913788293781, 31.17379631403673, 31.46375984965181, 32.21376881108913, 32.690425853018986, 32.57557332064725, 32.63087862916278, 32.68514822478992, 32.61578767312481, 34.056495578197946, 33.879748598661685, 33.51848457648615, 33.47539377373172, 33.42298264565827, 33.40316006932773, 32.70932013608777, 32.38632018806411, 32.268620090024896, 32.262813763735224, 31.819996736903292, 31.584889548996912, 29.421305180276097, 28.746681103641453, 28.64263852723312, 28.357950381263617, 28.01927860885465, 27.303457547230007, 27.29029619981326, 26.831261789682536, 27.75222993930906, 27.55956858667912, 27.58546177698089, 27.36105321374105, 29.89353984163993, 29.90290177816682, 29.57416321512477, 29.53462468962029, 29.605486192888268, 30.53702460006225, 30.15039301237161, 30.10056392545908, 28.676396878695925, 28.60265225357921, 28.36623315336267, 27.394695204444183, 27.508514238741707, 27.49194504606549, 28.722227190631813, 28.807437802365392, 28.837752904450667, 27.919386835200747, 28.31346485675381, 28.339559991830065, 28.91414176758481, 30.718182950746964, 30.96288670277, 31.39987927349829, 31.041675205960164, 30.861627597805786, 30.842963165576705, 30.733896699502026, 30.880657490351695, 31.278509913943356, 31.094989897292248, 30.73628421442966, 30.945704128229067, 28.84843930049797, 28.74032308364457, 26.827305060379704, 26.530809777814117, 25.96745433769848, 26.70902694436664, 26.595332123327108, 27.19955648451603, 27.40241477665997, 27.243182092813708, 28.80407916728914, 28.09172298124805, 28.850278599641435, 29.45933590834112, 29.60213473786181, 29.69968093294235, 29.763285440525475, 30.40091395136944, 30.46298858053222, 29.656473900560226, 35.7123254387644, 39.41904684959539, 38.91112194358855, 37.780734158330745, 36.60510631671014, 36.55645897774666, 36.477248157018366, 36.40950530431061, 37.792433290449615, 34.87130448093682, 34.53407791923436, 33.26566389972364, 27.17912069421101, 23.291100150093367, 25.235788378462495, 26.844747855023865, 26.66167162146554, 26.45897317056555, 26.36598999073556, 26.45640035262994, 26.011657498988484, 27.54453843464053, 27.63932139851774, 27.90914813689311, 28.655600268129472, 28.862732023253187, 26.99278530890134, 25.623890753267972, 25.52224758520075, 25.62527082492997, 25.76278495841828, 25.743342223622783, 25.73690716806723, 32.13709991989379, 32.090933199813264, 33.56757172953626, 34.71236485523204, 34.81032715507314, 35.1649374381622, 35.181312239028955, 35.17573788741574, 35.12961727889304, 35.036676448412706, 35.02687943230625, 33.55015249439776, 27.25423674791732, 27.311532173124807, 25.67164091469422, 24.742856865157176, 24.620622900560225, 26.21423230078587, 26.24000731753813, 26.437973901571738, 26.675366786849004, 26.92306304754124, 27.01919970860566, 27.297687830932283, 28.63369135955493, 29.355476949521474, 30.140518654139434, 30.243248319950208, 30.534434136771843, 29.116119235449737, 29.62016206185808, 29.81691216269841, 30.10360221817616, 30.361658778039093, 30.784104211328977, 30.975762430205418, 36.77112135836836, 37.172732087768445, 38.76485314612513, 41.311528521864304, 42.42473405852592, 44.65787876688453, 44.87982789028945, 45.50969743674137, 46.51529072331154, 49.09481759765018, 50.87345243637617, 50.04842169826681, 48.79592027552132, 48.78814322391311, 47.373435681449735, 45.639956220757504, 46.902850085434174, 46.67259827661065, 47.84420538600996, 48.42607746840959, 48.61189698368089, 47.92942267545908, 47.93824611854965, 49.286505282757545, 56.10636960971055, 58.40124851726775, 63.50846260087667, 64.60198887430036, 68.84760323552754, 70.70140847338936, 71.28034889192344, 72.52377323923838, 75.0899715707283, 76.92661562822909, 78.0363755140056, 77.91390364184562, 74.1105224606287, 73.93911394257702, 71.87279778369125, 71.59699245541549, 70.46469318502956, 69.94974169469346, 71.77123990343915, 72.92394358730158, 72.02950223350452, 70.81346959150326, 70.51726972139444, 69.93821540662931, 69.7244313582322, 69.1584404818634, 70.60772882850918, 68.25284785939931, 67.85498596699865, 67.10423107679738, 65.09833801890757, 64.49970013289955, 64.47577398070341, 64.31248988436366, 64.70736840444549, 62.21282998786181, 62.59501112558356, 64.77233134889512, 62.43943597938064, 61.80706415834112, 62.94140341876752, 63.84176193360178, 63.527693292639285, 64.43611785768752, 63.60927580757858, 63.55337024704326, 62.770209502567695, 62.63836668160598, 62.10324386150017, 60.74766335580783, 61.40302063414255, 61.70102791861189, 61.15667755736981, 60.55677202987862, 60.95071886562402, 60.79940258624015, 62.55398988001867, 62.64043487885154, 62.513895134142544, 62.94156452334268, 64.20246616160908, 63.73434094779023, 63.5041789186897, 63.68215981823842, 63.081352581842005, 62.21168594771242, 61.91578327777778, 62.22479744942162, 60.76577123848428, 60.189609401255325, 60.442192638792925, 59.15886466192032, 58.1713403916122, 57.67674780368814, 57.30455199144103, 57.66981233551198, 58.03333615958606, 58.66582123373794, 58.70814725871459, 58.95698943938687, 59.25381329349518, 60.992397859866166, 60.34303437223779, 59.00214022661065, 58.97391081676004, 59.282932891300966, 59.30779942794897, 58.20297464036725, 57.185346162309365, 61.16065467779333, 59.0160093881108, 59.1997780250266, 58.67915318664132, 57.54848831146905, 58.521388471677575, 60.47850626023451, 62.78413240740742, 62.18300929053845, 62.330743322477055, 63.13634000526278, 63.34266642717086, 57.460404865157166, 58.15287767637204, 60.18254189962652, 59.67558345011283, 58.851053555399936, 57.75813170569044, 55.74531827217553, 53.59450696584189, 53.05560967608154, 52.03829812776222, 50.47595399958957, 49.88282322058824, 50.31065788562091, 48.92396737005913, 46.03938439822596, 45.52425748926237, 44.656687294506696, 43.77058376299409, 42.95362337387177, 42.38142063313103, 43.11967918744164, 42.5542412219888, 42.71610327303079, 42.35654511411459, 45.29705173389356, 45.19644239647992, 45.0319983889883, 44.8439058278089, 44.78376576081544, 44.457033635465294, 45.130506187752886, 44.783461494709, 43.52356669094304, 43.45794568783069, 43.32931773560536, 43.21553838593216, 41.47638313702148, 41.5162273219084, 41.57160974338625, 41.66498943004979, 41.42564631784936, 42.44019368228228, 40.828677462962965, 39.91583180088702, 41.17843555897915, 40.855561723242175, 40.76047030812325, 38.93587633652349, 37.7464689335924, 37.28775453004928, 37.04429753258897, 36.85626763390912, 35.8706244274244, 37.11990762581699, 37.1863524798475, 37.638247766106446, 36.25430491985684, 36.637866438608775, 36.35067290320573, 36.28472742047673, 36.276860259741085, 36.489197031451006, 36.48600939698101, 36.54901096187364, 35.638294388851946, 35.734743032368506, 35.40631950081144, 35.94980904692275, 35.46680773502609, 35.510734755368816, 35.95400621093993, 36.02994218028322, 35.5734647858699, 35.22393296634472, 35.225793847105514, 35.22902017810458, 36.43711631777155, 36.265380652661065, 38.02749138636274, 37.62971323295337, 37.42714121776961, 36.95039002240896, 36.31661667506678, 36.0037728418145, 37.40167867849362, 37.02681000169368, 36.31722928446611, 35.26668413694367, 33.25957250778089, 32.782263221397315, 30.39656745066916, 30.02428459228201, 29.808934232251165, 29.567904900871465, 29.517057490118276, 29.230555831974872, 27.45702673941799, 29.05700840811612, 29.236244849408656, 29.20064219179894, 29.138752161064428, 30.55835784529452, 30.565500675039317, 33.54320870417056, 33.51730989534703, 33.635564918067224, 33.004995154450675, 34.915940982337375, 34.8645192404295, 34.962203594104686, 34.69690704855276, 34.74498398177004, 34.892509737550576, 33.568477973070344, 31.96602754477452, 30.38308253337743, 30.25826683945106, 31.729319230443384, 32.42589775023671, 30.713313286570187, 31.00019012240058, 29.35558868495176, 29.330642955493307, 29.366665381535302, 29.27969271257392, 30.64566654684096, 30.65363044592281, 39.37223321623095, 39.28191009414877, 38.753450656215634, 39.75796137597261, 39.79561021078431, 39.678051907563024, 39.577788802754434, 39.58092119654594, 39.4433955567227, 39.436668274743234, 38.81424196817616, 39.86047494429992, 31.426467238717716, 34.84665992717088, 33.525482491129786, 32.92565040461926, 34.15261885869904, 34.488853953859326, 34.53786150140056, 34.362719461251174, 34.41639849393091, 34.43380485776533, 34.623252674369745, 33.655528133262656, 36.13845576322751, 33.802046939153435, 34.89278748630045, 35.413480934951764, 34.954698636009965, 35.625287723467174, 36.51973239729225, 37.450948705401885, 38.15702267880097, 38.81035162729536, 37.81278832454093, 38.92543132937419, 37.371204515795206, 37.57897065985545, 37.5870592175336, 37.909553840578106, 38.13556618074749, 38.30226780475931, 38.52199178742609, 38.90891580446623, 42.505845184796144, 42.78081238779957, 43.12959857388215, 44.12439770197246, 47.65035948605859, 49.19885042156863, 50.38835815336135, 50.44726838511912, 51.9128476215375, 53.77740473965141, 57.88696059803921, 58.28408677824463, 56.1891823251634, 58.838405519792005, 60.59668358099908, 59.749744590570856, 67.96977563499844, 68.4754641506964, 72.7640670121382, 73.84499798910674, 77.94533183673296, 79.95454370261439, 80.2316089782135, 81.43727749883288, 84.3028777342048, 83.64266997378787, 84.22314380166446, 83.60827409671646, 77.94086393572985, 77.80224571778712, 77.51650341492895, 76.08414368464052, 73.88129486301938, 70.6678930357921, 70.66055579944887, 70.70454495596016, 73.05540970032096, 73.10487307589875, 73.38420832965149, 74.77042171646437, 84.89224811056647, 84.41051367320262, 82.90167784049174, 84.00019356092437, 83.80854574719886, 85.27219799299719, 83.38851990071583, 83.86115079077187, 80.41423783208838, 80.70107812542602, 80.10656297681884, 75.80064022704637, 67.24896396349013, 66.77399559897293, 66.97918531131342, 65.4202743683493, 66.70486418922995, 67.21564541121748, 69.06087762978525, 68.09926675521321, 69.12133685941293, 70.44380782819795, 72.39286813881108, 73.71551038725491, 78.3382525890912, 80.52514818043885, 80.5624145053688, 81.96690939464675, 82.28206573225054, 83.05897434466924, 91.95171362200436, 95.1384200506536, 93.80487738390912, 92.0733422263461, 90.26234991919613, 89.49557513475723, 88.74779996055089, 85.54380739160443, 85.22927167662621, 84.46578751268284, 83.64410646506381, 82.41546343734049, 71.95527575706764, 69.84468479388423, 70.19614451929661, 70.47914236150017, 70.07942907290695, 68.09042342408121, 65.67059008169934, 66.48682310414917, 66.28897753485839, 65.93564506348238, 65.54596158761284, 65.37046544677871, 65.41060497743543, 65.36542293487396, 65.2823720484555, 66.71116757057268, 66.95735758224401, 67.35772266573296, 66.74329906945937, 65.79714311266729, 65.89994935294118, 65.63666966985684, 67.67334157049487, 67.836301411637, 67.20812611865858, 67.46182863554311, 67.55566999175227, 65.60759811266729, 65.14141364130096, 65.42029407376285, 65.92727871747589, 65.76574962114846, 65.75693996264978, 65.89704954933086, 63.01588652155635, 63.2164553084345, 62.25522925507515, 61.36306977116403, 61.112000663709935, 60.03933099937753, 59.525393220070825, 58.47132296226268, 60.8824291346094, 60.69227316721133, 59.97555997361363, 59.60740559718331, 59.14059838148992, 60.51111946840959, 63.26800193798631, 62.444801999766575, 60.98960054256148, 60.89585142873807, 61.13580467359166, 60.32196394117646, 57.94389530523912, 57.498850768351545, 56.65123618892263, 57.466516641067535, 57.59612670972482, 53.52083653913788, 49.92162164791472, 50.59517709866169, 51.45122667094134, 52.44057019024277, 52.02298722743543, 51.49452014096055, 50.16482355880475, 50.27219635729848, 52.23875164321771, 52.72057024929972, 52.186335688337095, 53.85078983255525, 57.95230559679428, 56.58441200932478, 55.543840993597, 54.604034451136016, 55.26226071663199, 55.88339294615624, 59.51149885294117, 59.445994397992536, 57.54360589891069, 55.4084502980859, 54.20425149361967, 55.44909533442266, 52.63800145992841, 53.14527025249119, 52.82843435916589, 51.903411534547146, 53.329149975648455, 53.14904358970199, 50.2158097787893, 49.91541920732499, 49.76502442966076, 49.25195724429856, 49.20558479217242, 47.09368758605664, 50.2836940274024, 51.38318088857766, 51.852124594460015, 51.29033809579726, 50.29197352521009, 49.35292301368399, 50.58611101037884, 50.78043721186394, 50.2892250182113, 50.18209551271658, 49.77714393846742, 50.06783223615001, 45.475963166062655, 43.501753086991016, 42.32951829435108, 41.12116830399937, 41.952854809860106, 41.37924966728914, 41.11679179715219, 40.221658253267975, 40.033264176121634, 39.29786039534703, 39.150173641366464, 37.880376916822286, 38.10787700248988, 38.069986997055686, 38.03616762608673, 37.74939185898628, 35.67170326518265, 35.67166010776533, 34.215697417600374, 33.863293564425774, 33.8710783300913, 34.47444615164955, 34.19627132889823, 31.93123144154736, 31.51503614433551, 31.430533554407884, 31.52292545677716, 31.72270481314452, 31.68434308986997, 30.643492731451012, 31.422503403904717, 31.54364519537815, 32.97945351626206, 32.09106557850918, 32.51509766192032, 32.78662126691695, 34.88690979820846, 34.89524456022409, 34.86384637119126, 34.83103647307812, 36.60204773008092, 35.78238173154956, 35.58713857275132, 35.89494914184563, 34.22695137968738, 34.817709462029256, 34.22913031528562, 34.08001404147215, 31.81090739130423, 33.28998705687831, 33.56757137892935, 34.43609170232276, 32.650412622648965, 33.50914697481477, 40.68146275925927, 40.23946413235294, 40.189848912392456, 43.018025688898256, 44.83088308955805, 45.39123737807347, 45.65184970269219, 44.202353398615, 42.95948439712345, 42.77080997134234, 42.81834528797335, 42.53432603804856, 37.14875908839091, 37.07144507796452, 38.66145624876745, 36.6166178488173, 35.05683016728914, 35.17504472983071, 35.5577409020386, 35.65395198693111, 35.728732114067846, 35.64664281437368, 35.18249199486461, 32.553500385299955, 33.791290649626525, 36.37205868464053, 35.59034294732337, 35.375952764705886, 36.359304614997605, 36.408508261360105, 36.56257547936833, 36.79242104387385, 37.07023584889511, 37.477788241508456, 37.64635425645814, 37.37077195652468, 37.08751032741986, 40.48640016657202, 40.45368728586213, 40.684695831621546, 41.95768085239652, 42.44710521560846, 42.54586578594903, 44.05936949943703, 44.77768222300031, 51.61930856318084, 52.30349483971367, 54.2194923752974, 59.30951685185187, 56.8852512412854, 56.91785076307896, 56.32245909188836, 56.389188469654535, 57.29546919930157, 57.924161637632274, 60.02964748057662, 61.37193277288966, 57.69562169273265, 60.53251689301276, 59.464692957019146, 63.12458329388423, 63.36229811267508, 66.16742958169937, 67.0129253036433, 68.01126403485839, 69.81377594063183, 71.92926783545363, 72.86965780539994, 75.709011511399, 74.35899236951447, 73.64436570217654, 72.72050026416122, 70.29158438328665, 70.30066427998675, 70.26333816230937, 70.64851840999111, 72.07432751216943, 73.94300101813403, 75.24438390587086, 80.94983536313156, 79.47396430112045, 81.40107309133876, 84.60480214683133, 85.92885203042329, 87.75917896615312, 88.7043711887644, 90.92541296595212, 94.21867188109438, 94.89253788019197, 98.03532039114532, 97.20335816931218, 90.57957583761348, 89.63833870852784, 89.42519494042257, 87.9220975834316, 88.04421799304582, 87.9305035979614, 88.96270391059758, 87.42257991024711, 85.81284543020541, 82.2672105540377, 76.52946124995267, 77.37542551517275, 76.52923633566371, 75.96934396536261, 76.41080541011063, 74.48588791651105, 72.98796894940152, 68.94490498861315, 64.57534028727046, 62.83434032089363, 62.49756141962341, 65.24541220345884, 65.84552778709215, 63.37053850096537, 62.914075454782655, 61.8861722303708, 60.27545054209461, 59.94496026633987, 60.10339412955183, 65.8332240710123, 66.12245925389045, 66.4947896573296, 65.57055588527207, 63.05949800280112, 60.72874770113601, 63.38846142970097, 65.33207502938039, 66.35951396280734, 67.33058442110178, 68.25886793207285, 67.39284609824416, 63.97401929243114, 65.1474684362185, 66.39107808544975, 68.16461503183403, 68.24979246276774, 71.47740031765295, 69.72238956907563, 68.77372398911847, 67.95070637567402, 67.56619200057578, 68.28761648981127, 69.31030824000933, 69.34294309391537, 68.76732993416395, 66.9572571888422, 66.03408723004138, 65.41371861904761, 63.59659814371304, 62.3381917567655, 63.21724207948439, 62.87676603131008, 62.69375574836601, 61.02520361476227, 62.13759892971002, 61.818684573918446, 63.05171037301587, 63.92025435511982, 63.52840257485216, 64.26932764752569, 63.54378167958294, 63.62177406987239, 62.1276899545596, 61.53537786358868, 60.105693186507935, 58.85247740021469, 54.59344062620604, 51.81005909991644, 49.46050815140186, 48.09565175824774, 46.58321739845938, 45.557014720354815, 44.15489430228759, 43.44893412603356, 42.153459738951135, 41.20027848373794, 40.383662881108, 39.80972071125117, 40.44132491051976, 40.94475606620112, 40.92368033893557, 40.19507129396202, 41.00824337141989, 41.95370813725491, 41.7258462981514, 41.22401867794896, 41.600697784391535, 41.87053676766262, 42.308606485371925, 42.86273525560224, 42.62560773588676, 42.04721893211991, 41.99055057461874, 42.70473409259259, 41.82934616073894, 39.86715138173047, 40.01469590740806, 39.933404875194526, 41.73471642516664, 42.15094059159212, 41.74715187488329, 42.48585353112357, 41.11295175267923, 41.41937420323816, 41.586291549330845, 40.82558263320884, 41.15513645759482, 41.38137685740742, 41.44751150879241, 41.182540448490506, 38.98132392094615, 38.55056628765952, 38.1563098304544, 40.466936740740735, 42.12426137208217, 41.800500895500704, 41.628062295555175, 41.83972824144102, 41.024184906184566, 40.56802455174292, 39.97173523051796, 39.825902613601, 39.638428010280506, 39.25890658423916, 37.49532800809212, 35.40822237905515, 33.77938201027077, 34.07153581224712, 32.98805669319691, 32.33313402497666, 33.90932074431995, 33.461484364845944, 33.14846937176444, 32.57558046926549, 32.033502467086834, 31.585608652738877, 31.379728202370572, 30.595623699857068, 29.583789674525367, 29.141038856297428, 28.906070043572985, 29.33166817412011, 28.65713721204692, 28.83918572938064, 31.542676217320263, 35.6824375070028, 35.63835173902894, 35.55564637924837, 35.18754695339247, 35.099817366701686, 36.47387542669748, 39.34646677850335, 39.2476882630719, 42.251757193161545, 44.77343211698505, 47.75746887153751, 47.30174245860567, 46.64911654061625, 50.42361017561471, 53.750401697012144, 57.26681321607533, 61.11423897743541, 62.23654784764239, 63.17392446498599, 67.02292871973235, 67.31418536509692, 66.45253171164022, 67.07112974976658, 67.08110396394012, 68.63709511531279, 68.73164804325138, 70.4117538225957, 70.77863080182073, 71.68205008815748, 71.93089939853719, 71.56719910792096, 71.42924412324932, 71.53372387542795, 72.04722060045128, 72.12096745908482, 71.84575986122329, 71.00621946234048, 69.3275538058668, 69.36908263826643, 69.33878674284158, 67.78862996364964, 69.6290785883131, 74.74669202555697, 78.4419233594726, 78.1319776974855, 78.12244398731715, 79.12803252894491, 79.71831571493043, 79.88780449875506, 79.90000948731716, 83.07104673454262, 85.55520300038906, 88.51229336749145, 88.03467910963273, 86.72255432659861, 83.4889352221444, 83.46879530184343, 84.11216387480547, 82.55285606084657, 82.78167455385609, 83.65337458815749, 86.17937478854653, 85.77316770214753, 82.75080186083127, 80.75408159867662, 77.28260874009996, 76.778130477202, 78.7020968504513, 80.74978418751945, 81.30041404232803, 82.28961432346134, 82.16950690141611, 80.86113363130123, 78.94828889230729, 75.57485663166305, 76.1405767454884, 75.77443419786803, 75.93137310257504, 75.16312302556737, 72.05518293378462, 71.79132955274342, 71.65290237324282, 72.0775570790532, 71.79884099789916, 74.27480590017117, 75.82510005539996, 77.48215899198568, 79.9555778191721, 80.88613351558317, 81.63009184490937, 88.39443389355742, 89.85239164013385, 90.2449214545596, 89.75592318338066, 92.07241951704016, 92.42585906733972, 89.84932014814814, 91.59030327372912, 92.24589612721758, 92.26519351805167, 94.69319383869632, 93.45785409396656, 94.34298702863369, 95.00588737820247, 99.09234054917523, 102.1099292877373, 101.29584735628696, 101.4650841003735, 98.9565703846872, 97.84666118785924, 100.03411527303145, 99.71810167429194, 98.58181522490922, 97.26160856551508, 94.58582210281732, 95.96039505016016, 95.67660684014, 93.08480004628268, 94.0523651154684, 94.94608922642392, 98.77257121620828, 100.14045546142172, 98.18673863390912, 97.83362865974166, 98.24863557446312, 99.24458833108864, 99.76630156778648, 103.36313139386868, 102.76135364189946, 104.78213266160908, 105.6462991265069, 108.40881220331464, 109.5156007946623, 110.0605955017118, 110.8951857722378, 111.54045595274148, 112.2054114720666, 112.07847618594514, 111.384385265873, 108.00586338764396, 106.13334230166512, 104.63891643923124, 104.12346435060692, 102.6052051004902, 102.36271676758416, 98.42468922061308, 94.07094486819172, 89.91012335636476, 85.3427096014628, 80.49777434586056, 76.31430633986928, 72.96930617451758, 68.99549531154683, 65.25759172634609, 62.015357591425456, 57.74361547976968, 54.28972953501401, 57.463993460452976, 57.66665648777104, 59.36208722782447, 59.820028324229696, 60.04673916736696, 61.61811523592308, 65.27785400451292, 71.28195219016494, 71.73486542397228, 71.45578071209398, 71.54414195105821, 70.80141558652349, 71.78331107796451, 74.0996245096483, 73.42858544032057, 74.53617187013694, 73.89247280213196, 72.69917398576096, 71.47718137047023, 70.76499726034858, 70.90185466993464, 69.75498708060678, 68.85446331621537, 68.56731058302209, 67.6082359671627, 66.09136096910986, 64.95564390157175, 64.11129178623106, 64.40140520809993, 64.57831236686896, 63.67520080283224, 60.40030193474104, 61.81779499073945, 62.78418401844071, 63.09509561212264, 64.1338688784625, 62.95450522728434, 65.13940054338369, 67.7046758005758, 68.11130878205728, 67.80915445681605, 68.41966301259531, 69.00077427801122, 68.53229764505677, 67.3744322489885, 66.63894223016786, 66.31748833761282, 66.84987036770869, 68.22550531808278, 67.90387261057293, 67.10079870090257, 65.72669948160208, 64.87088270276811, 62.90964166111501, 62.66474011780269, 64.28728267112584, 62.53005224385311, 61.81442400820431, 60.8892435515108, 58.26320971366324, 56.66705199112978, 56.44600652046374, 54.01330040234982, 52.77628593098351, 52.09951400303456, 50.906674452614375, 50.74788118502956, 49.3047146678338, 49.28551040943045, 49.03071368098351, 50.14675467429195, 52.12894355197634, 49.9237270995552, 46.21712937916018, 45.48083349290063, 45.14146651136011, 44.76715720074697, 44.09508905096482, 41.30538147564582, 40.391059152661065, 39.33920542071274, 37.54287406862745, 36.54360948731715, 34.4834902867258, 33.953342767896046, 35.493810059134766, 35.67961765841892, 37.10730947891378, 37.047075980547774, 36.87042633846872, 37.95535782436651, 38.3372187425382, 39.33187104177041, 38.87567552233115, 39.89612223342671, 39.25738163235294, 39.81165674664451, 38.20584080625584, 36.82361148979277, 37.75863226361656, 37.63058887729537, 39.28845601719577, 39.41264287752879, 39.49306161147033, 39.22030942538126, 39.4232572653215, 38.13154584530488, 38.30870127115559, 38.26777612317149, 38.197741048630576, 37.42221340916825, 37.08795553112356, 37.11733502069716, 35.58944113071895, 33.21115506198158, 32.71018058537794, 32.71126606981339, 32.27677209194291, 31.37684332547463, 30.47793979162776, 30.231008690631807, 31.519063041975965, 31.08995375516133, 30.688337014039327, 30.19535742281357, 29.748684731346412, 33.49681074489181, 33.11470567842132, 32.360823065904135, 32.3717101887644, 32.376120132703086, 32.067723218176155, 32.64748978711485, 30.848150442032374, 30.895090073451605, 30.67191927147526, 30.28397113095238, 29.62509886203574, 27.04580800194523, 28.573882694211022, 28.75442877380952, 28.53420904614068, 28.581396868269533, 28.60005727567693, 28.98785046847184, 28.972493470821664, 28.793840506069092, 28.71008912090725, 29.469697687518806, 29.533434946908397, 30.132508398070343, 28.811620310535325, 30.041922412464984, 29.913341684018057, 33.077050821468774, 32.650952968720816, 32.12160525416278, 32.243195058198175, 33.85710746774101, 33.85154251655141, 34.41782409136447, 35.547615383521375, 34.89337270062882, 34.49490404522942, 33.21781021631557, 33.29528707889823, 29.959086236461253, 29.471326982415185, 29.50602077067121, 29.661144270481905, 29.722472580205423, 29.814704644646746, 28.24768315499533, 32.18652016713352, 31.90653717065762, 36.76875862511672, 37.97012723171491, 37.96046090821558, 38.02652311336757, 39.60658159648303, 39.92862221367111, 41.33936914359571, 39.61579750824775, 39.70889278657019, 41.23625718164446, 36.022337141300966, 37.42948003408031, 33.099742921879866, 31.872254375116714, 31.78061327537933, 31.88511384362709, 30.193049749455337, 30.48629381849518, 28.956020887254905, 29.23615399921219, 29.104818136579198, 27.475442283989857, 29.829900534562974, 29.99795566920277, 30.779723704407147, 31.925564469977093, 32.872247076059395, 33.32356896851442, 32.93503223401768, 33.22877910152219, 33.20909647437265, 33.13862035434174, 33.13556479618023, 32.579469712807345, 30.317214934860218, 29.70873584796141, 28.958531960002983, 28.73607674159664, 28.854713778555865, 29.590038155384374, 30.964432111500155, 32.35751750621953, 32.962270371381884, 33.67005804614068, 34.2775095392131, 36.551716396514166, 44.0275391004902, 45.54029454022721, 46.29541601330533, 46.10413422191099, 47.22068951649549, 48.65907166160909, 47.27789647407264, 47.77737888655463, 48.6661289221911, 49.09561334352631, 50.93133009230407, 48.32997531207233, 48.545629514044506, 51.37972874606872, 58.06008107415189, 59.07194619950202], [0.0355438852318705, 0.0349859948646125, 0.0344304396202925, 0.0347082174758792, 0.0347222319483348, 0.0335900943880844, 0.0344444540927482, 0.0341503275754746, 0.0338702155306567, 0.0338888896669779, 0.0397222332710862, 0.0397222226112667, 0.0397222333488951, 0.0397222333456531, 0.0394444554933084, 0.0391666776377217, 0.038888899782135, 0.0405555668222875, 0.038055566215375, 0.038055566215375, 0.0383333440709617, 0.0386111117335823, 0.0444444568938686, 0.0450000003112356, 0.045000012605042, 0.0450000125272331, 0.0450000125272331, 0.045000012605042, 0.0455555683162153, 0.0438888893557423, 0.0463889018829754, 0.0463889018829754, 0.0463889018829754, 0.0461111118892001, 0.0427777896825396, 0.0425000118081523, 0.0416666783380018, 0.0416666783380018, 0.0416666783380018, 0.0416666783380018, 0.0405555669156551, 0.0405555668229359, 0.0341666762371615, 0.0397222332710862, 0.0397222332710862, 0.0400000006224712, 0.0513889032057267, 0.0511111112667289, 0.0519444589947089, 0.0519444589169001, 0.0519444589947089, 0.0519444448334889, 0.0608333502956738, 0.0608333334889511, 0.0672222409741674, 0.0616666838624338, 0.0616666838624338, 0.0613888894335512, 0.0455555683162153, 0.0455555556333644, 0.0458333460939931, 0.0458333460939931, 0.045833346171802, 0.0458333339545077, 0.0413889004046062, 0.0413888888888888, 0.0419444561157796, 0.0422222339713663, 0.0422222340491752, 0.0422222226890756, 0.0505555697167756, 0.0511111116557734, 0.05111112535014, 0.0513889032057267, 0.0513889032057267, 0.0522222235449735, 0.0522222368502956, 0.0525000009259261, 0.0527777924836601, 0.0525000147058823, 0.0525000146280734, 0.0525000013927795, 0.0600000158730158, 0.0594654686657114, 0.0544444593059446, 0.0625000174291939, 0.3555556550731403, 0.5744446052242237, 0.5708334931528167, 0.5705557152511972, 0.5708334931528167, 0.5711112710084034, 0.5713890488639901, 0.5722223678804856, 0.5602779334306345, 0.560277934640523, 0.5625748422761699, 0.5575001556178028, 0.2385831116557734, 0.0444654533146592, 0.0680555746187363, 0.0683333341114223, 0.0672222410519763, 0.0669444631185807, 0.066666685262994, 0.0658333516268593, 0.0619444617180205, 0.0619444617180205, 0.0616666839402427, 0.0611111281512605, 0.0613889060068471, 0.0613888895113601, 0.0422222339713663, 0.0419444560976274, 0.0419444561157796, 0.0419444561157796, 0.0419444561157796, 0.0422222340491752, 0.0388888997043261, 0.0386111113445378, 0.038888899782135, 0.0391666776377217, 0.0388888997043261, 0.0391666775547283, 0.0347222319483348, 0.0347082079871189, 0.0347082174758792, 0.0355415510426392, 0.0358193288982259, 0.0355415421763501, 0.038888899782135, 0.0388888996939545, 0.0388888997043261, 0.0391666775599128, 0.0397222332710862, 0.0394444554154995, 0.0397222332710862, 0.0397222227668845, 0.0397222332710862, 0.0388888997043261, 0.0386111218487394, 0.0386111218435549, 0.0347222319483348, 0.0347082081427366, 0.0344304396202925, 0.0341526617647058, 0.0333146598194833, 0.0333146511101196, 0.0491666803610333, 0.0491666673630564, 0.0491666803610333, 0.0494444582166199, 0.0494444582166199, 0.0494444452225334, 0.0611111281512605, 0.061111128089018, 0.0611111281512605, 0.0611111281512605, 0.0616666838624338, 0.0616666838027849, 0.0455555682384064, 0.0455555557111733, 0.0455555682384064, 0.0452777903828197, 0.0452777904606286, 0.0452777903594804, 0.0375000104263927, 0.0375000104263927, 0.0375000104263927, 0.0377777883597883, 0.0375000104263927, 0.0377777784002489, 0.0455555682384064, 0.0455555557111733, 0.0455555682384064, 0.0455555682384064, 0.0455555683162153, 0.0455555683162153, 0.0413889004046062, 0.0413889004824152, 0.0397222332710862, 0.0397222222222222, 0.0452777903828197, 0.0452777903614256, 0.0377777882819794, 0.0377777882742014, 0.0352707757547463, 0.0355555655150949, 0.035548553610333, 0.0352777876595082, 0.0358263314659196, 0.0361111116557734, 0.0377777882819794, 0.0375000104166695, 0.0319094312169312, 0.0319444533924681, 0.0316666755368814, 0.0316316448121755, 0.0341503275754746, 0.0344281054310613, 0.0347222319483348, 0.0352777876595082, 0.0349859953314659, 0.0366666763921335, 0.0347082174758792, 0.0350000098039215, 0.0350000098039215, 0.0347222230781201, 0.0463889018829754, 0.0463889013149737, 0.0463889018829754, 0.0463889018829754, 0.0463889018829754, 0.0461111118892001, 0.0622222396514161, 0.0604715230275444, 0.0627777952847805, 0.0655555739184562, 0.0655555739184562, 0.0655555574229691, 0.0733333538748832, 0.0730532226890756, 0.0736111317304699, 0.0730555759414877, 0.0730555759414877, 0.0730555758636839, 0.0575000160286336, 0.0572222382508559, 0.0572222369281045, 0.0547222375505757, 0.0547222375505757, 0.0547222374312727, 0.0355555655150949, 0.0349813269491131, 0.0355555655150949, 0.0358333433706816, 0.0358193288982259, 0.0358333433706816, 0.0355555655150949, 0.0352777871926548, 0.0352777876549695, 0.0347222319483348, 0.0350000093370681, 0.0352777876595082, 0.0352777876595082, 0.0355555561780267, 0.0352777876595082, 0.0350000098039215, 0.0347222319483348, 0.0352637731870526, 0.0350000098039215, 0.034425762065613, 0.0350000098039215, 0.0358333433706816, 0.0358333433648461, 0.0355555655150949, 0.0358333433706816, 0.0355555561780267, 0.0494304438219732, 0.0494444582944288, 0.0494444582944288, 0.0488889025832555, 0.0488748881107998, 0.0488889020424861, 0.0488889025832555, 0.0480555690164954, 0.0480555690164954, 0.0483333426704014, 0.0483333468720821, 0.0486111153906006, 0.0350000098039215, 0.0350000093370681, 0.0355555655150949, 0.0355555560224089, 0.0594444610955493, 0.0596265185146282, 0.059722238951136, 0.0597222388733271, 0.0600000167289137, 0.0597222234606807, 0.0638889067849362, 0.0636111118113912, 0.0633333510737628, 0.063611128923514, 0.0630555732181761, 0.0633333509298211, 0.0533333482726423, 0.053055559912854, 0.0530555704170557, 0.0530555703392468, 0.0525000146280734, 0.0525000146222405, 0.0480415545440398, 0.0480555689386891, 0.0483333468720821, 0.0480555690164954, 0.0483333468720821, 0.0483333380018674, 0.0422222340491752, 0.0425000003890445, 0.0425000119047619, 0.0425000119047619, 0.042500011826953, 0.0430555565670712, 0.0636111288515406, 0.0635480871459695, 0.0636111288515406, 0.0636111288515406, 0.0636111289293495, 0.0636111287912433, 0.0566666825396825, 0.0563888898225957, 0.056388903750389, 0.0566666825396825, 0.0566666825396825, 0.0563888902894491, 0.043333345393713, 0.0436111232492997, 0.0377777880485527, 0.0408333447712418, 0.0405555669156551, 0.0405555669156551, 0.0633333510737628, 0.0633333509285243, 0.0577777939594357, 0.0630555732181761, 0.0630555732181761, 0.0627777952205929, 0.0550000154061624, 0.0550000001556178, 0.0582422976145089, 0.0580555718176159, 0.0580555718176159, 0.0577777784780578, 0.0583333496732026, 0.0583333496732026, 0.0591666672891378, 0.0594444610955493, 0.060555572517896, 0.0605555724400871, 0.0608333502956738, 0.0605555565670712, 0.0608333502956738, 0.0605555724400871, 0.060555572517896, 0.0611111281000405, 0.0372082170868347, 0.0375000011671335, 0.0425000118139878, 0.036652662464986, 0.0355415510426392, 0.0355415421763501, 0.0600000168067226, 0.0600000008558979, 0.0600000168067226, 0.0600000167289137, 0.0602777946623093, 0.0600000168067226, 0.0597222389446521, 0.0597222388182168, 0.0600000168067226, 0.0602777945845004, 0.0602777946623093, 0.0605555723888672, 0.0358333433706816, 0.0386111218422582, 0.0355415510426392, 0.0355555655150949, 0.0352777876595082, 0.0350000098039215, 0.0352637731870526, 0.0352777876595082, 0.0347222319483348, 0.0344444540927482, 0.0350000098039215, 0.0350000009337068, 0.0391666776377217, 0.0363888898225957, 0.0391666776377217, 0.0391666776377217, 0.0394444554154995, 0.0405555669156551, 0.0444444568938686, 0.0441666672891378, 0.0441666790382819, 0.0441666790382819, 0.0436111233271086, 0.0433333453775059, 0.0391666776377217, 0.0391666775527831, 0.0391666775599128, 0.038888899782135, 0.0386111219265484, 0.0366760043572984, 0.0413889004824151, 0.041388900386454, 0.0358333433706816, 0.0422222340491752, 0.0425000119047619, 0.0425000119047619, 0.0425000119047619, 0.0425000119047619, 0.0425000119047619, 0.042500011826953, 0.0425000119047619, 0.0414332407407407, 0.0344444540927482, 0.03444444475568, 0.0400000112044817, 0.0336111205259881, 0.0333333426704014, 0.0333193281979458, 0.0335971060535325, 0.0338888983815748, 0.0338888983815748, 0.0341666762371615, 0.0341666762371615, 0.0341666762371615, 0.0341526617647058, 0.0341666761593552, 0.0344444540927482, 0.0347222319483348, 0.0350000098039215, 0.0349859864651767, 0.0386111219265484, 0.0394444453781512, 0.0386111219265484, 0.0383333439931528, 0.0383333440709617, 0.0386111219265484, 0.0386111219265484, 0.038888899782135, 0.0333333338001867, 0.0386111219265484, 0.0383333440709617, 0.0383333439879683, 0.0344444540927482, 0.0333333333333333, 0.0344444540927482, 0.0347222319483348, 0.0347222319483348, 0.0344304304427678, 0.0386111218487394, 0.0383333439931528, 0.0427777896630906, 0.0383333439931528, 0.0386111218487394, 0.0391666676781823, 0.0469444575941487, 0.0472222228395063, 0.0475000132275132, 0.0472222353719265, 0.0475000132275132, 0.0477777910532767, 0.0477777911609088, 0.0486111247276688, 0.0484313734827264, 0.0483333467942732, 0.0480555690164954, 0.0477777910597605, 0.0438889011048864, 0.0436111232311474, 0.0391666776377217, 0.0430555676159352, 0.0430555676159352, 0.0427777897603485, 0.0386111219265484, 0.038055566215375, 0.038055566215375, 0.0383333437597261, 0.038888899782135, 0.0377894499688764, 0.0350000098039215, 0.0350000004668534, 0.0350000004668534, 0.0349859953314659, 0.0347222319483348, 0.0352777876595082, 0.0352637731870526, 0.0350000004668534, 0.0350000098039215, 0.0350000098000312, 0.0344304396202925, 0.0347082174758792, 0.0344304396202925, 0.0372222325643248, 0.0344444540927482, 0.0344444540927482, 0.0350000098039215, 0.0344444540927482, 0.0344444540927482, 0.0369444547093865, 0.0344444540927482, 0.0341666762371615, 0.0341666762371615, 0.0341666760037348, 0.0344304396202925, 0.0319444448334889, 0.0347222315592903, 0.0352777876595082, 0.0347222319483348, 0.0347082082205456, 0.0397222333488951, 0.0369444357298501, 0.0400000112044817, 0.0400000105042016, 0.0405555668378462, 0.0402777790162363, 0.0519444589947089, 0.0522222230781201, 0.0525000146981017, 0.0519444589947089, 0.0522222367724867, 0.0525000013927795, 0.0513889032057267, 0.0516666810250063, 0.0497222360722066, 0.0516666811326384, 0.05111112535014, 0.05138890317331, 0.0394444554933084, 0.039166677550838, 0.0336111205259881, 0.0397222333488951, 0.0394444554933084, 0.039444445533769, 0.0397222333488951, 0.0394444554933084, 0.0397455659041394, 0.0394444554933084, 0.0397222333488951, 0.0400000011671335, 0.0555555711173358, 0.0558333345782757, 0.0622222395736072, 0.0563889046840958, 0.0563889046062869, 0.0561111267085577, 0.0519444589947089, 0.0519444453003423, 0.0519444589947089, 0.0516666810613134, 0.0516666811391223, 0.0511111122004357, 0.0475000126828509, 0.0500000138979701, 0.0461111240273887, 0.0461111240273887, 0.0461111240273887, 0.0461111240273887, 0.0461111240273887, 0.0461111113445378, 0.046666679738562, 0.0466666793495175, 0.0469444575163398, 0.0469444453781512, 0.0388888997782447, 0.0358333337223778, 0.0386111218487394, 0.0386111219265484, 0.0386111218487394, 0.038611111967009, 0.0430555675381263, 0.0430555675199741, 0.0425000119047619, 0.0430555675335876, 0.0430555676159352, 0.0433333447569799, 0.0397222333488951, 0.0397222233854654, 0.0400000112044817, 0.0397222333488951, 0.0397222333488951, 0.0400000012449424, 0.0394444554933084, 0.0394444450669156, 0.0394444554933084, 0.0394444554154995, 0.0388888997043261, 0.0386111218454975, 0.0386111219265484, 0.0388888893557423, 0.0391666776377217, 0.0391666776377217, 0.0391666775599128, 0.0388888898225957, 0.0505555697167756, 0.0508333338779956, 0.05111112535014, 0.0505555696389667, 0.0505555697167756, 0.0505555697167756, 0.0502777918611889, 0.0500000003112356, 0.0497222361500155, 0.0497222360722066, 0.0497222360722066, 0.0497222360397899, 0.0341526617647058, 0.0338888890445066, 0.0335971060535325, 0.0335971060535325, 0.0341526617647058, 0.0344304396202925, 0.0344304396202925, 0.03444444475568, 0.0341666762371615, 0.0341666762371615, 0.0344444540927482, 0.0344444452225334, 0.0383333439931528, 0.0383333439840779, 0.0383333440709617, 0.0386111219265484, 0.0383333440709617, 0.0383333440709617, 0.0386111219265484, 0.0386111115001556, 0.0386111218487394, 0.0386111219265484, 0.0383333440709617, 0.0383333439879683, 0.0344304396202925, 0.0349859953314659, 0.0349859953314659, 0.0347222319483348, 0.0344444540927482, 0.0341666760037348, 0.0347082174758792, 0.0347222226112667, 0.0347222319483348, 0.0347222319483348, 0.0350000098039215, 0.0350000098039215, 0.038888899782135, 0.0383333437597261, 0.0386111218487394, 0.0391666776377217, 0.0391666775599128, 0.0394444554881213, 0.038888899782135, 0.0388888996952513, 0.038888899782135, 0.0391666775599128, 0.0386111218487395, 0.0388888899004046, 0.0466666796607531, 0.0466666672067902, 0.0463889018829754, 0.045833346171802, 0.045833346171802, 0.0455555682384064, 0.0455555683162153, 0.0461111115001556, 0.0461111240273887, 0.045833346171802, 0.0461111240273887, 0.0458333460706538, 0.0383333440709617, 0.0383333439840779, 0.0383333440709617, 0.0383333440709617, 0.0391666775599128, 0.0394444554933084, 0.0391666770930594, 0.0416666782446342, 0.038888899782135, 0.038888899782135, 0.0394444554933084, 0.0405742310924369, 0.037222232648615, 0.0372152111753223, 0.037215220743853, 0.037222232648615, 0.0363888990818549, 0.0361111121226268, 0.0400000111999431, 0.037222232648615, 0.0400000112044818, 0.0400000112044818, 0.0394444554933084, 0.0375000005446623, 0.0611111282290694, 0.0613888890445066, 0.0611111282290694, 0.0611111282290694, 0.0611111282290694, 0.0611111117335823, 0.0769444659975101, 0.0772222438530968, 0.0772222438530968, 0.0775000216308745, 0.0775000217086834, 0.0775000215342676, 0.0544444596949891, 0.0544444449112978, 0.0547222374727668, 0.0550000153283535, 0.0550000153283535, 0.055000015286211, 0.0352777876595082, 0.0347222226112667, 0.0352637731870526, 0.0352637731870526, 0.0355555655150949, 0.0355415510426392, 0.0350000098039215, 0.0347222318705285, 0.0347222319483348, 0.0344444540927482, 0.0344444540927482, 0.0344444540927482, 0.0347082174758792, 0.0347222226112667, 0.0341596643323996, 0.0344444540927482, 0.0341526617647058, 0.0341526617647058, 0.0344304396202925, 0.0347082174758792, 0.0347222319483348, 0.0347222319483348, 0.0347082174758792, 0.0355555566448801, 0.058888905306567, 0.0588888894335512, 0.0586111275287892, 0.0583333496732026, 0.0583333496732026, 0.0586111275287892, 0.0591666831621537, 0.0588888894335512, 0.0597222388733271, 0.059722238951136, 0.0600000168067226, 0.0591666677559912, 0.0397222333488951, 0.0400000007002801, 0.0400000111266728, 0.0400000112044817, 0.0400000112044817, 0.0400000112044817, 0.0391666776377217, 0.0394444449891067, 0.0388888997043261, 0.0391666776377217, 0.038888899782135, 0.0391666676003734, 0.0547222374727668, 0.054722237426734, 0.0547222375505757, 0.0547222375505757, 0.0555555710395269, 0.0555555711173358, 0.0600000168067226, 0.0600000166731551, 0.0597222388733271, 0.0594444610955493, 0.0600000167289137, 0.0597222388214588, 0.0402777889822595, 0.0400000007002801, 0.0402777882819794, 0.0405555669156551, 0.0400000112044817, 0.039460785480859, 0.0394444554933084, 0.0394444554154995, 0.0397222333488951, 0.0397222333488951, 0.0394444554933084, 0.039444445533769, 0.0591666832399626, 0.0594444451447245, 0.0591666832347755, 0.0591666831621537, 0.0591666831621537, 0.0588888899004046, 0.0588889053843759, 0.0588889053843759, 0.0586111274509803, 0.058888905306567, 0.0586111275287892, 0.0591666677559912, 0.0472222354497354, 0.0469444449112978, 0.0472222354497354, 0.0469444575941487, 0.046666679738562, 0.0469444574923521, 0.0430555676159352, 0.0427777896825396, 0.0427777897603485, 0.042500011826953, 0.0425000119047619, 0.0419444561008693, 0.0341526617647058, 0.0344444540149418, 0.0344444540927482, 0.0344444540927482, 0.0344444540927482, 0.0341666673669467, 0.0458333460939931, 0.0461111240273887, 0.0466666796607531, 0.0469444575163398, 0.0472222353719265, 0.0475000012449424, 0.0633333510737628, 0.0633333510737628, 0.0633333510737628, 0.0638889067849362, 0.0638889067849362, 0.0641666845037134, 0.052777792561469, 0.0527777924836601, 0.0522222367724867, 0.0519444589947089, 0.0519444589947089, 0.0519444588844833, 0.0361111212262682, 0.0360971059757236, 0.0363748846093993, 0.0363748846093993, 0.0363888990818549, 0.0361111212262682, 0.0358193288982259, 0.0358193195650834, 0.0360971067538126, 0.0360971067538126, 0.0361111212262682, 0.0358333433706816, 0.0358193288982259, 0.0355415510374521, 0.0349859953314659, 0.0344444540927482, 0.0347082174758792, 0.0350000098039215, 0.0352777876595082, 0.0350000097261152, 0.0347222319483348, 0.0349859953314659, 0.0347222319483348, 0.0347222319483348, 0.0344304396202925, 0.0347082081427366, 0.0347222319483348, 0.0347222319483348, 0.0347222319483348, 0.0344444452225334, 0.0425000115157174, 0.0433333454715219, 0.0433333454715219, 0.0430555675381263, 0.0436111232492997, 0.0436111233271086, 0.0438889011826953, 0.0436111118113912, 0.0438889011826953, 0.0438889011826953, 0.0436111233271086, 0.0436111115779645, 0.0513889032777001, 0.0505555560224089, 0.0505555696389667, 0.0505555697167756, 0.0508333474945533, 0.0522222368502956, 0.0519444589947089, 0.0519444451447245, 0.0516666811391223, 0.0519444589947089, 0.0519444589947089, 0.0519444588786478, 0.0358333433706816, 0.0361111205246939, 0.0332959858387799, 0.0369444547930283, 0.0363888990818549, 0.0350000009337068, 0.0427777896825396, 0.0427777896643874, 0.0427777896825396, 0.0427777897603485, 0.0427777897603485, 0.0427777897603485, 0.0427777897603485, 0.0425000119015199, 0.0433870224815853, 0.0422222339713663, 0.0419444561935885, 0.0422222339571044, 0.0350000098039215, 0.0349859859983233, 0.0352777876595082, 0.0352777876595082, 0.0352637731870526, 0.0352777787892935, 0.0469444575941487, 0.0469444575941487, 0.0411111115779645, 0.046666679738562, 0.0466666796607531, 0.0463889018051665, 0.0458333460939931, 0.04583333356676, 0.0455555682384064, 0.0452777903828197, 0.0452777903828197, 0.0452777903594804, 0.0375000104263927, 0.0375000000778089, 0.0430555675160838, 0.0375000104263927, 0.0375000104263927, 0.0377777785558667, 0.0533333482726424, 0.0533333481507458, 0.053611126128229, 0.0536111260504201, 0.053611126128229, 0.0531932642782642, 0.0577777939620292, 0.0577777938310552, 0.058055571739807, 0.0580555718176159, 0.0594444610955493, 0.061944461667449, 0.0536111260504201, 0.0538889039060068, 0.0536111260504201, 0.0536111260504201, 0.0536111260504201, 0.0533333372237784, 0.0694444638966697, 0.0694444638966697, 0.0691666859632742, 0.0691666859632742, 0.0675863838313103, 0.0650653755057578, 0.0583426864301276, 0.0588889053843759, 0.0588889053843759, 0.0591666832399626, 0.059722238951136, 0.0597222388227555, 0.0366666769374416, 0.0375000105042016, 0.0319444533924681, 0.0375000105042016, 0.0377777883597883, 0.0377637650210435, 0.0411111225490196, 0.0405555669156551, 0.0405555669156551, 0.0402777890600684, 0.0397222333488951, 0.0405555668378462, 0.0397222332710862, 0.0397222333488951, 0.045000012605042, 0.0397222332710862, 0.0391666776377217, 0.0397222332639565, 0.0400000112044817, 0.0402777787892935, 0.0402777890600684, 0.0402777890600684, 0.0402777890600684, 0.0394444454559601, 0.0433333449268596, 0.0433333454715219, 0.0433333454715219, 0.0430555670712729, 0.0433333454715219, 0.0425466754459984, 0.0472222354497354, 0.0469444574930005, 0.0469444575941487, 0.0472222354497354, 0.0475000133053221, 0.0483333467709339, 0.1327778149620036, 0.1352778150482415, 0.1355555934484905, 0.1355555935191671, 0.1358333713040771, 0.1355555932215579, 0.1316667035480859, 0.1316667035480859, 0.131666703470277, 0.1319444813258637, 0.1319444814036726, 0.1311111122782446, 0.0511111254279489, 0.0475840347766885, 0.041944455804544, 0.0475000132275132, 0.0466783506069094, 0.0459126992685963, 0.0427777897603485, 0.0427777897603485, 0.0427777896825396, 0.0422222340491752, 0.0419444561935885, 0.0422222339571044, 0.038055566215375, 0.038055566215375, 0.0411531286907357, 0.0380555661375661, 0.038055566215375, 0.0380555561780267, 0.0502777918611889, 0.0502777918611889, 0.05027779178338, 0.050555569327731, 0.0508333475723622, 0.0505555697167756, 0.0502777918611889, 0.0505555564114534, 0.0505555697167756, 0.0505555696389667, 0.05111112535014, 0.0513888899782135, 0.046666679738562, 0.0469444449891067, 0.0472222353719265, 0.0469444575118011, 0.0469444575163398, 0.0469444454559601, 0.0508333475723622, 0.0505555696065499, 0.0505555696389667, 0.05111112535014, 0.0505555696389667, 0.0502777917509632, 0.0427777897603485, 0.0425000118088007, 0.0427777896825396, 0.0430555676159352, 0.0430555670712729, 0.0433333344226579, 0.0394444554933084, 0.0397222332710862, 0.0352777876595082, 0.0405555669156551, 0.0411111226268285, 0.0422222340491752, 0.0458333448490507, 0.0461111240273887, 0.0455555683162153, 0.0455555683162153, 0.0452777904509029, 0.0450000125129712, 0.0411111226268285, 0.0411111226268285, 0.045833346171802, 0.0402777890600684, 0.0394631290071584, 0.0377894499688764, 0.0347222315592903, 0.0350000098039215, 0.0350000098039215, 0.0350000098039215, 0.0350000098039215, 0.0349859953314659, 0.0350000098039215, 0.0347082174758792, 0.0288888892001244, 0.0341666762371615, 0.0341666762371615, 0.0341666673669467, 0.0377777883571948, 0.037222232648615, 0.0316666668222844, 0.0369444547930283, 0.0369444547930283, 0.0369444547930283, 0.0408333447712418, 0.0408333447712418, 0.0469444574865166, 0.0413889004824151, 0.0413889004046062, 0.041388889589169, 0.0419444561157796, 0.0422222339713663, 0.0477777910519799, 0.042500011826953, 0.042500011826953, 0.0425000008558979, 0.0463889018829754, 0.046666679738562, 0.0405555555555555, 0.0463889018051665, 0.0469444575941487, 0.0469444574930005, 0.0427777897603485, 0.0425000119047619, 0.0369444448334889, 0.0422222339713663, 0.042500011826953, 0.0427777787114845, 0.0397222332710862, 0.0394444554933084, 0.0461111239197566, 0.0405555669156551, 0.0402777889822595, 0.0402777889822595, 0.0402777889822595, 0.0405555668378462, 0.0463889017831239, 0.0408333446934329, 0.0405555669156551, 0.0402777791005291, 0.0402777890600684, 0.0405555668378462, 0.0397222333488951, 0.0397222332710862, 0.0394444547930283, 0.0411111126672891, 0.045000012605042, 0.0447222346716464, 0.0447222346716464, 0.045000012605042, 0.0455555683162153, 0.045833335122938, 0.0491666804388422, 0.0488889025832555, 0.0433333344226579, 0.0486111237161531, 0.0494444582840547, 0.0477777910597605, 0.0438889011826953, 0.0438889011826953, 0.0436111233271086, 0.0438889011826953, 0.0439122430750077, 0.0452777794117647, 0.061388906084656, 0.0611111282290694, 0.061111128097447, 0.0611111282186952, 0.0608333503734827, 0.0613888907563025, 0.0808333559757236, 0.0808333559757236, 0.0808333559757236, 0.0803128131030189, 0.0800000224089635, 0.0780718954202597, 0.0586111275287892, 0.058888905306567, 0.0627077510115157, 0.058888905306567, 0.0580672427637721, 0.0580555564114534, 0.0463889018829754, 0.0550000153283535, 0.0575000229041111, 0.0575000192966075, 0.0572222402387478, 0.057500017314841, 0.0533333492063492, 0.0536111267940691, 0.0536111266016578, 0.0541666821679289, 0.0541666820548732, 0.0547222375612622, 0.0469444576446194, 0.038888899782135, 0.0366666769374416, 0.0366666769374416, 0.0366666769374416, 0.0369421020081261, 0.0611111282290694, 0.0611111281512605, 0.0608333503734827, 0.0602777946623093, 0.0602777946623093, 0.0600000011671335, 0.0638889067071273, 0.0633333510737628, 0.0611111281512605, 0.0630555732181761, 0.0630555732181761, 0.0625000009337068, 0.042500011826953, 0.0422222339713663, 0.03694444475568, 0.0425000119047619, 0.0425000119047619, 0.0427777786336756, 0.0469444575163398, 0.0469444575941487, 0.0473132594926859, 0.046666679738562, 0.046666679738562, 0.046666679636117, 0.043333345393713, 0.0436111233271086, 0.0422222229225023, 0.0441666790382819, 0.0444444568938686, 0.0438888900560224, 0.0602777945845004, 0.060555572517896, 0.060555572517896, 0.0605555724400871, 0.0605555724400871, 0.0605555724400871, 0.0600000167289137, 0.0600000168067226, 0.0669444630466124, 0.0594444610177404, 0.0591666832399626, 0.0588888899004046, 0.0388888997043261, 0.0386111218487395, 0.0391666776377217, 0.0391666775599128, 0.0394444554154995, 0.0394444554933084, 0.0391666776377217, 0.038888899782135, 0.0363888990818549, 0.0363888986928104, 0.0369444547930283, 0.0372222232337379, 0.0563889046840958, 0.0563889046840958, 0.0558333488951136, 0.0561111267507002, 0.0558333489729225, 0.0561111268285091, 0.0600000168067226, 0.0605555724400871, 0.0572222382508559, 0.063055573212989, 0.0636111289293495, 0.0633333345004668, 0.0477777910830999, 0.0483333468720821, 0.0430555564892623, 0.0486111247276688, 0.0486111247276688, 0.0484196902963834, 0.0491666804388422, 0.0488889025832555, 0.0491666803610333, 0.0488889025054466, 0.0477777910830999, 0.0475000004668534, 0.0555555710395269, 0.0550000153283535, 0.0605555723810865, 0.0547222370837223, 0.0550000154061624, 0.0680555604575163, 0.0894444694989106, 0.0894444694211017, 0.0891666714908185, 0.0894444694989106, 0.0894444694989106, 0.0900000054051263, 0.0777777995642701, 0.0783333552754435, 0.0725000202303143, 0.0780555773796569, 0.0777777995642701, 0.0641666845024166, 0.0394444554933084, 0.0394444548708372, 0.0461111239275372, 0.0402777890600684, 0.0405555659819483, 0.0405555668326617, 0.0386111219265484, 0.038888899782135, 0.0391526538321235, 0.0391526631652661, 0.0391526631652661, 0.039166668767507, 0.0622222395736072, 0.0627777952711644, 0.0561111124338624, 0.0619444617180205, 0.0616666838514112, 0.0619444463896669, 0.0836111336756925, 0.083055578820417, 0.0838888899004046, 0.0838889123871771, 0.0838889123871771, 0.0838889122036838, 0.0602777946623093, 0.059722238951136, 0.0597222388188652, 0.0602777946623093, 0.0602777946623093, 0.0597222234671646, 0.0400000111979979, 0.0400000111266728, 0.0444444563271637, 0.0391666776377217, 0.0391666775599128, 0.0388888898225957, 0.0627777952847805, 0.0627777952847805, 0.0683333523965141, 0.0619444617180205, 0.0630555731403672, 0.0630555730800699, 0.0594444610955493, 0.0594444610955493, 0.0538888895833335, 0.0594444610955493, 0.0594444610955493, 0.0597222234671646, 0.0594444610955493, 0.0594444610955493, 0.053888889589169, 0.059722238951136, 0.0586111275287892, 0.0586111275287892, 0.0608333503734827, 0.0608333492841581, 0.0669444630505028, 0.061388906084656, 0.0616666839402427, 0.0622222395223873, 0.0397222333488951, 0.0397222333488951, 0.0402777889822621, 0.0402637745876128, 0.0413889004824151, 0.0416666694677871, 0.0508333474945533, 0.0505555696259989, 0.0475000133053221, 0.0477777911609088, 0.0477777896047307, 0.0472642394957983, 0.0702777973856209, 0.0702777973856209, 0.0761111323529411, 0.0708333531746031, 0.0700000195300342, 0.0697222416024792, 0.058055571739807, 0.058055571739807, 0.060555572517896, 0.0600000168067226, 0.0597222389446521, 0.0588889052553471, 0.0394444554933084, 0.0391666776377217, 0.0383333440709617, 0.0377777883597883, 0.038055566215375, 0.0386111218487394, 0.0388888997043261, 0.038888899782135, 0.038888899782135, 0.038888899782135, 0.0394444554933084, 0.0394444554154995, 0.0358333433706816, 0.0358333433706816, 0.0358333433706816, 0.0358333433706816, 0.0355415510426392, 0.0349859953314659, 0.0349859953314659, 0.0349859948646125, 0.0355555655150949, 0.0361111212262682, 0.0355555655150949, 0.0355555566448801, 0.0594444610955493, 0.059458585393291, 0.0544444453003423, 0.0602777945845004, 0.0600000168067226, 0.0602777946623093, 0.0600000168067226, 0.0607438964793563, 0.0711111310301898, 0.0708333530967942, 0.0708333530967942, 0.0711111309018094, 0.0469281089324618, 0.0469281089324618, 0.0519444589045833, 0.0461111203703703, 0.0466503310768752, 0.0466503222890488, 0.0508333474945533, 0.0508333475723622, 0.0394631289293495, 0.0405555668378462, 0.0408333447712418, 0.0411111226268285, 0.045000012605042, 0.045000012605042, 0.0452777904606287, 0.045555566993464, 0.0452777903828197, 0.0452777903685578, 0.0411111226268285, 0.0411111226307848, 0.0413889004824151, 0.0408333447712418, 0.0411111226268285, 0.0405555569561157, 0.0411111226268285, 0.0416666783380018, 0.0413889004824151, 0.041666678328276, 0.0413888993930905, 0.0413888904450669, 0.0569444603952692, 0.0566666825396825, 0.0564169149548708, 0.0561111268285091, 0.0558333489729225, 0.055833348852971, 0.051030593248693, 0.0508333475723622, 0.04527777832244, 0.0502777918611889, 0.0508333475678235, 0.0508333474621366, 0.0355555655150949, 0.0355555655150949, 0.029666192903961, 0.0352777876595082, 0.0350000098039215, 0.0350000009337068, 0.046666679738562, 0.0463889018829754, 0.0522222367322894, 0.0469444575163398, 0.0466666796607531, 0.0463889018051665, 0.0461111239495798, 0.0463889018829754, 0.051666681021116, 0.0461111240273887, 0.0461111239495798, 0.0461111118892001, 0.046666679738562, 0.0466666792717086, 0.0409930559446, 0.0466666796607531, 0.0463889018829754, 0.0463889018829754, 0.046666679738562, 0.0469444575941487, 0.0469444575941487, 0.0472222354497354, 0.0475000133053221, 0.0475000132035255, 0.0352777876595082, 0.0352777876549695, 0.0397222332607146, 0.0352777876595082, 0.0352777871148459, 0.0352777789449113, 0.0586111275287892, 0.0583333496732026, 0.0586111275287892, 0.0583333496778184, 0.0580555718176159, 0.058055571739807, 0.0619444617180205, 0.0619444617180205, 0.0579715220173037, 0.0616031245225962, 0.0613889060042536, 0.0616666674447556, 0.0577777939620292, 0.0572222382508559, 0.0513888891223155, 0.0569444603174603, 0.0572222381730469, 0.0565592760960635, 0.0769444659975101, 0.0772222438530968, 0.072803455567227, 0.0775000217086834, 0.0775000217086834, 0.0772222230003112, 0.0691666859632742, 0.0697222417522564, 0.0752777986908709, 0.0702777973895773, 0.0700000196117995, 0.0700000008558979, 0.0686111303299097, 0.0683333481948334, 0.0661111154684095, 0.0663889074074074, 0.0661111296296296, 0.066111115857454, 0.0741666874416433, 0.0738889095860566, 0.0683333523965141, 0.0736111317304699, 0.0736111317304699, 0.0736111157018362, 0.0555555711173358, 0.0555555711147422, 0.0577777935956834, 0.0577777938842203, 0.0580555718176159, 0.0580555716885871, 0.0386111218487394, 0.0386111218487394, 0.0447222346716464, 0.0394444554154995, 0.0397222332710862, 0.0397222233893557, 0.0591666831621537, 0.0591666832399626, 0.0591666832347755, 0.0588889048397136, 0.059722238951136, 0.0597222234671646, 0.083055578820417, 0.0836111345315904, 0.0830555787426081, 0.0827778009648303, 0.0827778009648303, 0.0836111115779645, 0.0641666846405228, 0.0644444624961095, 0.0702777974634298, 0.0647222403445639, 0.0638889067849362, 0.0641666678338001, 0.0444444568938686, 0.0438889011048864, 0.0386111212262682, 0.0444444568160597, 0.0441666790382819, 0.045277790358832, 0.0413889004046062, 0.0411111226268285, 0.0369444544817927, 0.0408333447712418, 0.0405555669156551, 0.0405555571117335, 0.0602777946623093, 0.0605555713507625, 0.0605555714285714, 0.0602777945845004, 0.0602777945845004, 0.0583333495953937, 0.058055571739807, 0.0583333496732026, 0.051234828116895, 0.0583333496732026, 0.0583333492063492, 0.0586111120448179, 0.0547222375505757, 0.0544444596917471, 0.0572222382482623, 0.0538889039838157, 0.0541666818394024, 0.0544444596949891, 0.0544444596949891, 0.0541666818394024, 0.0569444603952692, 0.0541666818394024, 0.0547222375466854, 0.0544444595750376, 0.0347222319483348, 0.0350000098039215, 0.0352801125116713, 0.0350000098039215, 0.0350000098039215, 0.0347082086095901, 0.0388888997043261, 0.0388888997043261, 0.0447222347494553, 0.0391666776377217, 0.0386111219265484, 0.0383333437597261, 0.0386111219265484, 0.0386111219265484, 0.0330555648148148, 0.038888899782135, 0.0386111219265484, 0.0388888996991416, 0.0350000098039215, 0.0352777876595082, 0.0294444444444444, 0.0352777876595082, 0.0361111212262682, 0.036374884602267, 0.0361111212262682, 0.0358333433706816, 0.0358333433706816, 0.0358333433706816, 0.0358333433706816, 0.0355415421763501, 0.0508333474945533, 0.0505555696389667, 0.0505555560185186, 0.0508333475723622, 0.0500000140056022, 0.0497222229225023, 0.0538889039060068, 0.0538889039060068, 0.0594444610177404, 0.0538889039060068, 0.0541666817615935, 0.0541666675225645, 0.0425000119047619, 0.0425000119047619, 0.0425000118088007, 0.0419444561935885, 0.0425000119047619, 0.0425000008558979, 0.0625000175070028, 0.0630555732181761, 0.0636111289293495, 0.0636111289293495, 0.0633333509959539, 0.0636111287912433, 0.0600000167289137, 0.0600000167289137, 0.0600000163398692, 0.0608333503734827, 0.0602777946623093, 0.0605555570339246, 0.0447222347494553, 0.0447222347494553, 0.038611111967009, 0.0441666790382819, 0.0441666790382819, 0.0438888901338313, 0.0475000133053221, 0.0477777903828198, 0.0458986821323332, 0.0472222354497354, 0.0472222354497354, 0.0475000132041739, 0.0391666776377217, 0.0386111219265484, 0.0388888892779333, 0.0386111219265484, 0.0386111219265484, 0.0386111218435549, 0.0350000098039215, 0.0350000093370681, 0.0350000097261152, 0.0350000098039215, 0.0349859953314659, 0.0350000009337068, 0.0588889053843759, 0.0588889053843759, 0.0586111273965185, 0.0586111275287892, 0.0586111275287892, 0.0588888899004046, 0.0625000175070028, 0.0622222396481742, 0.0625000174291939, 0.0625000175070028, 0.0627777952847805, 0.0630555730800699, 0.0391666775599128, 0.0391666775599128, 0.0394444554154995, 0.0400000112044817, 0.0400000111266728, 0.0400000111214883, 0.0361111212262682, 0.0363888990818549, 0.0360971067538126, 0.0360971067538126, 0.0358333433706816, 0.0358333433706816, 0.0361111212262682, 0.0360971067538126, 0.0358333340336134, 0.0352637731870526, 0.0361111212262682, 0.0358333433706816, 0.0358333433706816, 0.0355555655150949, 0.0358333340336134, 0.0363888990818549, 0.0369444547930283, 0.0363888902116402, 0.0402777890600684, 0.0405555669156551, 0.0405555668287714, 0.0408333446934329, 0.0400000112044817, 0.0400000012449424, 0.0441666782601929, 0.0452777904606287, 0.0511111253183717, 0.0455555683162153, 0.045833346171802, 0.0461111129007158, 0.061388906084656, 0.061388906084656, 0.0622222395736072, 0.0619444617958294, 0.0622222396514161, 0.0625000020230314, 0.0622222396384484, 0.0608683619572015, 0.054752582010582, 0.060555572517896, 0.0602777946623093, 0.0597222235449735, 0.0563889046840958, 0.0561111268285091, 0.0552777931839402, 0.0552777931839402, 0.0550000153283535, 0.0552777788671023, 0.0750000209305944, 0.0750000209254073, 0.0750000210084033, 0.07444446529723, 0.0738889095860566, 0.0738889094200698, 0.0580555718176159, 0.0591666831621537, 0.0652777959850606, 0.0600000168067226, 0.0600000168067226, 0.0597222388221071, 0.0361111212262682, 0.0361111212262682, 0.0358333429038282, 0.0360971067538126, 0.0361111212262682, 0.0361111212262682, 0.0400000111266728, 0.0388888997043261, 0.0327567609769422, 0.038055566215375, 0.038055566215375, 0.0377777882819794, 0.0377777883597883, 0.0377777883597883, 0.0358333242296944, 0.0383333440709617, 0.0386111219265484, 0.0377917743502657, 0.0386111215375038, 0.0394444554933084, 0.0394444554064247, 0.0397222333488951, 0.0397222332710862, 0.0397222233893557, 0.0591666832399626, 0.0591666832399626, 0.0588889052521052, 0.0822222447089947, 0.0822222451758481, 0.0822222445255014, 0.0783333551930959, 0.0775000217086834, 0.0775000216308745, 0.0927778036881419, 0.0927778036881419, 0.0933333592663987, 0.07444446529723, 0.0750000210084033, 0.0747222430750077, 0.0511111254227618, 0.0511111254279489, 0.0513889031998912, 0.0513889025054466, 0.0516666810613134, 0.0519444589169, 0.0600000168067227, 0.0602777945845004, 0.0597222388733271, 0.0594444610955493, 0.0591666832399626, 0.0647222403516962, 0.0591666832399626, 0.0586111275287892, 0.058888905306567, 0.0588889053791888, 0.0588889053843759, 0.0619444617958294, 0.0591666831621537, 0.058888905306567, 0.0611111282290694, 0.0611111282290694, 0.0608333503734827, 0.0558333489729225, 0.061388906084656, 0.0619444617180205, 0.0613889060068471, 0.0636111289293495, 0.0633333510737628, 0.0601750716619981, 0.0397222333488951, 0.0400000112044817, 0.038319329598506, 0.038055566215375, 0.038055566215375, 0.037485996031746, 0.037485996031746, 0.0377637738873327, 0.038055566215375, 0.0358333433706816, 0.0358333433706816, 0.0305112051820728, 0.0391666776377217, 0.038888899782135, 0.038888899782135, 0.038888899782135, 0.038888899782135, 0.0388888892779333, 0.0505555696389667, 0.0505555696389667, 0.0502777918611889, 0.0500000140056022, 0.0500000140056022, 0.0505555697167756, 0.0702777974634298, 0.0702777974634298, 0.0697222417522564, 0.0697222417522564, 0.0702777974634298, 0.0705555561780267, 0.0825000231092437, 0.0819444673980703, 0.0819444673202614, 0.0819444673980703, 0.0819444673980703, 0.0803688149704326, 0.0580555718176159, 0.0583333496732026, 0.0586111275287892, 0.0591666832399626, 0.0586111274509803, 0.0583333495402834, 0.0347082174758792, 0.0347222319483348, 0.0347222319483348, 0.0347222319483348, 0.0349859953314659, 0.0350000098039215, 0.0550000154061624, 0.0547222375505757, 0.0544444596171802, 0.0541666818394024, 0.0541666814503579, 0.0544444596171802, 0.0583333496732026, 0.0586111275287893, 0.0586111275287893, 0.0586111275287893, 0.0583333496732026, 0.0580555559446, 0.0419444561935885, 0.0419444561157796, 0.0419444561935885, 0.0416666783380018, 0.0416666781045751, 0.0416666668222844, 0.038055566215375, 0.0377777883597883, 0.0380555661375661, 0.0380555661375661, 0.0383333439931528, 0.0411111225334609, 0.0347222319483348, 0.0347222319483348, 0.0350000098039215, 0.0352637731870526, 0.0352777876549695, 0.0400000111156529, 0.0394444554933084, 0.0394444554933084, 0.0397222333488951, 0.0402777889822595, 0.0400000105042016, 0.035270766653069, 0.0400000112044817, 0.0400000112044817, 0.0400000112044817, 0.038907523335645, 0.0388983515081329, 0.0441284980683094, 0.0505572633280954, 0.0505574986513123, 0.0502800319267492, 0.0497249069345687, 0.0497255429174458, 0.0488932427021761, 0.0611174412047647, 0.0614004800031123, 0.0611111282290694, 0.0619444619085526, 0.0622222396650668, 0.0513889032835356, 0.045833346171802, 0.0463889018051665, 0.0461111239495798, 0.0461111239495798, 0.0463889018051665, 0.0469444449112978, 0.0383333440709617, 0.0380555659041394, 0.0383333440709617, 0.0383333439931528, 0.0380555661375661, 0.0383333337223778, 0.0386111218487394, 0.0380555661375661, 0.0380555661375661, 0.0386111219265484, 0.0383333439931528, 0.0411111225341093, 0.0350000098039215, 0.0349859953275756, 0.0347082170868347, 0.0349859953314659, 0.0349859953314659, 0.0322222311767323, 0.0263118586990351, 0.0263118586990351, 0.0263118583099906, 0.0261111184251478, 0.0261111181139122, 0.0207142861811391, 0.0300000080921257, 0.0305555641145347, 0.0305112051781825, 0.0302334273264861, 0.030277786258948, 0.0363888990818549, 0.0511111254279489, 0.0511111254279489, 0.0511111254234102, 0.0508333474945533, 0.050833347490663, 0.0508333333333333, 0.0555555710343398, 0.0550000153283535, 0.0547222374727668, 0.0547222374727668, 0.0547222375505757, 0.0492763779956426, 0.0625000174291939, 0.0625000174291939, 0.0625000175070028, 0.0627777952847805, 0.0627777952847805, 0.0627777783179013, 0.0541666817615935, 0.0541666817615935, 0.0547222375505757, 0.0547222375505757, 0.0547222375505757, 0.0552777784002489, 0.0386111219265484, 0.0391666776377217, 0.0391666776377217, 0.038888899782135, 0.0388888997043261, 0.0444444567946656, 0.0625000175070028, 0.0627777952847805, 0.0625000175070028, 0.0625000169623404, 0.0633333510737628, 0.0680555744644205, 0.058888905306567, 0.0583333495953937, 0.0586111274509803, 0.0586111274509803, 0.058888905306567, 0.0533333478835978, 0.0355555655150949, 0.0352637731870526, 0.0355415510426392, 0.0360971067473287, 0.0350000098039215, 0.0296638587931925, 0.0552777932617491, 0.0561111267507002, 0.0561111267507002, 0.0566666824618736, 0.0563889046062869, 0.0557002668439964, 0.0558333488951136, 0.0569444603174603, 0.056666681372549, 0.0583333496732026, 0.0586111274509803, 0.0586111126672891, 0.0427777896825396, 0.042500011826953, 0.0422222339713663, 0.0419444561935885, 0.0419444561157796, 0.0447222346560877, 0.0658333517740429, 0.0647222402738873, 0.0650000181197482, 0.0627777953625894, 0.0630555731403672, 0.0627777947576298], [0.0838889123871771, 0.0838889123871771, 0.0844444680983504, 0.0869444687986305, 0.0877778023653906, 0.0865873191721132, 0.0896288704481792, 0.0893510925925926, 0.0877778023653906, 0.0855555795206971, 0.0855555795206971, 0.0902241073762838, 0.0922222480547774, 0.0963795697945845, 0.0955462362278244, 0.0930555816215375, 0.0925000259103641, 0.0896895593681917, 0.1316293471833177, 0.1377381258169934, 0.1382936815281668, 0.1380135690943044, 0.1375000385154061, 0.1310037657952069, 0.1223202921724245, 0.1172222550575785, 0.2281279793028322, 0.3353385606131342, 0.3347713339558046, 0.3458731100884802, 0.3497223201058201, 0.3439496741363212, 0.3425491138344227, 0.3505556537471471, 0.3600001008403362, 0.3630556572517897, 0.3744445493308435, 0.3761112163865547, 0.2355812415966386, 0.1669444911297852, 0.2891667475879241, 0.2958333468409622, 0.3022223068783069, 0.3038889740118269, 0.3041667518674136, 0.2947736476034858, 0.2852521722689076, 0.2852778576875194, 0.2730556320417056, 0.2705252775443511, 0.2654855949268596, 0.259883354030501, 0.1367670750077809, 0.1175513848188434, 0.0569444603952692, 0.0536111260504201, 0.0550000154061624, 0.0550000154061624, 0.0547222375505757, 0.051944458994709, 0.0483333468720821, 0.0483333468720821, 0.046666679738562, 0.1377778163709928, 0.1422222620603797, 0.1425000399094825, 0.1908333867880485, 0.1916667203548086, 0.1897222753657018, 0.1897222753657018, 0.1905556088546529, 0.1911111646436352, 0.2111111702458761, 0.2111111702458761, 0.2108333923902894, 0.1197222557578587, 0.2391667336601307, 0.2391667335823218, 0.2552778492841581, 0.2544445157173981, 0.2538889600062247, 0.2558334049953314, 0.2547222932617491, 0.254444515717398, 0.3341667560690943, 0.6547224056178027, 0.7311113159041395, 0.7944446669779024, 0.6702779655306568, 0.6702779655306568, 0.6205557293806412, 0.6241668415032681, 0.6500001820728292, 0.6508335152505447, 0.6513890713455756, 0.652777960628696, 0.5758053256179327, 0.2595798720821662, 0.1970775390600684, 0.1494444863056333, 0.1494444863056333, 0.1491667084500466, 0.1436111513383131, 0.1402824841269841, 0.2272222856364768, 0.2247222851663814, 0.2244445073140367, 0.22250006232493, 0.1866667187208216, 0.1897222753657018, 0.1850000518207283, 0.1850000518207283, 0.1847222739651416, 0.1847222739651416, 0.172222270463741, 0.1713889368431649, 0.0591666832399626, 0.0588889053843759, 0.0591666832399626, 0.0594444610955493, 0.0447222347475101, 0.0447222347494553, 0.0444444568938686, 0.045000012605042, 0.045000012605042, 0.0452777904606287, 0.053611126128229, 0.053611126128229, 0.0538889039838157, 0.0538889039838157, 0.0530555704170557, 0.052777792561469, 0.0577777939620292, 0.0575000161064425, 0.0575000161064425, 0.0569444600840336, 0.066666685340803, 0.0705555753190165, 0.0661111296296296, 0.0672222410519763, 0.0669444631963896, 0.0669444631963896, 0.0669444631963896, 0.0686111303299097, 0.0680555746187363, 0.0688889081854964, 0.0691666860410831, 0.0691666860138508, 0.0589122472766884, 0.0552777932617491, 0.0530555704170557, 0.0547222375505757, 0.0552777932617491, 0.0558333489729225, 0.0558333489729225, 0.0541666818394024, 0.0455555683162153, 0.0447222345938375, 0.045000012605042, 0.0452777904606287, 0.0452777904606287, 0.0452777904606287, 0.0436111233206247, 0.0408333447712418, 0.0402777889822595, 0.0402777890600684, 0.0402777890600684, 0.0405555669156551, 0.0447222347494553, 0.0450000126037452, 0.0452777904606287, 0.045000012605042, 0.0455555683162153, 0.0455555683162153, 0.0455555683162153, 0.0461111240273887, 0.0472222354497354, 0.0469444575941487, 0.0469444575941487, 0.0469444575941487, 0.0511111254279489, 0.0511111254279489, 0.0530555704170557, 0.053611126128229, 0.0530555704170557, 0.0530555704170557, 0.0611111282290694, 0.0608333503734827, 0.059722238951136, 0.0594444610955493, 0.059722238951136, 0.0594444610955493, 0.0686111303299097, 0.0660947716308745, 0.0655555739184562, 0.0650000182072829, 0.0652777960628696, 0.0652777960628696, 0.1044444737005913, 0.1041666958450046, 0.1050000294117647, 0.1050000294117647, 0.104722251556178, 0.104722251556178, 0.1008333615779645, 0.1008333615779645, 0.1011111394335512, 0.1011111394335512, 0.1013889172891378, 0.1016666951447245, 0.096944471599751, 0.096944471599751, 0.0980555830220977, 0.0983333608776844, 0.0991666944444444, 0.0991666944444444, 0.0986111387332711, 0.0988889165888577, 0.0986111387332711, 0.0986111387332711, 0.0983333608776844, 0.0986111384998443, 0.067500018907563, 0.0677777967631497, 0.0658333517740429, 0.0658333517740429, 0.0652777960628696, 0.0655555739184562, 0.0525000147058823, 0.0522222368502956, 0.0522222368502956, 0.0522222368502956, 0.051944458994709, 0.0533333476475776, 0.1005555837223778, 0.1005555837223778, 0.1008333615779645, 0.1005555837223778, 0.1005555837223778, 0.1008333615779645, 0.1094444751011515, 0.1094444751011515, 0.1097222529567382, 0.1102778086679116, 0.1102778086679116, 0.1091293221768346, 0.0594444610955493, 0.0591666832399626, 0.0625000175070028, 0.0627777952847805, 0.0644444624961095, 0.0655555739184562, 0.0619444617958294, 0.0619444617958294, 0.0619444617958294, 0.0741666874416433, 0.0827778009648303, 0.0888889137877373, 0.0925000259103641, 0.0985270892468098, 0.1022222508558979, 0.1100000308123249, 0.1158333657796452, 0.1201797568471833, 0.1255555907251789, 0.1325000371148459, 0.1396382118736383, 0.1328548245409274, 0.1320191567849362, 0.1333987093059446, 0.1367600538437597, 0.1427778175381263, 0.149077990507314, 0.1575000439620293, 0.1563655627917833, 0.1572222661064425, 0.1775000495642701, 0.183109274431995, 0.189722275210084, 0.1963889437441643, 0.2052778351229381, 0.2105556144568938, 0.2083333913787737, 0.2105556142234671, 0.2078524926859632, 0.2000000558667911, 0.2055556129785247, 0.2052778352007469, 0.1825000509648303, 0.1696358674136321, 0.1553501531279178, 0.1419071091658885, 0.1270588366013071, 0.1122152324151883, 0.0990499663087457, 0.0844841399782135, 0.0738398822751322, 0.0662791912542795, 0.055389834344849, 0.0486671452692188, 0.0419444561935885, 0.0419444561935885, 0.0419444561935885, 0.0413889004824152, 0.0411111226268285, 0.0427777897603485, 0.0430555676159352, 0.0433333454715219, 0.0433333454715219, 0.0444444568938686, 0.0525000147058823, 0.0608333503734827, 0.0766666878306878, 0.0850000238095238, 0.0916666923436041, 0.0988889165888577, 0.1075000301120448, 0.1144444765017118, 0.1700000470743853, 0.1780556054310613, 0.1852778296763149, 0.1902778309990663, 0.1888889411764705, 0.1808333838313102, 0.1702778253151262, 0.1675000467631497, 0.1616667117958294, 0.1547222652505447, 0.1483333746498599, 0.1405555943821973, 0.1472875834053067, 0.1400000390600684, 0.1327778148926237, 0.1266667019919078, 0.1183333661654477, 0.1191667000466853, 0.1111111121226268, 0.1083333636788048, 0.1075046984126984, 0.1072222522564581, 0.1050000294117647, 0.144722262759363, 0.1697222697634609, 0.1727778260192966, 0.2116667244008715, 0.2497222921724245, 0.2661111119650639, 0.3708334372082166, 0.4516667921679193, 0.4911112486772487, 0.5019445850451292, 0.5119445825552443, 0.5213890349361968, 0.4643604223467164, 0.459722350995954, 0.4652779081057424, 0.4517063623093696, 0.4216666770152505, 0.4202778945722115, 0.3141013133364456, 0.2527707806541135, 0.2286111751478369, 0.2183333944911298, 0.2026774084033618, 0.2013889453003423, 0.2025000567226891, 0.1397222613600996, 0.1347222599595393, 0.104722251556178, 0.1013889170641479, 0.0861111352318705, 0.0875000245098039, 0.2427778457827575, 0.2600000728291317, 0.2594445171179583, 0.2619445178182384, 0.2594445171179583, 0.2586111835511983, 0.2986111947556801, 0.2966666686896981, 0.3680556586523499, 0.3680555578120137, 0.37138899291939, 0.3719445484749455, 0.194722276766262, 0.1625000455182073, 0.1919444982103953, 0.1897222753657018, 0.1894444975101152, 0.1916667203548086, 0.1477778191721133, 0.1436111510063394, 0.0738889095860566, 0.0744444651280012, 0.0705718959694989, 0.0727777981637099, 0.0708333531746031, 0.0750000210084033, 0.0519444589947089, 0.0519444589947089, 0.0522222368502956, 0.052777792561469, 0.0525000147058823, 0.0547222375505757, 0.1075000301120448, 0.1077778079676315, 0.1080555858232182, 0.1238889235916589, 0.1747222711640212, 0.2125000595238095, 0.2261111744475568, 0.2511111814503579, 0.2758334105975724, 0.2886111919545596, 0.2894445253657018, 0.2888958976812947, 0.2461111800472041, 0.2455556243386243, 0.2483334028944911, 0.2313889537037037, 0.182600374572051, 0.1358216630874572, 0.1263889242141301, 0.1010901037192654, 0.0766666879863056, 0.0611111282290694, 0.059913633129085, 0.0554365087924058, 0.0547222375505757, 0.0550000154061624, 0.0525000147058823, 0.0502777918611889, 0.0533333479614067, 0.0530555571117335, 0.1083333636788048, 0.1097222529567382, 0.1111111422346716, 0.112500031512605, 0.1136111429349517, 0.113608780734516, 0.1605556005291005, 0.1625000455182073, 0.164444490507314, 0.1658333797852474, 0.1652778240332257, 0.1668114327458873, 0.1201447533457827, 0.1200000336134454, 0.1197222557578587, 0.1197222557578587, 0.1197222557578587, 0.1152264036091634, 0.1523669845938375, 0.1515266484593837, 0.1504132028478057, 0.15055559772798, 0.1494444863056333, 0.1477357664176781, 0.1468020907251789, 0.1470822027699969, 0.1470822027699969, 0.148748869903517, 0.146111115935263, 0.1488889302929605, 0.0711111310301898, 0.0713889088857765, 0.0715336286181139, 0.0718114060846561, 0.0718114064737006, 0.0718114064737006, 0.0772222438530968, 0.0775000217086834, 0.0777777995642701, 0.0763889102863367, 0.0790382989593105, 0.0755952392623716, 0.0718137406629318, 0.0709757387177093, 0.1608333783846872, 0.2902778590861345, 0.3008334176003735, 0.297639985451064, 0.3487535943043884, 0.3490337063492064, 0.3490313721599751, 0.3483334309056956, 0.3483334309056956, 0.3480556530501089, 0.3600001008403362, 0.3601424863834423, 0.2704202388733271, 0.1404202026143791, 0.1295845319794585, 0.1294444499688764, 0.1327778149704326, 0.1327778149704326, 0.1327778149704326, 0.1329202005135387, 0.1340336461251167, 0.1310620613683468, 0.1825000511204481, 0.1825000511204481, 0.1830556068316215, 0.1830556068316215, 0.1829225487083722, 0.1826447704760732, 0.1220915325241207, 0.1222222564581388, 0.1219444786025521, 0.1225000343137255, 0.1216667007469654, 0.1188888944120241, 0.1490289819483349, 0.1501400933706816, 0.149582203470277, 0.1502778198723934, 0.1502778198723934, 0.1519444870059134, 0.149311428182384, 0.1490313161375661, 0.1487558723934018, 0.1479202047152194, 0.1455555963274198, 0.1508333752840124, 0.060555572517896, 0.0598739612511671, 0.0601494049175225, 0.0595891808278867, 0.0600000168067227, 0.0583333496732026, 0.0580555718176159, 0.0725000203081232, 0.0845961903983815, 0.0982073053221288, 0.1159804197012138, 0.1273669775910364, 0.200833389589169, 0.2219445076933599, 0.2326214434026706, 0.2431653307850922, 0.2445402148406148, 0.2631396605132799, 0.2722946582015952, 0.2700607647836915, 0.2688889639824593, 0.2672222967171719, 0.2880556362308027, 0.2890102749582138, 0.2452848500229959, 0.2572222317256577, 0.3638889909978867, 0.3680556582340553, 0.3911112208686457, 0.3819445512293807, 0.3977778888869437, 0.3936112210274233, 0.3875001081839402, 0.3880556639560875, 0.3697223250077809, 0.4477779028166822, 0.5505557096171804, 0.5300328256581738, 0.4228664833488951, 0.4205556729665942, 0.4113890038904451, 0.4119445589013383, 0.4886112474323063, 0.5025001407563026, 0.5297223700591348, 0.6241668397136634, 0.6869446387877373, 0.5891830134492686, 0.580555718557423, 0.5797223847565879, 0.5802779406427016, 0.5800001623832867, 0.5794446063725491, 0.5791666718380409, 0.5903012848194846, 0.6208335068137255, 0.5888890536294316, 0.475989735915292, 0.4736112415966387, 0.5013445490196078, 0.5433334850250298, 0.5308334820261438, 0.5372223723934019, 0.5250001465919701, 0.5116668096016185, 0.4986111227824463, 0.4161112272713718, 0.362777879396203, 0.3619445458294429, 0.3616667679738562, 0.2900000811948866, 0.2260060705726735, 0.1166666992685963, 0.1158333657796451, 0.0963889158885776, 0.0963889158885776, 0.0961111380329909, 0.096666693526955, 0.0883333580765639, 0.0886111359321506, 0.1880556080765639, 0.2402777855586678, 0.4427779018051666, 0.6100957138966697, 0.6897224154217243, 0.7205557573918457, 0.7294446487706194, 0.7605557685963276, 0.7697224378306879, 0.7769446612200437, 0.7813891077653285, 0.7891668877217555, 0.6818347417749525, 0.6539194150560705, 0.4602779060068472, 0.2871802125739184, 0.3211112005913477, 0.3358334269374416, 0.3769445494864612, 0.3536112096949891, 0.4411112340491753, 0.4502194277933395, 0.4897223589324618, 0.4936112489106753, 0.5005555647370058, 0.51916681162465, 0.5302779256924992, 0.5309990787426081, 0.4483334584500467, 0.4102778921568627, 0.368811870603797, 0.4519445708061003, 0.375000104649082, 0.3550537017584811, 0.4197223394802366, 0.4159314761904761, 0.4511112364865691, 0.4411112338157485, 0.4333334541673151, 0.4179341921101773, 0.4215197119514473, 0.4223553797074386, 0.4213890063025209, 0.3376284652972299, 0.3231863510737628, 0.3122011484247488, 0.3044445294895735, 0.2961812101618424, 0.2458707396514161, 0.229145713429168, 0.2185598106131341, 0.2108940252878929, 0.2074416938219732, 0.2063889464674758, 0.2061111683745721, 0.2061438381574852, 0.2092204022720199, 0.2133333466386554, 0.1400000392156862, 0.1486111526610644, 0.1544444877061936, 0.1616667118736383, 0.1677778247743542, 0.1759943988811278, 0.2815570106598195, 0.2818324543261749, 0.2813889675536882, 0.2808334118425148, 0.2790406706349206, 0.2730555783535636, 0.3436415331465919, 0.3352405059912853, 0.3290803751945222, 0.3226448007314036, 0.3150864437441644, 0.3036251913411864, 0.1782913585434173, 0.1704528896669779, 0.1628898644568938, 0.1570075115157174, 0.1508333755835667, 0.1494444859652307, 0.0913889144880174, 0.1002778058667911, 0.1508333755835667, 0.1688889358076564, 0.2144445045129163, 0.2488889586056644, 0.274444521319639, 0.2772222998755057, 0.2777778555866791, 0.2777778555866791, 0.2777778555866791, 0.278611123793962, 0.3340196966230936, 0.3261112024587613, 0.2755556327419857, 0.2559103678765951, 0.2085807690631808, 0.1766549525424677, 0.2697222976968564, 0.2669445191409896, 0.2663889635076253, 0.2666667413632119, 0.2669445190631809, 0.2666667407491903, 0.2850000798319328, 0.2844445241207594, 0.2852778576875194, 0.2852778576875194, 0.2852778574540927, 0.2844444460784313, 0.2680556306411453, 0.3500000980392158, 0.3500000980392158, 0.3497223201836291, 0.3516667651727358, 0.3648879584500467, 0.3544445423280423, 0.3588889892623716, 0.3613889901182695, 0.37138899291939, 0.3786112171646436, 0.3788888948801743, 0.3950001106442577, 0.3138889768129474, 0.3144445325241207, 0.3138889768129474, 0.3117624556489262, 0.2855788272577216, 0.2938889705798063, 0.289166747665733, 0.2855556355431062, 0.2747783197167756, 0.2675070774198568, 0.2650000736195605, 0.14972226416122, 0.1488889305166511, 0.1494444863056333, 0.1502778197945844, 0.14972226416122, 0.1500000010115157, 0.1458333741830065, 0.1463889298941799, 0.1477778191721133, 0.1480555970277, 0.1483333748832866, 0.1480555967164643, 0.1486111527388733, 0.1508333754279489, 0.1502778198723934, 0.14972226416122, 0.1502778198723934, 0.1502778195378262, 0.0472222348272642, 0.0472222354497354, 0.045833346171802, 0.045833346171802, 0.045833346171802, 0.0461111240234984, 0.0455555683162153, 0.0433380138499844, 0.0427777897603485, 0.0430555676159352, 0.0427777897603485, 0.0433333454715219, 0.0450000120603797, 0.0447222347494553, 0.0447222347494553, 0.0444444568938686, 0.0444444568938686, 0.0441666678338001, 0.1397222613600995, 0.1397222613600996, 0.1422222620603797, 0.141944484204793, 0.141944484204793, 0.1411111120448179, 0.2427778457030035, 0.2422222900715842, 0.2438889571272953, 0.365277880096483, 0.5055556966230937, 0.5419445950111936, 0.6072223923124807, 0.6133335049019609, 0.616389061469032, 0.6208335072362279, 0.6275001757703081, 0.6316668421640429, 0.541944596249611, 0.5425001519607844, 0.541944596249611, 0.4205556733582322, 0.2813889676243649, 0.2405531581083596, 0.2203548117024587, 0.2513889593039994, 0.251111181372549, 0.2475000689386866, 0.2441666677559912, 0.37343604886399, 0.4730556880641146, 0.4738890216308746, 0.4747223551976346, 0.4786112451758481, 0.4869445805322129, 0.4836112455137036, 0.3561112108621226, 0.3258334246031746, 0.4138890048241519, 0.4241667848583877, 0.435277898698031, 0.2895680839989811, 0.3080556417678182, 0.3175000889355743, 0.3186112003579209, 0.4113890038126362, 0.5116668099906629, 0.5825001630096482, 0.7394446515717398, 0.7433335413943356, 0.6566668503734826, 0.6544446272875819, 0.6522224049175226, 0.6675000141612201, 0.7055557513227514, 0.7222224242141302, 0.7261113144257705, 0.6405557348272644, 0.5585831079209461, 0.4873901752845275, 0.4386322414410208, 0.4375001223934018, 0.5416668181605977, 0.5705557150638033, 0.585277941643324, 0.5873272772331154, 0.5833310131198786, 0.6047223913787737, 0.6408335127606599, 0.6516668488951136, 0.6381817803454716, 0.6441668458191109, 0.6855557473544974, 0.7027779743230627, 0.6197223957360722, 0.6050001675225646, 0.6033335017117958, 0.6136112817330975, 0.684166857998755, 0.6919446353874884, 0.7091668646125117, 0.8011113345782759, 0.8886113595549332, 1.0034594544817923, 1.0588891848739497, 1.0546454331621538, 1.0414754988328665, 1.0442042589097689, 1.0481748451602864, 1.0653571584967318, 0.994150381652661, 0.9627707927443216, 1.073886802054155, 1.0657518966587565, 1.0148695321350762, 0.8975023521585487, 0.8637116944444444, 0.8555557889822596, 0.9539778267973856, 0.9653363744942424, 0.9560154529256146, 0.9462654030501088, 0.8976706187363835, 0.9830558306878308, 0.8288891139770727, 0.7471080176626206, 0.7127779770463741, 0.7617063930127607, 0.8000002238562092, 0.806666713163322, 0.8294446694677872, 0.8774115091814505, 0.8881771533613446, 0.9475142422191102, 0.9825002745876128, 0.9119446994242142, 0.9261533545751636, 0.960331705104264, 0.9584036267507002, 0.9080509073295986, 0.9752780413165268, 1.058611405366288, 0.9945705170232938, 1.054552084422658, 1.1160110161842514, 1.0757820304187418, 1.2317040785091813, 1.2359316780267662, 1.2675003494637689, 1.345574568549642, 1.3738892726423904, 1.448889291778934, 1.4121849436929443, 1.3919701516495486, 1.439790279333956, 1.3427454270152506, 1.317336918378463, 1.2904366022408964, 1.199467869825708, 1.2702031683784625, 1.2908336939360945, 1.2220612434640523, 1.4331443480255994, 1.5025537897603485, 1.8169449456115785, 1.9152316192570555, 1.9998581093215064, 2.0688497310924374, 2.02916723373794, 1.999222742997199, 1.839167174369748, 1.7422973512293811, 1.7040153749610958, 1.638181649771761, 1.397999566717538, 1.336890796451914, 0.8556514688485589, 0.6861439528452123, 0.4839239065515094, 0.3979786103330221, 0.4008660400715842, 0.4073972971521942, 0.523333479144621, 0.5160341984678138, 0.4877779139433552, 0.484166801276066, 0.4761461545025426, 0.3786811679894179, 0.3682260357920946, 0.3675001027077497, 0.4857354053065671, 0.4854622959072517, 0.507796451274628, 0.6843535734211724, 0.6093488853044923, 0.6154459929971989, 0.6190430999844383, 0.623611285555426, 0.6178384926689635, 0.6332237757547464, 0.624330216075319, 0.6312933359788361, 0.5159500750855898, 0.5241668133364458, 0.4603151601897246, 0.3084617529567382, 0.3172223108465609, 0.5716668266417678, 0.5836112744319951, 0.5947223884220354, 0.7238890902013088, 0.7085619943337226, 0.7575002120292563, 0.7571733696700903, 0.7446010063025211, 0.7345424892623716, 0.7423461037192656, 0.7357914866901393, 0.669859949579832, 0.4467811388888889, 0.4314426680672268, 0.4222083072673515, 0.3163212567693744, 0.3237909151332002, 0.2723996778711484, 0.2651587338157485, 0.2762698946467476, 0.2754342264783827, 0.2597222945845004, 0.2483520110488639, 0.2283333971366324, 0.2291667307033925, 0.2263889521475257, 0.2185247792561468, 0.2088469038119883, 0.2003664863834422, 0.1926750994002243, 0.1921172093461522, 0.1793347598039215, 0.1787768699035169, 0.162222266573296, 0.1720845066137566, 0.1737628633675692, 0.17348041713352, 0.1730556039526922, 0.1722222703081232, 0.1462605056022408, 0.1579178546529723, 0.1737488582321817, 0.17500004886399, 0.1754295305010893, 0.1755556045751634, 0.1769794601495231, 0.1764239044506691, 0.1857236504824152, 0.1847222738095238, 0.1851680947712418, 0.1858333853096794, 0.1947642917743103, 0.1737721999688764, 0.1561788276532835, 0.1491667083722378, 0.1413305550108932, 0.1357213116246498, 0.1420495132275132, 0.1164682559134765, 0.1055345680049797, 0.0990873226735138, 0.0923599651416122, 0.0861951652661064, 0.0864752780890134, 0.0922222480547774, 0.118611144335512, 0.1255555907251789, 0.1308333699813258, 0.1352778156707127, 0.1413889284936196, 0.14888893059446, 0.1594444891067538, 0.1650000462184874, 0.1711111590413943, 0.1797222725626362, 0.1763889381419234, 0.1708216635543106, 0.1612231786492375, 0.1619444896514161, 0.162777823295985, 0.1578548315437286, 0.1353034730781201, 0.1430859027388733, 0.1413889284158107, 0.134299743697479, 0.1272969424992219, 0.1683403737161531, 0.1949276387332711, 0.1934640553999377, 0.2287348871770931, 0.2250630861344537, 0.2247222851696234, 0.2244445073140367, 0.2280555584344849, 0.2239122374727668, 0.2250000630252101, 0.2252778408807967, 0.2252778408807967, 0.141323533846872, 0.1242856850740385, 0.1337581744475568, 0.1019444730003112, 0.0983333607220666, 0.0916783632897603, 0.0916666922657952, 0.0880555786304399, 0.0895821679894179, 0.1075000301120448, 0.1075000300342359, 0.1072222522564581, 0.1077778079676315, 0.1050000003112356, 0.1299066314970432, 0.1494444863056333, 0.2341667322595705, 0.2408334007936508, 0.2452778461718021, 0.2556582643168378, 0.2486624672424525, 0.2472222914721444, 0.2513889593059446, 0.2555556271397448, 0.2627778513849984, 0.2788889645107326, 0.2430578924680983, 0.2325000648926237, 0.2247222849361967, 0.2425000676937441, 0.2441667348240223, 0.2311624719758278, 0.245721295748392, 0.2411111784158107, 0.2650000736850296, 0.3805556619203238, 0.3875001083099907, 0.3858543557260872, 0.4108334481792717, 0.4219445624027388, 0.4871732193432929, 0.5113890319016496, 0.5488890424058512, 0.5559150429276294, 0.6627779631185807, 0.722222424291939, 0.7780744374371048, 0.689444637254902, 0.857500239807034, 0.920847585978836, 0.9523179435885466, 1.070301419078743, 0.9672224919078743, 0.9393907691409896, 0.9233335879240588, 0.9272224798326512, 0.8161041223934018, 0.7694491134931106, 0.7925982569249923, 0.7987278388577652, 0.6575001833949321, 0.5884173764133114, 0.5708334920395405, 0.4655556854964208, 0.4416013117024587, 0.452222348506069, 0.4571615586575375, 0.6344539582944289, 0.674937016573296, 0.7490079832581287, 0.6844703113912233, 0.6716340359477123, 0.657777961406785, 0.6742787656188408, 0.7973716746809835, 0.8494446817615936, 0.8627102715530657, 0.8697224649859946, 0.8633335743853098, 0.6847665749920888, 0.6515290103485838, 0.7711113264083411, 0.76888910340803, 0.7644446578742609, 0.8588891283846872, 0.8845238118580765, 0.7609104248366013, 0.763611324151883, 0.7496756918767506, 0.7722224378306879, 0.7684875580454404, 0.7753689806768087, 0.7442904374416432, 0.6508335148615002, 0.6636112963741052, 0.6724884670868347, 0.6131699901928365, 0.5827264301276066, 0.58498377762216, 0.5860855523653907, 0.6044422326486151, 0.6869609293495176, 0.6991668608776845, 0.6816106478944525, 0.6874019664643635, 0.6541668493619671, 0.6666668530967944, 0.6593790944236966, 0.7078106537503891, 0.7073762900715841, 0.7145845091814503, 0.9584339435107376, 0.9530604624961097, 0.844141197945845, 0.9222224777447092, 0.95444470772837, 0.9750910821888958, 0.999722501556178, 0.993011446467476, 0.9966669412542796, 1.0161113951136012, 1.0918651263616557, 1.07316765100027, 0.8280557868036102, 0.842243418845316, 0.8382003415116995, 0.7505416015244066, 0.7156699908360586, 0.7021452409741674, 0.6773951406006847, 0.6466387887488328, 0.6394701244164332, 0.5278664847494553, 0.5460270838779956, 0.5550561382430759, 0.5680626795829443, 0.5513890427948958, 0.5595892923280423, 0.6976005342359166, 0.6992975481637098, 0.7561089604730783, 0.9841529091970124, 1.05943044939374, 1.1891669985572948, 1.2200003390133831, 1.1361064528478058, 1.1491669846716466, 1.206944781512605, 1.224722564581388, 1.229388739807034, 1.0875003025683432, 1.086148733426704, 0.9981255972611266, 0.8369446785714286, 0.7797947989463866, 0.6522224043728603, 0.6410249154729495, 0.6262582075771491, 0.5981139283535657, 0.54158033184459, 0.5242343927683114, 0.5092321384220355, 0.5553245885465299, 0.5440429855275443, 0.555833484282602, 0.5466668193277312, 0.5400001504824153, 0.5282610929038283, 0.5082329655306567, 0.4906232816500681, 0.5669446028633676, 0.6619281317304699, 0.6622714066293184, 0.6747083833644569, 0.7463307242452537, 0.7348996274267885, 0.8426216041828768, 0.9042345976501712, 0.8986113530967943, 0.8963237727201994, 0.8962560814659198, 0.894108547353583, 0.8150002279800809, 0.8601052781668224, 0.8608335741518831, 0.8388891232168805, 0.7129505206971677, 0.7136718131561891, 0.5875001625427949, 0.5625001567667816, 0.5575001552287583, 0.6872224144880175, 0.681666857376284, 0.6836113015639598, 0.6833513296882855, 0.6672416979199087, 0.651391905506647, 0.642332930686416, 0.6337058825265148, 0.6241431978680362, 0.6188888941539586, 0.629043121381886, 0.629313896669779, 0.4929062958294429, 0.4844655873793962, 0.4741667992530346, 0.4701005015561781, 0.3017577843137255, 0.298055638888889, 0.3000000836997143, 0.3022223064892624, 0.395599913243075, 0.3977778854652972, 0.3352778715375039, 0.336944538671024, 0.3408334284158108, 0.3422223179271709, 0.3597223228291317, 0.3666667691409898, 0.3736112155306568, 0.3744445491752257, 0.3725001040305011, 0.3711112134298164, 0.2845028783846872, 0.2708987011055357, 0.4602779063180828, 0.4600001284624961, 0.4531140366479926, 0.4505556814503579, 0.428958922657952, 0.4213890066915655, 0.4619445736850295, 0.4619445724400872, 0.4711112428415811, 0.4736112369397782, 0.4849136401338312, 0.4947223604328787, 0.3224393917678182, 0.3102124978991596, 0.307434719265484, 0.3004926069872394, 0.2969981486150015, 0.2750933885776533, 0.4049394151882975, 0.3979856315288168, 0.3815944043728603, 0.3713142889433564, 0.3470457657121229, 0.3211112010582011, 0.2919445262215998, 0.2921359297385621, 0.289654602474323, 0.2907727165421724, 0.2725256777155306, 0.2907773849206349, 0.1322222591814503, 0.1322222592592592, 0.1327778148926237, 0.1322222592592592, 0.1271568632119514, 0.1352357909274821, 0.1330555928260193, 0.1325000371148459, 0.1304738861655773, 0.1315826633986928, 0.1335947718643012, 0.1324323362900716, 0.2815990447401183, 0.2835598290538438, 0.2836111905539994, 0.2905556369436664, 0.2896148559757236, 0.2880369533924681, 0.4047106527388734, 0.5383218156383288, 0.6338890750254808, 0.675555752613904, 0.6795029914117132, 0.6805557498967578, 0.5543839041406915, 0.5821523521749772, 0.6018745793413589, 0.6001565595906251, 0.6994446386684314, 0.7050001922123026, 0.6076775675789774, 0.4724228508338318, 0.4543628650793651, 0.5351752140522876, 0.5333029981851082, 0.5725001603641457, 0.5727779382197324, 0.5520471633208839, 0.548889042639278, 0.5588213445378153, 0.4665452857920946, 0.4805556900268461, 0.4825001351540616, 0.4863890240786478, 0.4197830286336757, 0.2988072666511049, 0.2904691879084967, 0.2546335850451292, 0.2500000700280112, 0.2397222893713041, 0.2308333979925303, 0.2164995898653246, 0.2260177487550576, 0.2193791389666978, 0.2063259142545907, 0.1946615783535636, 0.190212464441332, 0.1927778317771553, 0.1861811515717398, 0.2038889460006224, 0.1974580305010893, 0.1954972462651727, 0.1915850143946467, 0.1921452384842825, 0.1461368000933711, 0.163611156912025, 0.1677778247743542, 0.1700000476190476, 0.1704567222248598, 0.1668651194366635, 0.1871008408029878, 0.2004692373949579, 0.3333334267040149, 0.4922223600995954, 0.5202779235138499, 0.5293698893557423, 0.5441994876283848, 0.5502102310924369, 0.5657494517351385, 0.5713890489797308, 0.5794446067736972, 0.5836112746023966, 0.5510177457818013, 0.5546663473389357, 0.4111648005751375, 0.271330535480859, 0.254439837535014, 0.2578618246965453, 0.2503314782135076, 0.2547222931061313, 0.3391667588702147, 0.3572223218954248, 0.3922223317830899, 0.4180556722689075, 0.419381443121693, 0.4522223485838779, 0.4618955276221599, 0.4671522991752256, 0.4738890213974478, 0.4737665848631354, 0.4628104831932773, 0.4827779126206037, 0.3879552099874214, 0.4630556848739495, 0.5256934007936508, 0.5164216931995019, 0.5211671375460375, 0.5329483130252102, 0.5779763360566448, 0.5913890540771864, 0.6000001676781823, 0.6138890603018985, 0.6215126255103736, 0.6391668449268597, 0.6605557401182696, 0.5620518438375349, 0.5133334764239029, 0.5188890316682229, 0.5105555771864301, 0.5338189877840025, 0.5766271274509804, 0.5960933169058097, 0.6068699001711796, 0.6911113039215685, 0.7111528059848233, 0.7194446450357921, 0.9948812153750388, 1.0493140042794895, 1.055329847367949, 1.0811114128566266, 1.0804748568975613, 1.049493745518209, 0.9632799064737008, 0.9415406321130306, 0.9411113733219216, 0.8471569575928299, 0.8200840457516338, 0.8313891208372237, 0.5290172773887333, 0.5017903884998444, 0.615672297307812, 0.7275002029256148, 0.9087418836400312, 0.9353994167444756, 0.9530569979862002, 1.093942612655065, 1.1508336546840958, 1.1686114374416432, 1.242920509726113, 1.335033329477177, 1.531667094615624, 1.5220332244008712, 1.6136395722844694, 1.581634391845627, 1.609236741570703, 1.831836673226353, 1.9877783334111427, 1.929167205174292, 1.8813894144102088, 1.8683338551198256, 1.7917577534235916, 1.7199980916588855, 1.672705831232493, 1.6612515901027078, 1.4625677085278557, 1.3740430030442756, 1.1272432375505756, 0.9160784365079364, 0.9289729277933396, 0.8472224584500467, 0.8357751826201291, 0.8452779858348898, 0.8305884372860256, 0.8150490500239912, 0.640945385853045, 0.6208895084811703, 0.6088890399568174, 0.5891084578275755, 0.583337999902576, 0.582866490750469, 0.4313236426237162, 0.429444563881108, 0.4180486604607604, 0.3946172845471522, 0.3916667759103642, 0.4033334459228136, 0.4847223574540927, 0.4838143204170557, 0.4824254314503579, 0.5643698988484283, 0.5535527620007281, 0.5479856735138499, 0.52166681232493, 0.5252779242141302, 0.5232774497354498, 0.5202779231248056, 0.5212675170401494, 0.5096243130526737, 0.4436088913009648, 0.4341644442110177, 0.4284267088390912, 0.3366620827108622, 0.3358006647214441, 0.3224907439309057, 0.530532352552132, 0.548333486694678, 0.6330440521319639, 0.6369446221599752, 0.7112070105820106, 0.7227779796944729, 0.8415525171179584, 0.8507868780734515, 0.8591669071739807, 0.8713891327419857, 0.8684920837766487, 0.8861113590880797, 0.6600001847961406, 0.7254808838836195, 0.6619446294740118, 0.6516668488173047, 0.5816668294428883, 0.5597223784624962, 0.5355557054135544, 0.540555706660442, 0.5347223714596949, 0.5280066480703393, 0.5016013470004678, 0.5130556988795519, 0.5183194359632742, 0.4091199854173161, 0.4300001202925615, 0.4300001202147526, 0.4075303465608465, 0.4148320172735761, 0.2953991636321195, 0.2900327314814814, 0.3938889989884843, 0.421426238095238, 0.608625258714597, 0.6100001706349206, 0.6241668413476503, 0.6222223963585436, 0.5877382331932773, 0.6049511234827265, 0.6002639122315594, 0.6527779601618425, 0.6549838161375662, 0.6508078074229693, 0.5435832251011516, 0.5485901079611487, 0.4205393059446, 0.4183077464207905, 0.3913889982882041, 0.3958194110644257, 0.3955556662776221, 0.4033334461562403, 0.3996732882041706, 0.3634174653698518, 0.3780346257391845, 0.3861112186196708, 0.4014239861500155, 0.3631303505116121, 0.3108334201680672, 0.3838889963429817, 0.4030556682228448, 0.3977778890438583, 0.3966480762527233, 0.3710948477279801, 0.3813889955648926, 0.3605556563958917, 0.3375000943821973, 0.329166758714597, 0.3102778645347028, 0.3120985696389667, 0.3024929981325863, 0.2304528877995642, 0.2238889514472455, 0.2277778414254591, 0.2288399069405539, 0.2266036790382819, 0.2218300659819483, 0.2316480300342359, 0.2405556227824463, 0.2411111784936196, 0.2455859407083204, 0.2425000675381263, 0.2380788987706193, 0.2413889564270152, 0.2302778420479303, 0.2255532565359477, 0.226944507858699, 0.2302778420479303, 0.2243557706193588, 0.2289122668845316, 0.2402778449268596, 0.2372152580921257, 0.2346919154995331, 0.2335738015094926, 0.2382633463274198, 0.2305556199813258, 0.2357353354341736, 0.2368464468565204, 0.2337628801742919, 0.2340429922191098, 0.2260457517896047, 0.2250000628695923, 0.405277891145347, 0.404444557578587, 0.4034034533146592, 0.4050841255835667, 0.4088608996265172, 0.407777891923436, 0.419166783924681, 0.4202778953470277, 0.4209734838935574, 0.4333334546374106, 0.4478502622938064, 0.4533334601618425, 0.2591667391067538, 0.2644445182850918, 0.2652778519296607, 0.2663889633520074, 0.2632913541083099, 0.2691597020697168, 0.2680556304077186, 0.2652544728446934, 0.2638632493775287, 0.2543417740429505, 0.2453781886087768, 0.2389332773887332, 0.2399720289449113, 0.2394071364768129, 0.2385784712885154, 0.238013578820417, 0.2338865548552754, 0.2357773508403361, 0.2208333950357921, 0.226360913943355, 0.226111174291939, 0.2227778400248988, 0.2125980394484646, 0.2227778399470899, 0.2193767864145658, 0.219379120603797, 0.2200000614690321, 0.2197222836134454, 0.22296918767507, 0.2219445065359477, 0.2299673577653283, 0.2252054530034236, 0.2277264614067849, 0.227446349361967, 0.2330019064737006, 0.2288889529256146, 0.2347222878929349, 0.2377778442265795, 0.2447222905384376, 0.2545728681139122, 0.2602778503734828, 0.2761111882975413, 0.2805556339091192, 0.3033334182228447, 0.3438889848272642, 0.3775001055088702, 0.3943487855410144, 0.4181233173825085, 0.4408334565048242, 0.4513890150949268, 0.4563890164954871, 0.457203630096483, 0.4936112489106753, 0.5307003863211952, 0.569444603330221, 0.5591596985683163, 0.6446593420453367, 0.737376456660442, 0.8044678618412299, 0.8805791156240275, 0.9103316907096172, 0.9194447012916276, 1.0013891687675072, 1.0063891700902583, 0.9732075210862124, 0.9309199398537192, 0.903247183629007, 0.9038027380084084, 0.7846804166666668, 0.6422596090076772, 0.615142424427288, 0.5246546399782135, 0.4753782527233116, 0.4733334652194211, 0.394281077264239, 0.5019445842670403, 0.5797223815748522, 0.6000001675225646, 0.6608241532057266, 0.6922224155773421, 0.7055557523342669, 0.7133265020230315, 0.7115826391009189, 0.868889131652661, 0.9758382465764084, 1.016389169623405, 1.1466669869994297, 1.0360856773264864, 0.957014523235684, 0.9655558250077808, 1.1069960683162154, 1.1102780873015876, 1.0966669726890756, 1.0820637621381886, 1.064227621304077, 0.9147549049953314, 0.8080557809679428, 0.7958335546769643, 0.6730557433084344, 0.6930557482856106, 0.6961439836601309, 0.6694446314192344, 0.4636135744631185, 0.4355556767818239, 0.4772223550420168, 0.5300001479147214, 0.541944595439751, 0.5416668180049797, 0.5533334878618115, 0.5263890354030502, 0.5219445897914722, 0.5058334737005914, 0.5018860902583255, 0.5375001498599441, 0.57527793767507, 0.6436112907614902, 0.6834710831725284, 0.6766668551976347, 0.7355557602707751, 0.7361113166044195, 0.8397224567382511, 0.8488891260504202, 0.8536113496732026, 0.8597224624811968, 0.8711930503423592, 0.96252591643324, 1.0132285585810252, 0.9697224870837224, 0.8911113597883598, 0.8691669014900406, 0.8092369176781822, 1.0202780627139747, 0.911944688530968, 0.9097224762682852, 0.903333585823218, 0.9177780340024898, 0.9363842307033924, 0.8700002428415811, 0.7635224203956584, 0.7536113212930562, 0.7455557636943667, 0.7369446501283862, 0.93479484064737, 0.7333335379707437, 0.7447224299577244, 0.7372224281823841, 0.7333335382819794, 0.7043580806878307, 1.000000279178338, 0.9865079380641144, 1.0088891708683474, 1.0175002840802987, 1.1033336418456272, 1.1275003150482414, 1.0483336248417898, 1.0350002893713044, 1.0208336185807658, 1.0172225058356676, 1.0244447309368194, 1.0227780637254904, 0.8970660724374934, 0.8800002453314659, 0.8586113513849984, 0.8522224603174604, 0.7683335476968564, 0.7416668737161533, 0.6286112866479927, 0.6325001763927793, 0.6305557314036726, 0.6319446206615059, 0.6286112864923747, 0.6238890631030191, 0.411914103330221, 0.4066667798766729, 0.3936135549330843, 0.4686112415966387, 0.4600001283068783, 0.457222349284158, 0.4649579841269841, 0.4705556868191721, 0.4691667974634299, 0.4741667986305633, 0.47500013243075, 0.468889019685652, 0.4669445744631186, 0.4691667974634298, 0.4661112412075941, 0.475555688453159, 0.4763890218643012, 0.4705556868191721, 0.4894445810768751, 0.5001682013694367, 0.4917695080921258, 0.4792158183162153, 0.4711112426081544, 0.470277909197012, 0.6888890813103019, 0.6863890807656396, 0.6866668587768443, 0.5922223867880486, 0.5930557214441332, 0.5947223882664177, 0.7806351353874883, 0.7575002119514472, 0.7588891009181451, 0.7575002118736383, 0.7575002119514471, 0.7566668782290694, 0.5330557044039838, 0.5338890378929348, 0.5330557045596016, 0.5350001486150014, 0.5316668154372861, 0.5311112595704949, 0.3120214760348584, 0.3108334198568316, 0.3141667543572985, 0.3402778728602552, 0.4872223583099907, 0.5405557066604421, 0.5665010876128229, 0.5663890470743854, 0.5661112693744166, 0.5650001577160496, 0.5633334906629319, 0.561666823451603, 0.7186113114690319, 0.7180557560690942, 0.7150001998910676, 0.6891668593215063, 0.5441339910519764, 0.4911112481325864, 0.4621591977124182, 0.4588890167289138, 0.4572223498288204, 0.4561112384842826, 0.4555556828509182, 0.457500127840025, 0.3072572370837224, 0.3077778635231871, 0.3086111970899471, 0.309444530734516, 0.305277862745098, 0.3072223077342048, 0.323618120291913, 0.3230556453431374, 0.3269445356364768, 0.326666757858699, 0.3269445355586679, 0.3275000911142234, 0.3241643334889511, 0.3366667604263927, 0.3406396722689075, 0.3523927067382508, 0.3599604008714597, 0.365000101696234, 0.3669445467631496, 0.3752778823503476, 0.3797223281979459, 0.3886112194211018, 0.3913889980547774, 0.3834141334816262, 0.3635924737823008, 0.3512535667600373, 0.3372432959850607, 0.3198810178169416, 0.3055929691876751, 0.293818926626206, 0.2848669470121381, 0.2730089388422035, 0.2578828881886087, 0.2475000688608776, 0.2369445105042017, 0.2366667322669787, 0.228611172947762, 0.2208333948417623, 0.2425000677199719, 0.2411111785093386, 0.239444511367238, 0.2397222891378773, 0.2394445112822907, 0.238333399859944, 0.2375000662931839, 0.2375000663709928, 0.2377778441487706, 0.2377778442259311, 0.2491667359697591, 0.2428478061002178, 0.2319445091036415, 0.2316667314036726, 0.2332422999533146, 0.2336111763149704, 0.2304435136943666, 0.2300000642701525, 0.2315569592242453, 0.2294445084033613, 0.2286111749144102, 0.2280556192032369, 0.2305182077497665, 0.2016667229225023, 0.2016667229225023, 0.2038889458450046, 0.2047222794117647, 0.2047222794117647, 0.2092040719732337, 0.2125000593681917, 0.2119445037328821, 0.2113889479458449, 0.2138889484905073, 0.213055615079365, 0.2352778434484905, 0.2675000748521631, 0.2697222975412387, 0.2694445197634609, 0.270277853330221, 0.2702778531746032, 0.2811111895424836, 0.2775000774198568, 0.2847223016651105, 0.283333412464986, 0.2850000795206971, 0.2905556367102396, 0.262500073279127, 0.2758334102863368, 0.2733334097416744, 0.2722222983193277, 0.2708334088079676, 0.270277853252412, 0.2634617221444133, 0.2726540674603174, 0.2797223004201681, 0.2880556360877684, 0.2914356448801742, 0.2930556374105198, 0.2922223037659508, 0.2847223017429193, 0.291944526065982, 0.2994445281668223, 0.334166760192966, 0.3416667621381886, 0.322224581154684, 0.3256746063647681, 0.3255556464363524, 0.3255556463585434, 0.3344725201525054, 0.341666761826953, 0.3617483990818549, 0.3711112148303766, 0.3777381648770619, 0.3825001068316215, 0.477500133286648, 0.625555727124183, 0.6780042455229954, 0.6983335295301696, 0.7072224200761112, 0.7546290563858187, 0.7677780068404852, 0.7821313697286132, 0.8072224533393519, 0.8266669015544172, 0.8427102780227086, 0.8613891317979777, 0.8650443598069694, 0.7342647594209701, 0.810266287207244, 0.8166668950886434, 0.8185761499105871, 0.7935389264705883, 0.7891668870208269, 0.785933885698724, 0.7688772185652037, 0.757460492997199, 0.750177579676315, 0.7417882237784003, 0.626111285480859, 0.6161112549797697, 0.6930860648148148, 0.6804296713352009, 0.6787443309212575, 0.6780557446311859, 0.6751308843759727, 0.6698134239807034, 0.6691526808278866], [13.171648281901648, 13.334851666199814, 13.529891633831312, 13.66573434982882, 13.8102922683629, 13.592070648770616, 13.612226010504203, 13.619624396125117, 13.705581555477746, 25.62870682450592, 25.864378815048248, 26.407128828166822, 26.720520683074614, 26.89808854078522, 27.153394208061, 27.89663220291005, 28.020869059601623, 28.219493929831977, 28.642029407407414, 28.735483839169003, 29.356572045228493, 17.912656977570958, 17.960635510783664, 17.3886131416537, 17.372353227196804, 18.71471569705884, 18.666503681917213, 18.14080589134119, 18.28864405135388, 18.312610151078744, 18.124418843370684, 17.987154843370682, 17.293300885620916, 18.11602475060821, 18.154888125350137, 18.254960419000938, 17.33190034562714, 16.999691604149163, 17.049607623093685, 17.120133471755366, 17.08443069553377, 17.200198241784687, 17.552756769218803, 17.89658986220044, 17.460054231948334, 18.109932627373176, 18.9807941180361, 19.775012028322443, 20.465546793884226, 21.388374228913797, 21.977982238717715, 22.076395028944912, 22.41481235566449, 23.14742416464364, 23.2408303951136, 23.375736681971038, 23.432407900483074, 22.96388256302521, 22.335322777266843, 21.915712607298477, 21.58204036414565, 21.10229712145969, 21.189144481403677, 21.423459609399316, 21.640652125894803, 20.96690783115468, 20.816557580143165, 20.78212494545597, 20.69094402670013, 21.80547750155618, 21.55880343962029, 21.432787350240563, 20.93349879761461, 22.304987211017743, 22.073623904803405, 21.55830559048527, 21.24934950912569, 21.060500327186432, 21.305274036681077, 21.348544327653286, 20.970852249898847, 20.64378695417056, 20.55106458123249, 20.63926770699049, 20.8564129773759, 19.80786457298475, 19.9090178268752, 20.0512146206038, 20.51238393549642, 20.95482586220434, 21.26603967094616, 21.75363059850607, 22.276742115935264, 23.50806402061936, 24.39919435294118, 25.700949821064206, 25.6126492739861, 25.21577226696234, 25.45408927550446, 26.25035942997199, 26.67397093611889, 26.61835463352008, 26.04443060068472, 25.526395989573604, 24.680868661064427, 24.609532518285093, 24.38973420323685, 22.86367425233427, 23.279315059358467, 23.123584768596327, 22.96639950395917, 22.145513755588517, 21.692547025676937, 21.818052125350142, 21.99939646319639, 22.07058228983816, 21.541797755647632, 21.21160390499144, 20.636464515633104, 20.725367070811508, 20.23101105625584, 20.180777877139747, 20.018574597416748, 19.968611677404294, 19.884900093059446, 19.740712059835047, 19.74322610067296, 19.811344793783068, 19.59437462130408, 19.45896658906721, 19.722880969187678, 20.14019863113913, 20.342780744086525, 20.486415075708063, 20.33975788934602, 20.1854295891502, 20.345107534227488, 20.251254110955497, 19.886339987588848, 19.35647069382197, 18.805821883280164, 30.311098060486945, 30.16394137089429, 29.75650655952381, 31.82294978423592, 31.562382435807656, 31.384992086601304, 30.9303629842048, 30.553523463663243, 30.136966537765847, 29.821649053843768, 29.76319918393637, 29.73000117362104, 17.911799717105662, 17.61357594833489, 17.31808850855898, 14.805986549408653, 15.098034686819172, 15.573682894957985, 16.3124434833489, 16.73740852466542, 17.38376976781824, 17.60373031248055, 17.68236709375973, 17.505177603641457, 21.139466641456583, 20.94212530539994, 20.5445495789715, 20.403705169000936, 19.73863236181139, 19.020945556878303, 18.2537560037854, 17.42084739091192, 16.668100110099594, 16.420034684554285, 16.422378257780892, 16.581297719811946, 12.777503554933086, 12.848226095055892, 13.168422228291316, 13.200618634765016, 13.062185226501713, 13.2862079414099, 13.217481516946131, 13.179144366557734, 13.364587986772486, 13.351867614301277, 13.115793851774042, 13.135201809446002, 13.792458389044508, 14.038472395502648, 13.893310240429503, 14.020164734982885, 14.287122137021475, 14.17250394328315, 14.09891352412076, 14.126889601073763, 14.077599276688453, 14.150670195424835, 14.236182487550575, 13.634192853874884, 13.596264000378673, 13.335787679099887, 13.328931209694987, 13.198794396591971, 12.97470851696234, 12.918931858621226, 13.007071735060691, 12.876169902583255, 12.812865337145968, 12.633280194664255, 12.626959294584504, 12.668059082088392, 12.55000808792406, 12.476893503579207, 12.837819980781202, 13.524725984228793, 14.148136136865858, 14.811659017052484, 15.577254467164646, 16.146304331354393, 16.977381423436043, 17.70782203135699, 18.500733474089635, 19.068520475412388, 19.66369809999287, 19.843891819172114, 19.139113224634297, 18.392019331310305, 17.859402649626517, 17.411470793417365, 16.610112094693434, 16.018284794895735, 15.148086118036105, 14.296986617102396, 13.569318631419234, 12.848541329831932, 12.152378786893191, 11.974316270852784, 11.946092590268703, 11.965982934718332, 11.969076069803664, 12.027652008714597, 11.981944659302714, 11.951039692531644, 11.803427424603177, 11.845119520385934, 11.75914582710862, 11.79529201803286, 11.911114421662647, 11.993669696700902, 12.078107087457203, 12.217628673428909, 12.19974116487706, 12.196767857920946, 12.323177726876493, 12.456708865079364, 12.520166557734203, 12.596494158963583, 12.969024421030465, 13.346200842890216, 13.427221203228353, 13.382717186507936, 13.43882842499222, 13.393934302987862, 13.381073954090803, 13.28583699205312, 13.33522754816371, 13.21704288383131, 13.24028064301276, 13.19096667553688, 12.812143076953, 12.543109391845627, 12.415817267955704, 12.37539487962963, 12.339762001711795, 12.400504426704014, 12.386207105742296, 12.387806553202491, 12.31248700902583, 12.327922582321818, 12.626344694522253, 12.542334516485765, 12.937169705848351, 13.029171853716026, 13.456661066293185, 13.693469960395271, 13.752789686286183, 13.898558930827887, 13.872907308614096, 13.943626375739184, 14.107975439309056, 14.266412397193736, 14.18600274836342, 14.249638344849048, 14.052538605351309, 14.167911101934896, 25.493622552131963, 25.521124944989108, 25.34198856489263, 25.1552636914099, 25.369217852941176, 25.478564208372237, 25.330366214596943, 25.161073423406865, 25.20999526365936, 25.280931148381576, 25.213440452589104, 25.144049810529346, 13.452040377061936, 13.464092194989108, 13.712451270697168, 13.776848903423598, 14.668674411920325, 14.804353653828196, 14.817840030344849, 14.8695720638033, 14.705374946461646, 14.49182088784561, 14.47791945681606, 14.236502431840384, 14.94791932659898, 14.850710043962028, 14.549124804305436, 14.607039448274657, 13.33395435779905, 13.127456900482414, 13.167530515639587, 13.0144034899432, 12.845712376439463, 12.776363466464364, 12.733055739651418, 12.687781303320692, 11.90472265927677, 12.002339025599127, 11.908667391117234, 11.995959814543784, 11.882026582555245, 11.94456605788982, 11.872175956250013, 11.724348842514784, 11.818336619903516, 11.948742062402738, 12.110003367547852, 12.083662719187677, 12.142867335978838, 12.009005990507314, 12.340964467305351, 12.50216724369748, 12.520173195809363, 12.458059021786491, 12.580281278304287, 12.740127124257551, 12.805497666588858, 12.739167151811053, 12.7210142167756, 12.912557204481796, 13.395679822751324, 13.565705139122317, 13.24018005104264, 12.96675889688959, 12.858003099311444, 12.891457555399937, 12.683168722533456, 12.675735615683037, 12.785262613523187, 12.77400814021164, 12.866266265328354, 12.402355726501712, 12.264101884209332, 11.888086082477434, 12.03389868985372, 12.121971055322131, 12.120457859550395, 12.282897686896984, 12.367255234905072, 12.498662927559913, 12.305117184718332, 12.242808598340728, 11.9840525105042, 11.764925473180233, 12.64381757306256, 12.67621648373794, 12.949216236928104, 13.097736921548528, 13.100787170401492, 12.789097601992555, 12.72038562029256, 12.471223570961715, 12.469062630174294, 12.560263987024875, 13.061119335978836, 13.225243929330304, 12.365264803065672, 12.356466276067938, 11.908996615935262, 11.720350984982884, 11.704169920557112, 11.760803891355431, 11.726392151805168, 11.672743628137535, 11.66694768853097, 11.5241038267118, 11.10028959757236, 10.961711634687209, 11.681669917819535, 11.8070265140056, 12.023952261037191, 12.158957602062586, 12.178047232959852, 12.2100033854653, 12.26585298381575, 12.242873751624913, 12.273938074618735, 12.237474761048864, 12.27457617561469, 11.71145224928805, 11.514412585434176, 11.30713828274383, 11.48806060090777, 11.832225515639587, 11.86919047307812, 12.11310300801432, 12.753761396436357, 13.467852843215065, 14.169777126191777, 14.806613446078432, 15.551652280890131, 16.07694501346094, 27.50320084072518, 27.88292551030063, 27.588177069327728, 29.039730330999067, 29.03564977645503, 28.803714757080613, 28.2864290959909, 27.580987720043574, 26.796928471444136, 26.18492992903828, 25.601495959694997, 25.352450670577745, 14.03264963894984, 14.14163070821662, 13.986153252567693, 12.554725713429816, 12.430653773187052, 12.46618375867764, 12.542503487784003, 12.673847042950513, 12.837302628773733, 12.79269386405543, 12.670035226112669, 12.822242622435464, 17.300321846173127, 17.097007536325737, 17.22898253470277, 17.118811877606603, 17.143445239096383, 17.201671462340492, 17.224796788048554, 17.259418635154063, 17.36750484360411, 17.466188136529986, 17.746671617173075, 17.457105314719378, 13.068710189682562, 13.13331359072518, 13.14856458068783, 13.20367285823089, 13.428175919545597, 13.374711901260506, 13.226649084897964, 13.26712539914864, 13.37650452910053, 13.261076413009649, 13.037704025365702, 13.098329963896669, 15.007189009103644, 15.03860572922568, 14.91443538087457, 14.952646269607843, 14.63612420143169, 14.702223936741364, 15.010251407663532, 15.050464731792715, 14.942104795751636, 15.029598825552442, 15.009999255536124, 14.42355757990974, 12.82904546451914, 12.692259873203914, 12.87457095681606, 12.720236958294429, 12.946670267896048, 12.86588253680361, 12.666104211562402, 12.495999411998133, 12.284998689931529, 12.176561881652662, 12.296548343584009, 12.375162127373171, 12.4030252464986, 12.34009588032991, 12.023769971366324, 12.19812818425148, 12.042595843915342, 12.014928340802989, 12.179218983252849, 12.088011388422034, 12.011723405091947, 11.719997748311089, 11.67027320504477, 11.760772884271582, 12.112080536023427, 12.633090986694675, 12.705110284387, 12.65861463530968, 12.622630925303454, 12.655607627139746, 12.45306084278193, 12.394201966853409, 12.384555038204171, 12.35111848170066, 12.53247694052876, 12.599244604263928, 12.153427538543944, 11.9398952237784, 11.953884690631808, 12.363065874494245, 12.909169551976346, 12.835003555176284, 12.93941983232182, 12.848110295985062, 13.08790969771242, 13.313450379612776, 12.925302032026146, 12.817059827186432, 12.900537356661738, 12.56093251431684, 12.279323441409897, 12.055355727279805, 11.547017651571744, 11.490588879133355, 11.386858715608463, 11.60152202194211, 11.347749929566737, 11.106844299005344, 11.264930512371617, 11.20051189345822, 11.203618612433864, 11.177476753968254, 11.06671814799253, 10.827257836483618, 10.73994903952692, 10.779190059719168, 10.788917063402582, 10.571463732648615, 10.612675365157177, 10.50378632508559, 10.490838371226268, 10.48170882868834, 10.24034581454508, 10.177033167989418, 10.321958845442344, 10.393795793187834, 10.36593393331777, 10.26151729565438, 10.151694736694678, 10.2596758505291, 10.322932017040149, 10.178713995253656, 10.26134035278556, 10.273543625731406, 10.254792384142544, 10.619603602638378, 10.44225746179583, 10.39250288915474, 10.290074821654215, 10.287943682850916, 10.34251203671089, 10.218489952521658, 10.17364193845316, 10.11644749782135, 9.989355910753194, 9.808011559577404, 21.708756913476503, 21.24112372128852, 21.20995431702528, 21.19155085799876, 21.165712856209154, 21.11454113904841, 21.003808041160912, 20.9486352254902, 20.976639531400437, 21.010068575595884, 21.065633631730478, 21.25264803978001, 9.529243798015887, 9.63437705874572, 10.05506815429505, 10.395805633675693, 11.613189055917797, 11.639204528645353, 11.620070479314506, 11.602759510893248, 11.65506602832244, 11.685590890600684, 11.789125203003422, 11.5933032683113, 12.348049229023417, 12.320733208326892, 11.722882906406271, 11.616723330890224, 10.463464242241818, 10.50529664386866, 10.547775643946467, 10.556883836494324, 10.49875367429194, 10.457861936507935, 10.451083423202611, 10.36117428097636, 9.647546667055712, 9.694241563776067, 9.70448654388422, 9.683377781434796, 9.767721711173358, 9.759892759726114, 9.93175538165266, 9.885296596483036, 9.878268313685291, 9.792792068238406, 9.693760718771395, 9.690702774587612, 9.695240457893094, 9.600198545673823, 9.72132361173036, 9.632373939542484, 9.480259015873015, 9.560576644568938, 9.365469412844307, 9.341851172346717, 9.395165597416744, 9.414295088304671, 9.444617400241215, 9.400436942287978, 10.094222818158006, 10.080378225412383, 9.917920391223156, 9.942108081388112, 10.054346627677925, 9.965485526844072, 9.943723262994087, 9.974232158807968, 10.07458468394024, 10.075882549253034, 10.166169746809835, 10.15396385712535, 9.4326985384376, 9.388809767566013, 9.526683180750078, 9.691382091736696, 9.541031908730158, 9.506540745918928, 9.57508634164463, 9.539909070961718, 9.469463200012967, 9.58452626540616, 9.72093857590842, 9.753760664021163, 10.444993246965453, 10.616989258101208, 10.645350305940708, 10.748929072673516, 10.939692429349517, 11.107659307812012, 11.56534797089947, 11.599412241752256, 11.669937367780642, 11.590217328005384, 11.562419019607844, 11.734167204258194, 11.03211522951666, 10.964288193104831, 10.848795766484466, 10.830938575552445, 10.790247802054154, 10.776734825785873, 10.337934324696546, 10.454141108292484, 10.609206755213195, 10.6041504589169, 10.619169426626206, 10.419491503968253, 11.036237662355424, 11.069297679038282, 11.0163400708061, 10.930612126984126, 10.771312029567383, 10.693828533769064, 10.547498022417404, 10.325999327886713, 10.072138341613508, 9.939825076563958, 9.981837356831624, 10.089257946812427, 9.588191114923749, 9.433219069638966, 9.973462012449424, 10.097416221444137, 10.057535168611889, 10.03466869553377, 10.267518999299725, 10.344953431061311, 10.342187595238094, 10.262875935711692, 10.222157154839715, 10.206186115624028, 21.439249497644987, 21.44248480112045, 20.908623561858075, 22.500928147836916, 22.7420602764485, 22.859826328197947, 22.735610535048377, 22.99830917950513, 23.143019775287893, 23.15255280047205, 23.157496974877464, 23.220480022842448, 11.856195941798942, 12.004841968098352, 11.999573076252725, 10.452416225390992, 10.477236425256802, 10.381286587768445, 10.35081722912258, 10.0001729073296, 9.95126079537299, 10.052075350373483, 10.229169515406165, 10.009745731248056, 14.081341131419236, 14.02551000147837, 14.247211806255835, 14.134681571506382, 13.999816795907254, 14.07288892777259, 14.145185648793966, 14.149681586990352, 14.13505980804544, 14.033362756847184, 13.906159180361035, 14.013948571681093, 10.309984037970745, 10.348809649124671, 10.267173351358418, 10.269435436430127, 10.328039529100533, 10.359050338313102, 10.30630265455054, 10.310714476579523, 10.44979490411655, 10.480565295518208, 10.460779832738096, 10.388739660816626, 10.789713222300032, 10.769666454003918, 10.819673394266156, 11.119498572517898, 11.024935058163477, 10.967483948520334, 10.971638992129632, 10.966064538603618, 10.92379809001716, 10.933037049797695, 10.93532485994398, 10.97711518634264, 10.330908084781232, 10.180515975023344, 10.107873565402272, 9.942152494864612, 9.988272709213872, 10.189869644335513, 10.167516508311936, 10.065352741822936, 9.986792773874363, 9.915070495409276, 9.904320848515152, 9.83919477777843, 10.226162694811917, 10.16101082010582, 10.08469894125428, 10.138067510971055, 10.346342559757236, 10.173158602396516, 10.167336863834423, 10.212717194989107, 10.308550788492722, 10.401855913398691, 10.50741640592904, 10.680864144565104, 10.348188994908057, 10.457948603952694, 10.523590314814816, 11.628712170323688, 11.47594608582322, 11.465607613342934, 11.549636430905696, 11.652777911764703, 11.819993731792716, 11.7382870227202, 11.700738399081857, 11.600514232570806, 11.582194926543824, 11.56781111749144, 11.49980643899782, 10.324624466293846, 10.22843403733725, 10.36936778778984, 10.241554831932774, 10.110396842644466, 9.986732169000934, 10.055042309446, 10.095196379396208, 10.075357375670476, 10.026095061079989, 9.94490193706461, 9.897680038359788, 9.862584282757547, 9.877619492374729, 9.72233912535014, 9.800278001556178, 9.768996444677873, 9.886510515483971, 9.909846048474945, 9.997596001379163, 10.027122089558048, 10.033786483273683, 10.008464291528568, 9.99176735045129, 10.10074030047464, 10.066449902816682, 10.093170246403298, 10.099608089869282, 10.112292501847977, 10.12346907741986, 10.181424027155307, 10.13881698179272, 11.115532936331578, 11.70609800320194, 11.70389211484594, 11.687091727668845, 11.75778104761905, 11.80406898318347, 11.88750330890134, 11.992119878229069, 11.980999213974478, 11.865747870837229, 11.708109569249922, 11.7385699816371, 10.563067421023964, 10.223560259351986, 10.230046794406848, 10.3090803881108, 10.27114172743542, 10.248800329357664, 10.210002838546531, 10.079136409663866, 10.046687919545596, 10.08372806598195, 10.042640205882352, 10.1008942638033, 10.121111417833802, 21.86450636772487, 22.231938807189543, 22.271086816448804, 22.713967410326536, 22.943512195234863, 23.28222155423281, 23.77654712286025, 24.207950191020856, 24.71011190655151, 25.0547757070508, 25.463062664488017, 25.830287193817203, 14.435030823115737, 15.182823980625583, 15.570271257936506, 15.667492609554932, 16.915560229147214, 16.858942514239033, 16.82534070598546, 16.880131181605975, 16.7658636415597, 16.826837208363084, 16.789391226818786, 16.65327989400418, 17.82214790414138, 17.61397975840336, 17.591230310056797, 16.70933958541148, 16.809703546492127, 17.11020498910352, 17.42012382049487, 17.64362093300524, 18.931466383736648, 19.385005395712728, 19.577304317588705, 19.175644935185183, 19.076459397254645, 19.1825799553753, 19.44625405874572, 20.33614437550576, 21.003801222643045, 21.568976266083105, 22.21481701216413, 22.655110075396827, 22.257904195864626, 22.34166780776102, 22.89730788188609, 23.58836317020338, 25.027161406240275, 25.99075874716227, 27.23952420899471, 27.628530032601933, 28.128231444055405, 28.82777162317149, 29.398415996252584, 29.970979096763543, 30.037769429193904, 29.906474006270106, 29.5250849914528, 28.94457364028945, 28.979181604856976, 28.1670967829605, 27.11880733891661, 26.270161264550264, 26.40386106417992, 24.956872152254423, 23.882754763837667, 22.8812746556178, 22.4735958295207, 22.473528108066755, 22.49409062702685, 21.95312339892624, 22.07591593549642, 22.2803795103218, 22.446253602443846, 21.684944494631186, 22.223470170312662, 22.712300801871955, 23.22724462075942, 23.331943482882043, 23.855379621597805, 24.282784532290695, 24.24889564004565, 24.068134609513443, 24.245074352318703, 24.11600407650887, 23.797054503415094, 23.33296247587924, 23.11972865094927, 24.175923704948644, 23.667628697157383, 23.63908048809524, 23.15094360035857, 22.734102881574856, 22.50079049735449, 21.817663910974947, 21.37423931611941, 21.320752359788365, 21.11146153126686, 21.060157083177717, 21.181209959295483, 19.7708107536447, 19.680033043718797, 19.591083329598508, 19.811949951447247, 19.947505558823533, 20.042055032124058, 20.19830139654723, 20.81182651774043, 20.731356736275668, 21.021174352163086, 21.761135308434486, 22.39996636146774, 23.154872226956144, 24.04264168400444, 24.704927412387185, 25.206778702677923, 25.939040732493, 26.94172085636477, 26.776660334010177, 27.654472692265795, 28.30796755701116, 28.69203345666044, 28.53781314074463, 28.66370486755944, 28.38598593059446, 28.45904340545303, 28.49939387741921, 28.557643275676934, 28.56383772788671, 28.060572649050616, 27.73257492491441, 38.92516019333956, 38.87547764200124, 38.5582108653128, 40.76197637507716, 40.38864299250894, 39.98290192270334, 39.76348868579469, 39.69099832210859, 39.62579264301276, 39.1588434245836, 39.23954402054156, 38.04654788585434, 27.748578791924608, 27.74877257314037, 28.048632492997204, 25.837217345774917, 25.98211940432588, 25.867175938036883, 25.740562713663248, 25.035821801665108, 24.670158201058204, 24.432513484905076, 23.79496690367258, 22.97047984286297, 26.217957458824827, 25.296274668845317, 24.270786851307182, 23.15289938258637, 22.174166908807965, 21.259586909352628, 20.99153916993464, 20.588471175770305, 20.094925860779774, 19.7970876585538, 19.73167216083879, 19.78977872734666, 15.929780336985178, 15.959099437034444, 16.013242058411144, 16.206115620370372, 16.097782250311237, 15.811727930827889, 15.807439009025837, 15.83825666355431, 15.681929823627884, 15.328111087612823, 14.92973175170068, 14.527943753267971, 15.07583726415076, 14.745313183317773, 14.6884958356676, 15.23845164175809, 15.127649534080296, 15.067953006439334, 15.440137098739498, 15.420552781268157, 15.54881850652557, 16.246323373482728, 16.81222690802145, 16.71252585604575, 16.78889356636386, 16.77704247525677, 17.100494874489055, 16.15393999174318, 16.150573772950384, 15.73023622524511, 15.414572193197555, 15.165382127292771, 14.962271684329286, 14.278695292794897, 13.64454270666044, 13.0782892194211, 12.869097655292952, 12.8667952613601, 12.39318499149745, 12.426072449268595, 12.386659920514978, 12.4625938540305, 12.574393290098174, 12.75871969257703, 12.671924555788983, 12.622078542395478, 12.530908883597888, 12.58835480820106, 13.211392569638967, 13.458645194444443, 13.879448309679429, 15.376115393986025, 15.678967610410831, 16.14837249851191, 16.808571127139746, 17.12028254624119, 17.566393789293496, 18.09944949486461, 18.61056074665422, 18.62860692724868, 18.739983959539373, 18.767145404061623, 18.804318371615317, 17.59626816985683, 17.190672746187364, 16.457640448179273, 15.811526755757855, 15.231069531356985, 14.711022748677248, 14.181764818160596, 13.655698181605976, 13.1817975611351, 13.159605724556489, 12.961225605742296, 12.495644487706192, 12.187309583022095, 12.166407850840336, 12.12964571584189, 12.32746818290798, 12.394725670090262, 12.490836812169317, 12.496681779567384, 12.560281275029194, 12.346123092656784, 12.406109048319326, 12.452871697556798, 12.587193008908477, 12.706270990526132, 12.873081372782444, 13.05099488750195, 13.154020704948648, 13.16350025987049, 13.253668413539277, 13.27056840221302, 13.23111478688142, 12.86800916993464, 12.88528136484594, 12.615110781648127, 12.702606164176784, 12.66252383286648, 12.451169740351697, 12.084795068082787, 13.372503720277, 13.398138544733012, 13.382022865643492, 13.358059276921882, 13.36528149929972, 13.303809788359786, 13.677226029645194, 13.970379688920014, 13.810093795268433, 13.98333689464675, 14.115701569794586, 14.049860563881108, 13.361253750700278, 13.589370892390289, 13.620559334111425, 13.885003867335826, 14.205694646358545, 13.999511573779332, 25.6912230340803, 26.074855315670717, 26.3024674289942, 26.46607613289761, 26.78525442717087, 26.80362327542989, 27.04074488564102, 27.41595755314348, 27.975117385283745, 28.273203380641142, 28.24408105404801, 28.577229679416384, 17.23983233838313, 17.693030090958604, 17.858412808512295, 18.03048337382509, 19.02857623877285, 19.014197686585742, 19.3708712263461, 19.128924244086523, 18.913894146202928, 18.58851113157485, 18.793044133753504, 18.54089467421413, 19.60457321482065, 19.30639853151261, 19.19405756403673, 18.3047206040305, 18.80715038320884, 18.760745368036105, 19.540777640494344, 19.825131501400563, 19.94594854785248, 20.46108135045129, 20.95596706178027, 20.450185084811704, 20.97083917147332, 21.25170031040435, 21.6629658138033, 21.716924193977597, 21.36019393106131, 21.162883489978864, 22.054221156862745, 22.02030218285092, 22.01874549886853, 21.79195238562092, 21.56601857965298, 21.25459404275599, 21.67896927310925, 21.96181978523317, 21.907841697089943, 22.019116356131345, 22.029165285869905, 22.18247732086316, 21.7448773181606, 21.63332050178961, 22.08553123015873, 22.163358136476816, 22.378339563647685, 21.94088504038282, 22.516286520774976, 22.54274613484283, 22.38235630925602, 22.42945865289449, 23.96896838912232, 23.51322614122316, 23.521703205182074, 23.626071604575163, 23.483828595082475, 23.51712571167134, 23.574059547171647, 23.23513094545596, 23.323813238443435, 23.33786113398693, 23.387636715919708, 22.671221191332084, 22.40637174912401, 22.24554173980703, 22.397202627139748, 22.53528404863056, 22.50147102987862, 22.55171908393377, 22.500082170790535, 22.43963629581518, 23.434185461251168, 23.246744775988173, 22.90855057315593, 22.224248565203855, 21.679498841744543, 21.34654796062869, 21.44499097237784, 21.352337544428885, 21.394529328859974, 20.91759611587561, 20.554015107765327, 20.084643251683683, 21.08098583846872, 21.06465062480548, 21.446023296763155, 21.82306160971055, 22.16288178625766, 21.813051269296608, 22.045801743198204, 22.414063191332087, 22.475684217631496, 23.128407411064423, 23.541664604464287, 23.07522928206441, 23.753062167989423, 24.230329759966672, 24.317730758870216, 24.825721470331462, 25.318748779956422, 25.799939979595912, 26.285273324424217, 26.455112286648, 26.87692375295674, 26.573181865375567, 26.39162276120448, 25.56918828159041, 24.842224736072207, 24.48884877318705, 24.86597365468409, 24.40210330220394, 24.23456289106767, 24.03194465981952, 24.859556024419557, 24.353839216554803, 24.073426872860264, 24.148456150389723, 23.8933219985588, 23.649678203866728, 34.88996298259317, 34.302731193746915, 33.53094060607462, 35.48503037771196, 34.89486229341736, 33.96559315301708, 32.67556458192891, 32.253024526999695, 31.643110710071717, 30.9948705052132, 30.489725625811804, 28.97714075186741, 20.0782896005291, 20.29480311048792, 20.09099058442734, 17.535723568394022, 17.417306387721755, 17.190644596093993, 17.6769212910831, 17.54485045915824, 17.246535810301896, 17.377172934001848, 17.345056543495176, 17.137208338235293, 19.555596161154764, 19.290607475101154, 19.37939377005913, 19.4182731382152, 19.16232764130097, 18.890347996031743, 18.82088965164955, 19.47880050525308, 20.120570097027706, 20.99628016686316, 21.6330885221761, 20.65746042785429, 17.861010683706823, 18.206136795036976, 17.99199584508248, 17.957994855353252, 18.1258430367258, 18.02510995508266, 19.037271496207143, 18.514276878151914, 17.853441000472085, 17.13355298916446, 16.427922801898536, 16.144624962159646, 16.954397601385, 17.020662982460586, 17.016682998027083, 16.933886307033923, 16.75000895175848, 16.141477749407535, 15.53937518475592, 15.283662872664411, 15.11588489471548, 15.007355869710317, 14.82643119048334, 14.040765924937398, 13.589068924447554, 13.125137927948956, 13.437927622004358, 13.351036475971329, 13.314370930127607, 13.040296552280454, 13.100229874536412, 12.886522987720438, 12.785749568160597, 12.492715611655772, 12.22386291171591, 11.881111549977955, 11.89623111967009, 11.649659472754566, 11.192187819016496, 10.962827034225551, 10.798083992051824, 10.553590352284989, 10.416106753734828, 10.270439106364767, 10.056113910130716, 9.932201532627866, 9.798324304540795, 9.416113867567953, 9.383209833255526, 9.04174163243075, 8.776216274509803, 9.927261999768522, 9.755457834500469, 9.528396541046792, 9.561113739417989, 9.307215451750052, 9.103853937519451, 8.991274614223467, 8.946946897759103, 8.843752868787188, 8.975366584422657, 8.989061753685789, 8.933261325971964, 7.532016971162077, 7.462278473389355, 7.477166464363522, 7.764477373157876, 7.830597939259779, 7.940004869436663, 8.042157248132586, 8.106454442954472, 8.070327038114689, 8.295557860939933, 8.32838249842113, 8.490557916977904, 8.6363445778089, 8.728057984360412, 8.516888669934639, 8.590340708527856, 8.70746256277687, 8.768193320719218, 8.794724668767508, 8.720126394957983, 8.72451007142857, 9.031391399159665, 9.115894321039526, 9.091883921724246, 9.154065151206431, 9.16985070595757, 9.060525645658265, 9.11111364456894, 9.135170466366112, 9.230847462844956, 9.3761136559044, 9.476018090413945, 9.111466403598016, 9.174855407640834, 9.295661057021604, 9.70500270121382, 9.640280431761594, 9.7807635938116, 9.71677664934406, 9.879748219089766, 9.814323330843449, 9.593377812558357, 9.447504923072952, 9.385222016184253, 9.230786991985685, 9.073363834939087, 9.094157385465298, 8.742224654995333, 8.742476731923698, 8.593541078042328, 8.349328067169168, 8.449950817283304, 8.746531242141302, 8.755403791651956, 8.875770350140057, 9.023347385910393, 9.038756300030396, 20.68631043221419, 20.852783601229383, 20.92017598768135, 20.93500450130046, 21.05018714067256, 21.44427908006864, 21.898339447527658, 21.71220924953315, 21.983201587020837, 22.03945292312481, 22.630199945183, 23.064896534473597, 11.961092825426666, 12.26472563881108, 12.556681739997686, 12.80638939301276, 14.204536247039542, 14.050791852147526, 15.35303634204793, 16.277266243376456, 16.81440006854964, 17.73306963156124, 18.097142712632603, 18.25862093783069, 19.665635648366017, 20.61909065756303, 21.51774167888267, 22.41515774678092, 22.12510643736384, 22.64695202692188, 22.177036019480116, 21.859410784387112, 21.996838421957676, 21.71722825801432, 21.416247726455047, 20.46452955527729, 21.26671736889875, 20.83885681512605, 20.553247577261, 20.202400152837782, 20.3966182699314, 20.56507062387177, 21.271548748366016, 21.81291205625584, 22.223462700752734, 22.727718521471427, 23.57225202908243, 24.12592259282371, 23.851117759017185, 24.66639576094228, 25.01341450602504, 25.32404292288331, 25.221643233205363, 24.99268738577029, 25.548706833099907, 25.862378336056647, 25.919437551497836, 25.90671572346624, 25.51162296062869, 25.17060949304453, 25.55231517864924, 25.40224575980392, 25.44490195915033, 25.576153189231253, 27.237449106053536, 27.079043318578183, 26.684864980661896, 26.429661481014627, 26.35379536808604, 26.38523602020633, 26.8095147980859, 26.54066544724556, 27.43492318798631, 27.20571214542484, 26.92726889897578, 25.78852022598975, 25.14949761585745, 24.968296124260814, 25.648914606286954, 25.65767714416757, 25.55584044615625, 25.441517234230503, 25.026510478654437, 24.578718808103147, 24.68635171234049, 24.8091735681606, 24.95816596073699, 25.13853626675617, 25.509852966542173, 25.31359517599012, 25.374636212997327, 25.423062628073453, 25.451076105042016, 26.16594314874991, 26.1519960673047, 25.61294145309291, 25.40073994062795, 25.514639871459693, 25.79763573533432, 25.66743030571117, 26.054138284871364, 26.11316548544973, 25.96766591339869, 25.651022561850297, 25.858204635698726, 25.118569282212885, 25.419206974167444, 25.816037080454404, 27.165131039755163, 27.078807549253035, 27.137472125583567, 27.389690284313723, 26.820373801182697, 26.586904982444366, 27.17584090655151, 27.638314921051848, 28.01744942950513, 28.16530135529749, 28.07663713274069, 27.45605993121693, 27.50543659469344, 27.64174619849051, 27.45963663453159, 27.16194903502957, 26.9770918820417, 26.635063367562765, 26.40518949867725, 26.01602306528167, 25.981746108232183, 25.819409538748832, 25.562817709305943, 24.65934771711809, 35.77007949257898, 35.170009256769376, 34.74492982197324, 36.90666957570807, 36.68750733333333, 36.16199382757547, 35.93129577085279, 35.460882554466224, 34.55430425754746, 34.12341943604109, 33.50006965802989, 33.03889525176279, 21.315507418145035, 21.50962210395269, 21.45304935270775, 18.716622470510423, 18.42482737449424, 17.683956752891902, 18.05813038927793, 18.191596644802363, 18.66619519880174, 18.667882919989104, 18.70397540460629, 18.77731847760015, 22.58403255477747, 22.22231213349933, 22.065820272927045, 21.96730496755369, 22.154011308340504, 22.2134410808655, 22.00827040566708, 21.76552537830688, 21.50062152559913, 21.442614692343604, 21.441025640563748, 21.515670875148015, 17.584176305466723, 17.699605444366636, 17.60752550770308, 17.591951751633985, 17.34158944195456, 16.847633432850916, 17.792119389822595, 17.60333813297541, 17.29703530742297, 16.940130921007754, 16.65534958932462, 16.074075870970145, 16.292800686352315, 15.65426249284158, 15.274932385076252, 15.11416587955182, 14.801476745578627, 14.44040402752814, 14.050337240273889, 13.817452209150328, 13.877638963663244, 13.856656195573004, 13.83103298653906, 13.558802707775056, 13.867893337535016, 14.169842522953624, 14.351650620525987, 14.145463378773734, 14.34310588253774, 14.090404053419052, 14.111936350840338, 14.266154438686588, 14.070206562480548, 13.884219185996344, 13.935260260520414, 13.53960348653906, 13.328346023031436, 13.067358106642288, 13.008063454715222, 13.077288527155304, 12.893054183629005, 12.654439973778398, 12.612400378773737, 12.407626805044243, 12.353471848612651, 12.43556525552443, 12.301333614301278, 12.206548117311184, 12.410233691409896, 12.383310405617802, 12.297871591658884, 13.405841423358234, 13.37515217997199, 13.309087788673644, 13.368647105119829, 13.468670581552852, 13.34983039366084, 13.299874027933395, 13.26543031520386, 13.145135608699034, 12.926248974867724, 12.9373000856676, 13.165789863445378, 11.99364161204482, 12.013541958683474, 11.729050150942784, 12.01604348901922, 12.02713141005291, 12.10529646204028, 12.043482975412386, 12.05153385464973, 11.972413979769684, 12.17130283224401, 12.21857404824152, 12.072213147681293, 12.162451722844692, 12.26111651126284, 12.20605544545596, 12.129393739184565, 12.041389660208528, 11.92860425420168, 11.883489812169312, 11.957299879084967, 11.762257473155929, 11.989015590258326, 11.7995637019141, 11.781429140367258, 11.677271317771552, 11.56136574074074, 11.37251185510871, 11.5252922810263, 11.559909602163088, 11.576202360196874, 11.716965689464672, 11.715703161998134, 11.565380806742793, 11.559227873638344, 11.634449289682538, 11.950130914565824, 12.027099215452845, 11.958957208605662, 11.774846204599806, 12.051524927482104, 12.098291468171622, 12.215483947904689, 12.02715529956427, 11.942686932850918, 11.897371916199813, 13.086599942421415, 13.042561603877486, 12.675014883675695, 12.603583953703705, 12.60292102184809, 12.78926966501647, 13.37719048775133, 13.924056163774775, 14.132776631949634, 14.100428407407408, 14.134265899315285, 13.877916970588515, 24.49388365779645, 24.87047575489548, 24.80307842250233, 25.155851596850688, 25.65056935752088, 25.696762571117336, 25.500688339242934, 25.077035592047928, 25.09757911423644, 25.458267631108, 25.806818233115468, 26.33634703105472, 15.807526354964208, 16.63806241409897, 17.33645193464052, 17.610190268456204, 19.01678128197946, 19.711838069172117, 20.252981688608777, 20.684218643479618, 20.99807999603175, 21.989361723217527, 22.5805750943822, 22.60053341114223, 23.556651124961096, 23.933843570028014, 24.625876829661934, 25.85817133281495, 26.746145445300336, 27.022347199695115, 27.775919978758168, 28.89201723651831, 30.19361894537815, 30.40772963108904, 31.248698510795347, 31.222398146358543, 31.48312812204133, 31.66919813761976, 31.48709515593488, 30.698326785164625, 29.0952009711958, 29.0248163708074, 28.34397814048299, 27.136799936479814, 26.190698100606912, 25.473046236850298, 25.23297873806778, 24.72706622119044, 24.472880659999085, 24.384130952432827, 24.515000178026764, 24.46878348240288, 24.75286387042922, 24.58310422835213, 24.78984570335541, 25.604519145035795, 26.045319949020268, 26.61584532280579, 27.28570563453159, 27.308749327572244, 27.88055580917296, 27.69567021440213, 27.30763298676341, 27.10205890082672, 27.99777560068472, 27.950007379007157, 27.495065623826395, 27.22608344488343, 27.46543431839921, 26.565758815737496, 24.59650733830144, 23.96313744249922, 23.87449491674448, 24.29705469673008, 24.746645267808432, 24.5402502875732, 24.508411017273573, 24.42144229649277, 24.714286299087043, 24.453963748713576, 23.936025367309888, 24.41630225551528, 24.609906239573608, 24.480001912048067, 24.974421363523184, 24.04358796723013, 23.873683685005588, 23.833432844291423, 23.899222862086965, 24.073018801898534, 24.162466434484905, 24.12634013826189, 24.04707703415811, 24.370006788180827, 25.12756525192365, 24.479799799155128, 24.163650103719267, 24.089057374183007, 23.436123460371928, 23.440001795362598, 23.20301247211848, 22.596141641067536, 22.387041587050508, 22.082475687816306, 22.13635873908536, 21.786833346702736, 21.12191283877996, 21.425624455104263, 22.05656526834734, 22.366250248443823, 22.4448403817867, 22.29523433803654, 21.47329917831969, 21.61268530294572, 21.647916398516447, 22.022228357238827, 21.79905127723312, 21.69343266581077, 22.336796527310927, 21.6612213426704, 21.929617776377217, 21.936898374105198, 22.516192003112355, 22.55199964402948, 22.584525292855847, 22.852282213624992, 22.48295396130421, 21.961950490180524, 21.81229087005914, 21.574449438764397, 21.0960556806154, 21.188041712729536, 32.118505232245184, 32.240186335434174, 31.82612181311858, 34.38974808929417, 37.50474427573841, 37.07366561607519, 37.22960846039528, 37.201154114482215, 37.27519008247744, 37.39405752170868, 36.66109048352659, 35.159794736305635, 24.630624983893554, 24.07032176889187, 23.73622694536117, 20.987855656777093, 17.480777141223157, 17.329679952380953, 16.950370742141303, 16.840119221809186, 16.56065773941799, 16.289142818082787, 16.58464973434154, 16.486035189574338, 20.330845844745312, 20.00858492623716, 20.01983269606417, 20.54066564486591, 21.220993143542508, 21.71000605452848, 22.031996313881105, 21.917446763849984, 22.478773618892, 23.26931078050109, 23.840853933629003, 24.48541982265385, 21.112508087461016, 21.931510794195454, 22.480545364379083, 22.39726773529412, 21.9105919134765, 21.199052448412694, 20.81386194179894, 20.96737963383132, 20.315766156231195, 19.772496097105517, 19.348408263038827, 18.821125623784887, 19.34317937807345, 19.047789625272333, 18.933168142857145, 18.968259103676477, 18.95989085465297, 19.64894335185185, 20.172827394491133, 20.307197075396825, 20.916856790460628, 21.07385702994476, 21.17873599936651, 20.442544564503574, 19.718163624471558, 18.94344590213037, 18.4521710253657, 17.83729948362248, 17.20790616026097, 16.340272593368738, 15.772165821960458, 15.040100724402414, 14.277547026414808, 13.897864522402978, 13.126912786533977, 13.291044643159267, 17.44696092997199, 17.592147513849987, 17.434390842514787, 17.436097001229385, 17.6952827167756, 17.69451462690632, 17.507026267740432, 17.80167163118581, 17.665861476439485, 17.536227998288208, 18.008842485838784, 16.992512226268282, 13.282846791853409, 13.13026898793962, 13.167891104030504, 14.546437200202304, 14.874576821895426, 15.36923626447246, 15.764224595348988, 15.496845808667914, 15.768276992685964, 15.551197906292687, 15.277326748832868, 15.333458930905694, 15.28214465787426, 15.468080672107456, 15.388829773809524, 13.797607817460316, 13.556321701369438, 12.965317690631808, 12.976041539371304, 13.137309788702815, 13.918642861553328, 14.792998872829136, 14.731406860333024, 14.823615207827578, 15.091906498264864, 15.0375041835512, 15.27548260566449, 15.234448676392782, 15.036547054826098, 15.225102278474818, 15.112823610298658, 15.1522614003268, 13.795420365001556, 13.432466271008405, 13.566238554310615, 13.38917631464236, 13.119265899626518, 13.06374228602552, 12.629033839713662, 12.651028199558436, 12.74065142680193, 12.53047003695923, 12.460997562324929, 12.263278337535017, 12.25169518282953, 12.317426335278556, 12.303058926470586, 12.863852645329525, 12.81828447831466, 12.915003596436357, 13.428710454403983, 13.423119160830998, 13.351987800887022, 13.397267893090572, 13.234121223334894, 13.453544658807967, 13.322055480469968, 13.27165778610333, 14.299769397681294, 13.874053619436662, 14.239632691487706, 14.075003914098971, 13.739704851151572, 13.870178891300966], [35.4181282998755, 36.25759627521009, 35.39324739406773, 33.09112713429816, 33.26239239145658, 33.461444698646126, 33.666082676873195, 33.73417607897604, 32.88398484635727, 31.410381905384376, 31.51449007204029, 31.398663994864613, 29.831379839352504, 31.459635166822288, 31.80733800119984, 33.42940691469421, 33.41954865727449, 33.466017403127914, 33.55514195940775, 33.61647734453781, 33.158158815515094, 37.07534175824774, 35.82188647523667, 37.8245107534236, 36.574206796296295, 38.1137523225179, 39.304227645319806, 38.13389952847806, 37.94322936920324, 37.78054218674136, 38.081053853563645, 38.27530203436671, 37.053644362667285, 34.47325185068471, 32.83811922565982, 34.19192414013383, 33.17931220673825, 36.37227661998133, 35.17527165997057, 36.85139918392338, 37.547916092592594, 38.05010836710239, 38.32851618835052, 39.74862220626105, 39.861214938920014, 42.884624345860566, 42.342496439135296, 43.4731234091192, 42.530355436274505, 43.201416883502574, 43.27805431251718, 42.65473410784313, 42.68127469537815, 42.86330275673473, 42.662538329851394, 41.93966108629007, 41.360246119047616, 40.60290072445018, 39.54428918168379, 41.65363135566449, 40.16372862690176, 42.10656797502334, 42.38642629988788, 42.76969665398381, 43.24576533177716, 43.53314168801289, 44.20736232158419, 44.32064446638656, 43.64708768712846, 44.53123552596808, 43.0488406556178, 43.71289794765925, 41.90626362459604, 42.46853341814504, 42.1088956468254, 41.979705564581394, 41.84997338686586, 41.8122530987395, 41.89789628645607, 41.89002997307812, 41.28576638089794, 41.75338447664178, 40.7933880033406, 41.54496361303766, 40.30557518685029, 42.9179390083757, 43.212516626218765, 43.138914774963496, 43.25929518242971, 43.61591603776844, 44.1564966017937, 44.70246089170038, 44.04164224883557, 44.914947042003845, 47.27607273498288, 49.36282176781823, 48.43956233621226, 48.814525590413936, 49.323634065549456, 52.399066837223785, 55.50678873646125, 56.548647583022095, 56.64965333263305, 58.56243697181892, 59.04358488873327, 61.87946169218799, 60.92872466822284, 61.9497673157388, 61.13594222930283, 67.89239960550887, 70.96200132096106, 68.52013706091529, 65.64108673757282, 64.44564549253035, 63.92757029793029, 61.90298333706816, 60.66803494810146, 60.45644807726424, 59.33892928660714, 60.88306943464053, 59.95362619794584, 55.90029342181894, 52.821263479245154, 52.00697288390913, 51.90779220542913, 53.13961251365871, 53.12553000167095, 52.78827751797387, 51.72047056839402, 51.29063582617491, 47.23434007925939, 49.36692484438221, 47.48378673363202, 48.99609123271735, 48.51968663294364, 48.00412357907073, 47.6859163535831, 47.87516003082256, 48.044494504705824, 48.375291243390265, 48.134004379775526, 47.82929891476235, 47.259144216615546, 47.14937798587683, 46.220673170105016, 47.20789323972069, 47.64774865297728, 48.0966800712866, 48.71619653077298, 48.095977088741925, 47.41424712525176, 46.77039411812586, 45.24344453300843, 45.70697310294973, 43.7669249929972, 44.88667653890445, 43.23482775746965, 43.97152380524432, 43.35692777855587, 42.49163578111572, 42.1166437657174, 41.31103360817581, 41.18452088087457, 41.33981541223156, 40.41588776859633, 40.74334468979281, 38.942631396193846, 39.1160606835512, 37.75973446766783, 38.18642939602528, 37.85315209936197, 37.729912369034, 37.017169014939306, 36.93739542811047, 36.65367212200436, 35.987147872782444, 34.87824981722689, 35.73784577695458, 35.03728105298786, 35.88860461819173, 34.533396625891534, 35.97146842183388, 36.10131473329573, 35.98349717971844, 35.74374206178027, 35.94113913265057, 36.044143728835984, 36.05584338997822, 35.61860469173029, 36.13889884866105, 35.043151892265804, 36.0275656170246, 34.63086891542172, 36.49912964144687, 36.44628697323374, 36.283023383005904, 36.467729432796645, 36.250985478135696, 36.13254449361966, 36.11281076408341, 35.079031510681865, 35.932493450902584, 34.77595080734516, 36.24872106427015, 34.16011460658393, 36.96725790421725, 36.64932833146592, 36.68787633869051, 36.51304882323614, 36.28140544825709, 36.28574740000714, 36.23999577256458, 35.41657581504824, 36.10981127684868, 35.40125394233064, 35.634999961129594, 34.377038075675145, 33.494675487185305, 33.61174367191907, 33.70696081840376, 37.233583921657726, 38.38350728396871, 38.4051855868646, 38.50097240322437, 37.74296715844028, 38.27158606466514, 37.554332761871045, 38.36624043806412, 37.50052776867413, 38.64570383940242, 38.69226316114224, 38.70039584726113, 34.63759147154723, 33.467009969576715, 33.4743439676315, 33.56481772405695, 32.82266399365081, 33.57515616807443, 32.13841559757236, 34.0446410026455, 33.04052328773209, 33.64351997012138, 33.483765016339866, 33.47089626086148, 33.50311597408963, 33.89679259397305, 33.84727114900405, 33.73027076670427, 33.09546481006847, 33.775464335088586, 32.12460596525316, 33.17257934613559, 32.15954282201929, 33.181376855275445, 33.12179236535562, 33.03316276548397, 33.006669225645815, 33.04577993526299, 32.921441938453164, 32.83431316565515, 31.95454525040409, 32.80682499805478, 31.68665977288892, 33.120637341361935, 32.083328928882665, 33.1165401826953, 33.14245977766303, 33.118951534158114, 33.30323942624925, 33.266694822673514, 33.3109684965764, 33.31363647183318, 32.51767799732338, 33.29120439028945, 32.30467839450736, 32.72621183356676, 31.741587724422292, 32.81797590445067, 32.854539686002184, 35.61147068143144, 35.34913176536728, 35.3327593331466, 35.35843867111688, 35.37605073467165, 34.595131038742345, 38.10241017864924, 36.36795096397448, 38.38682866441021, 37.25216875140056, 38.14730987068161, 37.48448675381263, 35.28268948134404, 35.24791566633404, 35.65366515834111, 35.686382241068856, 35.84509846688814, 35.05813053618113, 33.512021407329605, 31.847649754512915, 34.05921126524536, 32.884297674600575, 34.03012382835357, 34.10871614550265, 35.62616046747588, 35.6145684492686, 35.17165504707438, 35.48024295043573, 35.594731818481584, 34.636676404606284, 36.23468546700902, 34.91631234049175, 35.675994710473084, 34.96786456131341, 35.896422001945226, 35.11066574983984, 33.56580511227825, 33.17171041627763, 32.82359956761593, 32.83761622760924, 32.92765836554622, 31.9901706800498, 31.993388727980083, 30.8410064379863, 31.812152738795515, 30.719909315981948, 32.210398465213586, 32.680809266184255, 33.38338429738562, 33.92553927732586, 34.52063231422801, 34.22554187278244, 34.050426980781204, 33.628408480610034, 34.32893561702459, 33.25953126392779, 34.16479667125739, 33.37623998615001, 34.406797550156284, 34.38034561651237, 34.31723384835045, 34.26243886815906, 34.25124623070339, 34.39488509959539, 34.282065586912545, 33.96023153042328, 34.10752809578276, 32.36540899494242, 33.92938331777155, 32.47950557399626, 32.90037071000622, 32.58464929808591, 32.08847728050109, 31.754481147927716, 31.52979725762527, 31.106007259881736, 30.737435682773107, 29.506094912464985, 30.01769949517585, 28.08481120423858, 29.775588469017148, 29.005908298552757, 29.98552395564893, 30.009529632897607, 30.176235936196704, 30.14509440950825, 30.0739553490248, 29.878278283302212, 29.82738910006225, 29.27977621964091, 30.014175040538436, 28.571015791663456, 29.573977757207068, 27.987876219265484, 28.50729525456546, 28.030248142857143, 27.405700685807656, 26.89494184662514, 26.18423903571429, 25.70584295813881, 25.224677728948453, 23.902504971132892, 24.277655990662936, 23.16508430034236, 23.956391627043637, 22.91452430361033, 23.872144741051983, 23.595083187091507, 23.41862929419546, 23.46661225503813, 23.914133528555865, 23.961003204545992, 24.124352923216406, 23.458735088883056, 24.299336512527237, 23.483083895580453, 24.359029167289137, 23.33680711819172, 34.203034664799254, 34.53815842950513, 34.61291789915966, 34.49620687128139, 34.37346648988485, 34.663706861422355, 34.6376681373094, 33.91548594794585, 34.436517264161225, 33.20613483255524, 34.40376977165488, 33.64484187262683, 24.777287341970126, 24.662058587223772, 24.70624396338602, 24.751092192732653, 24.673988853641458, 24.52241402287581, 24.422007773884737, 23.79803732752231, 24.39193247766885, 23.367986890300678, 23.73474815802988, 22.95382383198709, 24.353951389978214, 24.684283050186743, 24.865223731948333, 25.03320544514472, 25.354213275910364, 25.5268625628696, 25.756479756691565, 24.972346755291003, 25.683055693510735, 25.58132341807489, 25.66764053546984, 24.912094579442886, 25.37200475311236, 25.11232477077498, 25.000674280783155, 25.114269022564574, 25.803671503190166, 25.672756595056544, 25.625090856275943, 25.168607010815435, 25.930086596093997, 24.85899677103694, 25.85995554333956, 24.98560291419819, 26.225285104419545, 26.40427661982571, 26.404724571584197, 26.363153409586054, 25.413938477357608, 25.361269525754743, 25.22368073218177, 24.37620698327109, 25.034213245487084, 23.99574263305322, 25.02489212091503, 23.762308937204324, 24.673043526221605, 24.517165785169624, 24.572366529411767, 24.516871689386868, 24.816034471210703, 29.00771326501712, 34.19511884613036, 33.602965608427525, 34.20460783162154, 33.26806765499533, 34.23806947510116, 33.154155427906815, 34.01947714620293, 33.765912508558976, 33.53506291316527, 33.384763832555244, 33.11064393019635, 27.85996297074385, 23.54815993674591, 23.41492110986617, 23.22534251649549, 21.991043845860563, 22.655324821272952, 21.535899128929348, 22.63722854738562, 23.003619734633418, 22.95469347891379, 22.90253648668236, 23.15156563118581, 23.546794381853672, 23.83182732379749, 24.05047342181339, 24.072784508042908, 23.007860185107376, 24.88418148669468, 23.919869983922336, 24.790863318838184, 24.450431359632734, 24.656021956349207, 24.69124613149705, 24.269367904139436, 24.18905855034236, 23.977387467084245, 23.2154535620915, 23.8361011197479, 22.66549759975101, 22.966442724089635, 21.935637760945777, 23.06340272097728, 23.08448096607533, 22.96735678844349, 22.73850858871024, 22.45798341443876, 22.230112142779333, 22.132965559446, 21.68391865519956, 22.171119227853243, 21.097151865688947, 21.92023829730781, 21.047105897814863, 22.25943415865235, 22.65300785208528, 23.05621081972976, 23.12280510202111, 23.546920265884047, 23.381425546374107, 23.66376218480654, 23.57413797329563, 23.596547092263947, 23.55523749292552, 23.58094473560536, 22.567346512138187, 23.546597951851208, 23.050904754046066, 22.57371068821973, 22.5427604987823, 22.30451344032058, 22.455502173270048, 22.210638746031744, 21.664776317062195, 22.589660739340182, 21.707911368892, 23.48391267312481, 22.45696603283536, 23.30354280034236, 23.325986628229074, 23.344016642460968, 23.396740659905365, 23.82106136328976, 23.725183754901963, 23.677158576563965, 22.78437122025389, 23.28799875560224, 21.80941668261749, 22.423646372782446, 21.50184887035672, 22.39127124307501, 22.34361712784003, 22.321866396280736, 22.22604229455209, 21.866147232726423, 21.865064058590104, 21.84659790110489, 21.778347602941174, 21.75369632889823, 20.60273138263565, 21.908562383753495, 21.090201127552792, 22.178495762215995, 22.538134099120047, 25.8343021162465, 25.86176468277311, 25.642516372082166, 25.672212821350765, 25.81156402863368, 25.865824617258014, 28.565229692547213, 27.68733721567452, 28.95535780555556, 27.979115997976965, 28.750285748443822, 27.89704993698323, 25.299220053015095, 25.332208174758797, 25.47942108619865, 25.37849198957361, 25.293825740818548, 25.297070948646123, 22.99958607524121, 22.908948574943675, 22.38824827552132, 21.287082455182077, 21.72421686663554, 21.318627701090325, 22.56526996428572, 22.124128244942423, 21.702332106442576, 21.394319336290074, 21.066859097416742, 20.646729982094875, 20.92153937371615, 19.556297707723008, 20.10576391020399, 19.188184128151256, 20.16779502699518, 20.077215987006696, 18.46242567491441, 18.55925812340492, 18.60597130361033, 18.729871985956635, 18.984781185418612, 18.995705304077184, 18.025168218260458, 18.067773338413502, 18.51206603260193, 17.8070009134765, 18.966197984360413, 19.252916113342323, 19.296921797074383, 19.25163445147417, 18.999862673669465, 18.956176921234054, 18.682040568316214, 18.70583373560536, 18.643604504557693, 17.7722320867054, 18.41856942670401, 17.40124215141612, 18.128597316993467, 18.071652651129483, 18.393989632813312, 18.52694960924308, 18.816347138422035, 19.018648931766837, 19.085236398770625, 19.191543436137053, 19.28644321913257, 19.403849878002937, 19.79025046047308, 19.106401139122312, 19.79477432765329, 19.753758827726635, 19.37150848980703, 19.257463123249305, 19.39371890063803, 19.39813993577589, 19.60355803034547, 19.69377962628385, 19.699421718720828, 18.73534819693433, 19.40894071303689, 18.78610688530968, 19.60254031037971, 19.8824494300498, 20.16648530112045, 20.543035554777468, 20.19902736772487, 20.24196857388381, 20.08001930921257, 19.99198947656332, 19.883516221755368, 18.67964787145516, 19.50084079535932, 18.546384642779334, 19.24495610255213, 18.930714518751945, 18.59199379505136, 18.247777808434485, 18.08486227433066, 18.210474097859617, 18.148676626684573, 18.1579181118892, 18.392479114612517, 18.075353333118745, 18.9883311794189, 17.871100063016616, 18.808989651104888, 18.77991394919079, 18.72087105042017, 18.79371424556489, 18.652922856326555, 18.5597037517118, 18.58537148723934, 18.654986307189542, 18.53499320035601, 18.103027843800973, 18.662259893946462, 18.911865501761117, 28.48067084516613, 28.77047249599156, 29.0565206940554, 29.247514951058204, 29.649067287503893, 29.940446928338005, 30.462478126439464, 30.591835208839093, 30.699765588313102, 31.010556890483592, 30.79362868370681, 30.028499580532213, 21.61322718160598, 21.5298587605042, 21.56446666106443, 21.523602908574546, 21.584384813492065, 21.499338133675696, 21.25332751875195, 21.3236775957953, 21.44595814477125, 20.301407665105295, 21.007098717009026, 19.95553946444133, 21.177743824618737, 21.3758227285228, 21.40288169289865, 21.408051997276687, 21.623382618113908, 21.59527182703925, 21.6105615943822, 20.96195108790856, 21.52073415211381, 20.701613362044817, 22.03658386640212, 21.555476469732337, 22.28701578174603, 22.34324117071273, 22.52675446576409, 22.660125119514472, 22.79913912052599, 22.91959296039527, 22.919877843292877, 23.193087528741614, 23.411164048552752, 22.685528192732647, 23.41460705804544, 22.33761495315904, 23.18260435849028, 23.04105889176781, 22.99868503553339, 22.79645928540305, 22.24743265662932, 22.376414872082165, 22.68508562486643, 21.83541344613205, 22.3813530227202, 21.48181342351405, 22.382199126671598, 21.312267073918456, 22.24348400427949, 22.384448031356985, 22.38275815312792, 22.43500846257392, 22.93831258776844, 22.912233005782525, 22.741563045673825, 21.987989813649456, 22.529492440865237, 22.73796813544353, 22.866180212107064, 21.891335591273087, 23.24985693954249, 23.10927090585123, 23.172725752645505, 23.230006485683163, 22.691265397370056, 22.71818293635232, 22.678575264783696, 22.79952289890643, 22.89916105259882, 22.68484858948024, 23.44744077762216, 22.720733498832864, 23.540494138577657, 23.625685578470307, 23.558631640378955, 23.59954880228758, 24.067472167055712, 24.21322545152505, 24.211780613134145, 23.544991113756613, 24.35506489900405, 22.19453343036103, 23.55417869715608, 22.39850649089636, 23.250963207411907, 23.302627679971987, 23.204173152194212, 23.113026794664904, 22.35105309648304, 22.284445586532016, 22.25058731628735, 21.331612609655817, 21.879599805555557, 21.180294465063803, 21.311966327030813, 20.491559700746965, 22.178088543363565, 22.19169741798942, 23.803132167911613, 23.73566912123806, 23.720644585901027, 23.875996213156203, 23.877784446623096, 23.857269204948647, 23.742048816117467, 22.613095556956115, 23.6096081651883, 22.46985553252412, 23.700641125263903, 23.501068437781097, 21.95984265452848, 21.90438977007732, 21.86298431886088, 21.74996616425459, 21.719889276065985, 21.68808625478201, 21.648343880718954, 21.03674895922813, 21.91067331792717, 20.666496252667216, 21.420654745487084, 21.57921914931529, 21.484728214363525, 21.55376859554933, 21.53165530751181, 21.46548197694785, 21.665839364456897, 21.738394619981324, 21.810370092903828, 20.64566751416461, 21.14530674424214, 20.88962475420168, 20.541151516184254, 20.211756163398697, 19.921116669160448, 19.632327961562407, 19.24634955516522, 19.183618571272955, 18.67686790657486, 18.32187722798008, 17.981246780267664, 17.800534872082167, 17.66508440967035, 17.67142655399938, 17.792285486383445, 17.730912683386507, 17.761214054699654, 17.742250176548396, 17.95027065234983, 18.1519913797591, 18.124771579754125, 18.16223657088391, 18.1225048103019, 18.18162707021925, 17.970936019666205, 18.107224770590783, 18.3361162351385, 18.37010318067227, 21.43722821661804, 21.479177072128856, 21.1235437045596, 21.0582573485009, 21.1499311398226, 21.30778989316838, 24.09517708115468, 23.478561134421863, 24.8744513942577, 23.77074582560519, 24.305921680594462, 24.24907987735285, 21.272629636321195, 21.584601880174294, 21.750895306489262, 21.648988167522564, 21.865110935738358, 22.34948248988484, 20.94834819212575, 21.79507132305171, 21.963164263227508, 22.7109982680519, 23.53695101953004, 24.31569301365938, 26.8653759501245, 27.350242844849056, 27.653989879474015, 28.3441418058668, 29.30381018098613, 29.58941024249477, 32.52381596480704, 31.1403766809835, 32.56257156326189, 31.36973931543729, 32.71488305376595, 32.36640828777104, 30.937949612433865, 30.91203234554933, 31.51109869382197, 31.8618151957672, 31.513547475412384, 31.005297261437907, 28.66014307936508, 27.636223822051043, 29.27537402754435, 28.645652039993774, 31.114525379240582, 31.207695336134456, 31.630286602445157, 32.02866168502957, 32.23266402505512, 32.589413527699975, 33.9282375943822, 33.4547092509337, 36.067596386165576, 36.43097440608466, 37.81279499455337, 37.39978376474868, 38.54028854645192, 39.4360263452381, 39.986474550031126, 40.47957874431994, 42.342635377113815, 43.06901834609725, 42.71537368767508, 42.39800265898239, 41.90647750619424, 41.03222334329287, 43.42243556839402, 41.7761166451914, 43.526956586523504, 43.96001224774354, 43.74393839970433, 43.43699152956738, 41.89968790577342, 41.474853719283146, 41.134321530890126, 40.4893657543573, 41.46091134018052, 39.98234632880485, 38.16068649206349, 36.42533438048552, 38.2371573522409, 37.42037844467788, 37.26110936386385, 37.35390610519764, 37.640778258714604, 37.3532427585616, 37.45335502225335, 36.587741371326544, 36.47755182228448, 35.756723571937925, 37.72853495634921, 36.67125680555556, 36.74726037107065, 36.77317506800498, 37.24063529878618, 37.75071507407407, 37.92054959508247, 38.2658899345647, 38.2277223885927, 38.04823130165928, 39.07157450404606, 38.31379143456856, 39.64991932088392, 40.83147589783043, 42.59795289083412, 43.5868767019141, 44.26612343419832, 44.76767110690943, 45.8169029404762, 48.82228933289373, 50.16476364279298, 50.66268581201369, 51.98223672961407, 51.59068517700553, 55.58650682039892, 56.808180504588776, 67.96319065701837, 68.24075145518208, 69.78292770154405, 70.2778878610333, 70.32073123280423, 68.4230393077342, 68.45711056193589, 67.60240075435729, 68.35180695578833, 67.19254951704015, 66.6272929519919, 62.02181683076564, 53.267815805244325, 53.32964543940763, 51.86490932146623, 51.41102146292407, 51.79987964355743, 51.66879318405077, 51.883242047307824, 51.61693892258014, 51.88103899136322, 51.02803563274198, 51.77752069677872, 50.30274818666356, 51.85244607547463, 53.376610934484255, 54.10636391036415, 54.74162548840649, 54.74344610869904, 54.79262907630461, 54.788098438282624, 54.88364720673825, 55.41909794244496, 54.83577125918144, 55.89488930112045, 54.21804498568316, 54.84610272595705, 52.4752485035792, 50.80542010550888, 49.218661460706514, 47.391128634064735, 45.92961754416887, 44.28174886904762, 41.62483487472767, 41.140245695537686, 38.94113296669779, 37.99677045471522, 35.891550398926235, 36.37672090341628, 35.83524307158419, 35.45944962147008, 35.15646606621538, 34.68500974984438, 34.69267484422658, 34.35942113741052, 33.779176852863365, 34.642420688453164, 33.19294195907251, 33.727750677404295, 32.1447791099336, 33.457312808221175, 33.14162882002802, 32.988603596475905, 32.795795495971234, 33.94407397284703, 33.65396558061807, 33.46361321430009, 31.894290934985104, 32.30556886679249, 31.31198670426161, 32.43978598984643, 31.028665372419628, 32.31858911921896, 32.32748309283316, 32.05586980757859, 30.91863945035792, 30.38429562734399, 30.32223280205416, 30.5417588925531, 30.49355302482104, 31.130764539215686, 30.321428687529192, 30.212641272486778, 29.185707506769376, 29.444445144255116, 30.113439487005916, 29.784923986227824, 29.344678576176985, 28.86133557773109, 28.54836214324619, 27.63629105870941, 26.53139633683473, 26.65596201198257, 25.3090970524432, 26.517113068082782, 25.142997473311546, 26.62655701291628, 25.56814893455947, 26.47639621405229, 26.451661910172906, 26.493258916471504, 26.38519628485839, 26.69437702116402, 25.87366539386866, 26.801218941020853, 25.98767574739816, 26.71930688095238, 25.236972734905077, 26.685898827264243, 26.12252155329909, 25.70889605905309, 25.776512600887678, 25.77286841690009, 26.00324691674448, 25.620263632034572, 24.957729018205978, 25.586995782446312, 25.57197518984404, 31.6145301861189, 29.94622111048864, 31.50980558232182, 31.33729373148148, 31.553129421413008, 31.460272272295853, 31.24902321661999, 30.95848868884221, 31.03867077567694, 30.416842293134017, 30.960043351540616, 30.84790523533845, 24.54909138009648, 23.77717580252689, 24.49235257461874, 24.58368544016496, 24.431260223856206, 24.46026559282668, 24.53392795736592, 24.643295558745077, 24.50084691503268, 23.73597158076564, 24.56608292592593, 23.76680017063492, 24.66384265921064, 23.390415980127614, 24.74865061321196, 24.859299445845007, 24.81720803890445, 24.77585863507625, 24.83204540930012, 24.826886792561467, 24.91905450038905, 24.22419875438708, 24.567429216510146, 23.708884762449426, 24.32105661336757, 23.216989349088337, 24.241764071890238, 24.01030782103953, 24.01778194864612, 23.94604507205104, 23.970048335511983, 23.78342611585746, 23.50858469545596, 23.52308976079307, 23.641953119343945, 22.86546042009025, 25.376575502645505, 26.392199166232235, 27.83502148358232, 27.820373875038904, 30.80193421280088, 30.832438135231868, 31.630708959348752, 31.683533479531725, 31.61265107757547, 30.97010000514162, 34.175076992608155, 33.49364665187973, 32.70297411015083, 28.756872160441954, 30.15246835475284, 30.14304727640528, 27.11777819231185, 27.044131903516963, 26.29681824719888, 26.3595985629474, 26.58212188258637, 26.87904093809193, 25.00760946778712, 24.751596980314343, 25.944861999610957, 24.871734619555976, 26.561708845938377, 26.95281770596016, 29.250386073529413, 29.606506554388417, 29.87360756325864, 30.46627104489573, 31.023635953081232, 30.837260239807037, 34.629521746732024, 33.614797571584184, 35.065259337457206, 34.44577562363834, 36.196062730625584, 36.23472994221587, 35.5440526984127, 37.06799562256138, 38.177888509100406, 38.3897325620915, 38.76437556828708, 38.13409512519452, 36.06623483605406, 35.71995143339558, 38.78117969102085, 38.7960208542476, 42.12277992662621, 42.55698183784626, 42.71853887791784, 42.00256983195482, 43.54417395283873, 45.62878442937613, 45.92059841423514, 45.71550751702328, 48.35950688079677, 47.22435196568627, 48.39070995417055, 48.166569355115946, 48.45411175115871, 49.15616793666355, 49.74179427816682, 51.66390470347028, 52.3889224929972, 52.16106695782757, 53.22287842652376, 53.468415938761154, 53.06284116129786, 52.20126852028197, 52.13629613569872, 49.023448812169306, 50.69431121117336, 51.49964061297853, 51.48061136087768, 50.78371359616207, 49.70373300077809, 50.30692620448178, 51.953498929505145, 51.55969036583087, 52.33652897591282, 51.67356078240741, 52.24172292950514, 51.190852515172736, 52.18244367600374, 51.06291056761593, 50.363094623716165, 48.99651088873327, 47.65832444109866, 45.98627254067719, 43.24823571140679, 41.32949878118386, 41.22745276617972, 40.75945221288515, 41.48747132228448, 40.02029273568316, 42.10669186725802, 42.53103425378996, 43.255882323918456, 44.45629830065359, 45.19501456963896, 45.5136586548637, 46.38480028369126, 46.30596062690631, 47.93848868479616, 46.79413263757717, 48.84187835850323, 48.32562412713974, 48.76073244654528, 49.357046880174295, 50.65177149383938, 51.00267955213197, 52.36588027676626, 54.87637595253658, 55.7183720418612, 56.06374597244268, 57.36094017507003, 55.63337739449113, 57.31895317717086, 59.35282191044195, 72.30769961072207, 72.62263607734205, 72.77891593987903, 73.16315500396827, 73.5284283624021, 72.96291671856521, 72.67557068112941, 71.65580945580453, 72.43700808621227, 73.55948434994461, 73.94566868658573, 71.04662855641145, 62.09564266285403, 62.40291103618114, 62.33086163523188, 62.39833541122005, 62.25490540943044, 61.56786409570496, 62.61845087387177, 62.32338570604648, 62.09902050272332, 61.06895069374416, 62.82884238313103, 61.14286780104069, 60.6422210061469, 59.37461025171179, 58.22135978026766, 56.81166820876128, 55.792853342592586, 58.11066641674447, 57.15066693853096, 56.466772597051055, 56.26698994650869, 54.32635758068783, 52.35019434797318, 49.78337644152296, 50.94341448459384, 50.27777492156864, 49.22928961453471, 48.99642022967473, 47.21810051408341, 44.03003343930906, 43.547880378259805, 42.248791673124806, 42.8862606489833, 42.27943169086523, 43.8562350165733, 44.83819900086498, 45.5147040121382, 45.43160425096938, 45.46279240010776, 47.35432677499432, 48.6812036809057, 49.19705568946468, 48.62076712690045, 47.39617143272436, 47.12375251439465, 44.72548429967191, 43.0420505161123, 39.63887802676626, 40.34785237502904, 39.89820866005292, 39.66563018647231, 37.8151175742246, 35.392790439827785, 34.82119972906941, 34.09963695240055, 32.899025767109315, 33.19029869169991, 32.79788645519404, 33.354387345808696, 31.95535046498599, 33.17128132621587, 32.900669477098255, 32.449211882816414, 31.363837852508045, 30.757671533846874, 30.114643805412268, 29.80986228859322, 29.205791589324612, 29.843221975568007, 28.089384933551194, 30.001746031434795, 28.515388259926475, 29.784461712418302, 29.87208326190476, 29.75380481584126, 29.72925817561469, 29.72380562114846, 29.690675896428257, 29.756587392510305, 28.990019441332088, 29.806828708605668, 29.24896020812653, 29.371330796302228, 28.06328243604108, 29.2703930104264, 29.34843664456894, 29.382262280967947, 29.47470165239717, 29.960958219576725, 30.3234208553507, 30.563751711562404, 30.012571167243816, 30.768071118811594, 29.69194845666044, 30.613700350217865, 29.52180722064854, 30.51551957057267, 30.411728657485213, 30.267365084344853, 30.09159687892935, 29.259011168689696, 28.985834395502643, 28.55400998451602, 27.54724905228758, 28.03186106512605, 27.11360515001556, 28.21239015600685, 26.793761563905765, 28.99087354521022, 29.383618399859945, 29.558905704559603, 29.89696239991336, 30.342214154393304, 31.78896208923504, 31.894849220121387, 31.685708777855584, 32.40331667934952, 31.55976302084355, 32.01994957718643, 30.558236612822903, 31.295396077886707, 30.880154577497667, 30.679570826177518, 30.640799586134456, 30.47405596654217, 29.065843087774923, 28.961645870759416, 28.05057314293495, 28.700841107294583, 27.7851402264483, 28.865077098661686, 28.02596041658886, 29.0093168872549, 28.950725937675077, 29.12171109288116, 28.962927861733583, 28.98859092089538, 29.07307693549708, 29.1821921030968, 28.353593530578895, 29.228063705493312, 28.415365425633237, 29.153674474634297, 28.22834840530657, 29.351441138032992, 29.49362924666609, 29.211475647058823, 29.301449992250763, 29.531473849517585, 29.5203081704002, 29.65220388806047, 29.203995352720828, 30.79575011285522, 30.468079447790224, 32.797970437830685, 32.39766718798631, 33.885492400015565, 33.96950908201058, 37.25853205281344, 36.97803289091192, 36.459813760270784, 36.454719695222536, 36.22847297786857, 35.103333013200725, 37.339615639912175, 34.46102395534249, 34.934484247198874, 32.13728416939129, 31.37026761811391, 30.556776807656394, 27.604343887877373, 27.80416730672269, 27.98600188881108, 27.686388532913167, 27.773400642545912, 27.80345672021824, 25.435840429998574, 25.47343031407912, 25.615720279411764, 26.22646608983829, 28.23198709718332, 28.131397722716045, 30.444027172235938, 30.50746053985204, 30.50237257979105, 30.55501039448725, 31.402971300523035, 33.020661187708164, 37.38306981777156, 37.52817774136321, 36.62791152108621, 36.15087858901338, 38.07056612044818, 39.05161170129424, 38.23429163857765, 39.65864337676719, 41.13175469864613, 43.14196727030813, 46.0932638819639, 45.92786718207282, 44.82924185862122, 46.693064991443336, 50.81795968977138, 51.54970188881108, 54.20220628066839, 55.33967645876128, 56.3969036919573, 56.82826257337379, 57.50116354588376, 57.67172384905204, 56.46557763133169, 55.59983206032036, 56.33228584500467, 64.70845812380634, 64.55588339044508, 62.84328075466853, 65.57214190997512, 65.45816846817615, 64.78170073661687, 64.04733042328043, 63.2275074859944, 63.355357679894176, 62.92477873279128, 61.8648395358699, 60.55365275047854, 47.5500783538096, 49.02080378906007, 47.64255199760886, 46.60272251610645, 45.65344595168068, 45.558651693043885, 45.52631972214441, 45.66019206154685, 43.81355385465297, 43.56885140779645, 43.19438652505446, 44.07464966386555, 43.90787926159353, 44.23738396945482, 42.1799543969849, 43.16463583685175, 42.97018646856521, 42.39944137573918, 41.85251761872018, 41.230169701182696, 41.5656737945845, 40.70727481995021, 39.07182591132924, 39.2144646741856, 37.76691245311495, 38.4397582342048, 37.97828925159476, 39.50392082135076, 39.72060858068784, 40.40086091191838, 40.797125826545646, 41.11760655960162, 41.803841840413945, 42.19701678703704, 42.29705305022764, 43.30382340678494, 42.36926121560847, 45.37084569638513, 44.62087848715829, 46.24597868522605, 46.45390646280734, 46.64837599502023, 47.79716255715974, 48.78886716137566, 50.16529618751945, 52.16258194708995, 53.04612620798319, 54.2503598610333, 53.13317551953003, 60.5091993601774, 58.84849332586367, 69.89504011873638, 71.21545837021476, 72.55420519941838, 72.64014836632433, 73.3437688897448, 73.45705118191722, 72.90392038036067, 72.25887173295985, 73.46569253874884, 73.14532593821973, 72.17736284189232, 71.5532975130719, 63.44167253483636, 62.67916282321818, 61.83175293666356, 61.06747426906254, 61.02131178898227, 60.32758140943045, 59.69965466075321, 57.52660718282045, 57.171782430672266, 55.63699478967738, 51.26510726400103, 48.80645522244138, 49.717835814998345, 50.90556265763436, 50.19441115180517, 50.24002979607725, 49.61000625139603, 49.25295157928727, 48.76776796739808, 48.65077633492744, 48.94953005065359, 48.537013503734826, 49.467632626672895, 48.37398133590102, 48.47179143899782, 46.691933736072215, 46.893761567250266, 46.52033153510413, 45.48627489239029, 44.531853706450384, 44.7920849790694, 43.79086725456284, 44.61669477692188, 43.3254656451136, 43.81063004948504, 42.10329012861681, 43.5842021100996, 43.21906660356365, 42.37379524932695, 41.965585799330846, 41.53207458683473, 41.1865048133345, 42.11668984772798, 41.00765507158418, 40.86034507298475, 41.1546552394958, 43.65589862821805, 41.21053079256147, 42.1740171250389, 41.868197720277, 41.66327254100529, 41.18427127020614, 41.14964029559602, 40.00778314464806, 38.802743818627455, 38.04934924019608, 38.87601214347962, 36.36822182259313, 34.934283569483355, 35.208567191254275, 39.07834423342671, 39.46674530967943, 39.39677561064426, 39.5500110258812, 39.50592073762839, 40.4067825223305, 40.101411371693125, 39.223284899081854, 39.56002010325243, 39.35284394911298, 39.775094853797725, 37.63648534964771, 35.79447554634994, 35.29449377373172, 34.866788410704565, 34.303545448879554, 33.766444434562715, 32.365155723389364, 32.165531382975416, 31.138172762313424, 31.710291057789973, 30.331218760192964, 30.723744381030187, 28.75124017476593, 29.94187566538153, 29.951119365312792, 31.550295698879555, 36.21543008434485, 36.32171841215375, 36.33205239432839, 37.7970643320884, 39.3793962574379, 40.77913818034742, 42.384597230703385, 43.3440917009804, 42.63651577318706, 44.07565830291005, 44.5069774932229, 42.14329425120734, 39.34736143121693, 39.23406306800498, 39.38847878529866, 38.2348422025333, 35.63030420572673, 36.460462621070654, 33.669370514142415, 34.59593860886895, 33.58660642117958, 34.402413788619164, 34.09610638134142, 33.77008098799324, 33.58135379527376, 33.7384916599751, 33.61470329917523, 33.93992745740222, 33.156800399782135, 32.98061592966076, 31.61244924626517, 32.03979612885154, 31.108009370094443, 31.575930450580977, 31.18505508643532, 30.922510558612156, 30.405827487161528, 30.094932853330217, 29.53440759912854, 29.12638271817616, 28.41610462457205, 29.589335763305325, 29.038247527777777, 30.659156441098656, 29.47690516513384, 31.33966320393713, 31.561332113912236, 32.01432707345615, 32.43237589683325, 32.64295675247887, 32.79564126875195, 32.894049641223155, 31.822545090880794, 31.66165191900094, 29.52857896164021, 30.676935194133208, 29.64432551548397, 30.65091882594149, 30.76749656535948, 30.738017270373295, 30.59056135422049, 30.710206797307816, 31.1550258496732, 31.96064360566449, 31.63818921888941, 32.77639803306879, 32.300971248755054, 33.45849688266417, 31.383861147024824, 32.379880597416744, 31.87730911134453, 34.43659908147695, 34.35603640895062, 33.97448193425148, 34.99149673303766, 37.08496798034705, 37.50593892125739, 40.43923384422658, 39.19720641200332, 40.90055511585745, 41.40093180588365, 42.84053918347339, 42.43813763803299, 39.81959281528167, 39.749842869825706, 39.8393643750389, 37.94842247408963, 35.05263145419457, 32.03917170562478, 31.487786574072786, 29.897838787737317, 29.995129501389453, 26.65452409754492, 27.864596741674447, 28.048441200228137, 30.290699169464546, 30.6329655209306, 31.346051948412697, 31.24313520596016, 31.850902655851232, 32.22957135649964, 36.94820563826642, 37.433544778806166, 39.20263657381536, 38.65542646743115, 40.96201651151572, 41.14127627359361, 40.293907027388734, 40.85988286254411, 40.99439735994398, 42.41558352948356, 44.09685460418612, 43.356625744361466, 40.661648414845295, 39.75256412408834, 41.43601496195145, 41.27555196724245, 45.603240947868045, 50.35657045511207, 53.58339736469032, 54.735521714363536, 55.72819175280112, 56.982296665888576, 58.03062111111111, 58.03660459228136, 60.9940727237006, 61.81318467265795, 62.351505455337694, 61.96324719973545, 60.9755661490436, 56.961649053254646, 55.47870538865546, 55.94784885021787, 56.08903645440399, 54.86848143588546, 53.29183296226269, 52.83318717258014, 51.6874706835512, 54.16708533214221, 57.54575098350451, 55.04462973077731, 55.76625492234672, 55.60803083391107, 54.77374740717398, 54.57965044670091, 54.25434443339559, 54.09286914690321, 54.209134490056826, 53.16903870506472, 52.113770679894174, 48.598450934251474, 49.56308018796736, 47.6148960157952, 48.04012283909119, 49.42411646280734, 48.425346180995945, 47.79465559912855, 46.90280631318083, 45.98805569775759, 45.32482291544248, 46.070339527155305, 46.82254755492856, 43.26789770181079, 42.51979905168846, 41.91526464895349, 42.94739057819795, 40.89923395721165, 41.223784740755015, 41.82551344358854, 42.34623704684096, 45.461102459797445, 45.67011270525988, 44.47305663398693, 46.089676790616245, 46.183577432075424, 48.47646979256147, 48.92673591752256, 50.17463793977591, 51.06223825827111, 51.24775367615935, 54.18609337605042, 57.37377618145037, 55.09078961235606, 55.42126642647059, 56.69256924926795, 57.8845954362745, 57.14845827409028, 58.2094759725659, 58.01612174136321, 68.31557801976346, 68.49238356870526, 69.66036064386866, 69.27833707368502, 69.2470265725179, 70.06985984375973, 69.7695150830999, 68.65122724789916, 69.74024564892623, 68.9881947631497, 68.67437613056333, 66.6237309616402, 58.42089138095238, 57.89395157656397, 56.826077229302825, 55.070587508092125, 52.04443470819004, 50.99866805999066, 50.98281680065165, 47.22188775855898, 47.37092994747899, 46.1526599929972, 47.177879193109376, 45.81913008569098, 46.35906285348584, 45.81234401711796, 45.46741861204482, 44.73180930726735, 44.30377925465299, 43.53612997408964, 42.44840765460629, 41.10596022805788, 41.03486060823218, 40.36148730524432, 39.50871206777156, 37.61916269965764, 37.990663219498906, 37.30093623996265, 36.342981430594456, 35.890287774976656, 35.59455417164644, 35.58361365437286, 35.34805076984127, 34.43799326797385, 34.59316825474634, 36.27767556963896, 38.007533426470594, 40.20620977995642, 41.01994809889512, 40.72798924766573, 40.13786478485839, 39.773745449657646, 39.41015531364251, 38.86950838194233, 38.76093928298514, 38.44408790273887, 38.82231838633224, 34.117124656720975, 34.46704744614936, 29.38794032688598, 30.573937997015328, 30.84214554878618, 31.075532443277307, 31.454371081384224, 31.38113165888577, 31.30159833737097, 31.189025717608622, 30.157486792016808, 30.5592746696234, 30.52673976937573, 31.204209900190754, 29.60353498600108, 30.921257063691915, 30.747286061780265, 30.07459435644257, 29.85790448801743, 30.19837157352941, 30.275654590258327, 30.18751030708271, 29.449134805750155, 29.89736953883492, 28.71733474749685, 30.361527861575908, 29.916788741287764, 31.51657005003024, 31.83357519854595, 32.44308942336517, 32.98018618061973, 32.91759060743972, 33.172279186819175, 33.35633237338547, 32.795682807927506, 33.43822506364315, 32.674307630803035, 33.26921946189796, 31.2721640653151, 31.854791126599427, 31.642678377491137, 31.14576122828483, 31.01724697027759, 30.74649479783387, 30.28429090391386, 30.45446416027343, 29.42895485807656, 29.739263205882352, 28.905745240099503, 29.816637096394857, 30.24475134591455, 30.14171669483349, 29.93636668214156, 29.38208259383753, 30.07696656248055, 30.117715722144418, 30.06300705578056, 30.0223493903232, 29.15005900132275, 29.659524361111107, 29.251494514225417, 29.971371318549647, 28.56737929092748, 30.130300065670717, 30.177984355046604, 29.845409247743543, 29.34765726229381, 29.17025988116506, 29.239090410376576, 29.2208857464986, 28.44647811087376, 29.061830829511617, 28.433420023632507, 29.357290863756614, 28.48840620985061, 29.25279264316838, 29.04854199994489, 28.98400140865235, 29.19331801882976, 29.248159029723, 29.16319880609698, 28.8717724125428, 28.15883345120344, 28.74281556403672, 26.952598311235604, 28.429106574929968, 26.61092274095316, 27.848758740662937, 27.34453109056956, 26.886359101385, 26.660814660364142, 26.07594096226268, 25.68821471444133, 25.58353870043573, 24.517736186430124, 24.76513794965764, 23.781608846016184, 24.52221709298164, 24.525263297306243, 24.666549598428254, 24.84286636577965, 24.937563655091967, 25.195562595315906, 25.47358055232973, 25.781961415854585, 26.06402436351476, 25.519522008325552, 25.90701982438531, 25.489447503369984, 26.210205213818867, 24.997927861967007, 26.135291889744792, 26.278116544584503, 29.01843456286959, 29.32974895051354, 29.563095983193275, 30.111468872469924, 29.951964286012554, 29.141697743277703, 32.36783719166537, 33.462925687590136, 37.44043968914501, 36.4017888548864], [959.6328950648148, 959.2501597464208, 966.4044443331776, 970.619752255344, 972.9750047082166, 976.0487988909896, 980.0731301217708, 989.4057627983194, 984.691772344849, 986.8647503145812, 979.396353423047, 979.0740691765484, 980.3194710505758, 994.1700770099596, 993.0330120651156, 991.7959687119514, 991.7411810940612, 989.8288302999312, 986.3772418909896, 983.8443025347028, 985.5967111704016, 1045.790188348895, 1076.1399949999145, 1093.8950194076406, 1098.1420311075926, 1094.9235029347965, 1090.4784471838625, 1098.9088644025055, 1106.067185977202, 1113.8459603068782, 1123.7323908877215, 1123.8545641968567, 1111.2877910517427, 1053.0569704147213, 1022.6780275552442, 1007.8090826824618, 998.553807864134, 990.7850135170404, 987.2580625140056, 986.3578247794118, 979.4791515308124, 971.4346802566138, 967.5050611356208, 963.4463227982416, 961.3075949942422, 986.6192577408748, 997.0384318861474, 995.328108939523, 998.64774076953, 1025.6231417938063, 1036.5716783361345, 1038.2099662927171, 1047.5074645694056, 1059.0924804985034, 1090.485969357921, 1110.0391880002935, 1118.2202304665402, 1120.0375138013535, 1120.4154163655464, 1130.119273986617, 1135.1540919564134, 1124.4756543674137, 1121.7122030433345, 1125.1969826370816, 1120.3708664789135, 1110.2682459105974, 1088.0209049354853, 1081.542509956923, 1077.6484429249922, 1101.9558533920012, 1122.07778746413, 1140.6146497731092, 1143.3256546261302, 1153.6669337917056, 1157.3085010742298, 1166.5628386737471, 1178.2726745924372, 1185.8374985683938, 1190.0892389218798, 1190.9069274044402, 1183.4268017482104, 1163.5736728198724, 1148.2289102452426, 1133.9486244073437, 1130.5043956495483, 1128.4185870863678, 1134.630358892935, 1129.0439290736072, 1119.4329723805631, 1117.5785617015251, 1116.6897631362433, 1125.4572769790695, 1124.1175943947244, 1125.1827801238717, 1123.9728028878903, 1125.3545709593095, 1124.456500498366, 1112.7995061199035, 1112.7785591976344, 1123.5563050647302, 1134.7646229831153, 1144.5940031011514, 1157.768126543503, 1156.088794230781, 1160.0465610175847, 1149.1037423572984, 1154.7364418617335, 1162.3215629586057, 1170.7943097183318, 1162.3283812746654, 1175.2640468910677, 1161.0413771934327, 1153.19527570845, 1150.7770668621226, 1140.027329543962, 1132.1529716608309, 1119.7040068259628, 1131.2326199028166, 1125.2223655783478, 1126.5789790775757, 1118.4874992615155, 1134.810803087457, 1108.2551512815903, 1113.0482551417676, 1112.950594218409, 1105.324432132742, 1104.5521891137566, 1106.8466381069827, 1108.4950878356676, 1108.2465531366272, 1105.1491249663088, 1099.2764926833177, 1098.8217998256305, 1104.4025991116555, 1106.4101818374572, 1103.8552696197478, 1101.0657396269064, 1096.5930103297542, 1093.6129760669155, 1093.2027961667443, 1087.77604442826, 1073.480779774147, 1072.2804971563958, 1071.6992786960868, 1061.5987476979458, 1048.250881316293, 1033.2607699054622, 1032.323931767127, 1031.684968921802, 1035.9829629212577, 1032.6632532018364, 1047.918720366402, 1044.7732744863056, 1055.42064361967, 1040.0568002976968, 1038.0236405192966, 1034.4595057964518, 1042.580415061002, 1043.5925503892, 1050.8948489018887, 1039.4654239529254, 1016.5350828987706, 1005.1015267572188, 972.2900724140987, 958.8461644346404, 947.7605889369746, 939.5741901581076, 928.5821184256146, 917.5582822468876, 899.3876464940087, 886.238370225957, 862.6098320326797, 860.0061160157651, 863.402524635844, 866.1738080558137, 859.8264508981481, 850.6757651663967, 850.8033793475723, 853.0335319801586, 849.1994586896203, 849.0276279526921, 854.8432121718799, 849.9004764439775, 845.1378292408963, 837.2989291063647, 827.8697727726424, 823.1008665908029, 825.0458944043631, 820.9011647967121, 822.3333454935419, 816.6004056490818, 813.5617430185185, 810.1848253391689, 817.1198907412783, 818.7195898209617, 821.2459131090103, 825.8783308934796, 829.8308521535947, 832.3278972960628, 832.2861109915966, 827.0326492412075, 811.649666915266, 809.0893254252255, 803.3507821320417, 797.1025888525521, 787.1591832423746, 779.5141731323529, 772.6891273303708, 764.0489957857991, 754.9490660934484, 747.7832361029411, 742.0360925979613, 738.0442875066138, 766.5946983168378, 767.8957416907874, 773.6928541404451, 774.4239624280267, 774.483869158341, 774.2688667061157, 770.896372002412, 773.4997430135387, 775.9340353951135, 780.0385251892312, 783.4471935802209, 784.8383086897758, 771.6552252387177, 770.9246556661219, 765.7530658344225, 766.9459765374261, 772.1714980764862, 771.0704766173358, 770.2594691849517, 767.4324256579521, 761.0279599169778, 755.181225429505, 748.7604808320104, 744.3611152474323, 740.011532144102, 740.1959422927171, 740.3218312563025, 733.310436145736, 725.1655396570961, 722.242016923807, 725.7390504038281, 728.7832865322906, 733.2703489488795, 735.3966184085746, 738.4021397364612, 734.4714645623249, 735.334338919001, 731.7085287715529, 727.4784156228602, 727.7714944928415, 727.9669786963897, 725.8536387741207, 720.760666175459, 714.0164074688764, 706.611293773576, 701.8205880084033, 696.4347025617025, 691.3105281541393, 695.5784351304012, 693.6053264699658, 692.3977201357765, 694.7427892747905, 693.0728195213196, 691.9599834679427, 696.4294312294585, 709.0253765216308, 719.3457195398381, 726.5332756063648, 733.9766923982259, 735.8460580101092, 736.8272997852474, 740.4317840880796, 743.8708223152817, 738.8547083099128, 739.6795980479303, 736.6196982240896, 731.6975609197791, 718.700251570334, 705.9447699461562, 702.1528050568004, 694.9083175645035, 688.8380541796607, 689.9176338267973, 683.3407075234205, 679.0146284134764, 676.407919825935, 675.2799513467942, 677.0419148285091, 678.3828032683629, 681.7838279754901, 684.779859554544, 685.8416931430905, 688.1623921668222, 687.3133958681138, 686.6283467408963, 685.840321501634, 690.729481907952, 695.9982013129475, 702.5991558811858, 702.0022365553222, 699.1004760376594, 697.178391745869, 694.0021284137098, 693.3287990774977, 690.8962296527388, 686.3062609689542, 709.4361881218488, 723.2879019922191, 725.8384880949268, 718.1617365841114, 714.4853885754746, 714.8415544564269, 728.5430163400249, 739.1306363965141, 741.9549558529411, 740.8892070357142, 741.2794906044974, 738.4310438884997, 718.376935684018, 707.2881258580766, 705.374436887566, 705.4114868609555, 708.9882263404918, 705.0765212170868, 704.1681447079053, 690.3674490221671, 687.8415349277932, 685.9656563515406, 688.5030216637876, 690.6062343877995, 716.3734247753657, 714.8258456727358, 710.2518218274438, 707.6867866898801, 713.5506943461717, 711.0432329322284, 708.1175306802832, 714.2823148888889, 716.0578927437753, 717.4930644910454, 714.9888003760503, 708.1798599693414, 700.2991254887954, 701.3762223459383, 702.8945555689386, 702.3403290194522, 698.447850747977, 695.2898858459383, 688.3101288972143, 684.1289373355897, 687.3918346875195, 691.7062582788672, 699.8360322196544, 696.6945634749454, 699.674108932773, 702.3334853128696, 717.5764390658263, 721.9707725904138, 726.944892383203, 733.1629893193277, 740.9986195768752, 744.9615535704949, 745.1018560220199, 748.4677689191565, 747.5191920428662, 746.7155888088234, 755.4139090382819, 757.5203089869281, 748.4852997999533, 748.3470731623094, 749.605299612356, 759.4781167850139, 762.2677837757547, 760.7670056703237, 756.2576137086056, 753.1458846206039, 753.4004047260348, 750.0726352352162, 744.353016932773, 742.7046336246499, 746.7579403580766, 745.3919694192343, 746.6864289167445, 733.1553435364145, 732.4164370019453, 735.3868068477279, 741.9226252644725, 750.670180033686, 749.9396165147058, 747.1717282005914, 731.4748224183784, 734.238716280186, 733.1796586283201, 733.5378409821817, 735.5684973966697, 735.1377538099129, 737.450278067616, 732.2716103819639, 734.1416226905541, 729.9351427086834, 730.472043155929, 729.7063982492997, 742.4856107470432, 750.0467542578587, 754.352675406577, 754.3203099391535, 753.5378809398537, 750.6363378855431, 750.4328453686585, 756.6479339112977, 753.8550412773108, 754.0324447907718, 759.1901281833177, 757.7191175497198, 762.2322504134765, 754.8651769094304, 747.4706394756457, 747.8683602918861, 750.354193182773, 751.3223380866012, 747.2759397469654, 740.7034498308147, 737.1005340325241, 734.3647481591191, 726.1274252417426, 721.2292640272332, 713.2559451149237, 717.5018691392779, 723.5948541521163, 720.8424588149875, 721.2385525729069, 720.1397111984904, 734.3357837696078, 742.0921094624183, 755.0406569282602, 762.8440625586679, 771.3672557335045, 769.5787333845315, 774.895032757781, 766.5760988416589, 773.2501166917536, 774.1663656847895, 783.0750123823262, 777.2315512913942, 776.0553122499222, 767.4569112983971, 749.0537119573607, 748.4761087878929, 738.3955604747122, 735.4094725037347, 728.5566706925771, 730.738687135154, 728.5151095527478, 725.0802366861188, 717.2765255014006, 719.2156314441331, 711.33581342507, 719.5845831790383, 728.335535970277, 730.0761428522409, 731.0824782071207, 729.441652792328, 738.3470571609088, 732.4327024113757, 723.2058947550576, 720.8019900435729, 722.869910781746, 719.4347817833022, 713.1119538498289, 703.1598648328664, 691.9236217063492, 684.2367421091327, 685.638496923825, 682.8241591324307, 685.5342415822439, 685.6588457264238, 687.5256216530429, 684.6455743877217, 689.2841674311392, 687.7870942172425, 690.4534077692966, 693.1661470379706, 698.4669192966076, 703.2624999842826, 705.9390609060068, 703.6602973557422, 694.4293489335512, 692.4942418737938, 691.817368827342, 688.2450184411764, 680.5805130943822, 675.9292956147681, 670.6404863330998, 663.6854946962341, 654.6213300665265, 648.4669003222845, 641.8073383474945, 638.0172295626361, 654.4528051598195, 660.4620433550419, 658.388997789883, 656.3116058733269, 657.9427023695144, 657.650055239807, 661.7917223653907, 666.7479554266262, 673.4317858455493, 676.9312523317772, 680.4827003544195, 685.7864545967165, 680.925590534547, 676.3607203092904, 679.3774187171646, 681.9383399530813, 685.3996453414254, 682.5685452940398, 675.8445538821196, 672.0844644915966, 665.8712936792716, 662.3992090341582, 657.3291249265484, 648.1512765589014, 638.6650519041394, 637.7506472258791, 638.6355426793417, 633.0704742302364, 631.8307257862589, 630.9253097426081, 636.3550234789137, 644.2568204723001, 652.3602256057422, 655.4162711055815, 655.8815495838002, 655.3404499119981, 663.6676352332711, 662.737702262605, 661.9129028611889, 663.182574286408, 666.6169482253346, 665.665690000389, 662.9267537549019, 658.7069588394801, 653.3345788775289, 652.6873453466385, 651.6470264832711, 647.0347736945222, 651.4481478870214, 649.246567746265, 646.7707175802209, 647.9252818818861, 644.5790244784469, 642.8933161770152, 643.7126006307967, 643.5783013351229, 648.1895653383132, 651.6313172610487, 656.2562103201058, 656.2154185098817, 657.0567740902583, 657.9625900168035, 657.3387123133344, 651.2691777321039, 663.5044578126796, 661.6458546298629, 656.644606640445, 649.174696313221, 638.4655964992219, 633.6745513400963, 627.8332384474012, 619.8636063032855, 620.8339862795673, 619.8557659222688, 620.6071630946934, 621.220467073838, 610.5819597488328, 612.8192826396669, 618.9983030949269, 623.6595193920012, 627.1968215190631, 627.1199068770309, 628.0722342549797, 627.4890248287426, 626.196771890834, 626.5433305508092, 631.4670679215685, 634.0738172612822, 639.2653771680671, 637.6164898955026, 635.6037682490662, 633.0338875992841, 632.3801563002644, 633.1309484673981, 637.065036137566, 638.1103883556644, 666.7280724550264, 680.9561004553376, 679.7504649425771, 676.7739360424057, 673.6744948539526, 675.9318258169934, 689.7711988252412, 706.3094407914721, 717.4661167581698, 724.5726595199969, 723.4497886556956, 718.1671238061781, 697.2363322276689, 683.8335394147215, 682.3731557425303, 680.2891550403828, 682.8588869586835, 679.850745642468, 676.0019378248521, 657.5898936312635, 645.3973427394179, 639.4329812577031, 637.4828583398693, 635.18301491939, 653.5846552998754, 654.0123751397447, 652.9588505847339, 655.0998961286958, 664.1099695096484, 666.9937161572518, 670.584307590803, 679.2861980779644, 686.7256521468195, 695.563720798206, 698.692714203159, 694.5341665587438, 693.0593711301743, 696.0166236376439, 697.2801351793495, 694.1335750827885, 689.5192081300186, 687.4019454624818, 680.1448816274509, 677.8284573204949, 672.4345397686741, 672.4823396109555, 675.7058427219109, 675.0943682741206, 681.4900618066448, 681.8550863956583, 700.305343939523, 704.9040165189854, 709.2771400128385, 712.3436904853719, 717.0268154815592, 724.8857326879863, 727.8140684127761, 727.9178085320572, 725.102480688142, 718.2641322668844, 732.2773744327732, 731.7166483559757, 715.7498794751011, 711.546624015484, 712.3141484320729, 713.1340535241206, 708.2963503720043, 698.9472904186897, 693.613611833022, 690.8725227186429, 692.7631889035947, 688.067040415344, 673.7075170365702, 672.6503951379552, 672.2327954289606, 669.7790056326642, 667.7507026273731, 660.273862186041, 662.7525991227046, 670.9983241649549, 678.8979240319017, 687.6238994408626, 698.7872341026299, 710.7003753362122, 709.6682489045285, 723.344296024432, 735.0374089713664, 742.766468174214, 750.3744812904605, 753.7962382375506, 763.3452270706504, 759.8640939876284, 760.7955874611733, 759.163219212107, 762.0078948113911, 750.3501541448023, 757.2157412804232, 746.4824214277932, 745.4703244046062, 737.0658258206504, 729.3070429909742, 724.7721096751478, 722.8543375199969, 724.7500005262995, 723.1084065698724, 722.8020289367413, 712.1472333323997, 710.4114966976347, 705.8036623791627, 705.3736829019607, 696.0615967145192, 698.3758701091659, 704.7792473225132, 702.7426811612978, 697.3134312229212, 689.6772169521474, 686.9602521372549, 685.9783845694832, 682.6312244993776, 676.8812112591036, 678.1190556889977, 679.4979640157173, 682.0808060196077, 674.9619827486772, 672.2117642345937, 670.3051702128851, 681.9128175926704, 695.9712428348116, 706.7933113287427, 713.2801578976813, 727.4326967781667, 730.2461832454092, 737.1779655326019, 734.2369749240585, 745.8212886889977, 752.0761453347338, 757.4136812738095, 758.8613846010738, 764.966076017507, 757.6197386158348, 742.9591157446313, 739.5493275168845, 727.7951037521785, 721.0997942103115, 712.4268474982881, 711.2831444673202, 705.4624186792718, 701.9638067176314, 700.4288697480547, 700.1201795836445, 687.3344109877061, 692.8894076948335, 697.9643568229847, 704.5615638173825, 707.6428331258948, 704.8553972598818, 719.3352744102864, 717.2601859017195, 712.4759287932617, 712.7749608257859, 721.9507402191877, 716.8073007256457, 712.637484785014, 705.0690227649393, 698.005915446234, 691.4152296472851, 704.1669492300031, 705.6217509805477, 719.082738903439, 725.5213209239806, 731.4162662938064, 734.4988351980236, 738.6020726963118, 743.3079864076408, 754.2451745487862, 762.98608809197, 771.4883440213916, 778.2481136363983, 770.211387629863, 767.3051305812324, 752.7084372822128, 750.6318276416122, 751.0511173701369, 747.4209579270153, 738.3022170034955, 735.7328454246032, 729.5776884887176, 723.5388366924979, 716.4217188630562, 709.356461202381, 708.8103331759258, 704.6039311993463, 725.531395398537, 726.7684882718642, 723.273346232882, 721.0787445989729, 721.6496626386555, 722.8432341948335, 730.2415375715063, 737.106903874572, 741.8899553429037, 751.9370064750233, 748.7393673642234, 746.0313637345159, 731.6041557126517, 729.260922817927, 731.6561531335979, 735.3066004899626, 737.1712372820573, 734.6786444793029, 723.0417682916278, 723.0729240952381, 722.4162636600528, 718.3914774933083, 722.4989476675161, 727.5069498795517, 733.7552675217864, 737.4496337145969, 752.60430939986, 769.6608449929194, 787.4710832135854, 800.9754866567848, 808.3110954364994, 813.0268626519608, 817.9475951567849, 826.2769763078898, 832.9898322716308, 835.7029831154684, 850.052247208839, 854.5705402208995, 840.8134758939464, 828.6832493486617, 825.4039346635543, 822.4156089169778, 841.6174470286337, 838.2714179211795, 832.6988922995641, 829.130530397676, 827.1695488426644, 820.6024886551509, 823.2775103892001, 823.1380541329754, 826.2826665812324, 836.1745263068003, 836.2936469450668, 833.2269234872393, 813.6938380614405, 817.229264002023, 821.483614494709, 829.2717271661219, 837.872199247121, 855.5402519511359, 858.3960464803921, 865.3110178056237, 873.550394134765, 866.403044427871, 872.1697715396825, 878.5478294878617, 884.9635519936197, 896.2860744514471, 901.0236103617336, 905.427167605431, 904.2491357683627, 890.0631570127607, 925.0954563805632, 929.027048911609, 931.4366083622004, 931.6008085209304, 935.563709819172, 937.290459914099, 948.0445655708684, 951.5650889705104, 961.1532943576096, 964.7403668543192, 973.2953747625836, 971.9610320010892, 956.952404614846, 954.8138432135077, 957.1015928115468, 960.1429681984904, 959.3790867095394, 957.331589275988, 951.555482695378, 940.9109200181294, 928.8973834362744, 925.1439077845472, 917.370311264078, 912.0607958183538, 951.2158236811392, 972.6458004685652, 973.4333363979864, 968.4159597174756, 966.97318641939, 967.7455842668066, 981.3528780260658, 994.888508521658, 1010.0464956002955, 1016.899057226346, 1026.9513783142702, 1027.5420544110643, 980.7586831996576, 965.7392204886398, 966.7624578331776, 976.7027557996672, 979.1814537784782, 977.5528913555868, 976.7033792604263, 966.3579285934484, 956.4381426744476, 953.4860799302832, 950.011876587924, 953.5673394437792, 981.0970198271864, 987.9683055483192, 996.4355533886552, 1000.935086891892, 1009.9367963036884, 1016.3103590018434, 1022.6631167342048, 1032.1952576051197, 1047.2363428299875, 1058.4532678026503, 1073.6308628419702, 1076.4932723290804, 1083.5381290446228, 1094.811730060978, 1096.1168061066676, 1099.9267976482454, 1103.300246907399, 1106.4156660588742, 1103.758281639322, 1112.1416708239185, 1116.0170370627916, 1121.7062214330506, 1118.775105469284, 1121.8898986574852, 1128.5303881878306, 1131.3777898860876, 1150.17965976385, 1156.489268467476, 1165.28458362854, 1173.4793434124265, 1178.6498712638338, 1175.8863843026663, 1184.9551693607998, 1194.9657641884492, 1198.3210576802048, 1192.40717178338, 1193.0465835485645, 1191.5872506213818, 1181.6179358415031, 1185.1098387931838, 1193.1992160052907, 1202.562735137877, 1211.528732804372, 1215.605441932384, 1204.103581472689, 1201.8071003283535, 1209.1732745525987, 1204.5143898056335, 1195.4299684840491, 1183.6185456316528, 1173.7350581780263, 1161.382901043729, 1149.1561039856051, 1135.8307222914725, 1116.1324975542327, 1108.18283563993, 1099.070548725257, 1095.2429632608157, 1082.6441220095703, 1074.537736648148, 1057.0016486448023, 1056.139418040772, 1053.432010155462, 1071.303674189698, 1089.6902116861188, 1088.6651815803766, 1090.45023914986, 1090.9497341626984, 1095.016419394102, 1087.71464323934, 1089.5776908634452, 1091.1631402176042, 1101.7648870510425, 1117.758787902637, 1131.550130218565, 1104.9814290783536, 1083.2150631069871, 1082.6673834106048, 1078.6008262971288, 1076.352832552241, 1071.7146322915498, 1077.1729744627294, 1076.3000749098194, 1067.7219280399936, 1064.4612007995383, 1056.0321397651069, 1043.619861315668, 1041.8202397309062, 1040.201269321177, 1032.8461568564117, 1030.804654585192, 1026.082493176181, 1019.3546453476062, 1012.8911212305694, 1007.7425502261864, 1001.617421432466, 994.3050303486616, 991.7338733715264, 992.012636754824, 990.9486329591502, 991.1496201265952, 990.3396963351228, 1001.982702804155, 1000.8884116619896, 1002.212763181776, 997.3599855175848, 1004.4254368520852, 1002.8434169258762, 1004.4431980270774, 994.5097734476344, 1006.2219814746342, 1004.3065990108933, 1014.6460243397136, 1013.5917083162932, 1014.844835061002, 1014.3527080222532, 1004.663562937336, 1003.051855727196, 991.8811478655462, 985.2255578202614, 993.9028190699502, 984.7794316275592, 965.4349640607688, 951.9125920294116, 927.3605357363832, 921.2010819946825, 899.2529267355275, 896.0848528050886, 895.681074904684, 891.3291569481137, 887.5587701633208, 878.5120390511088, 871.0631194418767, 870.99356846981, 868.6915030616246, 870.375785166382, 885.1196683963585, 885.4752668308433, 888.4513610802411, 887.4428326386924, 882.294568296518, 883.9339471037854, 885.2142497491441, 879.9821470265327, 879.9368210841113, 884.2362334449891, 885.5924423632897, 880.7331404435107, 874.4396287834577, 868.9835172983952, 860.4944724459228, 856.6125967806566, 851.2044560064581, 844.5827435210854, 838.1125699681684, 839.4234783844538, 829.1109906821505, 824.4498201186586, 829.8812082460266, 832.752561230859, 832.2940734007159, 838.5711752442421, 846.2157413548864, 852.4347666995791, 854.2878166234049, 857.4497066847961, 865.668006849284, 864.9247759401649, 898.0140835718175, 903.9991746141455, 902.3140164712884, 900.6666729705881, 898.5878358580766, 896.359331443121, 891.241214301743, 887.4723825559445, 890.8797173000311, 897.4291705375039, 892.2414143633675, 888.1084367598039, 866.4628117756769, 859.4262187380174, 857.9255320633364, 859.7186759109087, 864.1220986048086, 866.2403857783931, 874.0941416932774, 880.3461134747898, 878.9102167005913, 884.78316795028, 891.1072934097416, 893.9415422274353, 891.7033826117334, 898.3289140022564, 903.7023815059136, 903.944548864379, 902.3007085957828, 902.8805929141768, 899.6108183463197, 900.199013545596, 902.377297021164, 899.3155757449423, 898.8448985002333, 896.3277567462651, 901.240143431528, 897.9885963704481, 890.2829390428726, 885.5459309886398, 894.6779799395424, 901.8923393628228, 919.3447595053592, 923.38641115554, 930.7637314236694, 942.511496274432, 949.7429986314114, 955.2395466961548, 981.7953649733894, 990.6298088319496, 998.6448676432464, 1006.547840393246, 1002.6601765266448, 993.9336241975568, 982.2138581059692, 974.820022205571, 969.0323846747586, 962.5217677838468, 968.5767270202302, 960.0070189822596, 939.660787297672, 932.805236381108, 931.5304646187228, 939.7775095802988, 947.903561754046, 958.0992207850916, 964.5773570441954, 972.3221308535636, 977.626958533769, 983.609407661998, 992.3653430827889, 1008.6670585413164, 1034.9715502753656, 1060.700692863804, 1076.6751703629006, 1074.8609699801004, 1076.2802568610332, 1073.0732257155305, 1073.3011767282137, 1071.4976744245253, 1072.7325286774042, 1070.553475297298, 1058.2631648720042, 1046.376666148537, 1041.987636754124, 1029.7909139169778, 1021.099568186508, 1010.7373570067692, 1021.5477019354186, 1027.273140864768, 1032.8808734073295, 1035.7505052391066, 1034.5558066027854, 1038.7440062281355, 1035.6641723255525, 1044.3969283914469, 1099.6741734723, 1114.4598333201834, 1124.100634694904, 1130.172497612349, 1124.724098782135, 1123.2923442338158, 1133.3014281394203, 1142.7024990825553, 1147.3778360996737, 1154.9669748871777, 1163.582268159664, 1142.213909981475, 1079.8261424920634, 1057.8728725957048, 1047.2151018989073, 1037.8041058258636, 1034.7463389563493, 1027.594176308728, 1023.3814462215996, 1009.482663324463, 996.9018330298009, 991.2959935722066, 990.6332814959508, 998.0821074215686, 1022.0318140110488, 1033.5110672416745, 1040.2120524602394, 1046.963055688453, 1060.9547659527702, 1073.0115897905716, 1083.2682101882974, 1108.620902582166, 1135.6039811234689, 1155.610403655073, 1167.7450771584968, 1176.9388929806237, 1188.5364785287084, 1198.7669928218954, 1225.4226397516536, 1240.2050882360331, 1250.010578906853, 1259.3855501482649, 1265.9620207477576, 1259.3045287152668, 1250.454215532107, 1255.1411807779195, 1259.9214903238965, 1268.4992316182536, 1282.3470925718514, 1288.397495727757, 1292.4022768049329, 1296.99091676136, 1302.5189947320262, 1300.171326898226, 1305.578357084656, 1313.640565550109, 1321.8233925469103, 1318.0013764927462, 1320.5969734003268, 1317.1007625008558, 1320.4323204891846, 1322.879583984983, 1309.3626069448987, 1306.1716643139596, 1312.6660858314362, 1321.8142441586522, 1323.157084328941, 1322.8543280620916, 1322.177607436862, 1324.7886876410676, 1324.3922700554, 1315.5387884549946, 1302.7846457131632, 1294.4508740822428, 1292.5502565596787, 1287.5213466886864, 1270.5879879935894, 1260.8717369719886, 1281.4452497178647, 1288.4381447278242, 1279.4423385747623, 1273.6052871170243, 1264.7905367205103, 1260.0627555848116, 1260.8990047472766, 1276.439509250389, 1305.7127148558975, 1318.0490756329752, 1330.706955788273, 1325.940280966464, 1309.8680224401649, 1311.5489504118427, 1330.7239860023342, 1344.0977166520388, 1357.7631051674362, 1371.6828182641611, 1383.4587924903517, 1375.3010605731913, 1364.5582419225827, 1359.7427073040772, 1358.6784194662307, 1353.1132507254124, 1343.743882116947, 1335.0784223267974, 1320.2375724110643, 1315.3183370269994, 1311.962996144102, 1298.868139903874, 1285.1074156757702, 1277.5954619981326, 1256.7696847066604, 1249.3910736201017, 1246.5400877471989, 1243.885633689776, 1240.6866931020072, 1240.5391482317928, 1236.727580475957, 1231.1152574722223, 1229.745228417131, 1226.3813028263382, 1219.8955195851768, 1230.0460975110177, 1243.4921324980423, 1240.9170302086588, 1243.2590777724215, 1242.301376721015, 1252.251351982026, 1253.9912531022223, 1255.677331037659, 1243.885115862052, 1242.4138807565232, 1237.0673077724089, 1242.627287890056, 1225.0964654113754, 1219.8750351245722, 1212.3414373259411, 1208.3395726222657, 1194.970123382771, 1184.8748430071582, 1172.4923549391535, 1152.771139605042, 1145.7592562352938, 1126.55127214737, 1107.3195154533437, 1100.9486856560843, 1085.2470232270464, 1074.9026842947771, 1065.9563299808588, 1053.303235705444, 1043.035274902583, 1026.2875945775754, 1020.7015102882788, 1020.5147638700828, 1024.5874505168845, 1023.0867325478524, 1020.129283665266, 1016.6509162071272, 1020.697449263022, 1017.6574264037883, 1008.4161815099576, 1023.9670001615624, 1027.5025049009491, 1028.4970669076408, 1020.5641678266614, 1014.1757843450824, 1012.1776235576564, 1016.4048061548662, 1008.2497112018226, 1014.1807624379084, 1013.2781478353564, 1010.4822914484126, 1008.8786313895114, 995.5796096953704, 985.0250029828728, 982.79038948187, 976.8388288416588, 971.5852981399782, 963.3940183173823, 953.0903021128572, 944.9106765862388, 928.7843048800258, 920.1899614377649, 912.7201386285402, 907.025973883909, 904.7187774378308, 890.7043031113276, 899.1155257281356, 897.2809571199456, 892.8448413329443, 891.8123432840802, 895.6259283857764, 896.555896974168, 925.4032230526766, 936.9706830044784, 945.0841798678026, 947.4841974750234, 952.3145550456204, 955.106843625198, 956.1169899606286, 960.3300551200592, 961.1108641595082, 964.0183257162308, 965.4880047379396, 960.1673624693666, 938.5760825978836, 925.5024634695768, 914.9136019195876, 908.5921319354964, 907.047955296374, 909.5859632506224, 908.768460133889, 909.266696502342, 909.1477265812324, 906.9357698486616, 906.1965122896823, 912.5519872294584, 919.0286497460272, 919.9012007934174, 923.5251398096603, 922.2213280697166, 917.0620249329288, 918.3972951329548, 915.534341417788, 915.2559506258168, 913.6188613690476, 912.680492551276, 904.0734897010582, 890.2335973243074, 885.1074633932462, 887.0156515946934, 894.3598402128074, 899.8537691984127, 906.3653206679894, 906.3477062856364, 926.3957557054156, 932.0421199787417, 940.3144605231092, 949.1130628323218, 963.069434793184, 973.2570461753312, 988.8713633756612, 995.4193933248436, 989.4535927189812, 994.2667053952256, 994.4335541096328, 989.342253207594, 979.5740551676004, 993.9802866076332, 1003.454852284625, 996.8436789740124, 996.7511767911608, 989.2757332951526, 990.504712752713, 988.2607796843292, 993.896084500778, 985.0490434154996, 996.0465684627294, 1009.5733890186764, 1015.8350635795108, 1020.3817340831145, 1001.1996489180516, 1007.1790309035168, 1004.7175543991596, 1012.9949158015964, 1022.8730503927015, 1026.7653322193432, 1024.3853968751946, 1028.890463248899, 1013.5386528342668, 997.6830048327056, 993.9417608141144, 995.7947271110334, 1008.04259859765, 1009.8560149767654, 1019.2404076604598, 1013.073049848428, 1007.9216884760214, 1007.8397298377388, 1013.990516244242, 1019.0378482782446, 1032.298424420557, 1046.0724301296295, 1046.9991855375038, 1044.7568740915033, 1040.0153686553842, 1044.5202349933843, 1050.9514363419703, 1047.7560028438377, 1102.131289043962, 1119.234836006147, 1127.1241448923124, 1119.134157843993, 1111.775261295518, 1100.901525914721, 1082.459171624572, 1088.8755685754743, 1099.6699411358004, 1101.4587738474536, 1098.799756251089, 1095.237016044351, 1052.4734680852785, 1032.8309558346937, 1031.300979877762, 1041.6828512021475, 1048.1417271224711, 1060.8757065468071, 1089.932368604342, 1079.341640050109, 1064.9022488887333, 1060.1439666371225, 1063.853327775288, 1072.34624670085, 1098.702487556958, 1096.1608220133658, 1113.9891726746594, 1121.6217590021008, 1131.7671846897758, 1135.9839615236538, 1148.147349660952, 1163.598221546452, 1177.7038749904866, 1199.9634895115937, 1214.5907765766422, 1210.6685243412724, 1218.094707087924, 1221.8700086835454, 1228.366872080143, 1226.3177478568316, 1233.0092531842515, 1244.082652132293, 1250.7991774012603, 1262.7948178457823, 1279.5839080493308, 1291.9823912485217, 1302.2847506793494, 1312.9717756086209, 1332.0591410312943, 1343.3240185269997, 1367.3070793994711, 1378.1415971511826, 1380.2865814729223, 1373.7911957077863, 1371.350204281201, 1362.0298209530815, 1341.0143874380642, 1320.8467195376595, 1324.4466389001711, 1319.5498854370526, 1312.5954530817771, 1310.3883839269372, 1297.4798638990817, 1299.882170842826, 1304.3003272251012, 1328.0630750498362, 1329.0323405394493, 1336.3359580719732, 1343.8573323639746, 1353.9197193064892, 1352.1947851547616, 1351.9729632118735, 1353.0511560633363, 1352.331966054466, 1358.560475480781, 1356.298249376595, 1355.1331777899936, 1333.8718542670854, 1334.0549777167917, 1332.5567610092592, 1329.417227068005, 1329.1047431116558, 1318.8170575124493, 1308.1451582796449, 1286.3376869137098, 1278.8984684039835, 1266.360281450747, 1256.9229182564582, 1250.6781465550962, 1244.7940652521786, 1238.512713123716, 1237.081767396981, 1245.2843293329863, 1239.9912115082666, 1235.423667406728, 1230.0721017995645, 1229.5958710737627, 1241.438636563025, 1255.9255150414722, 1255.480296635154, 1254.5679467830687, 1249.452077659975, 1242.0652370827886, 1235.9559714523032, 1224.349032630005, 1217.0975158291317, 1214.367848203315, 1208.077293559018, 1212.0607984383753, 1199.3271878261748, 1185.2282040894022, 1183.24471641122, 1189.0312666320417, 1195.431414585434, 1196.6236665785868, 1200.1632197771285, 1203.7293895914936, 1207.2111608572204, 1211.218391613212, 1216.3935989894549, 1215.8928395983503, 1237.690161779334, 1255.1330712041708, 1249.9211557025928, 1241.147047541939, 1237.2001700732778, 1253.934297767507, 1260.338690777622, 1278.8640330705718, 1289.0735968589877, 1297.0557914723, 1284.3953969786803, 1298.8645172373947, 1292.0698064370667, 1284.7327902117956, 1281.2735632912388, 1299.179960022583, 1288.9715821700124, 1274.850143640134, 1265.9742991670555, 1239.7950196539837, 1217.0143687818238, 1202.126795311547, 1213.4423129158572, 1202.4328600736071, 1183.2203169244488, 1172.6678005748363, 1163.8006328608774, 1137.8314904778763, 1134.7366145318238, 1114.186157438531, 1098.0190006931216, 1089.3640440588235, 1082.400018874105, 1073.8865626260272, 1047.9907788678804, 1024.61381581676, 1019.5349693239962, 1007.558731312714, 1005.7001356267506, 1011.0127776805166, 1007.4973812775444, 1010.3580389001668, 1006.7225994033964, 1003.4429420402272, 1005.2263990311236, 1014.8979402356052, 1010.3078646940552, 1020.736363986351, 1018.0497089444344, 1017.0560441995798, 1011.8601211317304, 1013.7128436508714, 1005.3434274230468, 994.2609635114378, 988.0289500255212, 982.6057213943257, 981.787970730693, 967.1038434359632, 966.7725182138188, 946.2351247355274, 941.0911590782758, 936.8036023584656, 933.459387739178, 923.2598344211018, 923.1724095997508, 927.409147999533, 929.2611209646748, 927.8253434272486, 925.2735917936508, 928.4929912454091, 925.7829973669468, 956.3877805076252, 968.6842936290852, 974.496076352241, 978.6216711277622, 981.5207807103952, 984.2878133029876, 984.1355481157666, 987.2373270722844, 994.3194652490662, 997.0314226091658, 994.5301408413476, 988.2964130611506, 962.512876418534, 951.9368846834732, 945.1905698232958, 939.3454811349204, 939.178171043106, 939.0931003860876, 941.2277956430128, 939.6329269811704, 928.947045243464, 926.8586486592748, 928.0656957367725, 924.5459149719107, 929.768568422191, 937.3368107058824, 942.3937896590414, 940.2016117267284, 943.6733875175848, 940.6395650989728, 935.9097019042172, 934.6093727615934, 936.6280592731092, 936.8740513609554, 938.0130750736072, 936.293501848014, 933.5516518499844, 930.3074706868192, 928.5642976260503, 934.8776888201056, 933.9521244891844, 938.0066418313882, 950.2585075795206, 953.5739665831776, 957.2069202800342, 961.9604984298164, 966.025718802132, 965.4243625355584, 985.996496332166, 989.3763561171804, 1000.8806213231404, 1018.2381412254902, 1030.1656448856986, 1032.5956669924524, 1031.5639854756462, 1043.0951300660597, 1060.418980135154, 1063.1817685775754, 1067.105323557501, 1066.9573125566449, 1059.5612488702925, 1061.612801802054, 1056.3709482696077, 1038.7913276048862, 1037.8244650183628, 1044.748871019919, 1045.189313587924, 1040.588587988873, 1030.889820829922, 1039.2792262026144, 1046.1620113190168, 1057.129450572829, 1068.0925624689542, 1074.6409197565358, 1078.988371752412, 1083.1478316383443, 1087.5604183930905, 1085.651669058979, 1093.533789230392, 1107.8023236065203, 1115.9924717048707, 1119.9753498857765, 1123.198615155229, 1117.083830528867, 1112.797861881886, 1116.3679993292094, 1120.861359718398, 1122.358557502101, 1125.4230887231558, 1127.6385181732803, 1123.9071017563024, 1114.345461349595, 1108.3153340178185, 1105.4674992960583, 1113.956278007703, 1123.465265771553, 1179.738846079521, 1198.449176826642, 1231.3024766259414, 1239.2604683407146, 1252.0059056153532, 1283.2415816761438, 1297.0089433922574, 1309.7060516025776, 1321.8450318848943, 1338.7833404585413, 1345.1094742740977, 1341.3632884630729, 1303.6883672737524, 1302.84625363088, 1283.5531546135232, 1291.7167604227357, 1291.0867308106128, 1269.3040553583878, 1271.6438859305945, 1264.5480016466695, 1262.7739958064892, 1274.8940176405229, 1262.584432140523, 1256.1207549382198, 1258.370762516477, 1250.1857174818706, 1243.089643574852, 1239.2355455200748, 1236.5154464861498, 1226.5685028523724, 1233.250970269997, 1247.9511654286496, 1273.338241974401, 1256.4598231249613, 1268.1079845206195, 1269.9092302704182, 1280.666440263656, 1283.3590704009882, 1296.6391537844174, 1295.460380719428, 1303.148444990255, 1316.897657543709, 1313.5026767363877, 1310.1639354900624, 1289.7302814817149, 1306.5052575361908, 1304.3464351963007, 1303.1388669745563, 1315.5243573997825, 1316.142486641798, 1315.884029841892, 1314.2026116483808, 1311.2073308797071, 1306.1604503609644, 1300.3300130151729, 1295.9749836903206, 1297.3157303303765, 1286.9707244396584, 1289.8986474142089, 1291.8866696796308, 1314.493371548553, 1322.3509056938997, 1322.6228254579084, 1337.0505796805944, 1338.1974832155197, 1346.6516105494863, 1350.4052749704329, 1348.785251750856, 1346.9710957934951, 1344.0269592640832, 1341.3651535442732, 1325.1532582179427, 1301.2466895126047, 1295.9138748214284, 1284.1444659773124, 1269.6560064805476, 1267.1926587604264, 1255.82831342826, 1248.7493375070476, 1248.5277165212417, 1243.9289569363348, 1245.038588570728, 1247.99631624681, 1243.761641047074, 1232.954815416804, 1238.369065226657, 1241.7542752503891, 1244.0392554610953, 1248.150170774437, 1251.036896086421, 1258.9780145892428, 1263.2863166907875, 1278.2316635247432, 1297.0279489086522, 1324.5786640165734, 1348.8791217471207, 1365.468305915422, 1368.2339991700123, 1381.6193050347583, 1380.4561164801585, 1379.5782586369437, 1380.5795761081545, 1372.054326802443, 1367.154428626906, 1356.7303165371122, 1354.9267251651104, 1342.1235430623249, 1335.1405629563474, 1333.1181082399626, 1325.210851433084, 1307.8559189235916, 1304.849551868892, 1308.0081518035145, 1312.6617323674136, 1319.4833918820416, 1321.283549959695, 1309.5433263034097, 1300.5102795414602, 1281.2067799346405, 1267.0456697607376, 1262.0097862740429, 1263.447003538337, 1267.199085657563, 1265.4768963234403, 1258.6053629960318, 1241.7471335270775, 1234.099809688842, 1222.065269962574, 1227.2447713543418, 1216.7514342097725, 1215.320530330995, 1212.3072640967162, 1219.448038921724, 1206.5149106307188, 1214.1461142126516, 1211.1903456397447, 1222.5596103467165, 1225.3115261393557, 1235.2113033342669, 1233.0542959220354, 1212.0712589532368, 1207.042259473467, 1192.4345506924212, 1173.574223634376, 1159.8533492720196, 1141.7722687068397, 1125.2234064258596, 1110.99597115929, 1090.6559365801425, 1078.8550172495443, 1054.771603821398, 1047.9010478580826, 1040.32181944709, 1032.6157802371615, 1020.2091564534702, 1006.7350620344693, 1000.0055852152972, 1035.0428364371364, 1029.5247448523908, 1016.8485379782078, 1007.6538979493464, 998.0446886911764, 990.1912153016652, 977.575267807734, 969.296545439698, 963.0901660578896, 963.885014946312, 964.9852638651572, 972.9159772391844, 938.7210443561864, 936.6913691642544, 938.0837418895112, 948.570333473156, 949.7125159285712, 954.4056632143636, 956.8144570248988, 954.610720791083, 951.9523797921725, 950.0800966219264, 937.1243787819794, 918.982718736228, 909.4554497970744, 902.9748921472924, 894.9046952597156, 882.9408296511826, 877.4096923541861, 871.2074594360411, 867.3908240399937, 864.5653259960318, 866.9133360943821, 875.5853091076098, 891.3238586832399, 947.2169001822284, 969.459738482493, 978.741736982882, 981.4358664894958, 974.8059755172736, 978.7005887362278, 976.7075164179116, 977.0029850638032, 989.6240650270774, 987.5482926509492, 973.7410139188452, 948.0683435030344, 917.6595685014784, 911.3227746178804, 918.323252791981, 929.089260463274, 945.0993947531058, 954.1441661472144, 971.917249983303, 987.337684451868, 989.036933588895, 1006.9367802976968, 1025.181903372199, 1046.156673711323, 1048.7240891604988, 1052.6570963229512, 1066.0784738643897, 1075.597705616791, 1084.1459485152504, 1082.6412345869414, 1081.3810408265665, 1080.3040390262422, 1080.3067155831793, 1076.115174165127, 1060.1131598634445, 1036.488925260104, 1031.6848416705054, 1023.1827163606558, 1007.1237702307758, 1004.3799525202955, 1005.992672332736, 996.2299064257704, 994.7907734928338, 984.650745633131, 970.177855688654, 966.1996797885154, 969.6786520550886, 977.0477665126213, 995.3563733979496, 991.707834212911, 991.7396790144724, 985.3182041667444, 972.7276044314184, 973.9982665894796, 965.4574470302676, 982.2719870107376, 993.5735617791784, 992.7091025425614, 995.9964639430328, 986.2898378190846, 974.9559663882663, 976.446438672191, 968.4262282134298, 957.7043607863368, 959.0062297871926, 963.1498437676628, 966.5280642371614, 952.5803287274064, 959.7849202704635, 966.293916420946, 970.708639905073, 976.324029415733, 993.3365090881258, 998.9467077700746, 1007.580394858232, 1016.1411257276532], [147.72015627303142, 147.9779531537342, 150.2391705176626, 151.43792587332516, 153.16140846700904, 155.15903988390912, 156.07696365865235, 157.5359553540052, 157.57419288445377, 158.5874670901805, 158.90265109313725, 158.44715129699657, 158.19670430182072, 160.30809039640104, 163.7828830394491, 164.9922304049175, 164.64073084228136, 164.60137840616247, 164.69884048366012, 164.47408603470276, 163.9003928627451, 167.0953013207283, 169.03426776890757, 170.29490237877374, 170.9178036668556, 168.37835183040838, 164.23353308045438, 163.0921863813414, 163.04980454691875, 163.81202007438532, 164.58346572766885, 164.08581594358856, 161.1074089190009, 164.01964066042697, 162.146581597728, 162.83943460177403, 162.8231708534035, 163.15069620004667, 163.82219267966076, 164.799098772798, 165.7356633074184, 167.39125740094926, 168.45520563484283, 169.3186715300342, 168.42510987270464, 168.3656005731222, 168.70037370401494, 169.6572228204949, 170.53954794654533, 176.46440237659513, 175.75238100560225, 179.00929923755058, 178.58688828991595, 178.00345587799046, 176.9858087640834, 176.26832773503347, 175.22604166013073, 176.46745376571738, 176.78874501618424, 176.75223553213505, 176.96935442973856, 172.42148581683787, 170.66684892989417, 167.03128879365082, 164.60286480228757, 164.57986987636164, 164.0292138374572, 163.78666369843165, 163.6837210420888, 163.89609834632742, 161.78938080010892, 158.42310040374002, 155.8781498945689, 154.26549565281667, 154.58697190756305, 156.099945286648, 157.77849517530345, 157.9441131065982, 158.21597062931838, 158.9447339631406, 158.7822095908808, 157.49440826999688, 159.24358694817928, 162.0786066994242, 164.56001613935578, 172.4861243044072, 172.52993491044194, 174.16339561024677, 173.5743064536797, 173.05438979590724, 173.298010444211, 172.68054153983817, 171.96139630532213, 173.09252260784314, 175.06259852497666, 176.07861648544971, 174.25204650614688, 166.78637821389665, 166.64732173413864, 165.38449982461873, 166.10696193456272, 165.69619832477434, 165.91650182983193, 166.23903570767197, 165.11220061562403, 170.1657607039371, 167.3414122962185, 168.58166878070014, 171.39352348630564, 171.97343003555866, 174.00941141417678, 176.48083823817305, 175.56863689768127, 175.174047867258, 175.06778020487084, 173.57357767818235, 170.35207969708992, 167.0656432816682, 165.93206617522563, 163.55800504225022, 162.71638471518375, 164.84503950070027, 160.7150959677093, 159.67669503563647, 164.32735203306876, 164.33194614970432, 163.64264381270618, 165.26176488414256, 166.1004892072051, 166.2084074509804, 166.91752048755058, 167.6484912595705, 165.25423349898847, 162.91648746280734, 163.7452919589947, 163.48145280165863, 161.09395983815747, 161.76345117522564, 162.39885218082787, 162.7065389642857, 161.24835201509492, 161.51171158699037, 161.01545271272954, 159.7928458051665, 160.29831997938064, 159.8663670193744, 157.56431864028946, 155.99646236609087, 155.60532096903205, 153.68429457570804, 152.34621249502024, 149.8186235480859, 148.51707259220353, 147.4944459815593, 144.83655685722067, 143.76594866915653, 142.52263418082788, 147.02723994638964, 147.00381539301276, 146.19593372502334, 141.7911506723467, 139.9363023793184, 138.86839040398382, 138.32573357936508, 135.90160116845627, 135.74024413180828, 136.57651976353873, 136.78134332633053, 134.29459341051975, 128.94218035208527, 125.67657631185808, 126.9164241939776, 128.3858634011827, 129.1643737883598, 129.20378295424834, 129.15294899789464, 128.7565816960006, 134.22087876050418, 132.95601916044194, 131.50141754240585, 130.74480035519764, 130.1343500619359, 129.05500919779024, 129.04302093923124, 128.38800745214752, 127.33252023747276, 126.35210596553064, 125.6520610872238, 122.7346696405741, 118.51441597408964, 116.96635974618152, 116.56259988056986, 116.75787551937442, 121.08402770105822, 120.81031150287892, 120.20257552116404, 120.0742571145347, 120.28021775647188, 120.139464856676, 119.8114391801276, 118.79556083726236, 119.21649963134142, 119.09637046140678, 119.16735295194262, 117.37218450669155, 112.1974551975568, 111.26661266884533, 110.88460768868656, 109.82063281240274, 109.30788783982194, 108.50170741285405, 107.96762410434177, 108.16668498544972, 108.5714040192966, 108.3209247097728, 108.36182422471212, 108.00396564371304, 108.07719312900716, 107.559588540305, 107.9438136206816, 108.26495967044008, 108.01788890141611, 108.2852649737006, 108.73848873155929, 107.60449834757236, 107.62026315063802, 109.0864481185762, 110.3092154194678, 112.08343588717712, 118.9863341346094, 122.0125825823218, 122.5218060166511, 121.9931234857305, 139.23044325280114, 148.86925343028324, 149.4465254591503, 149.92951517958295, 152.33863449657642, 152.63931081333646, 153.71995421187364, 153.01887352073413, 147.51910085262995, 145.45189088849986, 146.80730874416432, 147.38030558099905, 130.75063576704014, 124.34579931333644, 124.39951972331154, 122.7502271339091, 122.98541894156553, 121.04007580693536, 120.46699454232804, 119.25877048607224, 119.45896804855278, 119.33690316238716, 119.65529230275445, 118.29600484088078, 118.38572304326176, 117.74194369740115, 117.30386969273265, 117.03560530003112, 118.66628533278868, 117.5704282221444, 118.89961461383442, 119.8689525926704, 120.14691742001244, 120.67013482446312, 122.90944103244632, 128.17850811912544, 129.22363643331778, 130.5158965980392, 131.85092530174293, 131.43085542530346, 135.15147386157798, 136.48813101106117, 136.6242663443822, 136.94844877662698, 137.57269748708373, 135.7873777472968, 134.1862852129824, 130.12109971879863, 128.95612106497043, 128.57836664892622, 128.4953347448646, 126.05777081061314, 125.4315258339558, 124.21799620043572, 123.85228403112356, 123.2369812813382, 123.13085509835048, 122.64297434469344, 122.30205658769064, 122.02306613414254, 121.72349216067538, 120.97734741479924, 120.33186184025833, 118.39640811275808, 118.53002697230004, 118.35031727422258, 118.32923603299096, 119.01204609803922, 119.18019719701212, 118.90707929590724, 117.97851858270435, 117.49040639176782, 118.1613344615624, 123.86661483450044, 124.68591039130096, 124.03899092924948, 125.41580881956116, 124.78918257648616, 124.57667526727356, 124.06499341007626, 123.70413795922812, 124.351529447881, 125.96721697310166, 125.95034144825708, 125.69024065375038, 120.61268550116714, 120.63215140521112, 120.00550638344228, 123.13255924626516, 124.90245497733603, 125.18245675116712, 125.42218207889822, 125.80149655851228, 124.51671016837848, 123.64066054072258, 121.82824788673358, 121.253726372549, 120.2753813565982, 119.77168193241197, 117.53287376384998, 116.33520771825395, 115.76434509606028, 115.73214648513849, 116.29591953042328, 115.53277075171178, 114.9889266408341, 119.01285006956115, 119.34849764526922, 119.4268642525677, 119.51719972478992, 119.9143770445845, 124.0096858327984, 124.71602031255836, 123.56589273591658, 123.19384969125429, 122.43863617942732, 122.04456274330845, 120.97122782547464, 117.53906383870216, 117.49767033071896, 120.3936343323996, 121.56384176906316, 121.43161748288205, 116.44917247237782, 117.63392162441644, 118.2203235596016, 118.06680749455336, 118.91093346132897, 119.90244900723626, 120.37457031310302, 122.17591286616867, 122.9503231092437, 121.86751259586056, 123.13068205742296, 123.88718734850606, 125.18648105493308, 125.04122325707996, 125.26262241581075, 126.58584442530343, 126.48268927061936, 126.48414867452536, 125.6542000165733, 124.38444030835667, 122.98791723552756, 121.65934818596328, 119.3634347422191, 118.73385476696234, 115.2690340385932, 116.39396469335512, 118.26214097082166, 124.97361621272952, 125.6556798297872, 124.82681557438532, 123.77614947696856, 123.8728556896981, 124.44705202645504, 125.08700714028944, 125.13388906551508, 124.95328364184564, 124.22503019335512, 123.65873175233428, 121.06402868168378, 113.1390587580143, 112.92743710006224, 113.05278322338935, 112.70080850303454, 113.9945984302054, 113.31205687348272, 113.21510394836956, 114.050832225568, 113.79780250085588, 112.55064046576408, 113.24763265258323, 112.12643678703702, 113.09300502334266, 112.8766459065515, 113.43099610511982, 112.86770358994708, 115.11547946467476, 114.3582737657174, 112.41242697639538, 111.62959770549332, 111.35396192615936, 110.2990061206816, 110.0950791056645, 110.45661107975413, 110.6143779231248, 111.25281192639018, 111.85073486118894, 115.4391521328198, 113.06150958084343, 112.58120229660751, 113.71861401851852, 113.15986673225956, 112.5284216504046, 111.30890230034235, 111.73865175334578, 110.3042409475568, 108.84905340172736, 108.04316171630876, 106.4978958462496, 102.17874348918455, 102.94892241472144, 102.92887722440088, 102.90518092242452, 105.12270538966698, 106.5235966371771, 107.21994598988483, 109.10608045191412, 110.61533120494865, 111.8063584231248, 112.5908962630719, 113.8039708277311, 113.77420222992532, 113.9644865253657, 114.53353880385616, 113.82768541705572, 111.7314319313693, 110.76445820541552, 108.82296222455648, 107.9902492710084, 107.08283378727046, 107.08419430275444, 107.24256819421102, 108.10487749198568, 108.23068419545596, 108.53010068230624, 111.4580954337068, 115.81503706372548, 117.0625153529366, 117.70909428688142, 117.8834287917834, 123.6476641223156, 123.52538396218486, 123.58906125848117, 122.3016082842359, 121.1536876125895, 120.71735752645505, 121.09343349976658, 117.56499571560846, 114.16369394693432, 114.23913292258014, 114.33234517693744, 112.55020708035045, 110.00623677139744, 109.15659983714596, 109.54332265764084, 108.60509434632742, 108.35684974556489, 108.15035576781824, 108.71245358348897, 107.3299737333489, 106.8439678610333, 106.26865719382197, 106.2494313758948, 105.17499288336444, 105.97368532391846, 106.41857028789292, 107.40454935247432, 108.2617393706816, 108.0147423653128, 106.38798908496732, 106.4901057509337, 106.99386164666976, 106.88619428921568, 110.59289638865546, 111.6379964589169, 111.3603417735761, 113.02600197175536, 111.93426367203548, 111.0509429267818, 111.30070381543727, 112.28265650544662, 113.74202927785558, 114.97232592452536, 116.3695878182384, 117.12750541448804, 111.75896460006224, 110.56197519382198, 110.83621338210985, 109.86953553703704, 109.21000737885151, 109.43598540094926, 109.59774693557424, 109.9654575915811, 108.78417303789293, 106.17540232282911, 105.63554107072828, 122.61838294452228, 128.04884732882044, 128.09263645983634, 126.78935062854028, 128.2375228899004, 128.02304839892622, 127.74629301766264, 126.61550625552444, 125.48638540102708, 125.19019017281356, 127.33355924354184, 126.2558287499222, 110.31919819109866, 107.45274000964508, 107.38435877155308, 109.4840366811836, 113.8381869632742, 113.6264029063959, 115.25137264978214, 115.7047480532213, 115.69239187441644, 116.5380326564737, 117.89324012286023, 118.33762893588546, 116.65613729092748, 117.59199802116404, 118.4803985692499, 115.7155368836796, 114.63377631878308, 115.40872188591594, 115.82495850583568, 119.42242069996888, 122.38096603890445, 122.59141658729506, 124.62481806100216, 125.19420147930283, 125.4610097981637, 125.63085577287582, 125.48526925739183, 123.03203815080803, 129.5451215995176, 129.34957473521698, 128.6087540104264, 126.28123036894564, 125.53134741246498, 123.8211152270827, 122.01484692413632, 121.7945793271086, 122.44866023988484, 124.05427953633676, 124.0598091826953, 121.7803823777901, 119.88309403384687, 121.2668461959228, 126.23191934850604, 125.50298919170363, 125.48407844802364, 125.70423824808071, 125.2190031807501, 124.14914618658574, 123.52582310846562, 121.00583363453158, 120.36759121770932, 117.41149913881108, 116.6866071828509, 113.7167735831777, 108.79140580275444, 108.0747627587924, 107.33897332485216, 106.06416553734826, 106.24412839900404, 105.53812975155616, 105.021177045596, 105.76075867818238, 105.93554486663557, 105.8853932859477, 108.88209854154996, 108.75668850816992, 109.58725640320571, 109.3252041311858, 109.2274180674603, 109.83369712667287, 110.59810819934644, 112.16874086671336, 114.89217916059756, 115.15000984235915, 116.09495928291317, 115.476562052521, 120.2503265139278, 121.15332082889822, 121.9128186364768, 122.94765442966074, 126.15741767289138, 130.01512882376284, 132.20070091542175, 130.23184122331153, 128.48747296226267, 129.74700082516338, 130.61777668137256, 128.67412485262992, 126.64427183146591, 126.19956387293806, 126.62138682391844, 127.81639048187051, 125.91476910566448, 122.5873982230003, 123.72942441837849, 123.95925899167445, 124.67153381224712, 124.04740014635854, 122.38808028229067, 120.16268416923435, 120.14552002201992, 119.67094240647369, 119.71518633356676, 117.8903295463741, 117.3680976303299, 116.2633173568316, 113.85792273622782, 113.18873370572672, 114.40348845720509, 116.72314132111734, 117.72879771374106, 118.2675563120915, 119.4135085557112, 118.64525148132586, 118.24747159391534, 118.98801408629006, 118.21085437480548, 118.61532134765017, 120.37643276408342, 126.356266326953, 124.86800987286024, 124.21395532524122, 124.68776946093992, 125.19052452069717, 125.49696588367505, 125.58036485978836, 124.69116050583564, 124.3033504826486, 123.68595396661998, 121.91666170432616, 120.24196118759724, 114.62170056885503, 113.98125117966076, 113.59106228392469, 112.7371713401027, 111.58838547256748, 113.04572610371926, 114.43386371560848, 117.52771921062867, 117.5664981635543, 118.52972264441333, 118.9482270987395, 118.84648889674756, 119.09090472159976, 118.83036181359192, 118.14684542639276, 117.91393003034548, 115.72219504500598, 116.05578800140056, 112.77113127178649, 110.66629773677248, 109.4049438453159, 107.57802831943214, 106.15316201610644, 107.37471308278867, 105.78664879474012, 104.8558303628229, 106.46305069638969, 111.91613292629552, 111.41646695510426, 112.0870359746343, 111.68617860776531, 112.21197274634298, 113.6627469965764, 114.64183954279493, 114.72864611469032, 115.5592215340025, 117.40757588663244, 117.7572158864768, 116.00528298653904, 111.25147728361344, 109.79646755524432, 109.42813198272644, 109.14360349494244, 108.48053526828508, 108.67540783737938, 108.83871904652972, 107.54636123716152, 106.5978957491441, 105.39760592818236, 105.11495835924369, 105.6899025823218, 105.74452330781202, 105.2032343411142, 105.43504032461873, 105.37446361780268, 105.14170391472145, 104.4855369956414, 103.96198337091504, 103.37251644475568, 103.90263942382508, 103.5970108437312, 103.38033566464362, 103.51169243876438, 104.62003421187364, 107.4567092955182, 111.12690024852164, 110.38447753641456, 110.78023222766883, 110.60429120961716, 111.81085447494556, 111.7014989327731, 112.32896321528492, 111.63574879777468, 112.38121472930284, 112.3221611469032, 112.33039101890756, 108.1824543545272, 106.69981570938376, 107.75064770222532, 108.41381532671956, 107.9049603015873, 108.23824577513228, 108.88701857391844, 109.5652874753346, 110.2095275761749, 110.14878045946156, 108.47825341386554, 108.1431044247588, 106.99196933442263, 111.7779197604264, 111.49882547167756, 111.98956745074696, 111.65215188437595, 110.91576201976343, 108.94500818775288, 108.42262828804854, 108.0666783138811, 106.39579521039526, 106.14895666207596, 106.04174816129786, 103.10614075544662, 100.19223854240585, 103.27719645673824, 105.42919127419856, 105.1908242370837, 105.10668554341736, 105.12575383099906, 106.1725294232026, 107.06165449587613, 108.43971181162466, 108.02028062324928, 108.59484967063491, 108.9123198006536, 109.0069694316838, 104.08204948840648, 102.32902358986928, 102.085862339169, 102.7796622621382, 102.24278044296608, 102.27700027505446, 101.73501035286336, 100.86380458325552, 101.07604313071896, 100.59252366363212, 100.30348264790952, 100.42338265499532, 99.63375300062246, 99.09110904582944, 98.49583397191095, 97.27999397408963, 96.39631292545909, 95.71389283699034, 94.57472363795516, 93.74444288663244, 93.68305679225024, 93.83886248972922, 92.46889567390288, 97.43196783232182, 98.11017123895112, 99.01695049330844, 102.71393412737316, 106.37203869312172, 106.53598930376594, 107.3988394816371, 108.24646647634609, 125.2573329431217, 132.35263321451913, 132.61394469537814, 131.73460320798318, 135.67191825404606, 135.8551264586835, 136.17892816573297, 132.87748962215997, 131.69772956216931, 132.80202418137253, 133.64655960644257, 133.2120137388733, 118.72226706629316, 114.32290059492686, 116.28695689371304, 115.45682335737628, 112.90967372603484, 111.8948337868036, 113.44263047230002, 113.68888344312168, 112.5690350234205, 111.4341294494242, 114.49740362270464, 114.53099031170294, 113.65480810410833, 114.20676486056644, 113.93969562955182, 113.50995140818549, 117.54186245393716, 119.1189759197012, 120.24988653392468, 121.735143632742, 123.17720343121694, 123.4370651871304, 123.80584968845316, 124.51829511500156, 126.9465708703704, 133.1602961878307, 134.4132918678805, 133.453208601385, 136.588835728836, 137.04021869187673, 138.70130341526544, 140.12214567094617, 143.11063785465296, 143.02316499097415, 144.33822289488018, 146.9116980112045, 145.63367982469654, 142.65012995845004, 142.6436560901027, 140.43392231286958, 144.1307113145036, 149.1282016588858, 148.97512217071272, 149.34105655018672, 150.5008257219888, 153.0724788951914, 155.0524785427949, 155.50728731325862, 157.185856898615, 158.57618693036102, 160.1447862044818, 160.53253513577653, 159.4897453561843, 155.96761056162467, 156.81398447284468, 159.3302757272798, 158.77378202822243, 158.04742902100838, 157.3753342902272, 157.54797352349829, 156.94015420689385, 156.2728915262663, 162.26834678600932, 162.98959663414254, 177.21397182677794, 177.77981568534082, 177.42690837005912, 175.3910828932462, 174.8391534742926, 174.57900410527543, 177.32606677124184, 177.66871569257705, 179.28591878898226, 180.60099163920012, 177.16807475303452, 173.90428585098817, 171.79533641206555, 172.475558162854, 173.10795983247743, 173.94721247953302, 174.49379694351074, 174.15443635799875, 173.30601467016805, 171.87823261873638, 171.4749944023498, 170.65548307967632, 169.09288618059446, 164.76652151447243, 162.23030134142545, 165.3082641496265, 169.51198717826017, 170.91687893829751, 172.20761882998755, 172.62080091223157, 175.83836963826644, 177.27242236336758, 178.50970726786622, 181.6118805374261, 182.42352280166511, 182.68906059274815, 186.9841400331466, 190.4792888277311, 189.26421136920325, 188.0156018103797, 186.12068636606887, 184.5534246510271, 181.6935313921569, 179.83075024439776, 180.61722478446936, 178.49831231489262, 176.7016709464597, 173.40556355314345, 172.63584243650791, 167.55313850910363, 167.980610313103, 168.85467915289448, 170.69388355711172, 170.36776863678804, 171.11116784142544, 171.89409166378772, 170.48313533691254, 171.70866305812325, 173.23067040919702, 172.20274189768128, 169.11521110994332, 170.6980490299467, 169.7311276530501, 170.6475229501245, 169.41416052816683, 168.9738621260504, 169.05627117724868, 169.10030862558358, 169.5852276776377, 169.26392722268906, 169.8732855853512, 169.55173209049173, 175.23961843135697, 175.6386981679116, 176.96433121910985, 182.3298670960791, 184.26282886305637, 184.55448881613688, 186.26573125054463, 186.59381106084652, 187.0909746523498, 186.43522212371616, 185.18698256178027, 183.62860164618087, 183.9802510096483, 181.87181155843447, 178.9660997754435, 171.20346661321133, 170.49353709648307, 170.881939730859, 171.24185355703392, 169.7943000824774, 169.1912734764239, 169.33298907757546, 168.8794366609866, 165.05836021732026, 164.19574894218798, 164.72927592203547, 165.5916626662776, 165.98113624004046, 165.1450741084656, 162.77638861344536, 161.5759326147681, 167.1466273960473, 166.56726594810146, 165.96282500303454, 165.592686387644, 164.46444718658574, 164.70292369817932, 162.01383660690942, 160.6259239415655, 160.053544583489, 159.7662240904918, 162.9748501344538, 163.082654855042, 158.0094427396514, 156.04247509842824, 155.171941657174, 155.21169838484283, 154.4215992298475, 155.04705126509492, 154.0429943109224, 152.6026873181606, 151.56227337791782, 150.29627443129473, 144.3254690462963, 144.35710073576095, 145.68301073747276, 145.83424018152814, 146.06534173241516, 144.726986620526, 142.2976679144102, 142.80082613981415, 144.09436913445376, 144.91287236274508, 144.90880763445378, 147.2625878845316, 148.61996521374104, 147.51974345938376, 145.57491814488017, 145.43772379248367, 144.95563588422036, 145.54845062231558, 144.49255229053844, 145.82961370098042, 144.92553668915212, 144.6479652814348, 142.69977097408963, 141.34686096638654, 139.1264824632742, 141.01173792507, 143.4334769852163, 150.05971055197634, 148.88997414558045, 147.68533642966074, 144.83715000646467, 149.52483475785868, 148.55734697455648, 148.57100002310926, 148.84185885877685, 147.40122183535635, 146.676582625817, 143.03735832812012, 137.75577560831, 129.01899505469964, 128.85386321140678, 128.43588823023654, 125.26692941253242, 121.83893971654216, 120.83688718456273, 119.3787252937286, 118.16725711601308, 117.85895283823528, 116.94395260737627, 116.52081844008715, 116.9070457359944, 115.47993441728916, 113.18139614923749, 112.13032446638655, 110.65879195331463, 111.0143891993464, 110.37706425816864, 109.6291137342048, 109.32098028921568, 109.099763820028, 109.97307853081232, 109.84289075, 109.16277165351696, 109.71098915795208, 110.32960656255834, 115.15142686974792, 114.4937148530968, 116.02374343277312, 115.82079920074696, 117.060124970277, 117.04098573008092, 117.19495149323065, 115.865679718643, 116.03081086282292, 115.74137728190163, 115.9667294860722, 115.44786931154684, 111.60886982772848, 111.7167296311858, 113.23373101633987, 114.78898566330726, 114.75127542880486, 115.48171324718722, 116.4121484020386, 118.08181433278868, 120.06019043207282, 122.31221511414566, 138.3556147917685, 152.40423915849675, 155.15725370759412, 154.57724177149683, 158.24918665802988, 160.03060013523188, 161.89219838359787, 163.02652039464675, 163.24860713398692, 162.9078367752879, 162.8548535101152, 162.17812569903515, 146.90851956201368, 134.6300184669312, 133.18664780820106, 131.51157035869386, 135.1948783897448, 137.2004665988173, 137.90688004326176, 138.3638818478836, 139.97941470557112, 142.97693954769684, 147.63327802054158, 150.03226631574856, 154.11063057056103, 156.20727012721756, 158.64416876664853, 158.56437741293183, 158.84389305431063, 157.2767676930439, 157.93472911251166, 159.3148489148771, 159.47827865515097, 156.94257404831933, 155.7853818881108, 155.32023332656397, 154.45624843907564, 153.76902588865545, 152.05083921360247, 150.0240527788671, 152.81747016931217, 152.8499480945378, 153.8492731525833, 155.68371782469654, 156.1784889467009, 156.57347908730156, 156.28242520782757, 156.3085188298319, 155.60012084220355, 156.15259097742114, 157.31242670837224, 156.37058734344848, 160.54797233084344, 162.2083483139589, 164.20638388616558, 167.06680548148148, 168.48294256846663, 168.73069607500778, 169.0038272249423, 168.59079948591662, 169.387357124183, 170.10106944911297, 170.12424715488902, 167.37776397307812, 165.8686522926393, 164.27723959663868, 160.99445406084655, 156.2432912121849, 155.45746878252413, 154.79055748194833, 155.1752577685963, 159.7526253685788, 159.12747538406475, 159.2584487440755, 158.845026005291, 158.64846875910365, 161.08113242226895, 160.6668246276844, 160.36572682770455, 160.58534137885152, 160.74371045028013, 162.21306159920505, 163.2596425411771, 160.60665846101773, 164.05493762869594, 165.59005125272333, 168.57668545689387, 167.43090145160284, 172.90012894957982, 174.82836004987553, 176.84814416651105, 179.69620527163087, 186.8189719926081, 190.81180848031437, 193.24172679225023, 193.7766231408341, 196.0118002762994, 198.69182414721448, 200.816401503657, 202.41951290421724, 204.34011263375348, 206.08934663499844, 208.83449671381888, 210.78672871210705, 209.073853727202, 208.61676118868655, 211.5117255267663, 212.10045549385316, 211.4867751059757, 211.16926213741056, 210.423564193822, 206.4716191336757, 205.289830698154, 203.31726939962653, 201.91204128312387, 199.5852488046997, 197.66385270144724, 195.6457391046322, 194.9265378734049, 193.9818020815437, 196.3294360948925, 197.46174545463745, 197.0111595640257, 197.22877472276687, 200.3688647079054, 203.13196598054776, 204.1588657708528, 205.148876799705, 205.12208245564892, 205.0790439565048, 209.17997177038592, 214.5252998694775, 213.5490420798397, 214.3267031399004, 215.9230148387022, 216.27860508581867, 217.2270311869748, 219.44939709570497, 221.55178430781203, 223.1954568825864, 225.7411742106287, 226.28419149937756, 222.84380129723, 217.40849679084965, 214.66339723934016, 211.5015695347028, 209.9637151230937, 206.20781001828507, 207.06839362777063, 207.07303967507, 207.5291816864301, 205.1271936118892, 200.47814897782447, 196.5069564337846, 196.89529312098767, 197.6023177445534, 198.2106796408341, 199.01423320806097, 198.103668590803, 197.8762985971833, 198.34766042545908, 193.6257070981948, 192.60278212706197, 193.3987441362434, 195.0698474525366, 195.05388555804544, 197.3459205646592, 199.01691984041395, 203.23592142880483, 209.420462126859, 211.4553807237784, 208.5580770713508, 211.34821153866133, 210.8291137705833, 211.34755438709928, 211.07473039830376, 210.1673816755745, 208.7980818498288, 208.32699521957676, 211.03560005462185, 205.87301333232185, 199.9249239151883, 199.65898524603173, 198.5930320857454, 197.72148350809215, 196.1612848311547, 193.90791958722377, 191.63530460007976, 190.74496011811397, 189.89679346272956, 186.77788709762248, 180.99771946397448, 181.6639535047464, 181.0720401756925, 180.26958533702475, 177.5582110145104, 175.7748691276066, 179.44921157600953, 180.9440403548864, 182.42633560947712, 181.97132076229383, 181.7610837535792, 182.72581517474003, 180.1144704072518, 177.27202244364395, 174.38139772167756, 171.97657344740117, 173.8360608057067, 176.04332650952838, 170.94152862737317, 167.77015433730156, 164.3877884070962, 163.3781381993464, 160.35956165837092, 159.72979446467474, 160.39410496817618, 160.41496550319016, 161.17866044772828, 161.02324317950513, 154.7148182962963, 156.27515648797268, 156.89205075373485, 158.41216087799563, 159.20197357843136, 160.42351623818493, 160.98473850303455, 160.318016958061, 159.1157053313103, 157.39630355112044, 155.6302148741707, 154.87714948560537, 152.24548863095237, 154.90521829559208, 153.33731495666044, 150.27106167693742, 145.74144944288565, 144.25865047393404, 141.89962570938374, 140.76898615063803, 139.4691762898685, 139.77682456427016, 138.47883706769375, 136.89470964729225, 133.7827242282913, 131.5307731601307, 133.40203439990412, 139.80989323101463, 141.9840604389978, 141.30681768674137, 140.05467146354323, 139.9723772354145, 139.08826995053712, 137.1046519449113, 134.88944569996886, 133.30084257889823, 132.05527888198498, 132.71691711850295, 129.54656990320572, 122.9906131199378, 121.68672126558025, 122.57084003999378, 122.00567187387176, 121.13228117857142, 120.43071477326484, 119.86732694179894, 119.76130817117956, 119.07951837248486, 116.45210365258, 117.55921357127296, 116.71611988165266, 118.0725500448654, 117.46137652591035, 115.77073326011516, 114.57834674089636, 114.34228499803764, 114.41066079629628, 115.55610969646747, 115.18432971078434, 115.66579291549954, 113.7316432620565, 115.24548029225024, 114.55130630127606, 112.2722060813294, 111.3975691083878, 112.7236579317616, 118.2614008994709, 118.38619120339249, 118.17965372798008, 135.0793360996732, 143.49049169133207, 143.8652817489107, 142.90774887729535, 147.45867712620606, 147.4955826234049, 150.5533568521631, 151.8980970592904, 151.7819144964208, 147.416179442105, 149.03863684663864, 150.00235109305945, 132.4890417920617, 128.0348983227408, 129.28576108971367, 128.1767034911298, 129.0526734822596, 129.28948648067174, 127.66342815398382, 127.99735584795746, 128.16472558629007, 128.93884367514784, 129.49767944463565, 129.1085393282164, 129.95619159235918, 130.06936272751324, 130.47903921086214, 130.370441028089, 135.19176765365395, 136.53250917366947, 137.2817790691721, 138.03708660269984, 138.89715634189233, 138.28779361056644, 139.0300272443978, 141.14174203391215, 146.452754701136, 146.72287161922313, 147.017507532991, 143.7734646774043, 146.4314391354653, 147.53593403695925, 149.65214058706815, 150.7611834554933, 152.42499955711173, 155.02828430532213, 154.87446386577966, 153.33614635815755, 150.3015569228914, 150.8965040866013, 152.16652300599196, 149.7259075774093, 151.1793431064439, 151.48911879069405, 150.79597843718255, 148.64732542615934, 148.2333582298475, 146.80018536220044, 148.4646733049331, 149.60206816293186, 149.55588099011825, 150.5040564830059, 151.26065685286335, 150.47040295860566, 152.62242651129878, 152.3049370222283, 152.02589027069715, 153.86893602675914, 154.9709656283847, 156.53068794794584, 158.40827420328569, 159.03669633931165, 159.63717478669537, 163.25083690056022, 169.1670101999689, 168.69756523008093, 172.65480449354186, 175.41588213756614, 176.19353139530682, 176.2374497798008, 176.8580567855244, 176.4516262578587, 177.8449518639383, 178.07442343051136, 181.2008927407408, 179.55056829528482, 174.35605550925925, 172.77689771977327, 177.57929928355276, 176.4959271190476, 177.8298428427482, 178.71251595815727, 179.0412879077107, 181.1259915568783, 180.1924555335356, 182.5222928417006, 181.6447981023187, 182.7541025338469, 184.40114914698103, 183.4892283250856, 186.4972380749181, 191.04751963881108, 195.2773965919339, 200.0831918230995, 202.3357023417367, 203.188858879474, 208.96200277155307, 208.9415376794273, 210.83455817631497, 210.45593179076025, 210.03488609407097, 206.7453026706117, 207.11571227093057, 210.15171407819795, 205.5636522864924, 203.26010803205725, 203.51799787013695, 202.17122945649183, 199.5807380609983, 196.90690319779023, 197.53937922300037, 198.8863913637566, 197.34090251781825, 196.0063559042173, 194.625062032991, 189.45853896265172, 191.14826819996887, 191.4284433022876, 190.38460594179892, 187.98842152513225, 187.45443014223463, 189.3759228417367, 187.4948965402272, 187.16052264441203, 187.78624886165576, 186.29395158294423, 186.55682650077745, 184.506735964986, 182.62766642250236, 179.4906567997199, 177.13469670502647, 175.5122554775132, 173.80213845743853, 170.40219491581075, 169.514803710084, 168.27503004473556, 169.060594963352, 167.5921232892157, 171.14934489666976, 172.66847869273263, 174.79667033504512, 177.15965861655772, 182.5747743545752, 182.3757636248833, 181.6124864823374, 183.9847079957205, 183.3884708629785, 183.26862712426083, 182.50083434687207, 179.85098550326796, 181.68609053445897, 180.68624561476813, 181.1367757201992, 180.18029208629005, 175.6803434039838, 176.9198736733582, 179.032888666122, 177.44486020502643, 177.58284119460006, 176.2027948611889, 175.25549284562717, 173.06481153600154, 170.8212031636321, 172.43718680539993, 170.102464423047, 168.96432993145035, 168.0166312456427, 165.1260329127691, 165.07128316059757, 171.94816655042015, 172.2678817918612, 174.13237419024276, 174.6335502782914, 172.39546501027075, 171.50067918487397, 170.907478674681, 172.20248798202613, 172.47609852769995, 174.6513003020295, 176.14731345066917, 177.46268192701524, 174.20843121630872, 181.2162098480392, 182.08501035933008, 183.68083911756923, 183.4486270218643, 187.50098474439773, 186.3312078323996, 185.4100508790072, 185.040060902272, 182.84993337675076, 182.31826867569248, 181.36768203921568, 177.9875665868347, 172.16243562955182, 171.0074021424675, 169.44240565429504, 168.66792054147214, 169.45245638731842, 169.79598299151883, 170.76956214005602, 170.7991595375039, 172.4512219736228, 170.77076966207594, 168.5445509360411, 170.33126260224088, 169.83999724642078, 168.89761014060068, 168.09453339993777, 165.1131956062033, 164.54635522253346, 162.4998492641612, 161.37825586204482, 159.8223857717865, 159.08707763141925, 158.76381213079677, 158.6907464354186, 157.12753921988795, 156.88190579162776, 155.25726752155305, 154.78286323630564, 158.48686787760658, 165.9771810236539, 166.7388707335823, 165.51785625661375, 165.21747586515718, 164.93607288733273, 163.2429758330221, 162.3695904852941, 160.95846417810458, 159.7945637990196, 161.03316233060673, 160.3262407369281, 152.15165864682538, 148.41329676128228, 148.6470569911298, 149.937707146981, 149.95275600404605, 149.46398620129162, 150.034264428338, 150.76512976641766, 150.64142651517272, 150.5651864080299, 148.7664685068426, 148.3259406809835, 147.34867238437596, 147.59936141931215, 145.7344912340492, 145.94867763997823, 145.3622115690165, 146.3451135322324, 147.23087225832555, 147.93844236227824, 148.90702854435108, 149.53908305228757, 150.56023126688456, 151.90974472759106, 151.69381267328043, 155.62251304761904, 160.63472800108931, 160.84885738157485, 161.5278579807034, 160.21415634056956, 159.30434593736382, 157.92657429590724, 156.5891445673825, 156.5037721309524, 155.8505409483349, 154.69689734578276, 150.7128875673047, 148.39211973459385, 144.66815450085588, 142.82300919919078, 141.90611229652973, 142.22368812239338, 141.94035612309366, 142.55541595821663, 141.88094894039773, 159.7974006100996, 168.95129902497666, 168.98877539285718, 168.91347761002177, 172.8538011760796, 174.22808837527234, 175.813932443822, 176.84818075879244, 176.88884708870214, 179.9980654900405, 181.6333616310302, 183.9915087625272, 166.41651183590102, 160.1320866711796, 161.92177368292874, 161.9054752756769, 162.8235575573452, 162.47221712021474, 164.98008589830377, 171.5380964432773, 173.92854480018676, 171.57649710270775, 176.91957712410522, 174.3979738576097, 174.41418318183943, 173.86460956956117, 173.32032603843763, 170.695302243075, 172.84877432710863, 172.19243166740907, 170.47863648171491, 163.7937490139278, 162.14528540507314, 158.57302960122936, 154.1980400480081, 154.95711188219735, 154.74393307694913, 154.4191206257392, 154.98975096895427, 153.77325897346324, 158.25671799424214, 157.96557047541236, 157.6281935374261, 157.5808535392157, 159.9227045893246, 161.28826762612823, 162.40595261344538, 163.5176274188453, 164.35978889239033, 165.7641400250545, 168.4730487821351, 165.81607542794896, 168.39708559282604, 172.12258617934953, 172.3252870150171, 172.454429617258, 175.52790851525054, 175.9169380348584, 176.6632742324152, 182.5537862082944, 183.97811941285408, 185.3281298405592, 185.35715925490197, 184.73492012013693, 183.02345694102084, 180.9667398002645, 182.55720295035795, 183.97201909181453, 181.98723138896668, 183.50820539176783, 184.20940749237477, 180.68220698474943, 182.28466041051976, 182.7561306346872, 200.64156442156863, 218.8051542429194, 243.90130929209465, 261.02665159360413, 276.00888891013074, 290.6667279220355, 303.56476644561155, 314.82908066487704, 327.2382672895269, 339.19324849214127, 354.8493389817149, 368.10819174712105, 365.4159521397448, 358.7163693894335, 357.0773891920324, 358.4049538218176, 359.895695003268, 361.92464730563336, 364.7231301548397, 368.5626312619826, 370.5978511202926, 371.43261603104577, 370.0599565816215, 371.6789407668846, 358.81688866487707, 342.16291001221595, 327.80120469405534, 311.0038383389356, 296.65585673552755, 280.8171812416744, 267.4934384736228, 251.93892598459385, 241.0909857023031, 227.27883259998447, 212.255827679972, 197.9719325094149, 196.19005132166205, 192.92350758176872, 192.94867467009024, 193.4975160986617, 192.28065618448488, 190.90245250863683, 187.4600771990352, 184.72238397447867, 189.3096275368814, 189.8837561736695, 189.41514770245425, 189.0903151532835, 188.78781830882352, 187.56073762628384, 188.71283039822595, 188.14160318915344, 186.9662356144569, 186.73607677910053, 185.9897660439472, 182.6400956553844, 174.27729188998728, 172.28405497447866, 170.37988426314968, 168.40381363655462, 169.96576175876191, 170.7671286028841, 168.8753894319172, 170.47998639386864, 171.89235579964208, 171.57945804217243, 174.84902593650796, 178.35178386655772, 180.10078586609086, 181.36845927567697, 184.8392478948134, 186.4458737780112, 183.7687006642546, 179.6556557358388, 183.8440618257593, 185.8229683243853, 188.6718124341737, 189.4668792713196, 187.1816410785092, 185.0122326619203, 185.39985027318707, 185.6749872920168, 184.574904351774, 186.013592459695, 186.27761662332716, 185.1804905166511, 186.77484816939, 183.54172069744007, 181.27494044078745, 181.39432333784623, 180.53486697634608, 178.50463674284157, 178.92297919374414, 179.12133033076566, 176.91184428446934, 174.5527006014628, 174.37625812363837, 171.5979184597728, 173.5855971581077, 175.26402709975102, 173.06174995953936, 170.9762957411875, 169.60623165577343, 166.8940280691721, 165.94085198241518, 170.53218369133208, 171.05621020121382, 171.1465523706816, 169.7861047342826, 168.1484278760822, 166.7879783860878, 163.35686833302208, 164.61494299469732, 167.8993730717398, 171.91753383333335, 176.1572071947557, 178.8820594940087, 177.70355487145972, 179.43671183893554, 181.2211099467009, 183.00833992086837, 183.25458712402735, 186.5772433611111, 187.80304043874887, 188.80275593868657, 187.98686785885465, 185.2172200570339, 181.7887363856209, 179.04308254722997, 175.44886107033923, 178.7632410465297, 176.5175134159664, 174.08486997004357, 171.70775882913165, 170.516838164488, 168.63121605539996, 167.51057671218487, 170.9162862559913, 169.51945324789787, 166.91568112387176, 164.45507730711174, 162.30440518744163, 152.3271789558411, 151.07370228943714, 149.52574711124325, 145.3044602690076, 146.56694631109892, 145.87874249916354, 143.64333204412628, 138.06412563764394, 138.55250269973544, 139.23350428882662, 140.7473281239496, 140.91472752536572, 143.2279579033992, 143.92866708429912, 144.86481254968575, 144.7950586928381, 149.8907139293163, 150.8060916528167, 150.7005338879552, 147.53796215250546, 145.1926761800498, 142.59723808320365, 141.41616019467403, 140.15709582840617, 138.92519977392385, 137.55904501916493, 136.18435013415643, 132.5541682648671, 130.51487668308434, 130.2566399607843, 131.16744522027702, 132.84241673918456, 134.36605439355742, 135.6616140201525, 140.68039303516963, 140.9611695967943, 140.6425303934018, 140.1446006634765, 139.34270290802988, 136.50648490873016, 134.0830769589169, 132.25062842919388, 130.5931024118425, 127.80093289433552, 126.16642150326796, 123.76747243129472, 118.75796537387178, 118.95419422175536, 119.604252573296, 119.85321437099284, 120.92253957609712, 121.26214194996886, 125.1497602289916, 126.3423242347041, 126.86185639285716, 129.42871625365703, 131.20111567507, 133.2320348462496, 134.58581989503585, 134.27683987745098, 134.44172312822906, 134.5226980374261, 134.85403906839272, 132.9223628749384, 133.17677451213822, 132.79330343409586, 132.48801521249612, 130.78636810792096, 129.1935776732026, 129.5960992273576, 129.93741159399318, 130.19393696051344, 150.76046664713667, 161.1646866458139, 164.7607701306411, 165.63415587598635, 169.36546426820726, 169.63936813920014, 170.26041322836912, 170.83666936803613, 171.63394329372858, 171.1087679494242, 172.0473486469032, 172.85977217696706, 151.45327086492372, 144.80477907664178, 140.71258135247433, 137.8678138959695, 140.79070192530347, 140.75553868113911, 142.16517561305113, 143.9815594196234, 145.35775633574542, 144.93060805913476, 145.92182186305632, 145.1282863069561, 145.56506913694366, 146.0256401549175, 146.9919749421102, 146.41069357454091, 149.29166558595549, 150.72570054411764, 151.66735052124184, 154.36539917592594, 156.31866999595394, 157.12365706676005, 159.88484153859324, 161.53103696280735, 163.2216221407563, 163.7561782017585, 164.5323185723623, 161.94529323299165, 165.78764429660754, 172.7796721816838, 175.8568383240741, 174.05909911772486, 176.54986793946466, 177.87816381629318, 178.46462565312015, 178.7834981352319, 178.6718470059913, 179.53361509609402, 181.90070442382512, 182.54433309243697, 185.2695719186119, 179.59499168744165, 178.10218010364147, 178.89105316876748], [39.52667935773485, 39.25551941184253, 38.85909264386866, 37.48941247635199, 37.16242120113601, 37.00649428516963, 36.017470291584964, 35.84839196483038, 35.381092646825394, 35.97557484492686, 35.97477132236228, 35.62875580688729, 35.25960304419546, 34.934210822365564, 34.84139545206971, 35.61612303103667, 35.678361335190374, 35.799344119825705, 35.536321171413014, 35.46395679807748, 35.61237030042017, 36.92275076532835, 37.31681421475257, 37.51374246496335, 38.36424427913555, 38.43519920628632, 38.17548630275444, 37.566078822517895, 37.42407376523028, 37.69279710625492, 38.81580182710862, 39.22380147930284, 36.10419076471496, 37.487813548026246, 38.01301185830999, 38.26976523764981, 37.82892945370371, 38.11904158403362, 38.37428172245565, 39.08618233574541, 39.464366110952255, 40.23530066069419, 39.46417912655618, 39.66051493767508, 40.169960536295264, 40.46565680664488, 41.13575089659197, 41.60727092755991, 43.48248639503579, 47.14829043985373, 48.77958123015873, 48.088835636009954, 48.39888775505759, 47.91896692334592, 47.76504802661064, 47.61727217226891, 47.67527149749013, 46.76569612791784, 47.06955052552133, 54.24557761882719, 51.79280655734516, 49.46146443997403, 48.61311550062248, 49.672102590802986, 49.28346221122588, 49.13857543938688, 48.73508087710862, 48.5315535140056, 47.34435663017429, 48.36934223358232, 48.57645105002076, 44.02195863569872, 43.6474461537504, 43.5357983799292, 43.55455159796141, 43.46877932773109, 43.49474068713041, 43.31258439347962, 43.94618118036104, 44.32772942405851, 43.41573108870215, 43.96944750389044, 43.18317199019608, 39.93412842841583, 39.74630391658887, 39.475143707730325, 40.63277389865456, 40.45959462892935, 40.122233358465614, 40.329177589283766, 39.61267584948971, 39.3942567023609, 37.92930976349559, 40.62167248327109, 40.88130200658304, 40.89337740457714, 40.42131813562091, 39.08969050801432, 38.404018311201895, 38.80035823506069, 38.77454339219773, 38.44001041845627, 38.59945255454405, 38.44723293845316, 38.611760840119, 41.344814077808905, 46.483521077981415, 47.5641752655083, 49.848624473290606, 49.939416053137, 51.32109996675699, 52.17300451395697, 52.1377922984134, 53.34834821589616, 53.11736980808314, 53.42862599756605, 52.72766189302777, 45.389645971450165, 43.116706363138725, 42.412194315592906, 40.12682381444539, 47.44640216511048, 45.24641961959228, 44.5417233309278, 44.98056810309679, 48.73194609975101, 49.75587961142234, 50.017532003345785, 49.26920751509492, 50.68233287141302, 51.10355398304804, 51.55644495417055, 52.06739306887126, 44.95452368508533, 45.20674429954159, 47.689457737299, 47.51642713612732, 43.08068244109866, 42.74234113457764, 42.49742476999689, 41.18746618028453, 41.69673523039216, 41.6599760645814, 41.425289294740125, 42.09406136227824, 43.03357142196222, 42.14410002042095, 42.310881676237166, 43.48890100971316, 47.50447364729225, 48.1740988786181, 55.596571809948536, 55.75068855835667, 57.80746812745098, 58.16528869265484, 57.60330709710682, 56.28578114052287, 54.611236979223534, 54.43400656528166, 53.49846083107688, 52.276240419856826, 47.75934184027455, 47.38745105379426, 40.97525039145658, 39.39824782244138, 41.3442402275813, 42.61751189021164, 43.92112336892768, 44.9297627395736, 46.092033665004536, 45.99410683076564, 46.06862396716465, 47.421730953625904, 48.02989902403906, 47.4839750057209, 46.27275696001596, 44.81986978039516, 42.86013090857454, 42.2978330131497, 42.15528952902272, 42.28803616511048, 41.34261372253347, 39.0687566302521, 39.08060748320625, 37.2670918969032, 36.41335926015407, 35.930873137177095, 36.27570726486151, 34.35758598667871, 34.81429838017429, 34.48232002326487, 34.25850072323374, 34.42332331654348, 35.78139886904762, 37.13558196008403, 37.531396285059415, 38.921887301696245, 39.11621277170481, 39.37139881535948, 38.65842086904762, 38.775900927913305, 38.74528208037659, 38.117865941795706, 37.01080568067812, 35.24730073747277, 33.17133888275441, 31.40055636391224, 30.743817085823217, 29.25114469413321, 28.896802834417475, 28.44083347509727, 28.204265056411455, 28.233476409853854, 28.811107234126982, 29.733584372159974, 30.34475866682229, 31.03946452801121, 31.670113865851626, 34.63495830345472, 34.35583332361334, 35.42462469973545, 36.09469231605976, 36.67674659172568, 36.93628012729537, 36.99794909767737, 36.41495617577031, 36.63154613748833, 36.94162092770256, 36.999122966542174, 37.380231865624026, 35.07422723272124, 35.88511706646178, 35.27517520121382, 34.8256350331466, 34.5272525943822, 34.629829611733584, 33.533446139439434, 33.87473931271397, 33.68565829225023, 33.07250920143431, 32.57635100194522, 32.067270612464995, 32.16529989729422, 31.334487639978214, 31.41635975787881, 31.653894848576748, 31.740694319861376, 31.78659820603797, 30.7791021014667, 31.662302075759936, 31.765321392001248, 31.935996249221912, 32.43049222719486, 32.54355662224431, 32.336745361068324, 33.008465948957365, 32.74198829870837, 32.16473532765328, 31.610283724245253, 30.941791735449737, 30.13383360247432, 30.76019213227513, 30.90656506652661, 32.62803873890835, 32.99517416542172, 32.56815988694367, 32.38581646802054, 31.348180786137707, 31.21030025560225, 30.97864753913788, 30.72747539441332, 30.772436213946605, 29.060359779264694, 29.888366658636787, 30.360911621304083, 29.23188489363523, 28.56923978361541, 28.871079468626807, 28.971301242063493, 29.971530021786496, 30.095626589528223, 30.56213971218488, 31.121899232242075, 31.44023285698724, 31.76679452749144, 31.58095094747899, 31.404812651882978, 30.536917455182078, 30.134440683308046, 29.68377576704015, 29.39656045882677, 28.325012340258333, 28.20641286764706, 28.220044976890755, 27.78779697012138, 27.519367844460007, 26.47163960279668, 27.361726088779957, 27.958824285014007, 27.956678861500155, 29.56060324836601, 29.9993874134765, 30.28082542437433, 31.22935952995643, 31.01445510154061, 30.684525336056648, 30.82625974393091, 30.822352160441955, 30.016957103417138, 30.868700572990637, 30.75528623926237, 30.635230279567388, 29.196119229225022, 28.88839459990663, 28.70481612830105, 27.46215529154995, 27.492803824646447, 27.73212014386866, 29.50713237169312, 29.770033690152644, 28.65001732796452, 29.12283941105924, 29.98224196329131, 30.60104492374728, 31.09973089553183, 31.540608456816063, 32.11463058644569, 34.85778749867725, 36.83558427600569, 38.859648523028845, 39.5063669135687, 40.95945587021476, 41.200774312091504, 42.571553857531896, 43.809124763166565, 44.749141569561154, 47.67449020245876, 52.75223695066915, 55.18971398568316, 53.82288937784004, 52.38718417507003, 50.72739423233738, 48.75825724770659, 47.59159955220978, 45.6232971906318, 46.0105265507314, 45.688630531123565, 44.23925273980704, 39.74173255571117, 35.80508009842826, 33.57355229380641, 33.398780837846246, 33.06194499085163, 32.947093105353254, 32.86143511996578, 32.68512763204171, 31.690224830220977, 32.51390150060626, 32.17686914192343, 34.87563996350762, 34.80944687457205, 34.47998133176289, 34.51610649245254, 33.48031743954249, 33.44200484414878, 33.47028450816475, 33.56275418604108, 33.50687181847183, 32.33434216004007, 33.207285424447555, 33.252464906784944, 30.468019681528165, 30.35450583473389, 30.31814311476813, 30.179438574618743, 31.010145241557087, 31.311962244631182, 31.360752603096792, 31.32878300131303, 31.45778185333023, 30.560735639586717, 32.31126353524743, 33.512464991285405, 33.85691185830999, 34.07881200809212, 34.19518459192538, 34.2010561091659, 34.382390508870216, 34.16715703906007, 33.88749517685964, 33.61974509640264, 33.41149131585486, 33.13147253181856, 37.33690790763176, 40.29860829995332, 40.19246683193278, 40.35347971935376, 40.07778895144725, 39.73747346230115, 39.08394366392909, 38.69566859835045, 38.608649178172016, 38.19123125210993, 37.82007800902584, 36.86617697909406, 28.58260346029806, 28.44028976711796, 28.48851633719461, 28.1054018925096, 28.207507859710557, 28.27223009228136, 27.595467532057263, 27.9258411162465, 28.054174481948337, 28.327447204163427, 28.51145718617336, 27.28415619705322, 28.16103482485216, 28.191513243775287, 29.521903642468104, 29.39431910216309, 29.241063224147997, 30.28107938725232, 31.14861045066916, 30.96270470175848, 30.66855643145036, 30.63281872657952, 30.56170995845005, 30.614349476438814, 30.31630538336445, 30.860320855197635, 29.490110683629005, 29.503497951369443, 28.598551127139743, 28.069253662464988, 27.585625745020227, 27.60637321623093, 31.61630180174292, 32.32497090670713, 40.02114068790849, 39.92610759648304, 39.87643905407718, 40.61424071553066, 40.34167792460318, 40.51195575739185, 41.84036855820106, 43.45176133307008, 45.6912543170784, 46.904599631435, 44.4072595889064, 45.1334660771162, 38.87100232128342, 40.372132833087015, 41.55619146693122, 42.125328311157794, 43.393331435340805, 44.20478328727046, 43.83298729699658, 43.20909591378774, 41.820706202925614, 41.86411736375661, 41.16485842577031, 39.82823778061354, 38.56403010073012, 36.12602788881108, 35.93347655479109, 35.09550859763462, 34.0386290104264, 33.71203910621759, 34.1093316704015, 34.362002804709384, 34.75356169817928, 33.398015144880176, 33.2290800164287, 33.6532608029744, 34.29305475762004, 33.24709082335704, 33.84417234414877, 33.77539436647992, 33.804825008558986, 32.97356040164954, 31.716768318238408, 30.621310836445687, 29.283229251167132, 29.059116015795205, 28.96580384344849, 28.860903854497355, 28.068492394771248, 28.13440505010661, 28.024501187363835, 28.724171807812017, 28.59089942592593, 28.43009636943666, 28.22750786321195, 28.177507850248347, 28.851478387488328, 29.197285814476363, 28.44100679092748, 28.18338031640017, 28.541168071470075, 28.76632922290113, 28.74812876509362, 28.840495700280115, 28.945008064114536, 29.39646433294429, 29.819634824540927, 30.15494070697168, 29.481097935488048, 29.71950610558668, 30.301119561780272, 30.046438644802368, 29.6332409754902, 29.49382419172113, 28.09266405972871, 28.1560557002023, 27.968667413003168, 27.814164868871902, 27.6182637875817, 27.14789484998444, 27.746751222222223, 27.824213887332714, 27.71763608014317, 27.94721365110489, 28.27167452949865, 28.447507902198684, 28.817774351229374, 29.382907098775807, 29.48456467884182, 29.54020373537193, 29.835286100373487, 30.074396557656392, 29.213712560068476, 28.942682901676783, 28.748791628229068, 28.570626320340548, 28.492598387015, 27.61232539076993, 28.407092029800808, 28.39869834298164, 28.09997259430439, 27.923191484322277, 27.833406008792405, 28.271914702898385, 29.74469315717398, 30.31973067094616, 30.60562682633054, 31.03913555921258, 31.23200895385932, 30.81296310098236, 32.95655828003424, 34.17889841907875, 34.52250963064115, 34.546398530511475, 34.151573224097014, 33.94889835047204, 33.24414464347961, 33.24971726898538, 33.46570004341737, 33.799154576728014, 34.079747593059444, 32.56433801937441, 31.835544853096792, 31.51872460870423, 31.55242447735242, 31.60696957695301, 31.801675537293164, 31.407015225334572, 31.17355840428338, 30.81750836212263, 30.180042660908807, 29.34392917164644, 28.63122845992842, 27.310047394732308, 27.72454579582944, 27.59436088383131, 27.570294797152197, 27.436685715997505, 27.36167429217243, 27.45111876003735, 27.00822154081337, 27.39221296405229, 27.88566835729848, 28.299522038982268, 29.4025078706038, 31.281226915480925, 31.838871070494864, 32.4059795532991, 32.706398009726115, 33.08315113328665, 33.85334275194523, 34.472446336246634, 35.09884472139745, 34.64639852248678, 34.24667621055089, 34.031953928009266, 31.49641794458839, 30.1149097429972, 30.62503628275755, 30.961119706037977, 31.10240594654528, 30.95204566145347, 30.42396457228447, 30.104230781279185, 29.499531809835045, 30.03534216063908, 30.336894189386864, 31.835564426159355, 31.842566695689403, 31.22822185815437, 33.0709393119696, 34.19693006274454, 34.83973193199502, 35.082126728613574, 35.923798221022146, 36.85473249066293, 37.957997976623744, 37.752391199112985, 37.57778824644426, 37.06834367732909, 37.89278806707127, 37.14938995747973, 37.35318468417366, 37.7752502903946, 37.0691807648615, 38.97470233597884, 42.6500509326175, 43.93894462708592, 43.51973437130408, 44.200567897992535, 45.467678132664176, 45.75287430649647, 46.171348040397866, 45.111879788365016, 45.48383617250233, 44.58166464934187, 44.71916747424525, 41.4073930664488, 37.62021108520074, 35.36047635037348, 35.324342256302515, 34.79909274548708, 34.897599910441954, 34.708428242170484, 34.57329023590129, 34.16182217801381, 36.064663424291936, 36.9663009142546, 39.89502948677249, 40.16036571319639, 40.91513484718332, 41.63033580874572, 40.55306890545311, 40.21317060262994, 38.8755114020386, 37.98090199547271, 36.68425998827679, 34.08250871978692, 33.52293748358232, 32.66637164799253, 29.17312418331777, 28.613315284504363, 27.56695454302832, 27.086426567215877, 27.642710733737943, 27.17406451711796, 26.73340587177093, 26.130653673630565, 25.96859693121693, 25.81453376058201, 26.143065563881105, 26.16540644623405, 26.06129324587613, 25.969183004103776, 26.15306284718332, 26.241368498132587, 27.2082824572051, 27.970924953043628, 28.55778574883287, 29.115563680827886, 29.60945270837224, 30.09806389770348, 35.54676554084967, 39.55334884072518, 39.69167774470899, 39.983066723622784, 39.74990820518208, 39.48163286963658, 38.65055681333645, 38.33158615359478, 37.93761546047308, 37.6821926368704, 37.30239561367881, 36.137643590171706, 27.229323641534396, 27.042304206427016, 26.85472971483428, 26.584729642934956, 26.74274264153439, 26.791734562713973, 25.87722936826953, 25.93221777046374, 26.08915723646125, 25.9814379562714, 25.885284994553377, 25.71611206870526, 25.65416066409897, 26.13090114083412, 26.73962898179272, 26.964174157018363, 27.53028545845005, 27.66323102513228, 28.979069697310408, 29.29473039152596, 29.56611906252529, 29.68473050816993, 29.639008802598823, 29.80336445231676, 29.32497745557112, 29.502052771708684, 29.08110741122005, 28.9008242110132, 28.74322203327475, 28.752440075214626, 27.77619802591036, 27.313639460706504, 30.152786122938064, 30.04226724548709, 36.47387295689713, 36.240556455493305, 35.98832494032057, 35.57169242468098, 35.32806541106442, 35.218443364678016, 35.986676709895995, 36.01723002878929, 37.042365432150646, 37.53973709041395, 34.67417633937521, 35.04973196146044, 29.00752442966076, 29.438574629637465, 29.745866684173667, 30.440636107843144, 30.646301460473083, 30.818012333566763, 29.76477441223156, 29.626257087535016, 28.53705725731404, 28.373413164176775, 28.157824870098366, 28.05859516565516, 27.97957578485839, 26.8306237464986, 27.43269441223156, 28.436674592205502, 28.260231933629008, 28.15996348257081, 27.996674472144413, 29.46154853214934, 30.240048093292877, 30.00043549019608, 29.9322305642734, 29.605425454481797, 30.126242885908617, 29.099944572919284, 29.71478130489029, 29.30275305750078, 29.33685458224401, 29.97723058597884, 30.32495693471833, 30.31415382290693, 30.139480859943976, 30.5202182831505, 31.349175405073144, 32.135564526610644, 31.58223102023681, 31.706698086212263, 38.27724892514784, 38.17701548117024, 38.17826460318435, 37.35223263126362, 36.89439123708373, 35.99155273194834, 36.21127488538749, 36.12825679225024, 35.8605907359568, 35.42639877489885, 35.48690275560224, 35.2232874064737, 29.24490997292834, 29.49639710566449, 29.68598397183317, 30.14278619540085, 30.2266751065982, 30.596194100529104, 30.09303560674149, 30.304256362748998, 30.300316114399195, 30.473404646436357, 30.500472770303592, 31.21552897427724, 30.47589264791472, 31.25646502159737, 31.537130380549076, 31.783967753968252, 32.24139788849985, 32.0780877654522, 32.65469837223779, 32.31656095253658, 32.10551289106754, 31.90339333963585, 32.02233800645814, 30.878123057684046, 32.774470884687204, 32.59293363135051, 32.2617384094285, 32.01375493004461, 32.0016288881108, 32.579731319872394, 31.975286691312, 32.378456260971056, 32.87460508411142, 34.87552302591037, 35.49194943075008, 35.884918449272405, 35.1478090148615, 35.93680270524498, 37.776177492704775, 37.7179608540305, 37.9641772552132, 37.74191994234361, 38.62746405018675, 38.74584413071896, 38.03167206548852, 36.37542069864613, 36.03973225490196, 35.502871834186635, 36.2724911612272, 35.281163470468925, 35.55077539441332, 36.45962706240274, 36.39567285364146, 36.92251026984127, 36.614454643027685, 36.850288055088704, 37.71417719125429, 38.33425902956738, 38.52097678431373, 36.82182195525988, 37.4741486083288, 37.85084388180828, 37.89494924081856, 37.44155070300343, 37.58582511951447, 37.51162341140941, 38.24379613359788, 38.08529505096482, 37.72901334578276, 37.0510043820417, 38.06578057298475, 36.941389746965456, 37.51871907314037, 37.21965524642079, 36.77642633948352, 36.72476501213819, 36.78667892491442, 36.87949849283705, 35.95398241013072, 36.0341670611578, 36.30256581559291, 35.832356376329884, 36.07707529232805, 36.86195457749766, 42.97949906362628, 46.29126153431373, 46.60284644300175, 46.87690351050421, 46.9838272788671, 47.25185455283225, 48.253460925225646, 48.35472143160598, 48.114625629240585, 47.91189243230626, 47.78785863997821, 47.09780435256381, 40.06995668207283, 39.686955506925, 39.02348892460317, 38.406823886476815, 37.93110765398382, 37.61189623261166, 37.444501541939005, 38.03293511842515, 39.1236220187928, 40.14504331302522, 41.61376477614378, 39.32018291860411, 42.30843017390289, 44.04473451602863, 44.73852319817928, 45.4233454861993, 45.47480927723312, 44.92774597082166, 45.15276197665734, 43.815054065904135, 44.294456802443214, 43.00115609328314, 41.80721270907252, 40.32809544788714, 40.539613789327866, 40.3213413994709, 39.91221931878307, 41.49584490834112, 45.9058484398427, 48.768619081543726, 48.69837489347962, 50.09029578123574, 49.97789908789399, 50.21580018067227, 50.31398148953665, 49.97721941224292, 48.174774531201365, 48.5990027227669, 55.76143936941397, 53.716220038904446, 51.70538449089636, 50.03564154277933, 51.14094247562248, 52.16739884033613, 52.40750496471237, 52.35048379474012, 52.09100126097106, 50.98947337536506, 52.27549813952061, 51.845987461640206, 47.79512442591944, 47.00236508450046, 45.4588217823685, 44.7740851739807, 42.509246904606286, 41.17858015483971, 40.5967383793184, 40.83230324214131, 41.53917824431996, 41.24523936165577, 42.17783477412076, 42.23227340437286, 39.55839530672269, 40.03283021661998, 43.00323769654529, 45.6738126708664, 47.88806891485243, 48.064492540849685, 49.2227526974816, 50.26806253937131, 51.26553655392158, 50.63238046903206, 54.113401041525314, 53.92221348179271, 54.15887129512917, 53.40190968909074, 50.93872660262994, 48.28631766806723, 48.07556894747899, 47.68167917647058, 47.35302749254591, 46.53113230018674, 44.99305076423903, 42.195184931207855, 46.58736997177106, 51.27124391783381, 51.048865722540654, 51.66374882250365, 52.96775755057578, 53.04294519911297, 53.800901725645815, 53.799960294095605, 54.39631697689076, 55.26278549852942, 55.06782114164528, 54.494480804741805, 47.14424306427988, 45.905073142079054, 46.82184249092035, 47.94681977174953, 47.11022736788049, 46.5541253985372, 45.52475307586368, 44.916082222300034, 47.54798684663865, 47.5267496048864, 48.80447665437286, 48.37737956240274, 50.04237600427949, 51.22370443837535, 49.53694984633131, 48.51136717009027, 47.26449001704016, 47.023012351229376, 47.526333087535015, 48.17640233263305, 42.37000012083722, 41.0088243907563, 39.191769272005466, 36.65856124050731, 35.899463776844065, 36.11624173366013, 36.66049772839119, 37.730220606676006, 40.688199672813575, 41.93573462270464, 43.14656429419546, 43.32195653765952, 46.695977033924684, 47.00408427450981, 53.72547480276311, 52.94135107211329, 52.734217101385, 52.39190954940865, 51.47804392016807, 49.90262253451083, 47.63578488834423, 45.620100831310296, 44.43585229898395, 43.44791101805166, 39.99749830721159, 40.97663794480525, 35.67796484438488, 35.651397154839714, 38.63406998093682, 39.54240581613757, 39.40890451423903, 39.49084435911402, 39.65938027186431, 38.94483555571118, 37.97510627980081, 37.67778829131653, 38.48096283955312, 37.24615078345784, 35.61375673775807, 33.275318236318235, 31.234200257391844, 30.633581918943232, 30.607573736335446, 30.49509497610115, 29.640008350823564, 29.92936131157949, 30.81782349920567, 31.31078115821195, 30.47214860071261, 31.30575312719659, 32.28528667520222, 32.508757743476, 32.69064251301071, 32.99666184353113, 32.789978667366945, 32.66528688764395, 32.87268646358544, 32.91904485629604, 31.853341834733893, 31.404789045518207, 31.48086517896048, 31.121117423825083, 30.038063916122, 28.73246533604295, 29.40863957825241, 29.674527321895425, 29.986590989324625, 30.06654408162154, 30.492725334498527, 31.068327971735272, 33.04113422952265, 33.779283227824465, 33.78157068308434, 33.30723133312391, 33.69922029699657, 34.19583445059135, 34.508415905829885, 35.6963187366856, 35.45595059142546, 35.785565517584814, 35.579584738951134, 35.15748166604616, 33.343336274276375, 32.88569276470589, 33.105564789060075, 33.18567916998332, 32.996708171490816, 32.32772742417069, 30.096154157952068, 29.823894599256324, 29.488619331608568, 29.751712021708688, 31.2227115349362, 32.11352178415876, 33.759262014861505, 34.114315546238764, 34.43214722338936, 34.393825591192034, 34.44480642685963, 35.208396626782324, 35.67355599354186, 36.02662737177093, 36.21628683193278, 35.29823605951732, 33.24612036453471, 31.809973832088392, 29.584893787637466, 28.68788844763461, 28.136625413086804, 28.31916489896579, 28.55681449175226, 27.448840589480238, 28.40943098996265, 28.815495586912544, 30.56167519412153, 30.96156768323997, 31.46469124525365, 32.00500893495176, 33.789189997510114, 34.43471753446935, 34.78574924906629, 35.03967568215064, 35.21571449011827, 34.4196181276066, 35.19460411585745, 34.55917695767195, 34.16889842250233, 34.18559980267663, 34.19982477069717, 34.72189800248989, 33.954922895113604, 34.12073525078005, 34.16075406676004, 34.18725734329287, 35.9892884200118, 35.807183648381574, 37.767017817538125, 38.65334411577964, 39.0439300899471, 39.69748537986307, 40.0648566254915, 39.93400966433176, 41.22864114169001, 41.38977771311858, 44.76293931214728, 48.983098884220354, 48.57503416915655, 46.99524801540616, 47.02835955656707, 46.99174975575786, 47.28113353618113, 47.47406037037037, 47.97362448961447, 47.82702671483037, 46.99239340132016, 47.13279287612824, 41.63285593028322, 38.56926581516432, 38.36948773661687, 37.70901368934084, 38.21374512029256, 38.09203667499222, 37.175012626984135, 36.06908315681412, 35.354351188168735, 34.58269603127918, 35.06846412208217, 34.365576227677934, 33.97949555688158, 33.9962601904548, 34.33879544029724, 35.602148217086835, 36.88152486243386, 37.75528831784936, 38.64973298093682, 39.50658873552754, 39.73634625056156, 40.10603822953626, 40.51048978284963, 41.16806701190477, 43.05970608718104, 45.13472754605379, 46.01165557197324, 43.227475418456265, 44.11239373615001, 44.0407100638033, 44.20033393782551, 43.90744682648615, 43.823758298630565, 43.556551291939, 43.54112324797698, 43.50551587697312, 42.90285934492688, 42.20730979676315, 41.84820442273576, 40.93213253431372, 42.59353240709617, 43.943606433706826, 44.48728083963585, 47.15696460122938, 51.64686300513215, 54.52753124953315, 53.99022217958294, 54.2240106114204, 54.20016175497977, 54.812570693043895, 53.74594631605976, 52.47664380298786, 52.25583421428571, 50.8064888565982, 56.91029113974479, 53.18378462745098, 49.49944286302781, 47.414819062402735, 48.21056898008092, 48.125864085745405, 47.607601223379625, 45.91498206886088, 47.18449961546841, 46.09131713958917, 47.76690810099596, 48.90447428127918, 45.56306826314971, 46.13406732319613, 46.43203438639901, 47.62792391596639, 47.16308017748211, 47.28021620946157, 47.80612445284781, 48.73027016051977, 49.554665778867104, 49.79377138694366, 51.87818730586096, 53.32557041441021, 51.18451640227202, 52.21922543215064, 52.52635204217242, 51.71937933932462, 52.28673882041706, 52.45682501906318, 51.41634211873639, 50.19027463414255, 48.69209237600892, 45.650783611531935, 46.048186635543104, 44.1180581923436, 42.61758546109555, 41.00390218993153, 40.126705451213816, 39.10554771483037, 39.03607962605042, 37.92600024038608, 37.80056608846872, 36.988485706271405, 36.69300941246499, 36.31233197429701, 38.33893871397448, 43.71241852785559, 44.2371919457672, 45.182157507774406, 46.381398994553386, 46.689648157407404, 47.98385525254047, 48.75853110144532, 50.63362525007781, 51.58774979886399, 52.215014565745285, 52.160428166647215, 46.64508504652713, 45.04735149048411, 45.08414571381886, 44.95963614721444, 43.990291449191496, 43.01633105913477, 41.78025224509804, 41.11857067305484, 43.86883308076564, 43.57877420261438, 42.70316955297231, 41.14370495533769, 41.5876032491441, 41.02109838990041, 40.80499235091816, 40.00626688857765, 40.324051333955815, 39.970052572362285, 40.689504637254906, 41.1430475900113, 37.38820806753812, 37.581989480954974, 37.97937738888889, 36.8893054388422, 36.69211766487706, 36.88746775233427, 37.0125382980859, 36.92658290157174, 36.13739304559601, 36.06039452194211, 35.66901526481741, 35.31246502085279, 38.24622403042328, 37.4839380900491, 38.65522948123826, 37.20644994786481, 38.44507477201992, 39.32930952131964, 39.14389974502023, 39.26563583837406, 38.96642526011516, 38.33714568946468, 39.32377091775145, 39.36121957651664, 35.83684651517274, 35.81843829192205, 34.25609262816165, 34.96157575139648, 35.89645504505135, 35.10477339544689, 35.087759007750414, 35.22718002040153, 36.10227858862434, 36.895684480501785, 36.30543714316838, 36.78832191756148, 37.36513612021476, 38.50418172689077, 39.22234022358322, 38.44717335269807, 45.700759494319946, 46.50833169763461, 48.06618984881731, 48.07136702207572, 48.78586300700281, 48.74297084679427, 49.64962376742919, 49.58010694327732, 49.76864589737006, 49.53547104333956, 50.286491836834735, 50.11224741664174, 43.24840619880174, 42.09278749992219, 41.822548415032685, 41.7168973784625, 41.3621678828976, 40.9174477875817, 39.664373773187066, 39.27457602855587, 38.56083673242838, 38.45771555882353, 37.214986520074696, 35.44830651387672, 36.26122874704326, 36.5143166425524, 36.136260862667285, 36.03223606347623, 35.19176459119203, 35.04886075062248, 35.88438612480548, 35.645754330298786, 35.38075669720337, 34.76725261469032, 34.97056529911234, 35.683090832839774, 36.00993098918456, 36.10453383605665, 36.50734146887644, 37.16789987317149, 37.6133106000021, 38.05243059982882, 37.40001659930137, 38.07771213853388, 38.78723303376906, 39.5242332072278, 39.28414939052288, 36.98119383403686, 37.483530237784, 37.41850456621538, 36.931898206504826, 36.39046934484905, 38.083721676958255, 42.14422916359322, 45.62452880705079, 45.92285751766262, 48.84774900949269, 48.733925486150014, 49.1901117421413, 48.62667927933396, 50.10767635760971, 50.26710038787738, 49.89226478971791, 49.83641661609089, 47.913939135076255, 43.65932058714598, 40.04696660434173, 39.43961583520075, 36.131489977513226, 35.91452850832556, 35.781935467935604, 34.489286783364456, 35.12908370277, 35.61565392320262, 37.6329117191008, 38.0075078400249, 38.09100842825558, 38.456585539325154, 39.51762020852786, 39.1678909833489, 38.95917279352155, 38.59483272222223, 38.45895360340276, 38.09083201766262, 39.08645263328665, 38.08572910799875, 37.59704556520386, 37.61528562955182, 37.56700621926549, 37.77874248039216, 36.85739792366947, 37.08869791946778, 36.92113898908311, 37.34255237986305, 38.046112361045175, 37.71430397437516, 38.70212287520368, 39.245428649859946, 39.415974119984725, 39.25596329474012, 40.193028895496816, 40.3250325544326, 41.65081966118, 42.2138419746343, 42.80644320081627, 43.220041570395495, 44.13829850980392, 42.461739218575495, 43.51147615916719, 43.59199119440944, 44.06839160605353, 44.577761678882666, 43.90022390826331, 43.46517066343248, 42.26436471265173, 42.243689613134144, 42.25437657002802, 41.960579313608775, 41.89861544490935, 40.6483547610554, 41.42407408488951, 41.88289447642391, 41.85101536243386, 42.216972159180166, 42.93033146783642, 43.23710095564893, 44.74409736702459, 44.630439737096914, 44.44072388920012, 43.791991245409285, 43.26640030617803, 44.22586641980302, 45.04639409829044, 44.92072140110489, 44.79079619545597, 44.32340095409275, 43.35407555220977, 42.64290783955805, 41.17063645765509, 41.14601683667912, 41.25976955306568, 42.67489691376569, 43.57981428991013, 40.890495644491125, 42.892012673364775, 43.31542696138344, 43.12741314314051, 43.28166679660754, 44.22198695339247, 45.41679350731403, 47.61678090607411, 47.684300846327424, 48.44803117200504, 46.30456549990998, 46.63817072128851, 45.4000633208839, 46.71581065974167, 47.92565059399316, 49.68576279419546, 52.20329384897292, 56.07984953688142, 57.796245579831925, 55.95324121156241, 56.062865435834254, 55.80265293253968, 56.64023666884532, 56.56129197752945, 54.70517567857143, 56.24515984722006, 55.4898978009791, 60.5065154466231, 56.7034508417367, 53.34616768339558, 53.050781914488034, 56.12594209920636, 56.14500078330221, 56.31223792156864, 56.092986244631184, 55.98322748590942, 54.60555599408652, 54.93165775756886, 55.38265262659508, 51.74284558380018, 51.64020787784003, 50.68788503548086, 48.65982890343915, 44.97253080703393, 44.37661812566137, 43.24954245743852, 42.3806906669779, 41.39811339013384, 40.23756801859633, 40.15999092149081, 39.35246120082478, 38.4762398942577, 38.61722775233426, 38.89064542156863, 39.00458336422346, 40.69148369914671, 41.52092372883598, 42.15554363764395, 43.03803720323685, 43.94287845023278, 43.62137090483972, 46.88755470292561, 47.91077638045377, 46.54837403641458, 46.32251057142858, 46.18216730913088, 45.717229856133294, 44.759466378618114, 43.99821689534703, 43.29450514561224, 42.13909660550888, 40.94011637557903, 38.15459231206363, 41.04647128638086, 45.70431671967918, 44.51455439690969, 45.65319666744476, 46.11128248117024, 46.28436604380641, 48.23731898996266, 49.056436678368485, 52.465635099562064, 54.01112619638968, 54.27666766137567, 53.87766239222948, 47.92103750077809, 44.60388693221408, 44.9942258093682, 43.880756486830045, 43.25117908527272, 42.33480776882976, 41.13179714067266, 40.6928496949113, 41.88121802178456, 40.64640023093681, 40.9293179493717, 39.86931952287581, 40.91772509902938, 42.16688207968995, 42.00901952075423, 41.84166868505164, 42.702869036025525, 43.52456121926548, 44.68139171593932, 44.2968934719888, 39.98629922953626, 40.35821823504762, 40.83150503672581, 40.46123538087457, 42.37554020300342, 41.50408826182565, 41.3536226468254, 41.81452354512917, 41.1618575725179, 40.12343062152908, 38.87548206931023, 38.75859572222223, 41.10010481909431, 40.79795198970654, 43.60444465631809, 42.01639902645503, 41.90422082026143, 42.69655928524744, 43.24742552964519, 43.87111820393714, 44.43867461655773, 45.04846507218051, 46.04321513025211, 45.92745415787426, 43.16548221895425, 41.70693338079676, 39.406840914877066, 37.95683563718748, 39.56102565709617, 39.4338899037504, 39.353717501634, 38.355617532368505, 37.59972301097106, 36.70962196066955, 35.44692870300342, 35.42909254800809, 36.40486531917212, 36.11460609632742, 36.08445450272331, 35.3461070690943, 35.181144435530136, 34.98997877774575, 34.286043606131344, 33.868017708179664, 34.83257013437597, 34.66363010690943, 43.25090096444134, 43.36581945440398, 42.58331486469032, 53.26385473747276, 54.38879155220978, 53.7358713030624, 55.41526933761282, 55.79380615798775, 56.212095355438194, 56.8139047359925, 56.8586945218643, 57.14714948373795, 48.35834681746032, 48.0833467490637, 45.28070129186119, 37.720860059134765, 36.72712273115664, 36.307323635134615, 35.66460642265795, 35.94576159648303, 35.75467820611578, 35.18791069156552, 34.127504535014005, 34.296078079209465, 35.528753789215685, 36.22461323786181, 41.05390238562092, 41.53443709856832, 41.85251165600685, 45.56606287348273, 46.985507323607216, 47.68971652969188, 48.46605210714286, 50.288195356676, 50.93531490631809, 52.08640343386244, 52.06193288040773, 52.17722010301899, 48.594308499377526, 48.41479870486175, 48.47306908323414, 41.945169128773735, 42.41501483457827, 41.970865813725496, 41.40887907390096, 40.33751056410351, 39.92377080848182, 39.154064729760606, 39.15005273187053, 38.343558727388086, 36.690479054310615, 36.18917159150327, 36.41960163188609, 35.240957763077084, 36.086872824540926, 36.46797907251789, 36.21151775474634, 35.70263541293183, 35.39537109693762, 34.78445812612823, 33.66589117908692, 33.64348949307501, 33.86906148179271, 33.98078417639278, 33.565268209539376, 32.926994101385, 34.138266282601926, 34.184687132197325, 35.89718757103953, 36.62488157204134, 37.053156844455465, 38.36498704154996, 39.71880658877996, 40.56136726631718, 40.99890030415499, 40.89707696872083, 44.92102792818239, 44.65826892211329, 45.26359338576292, 44.24253856551509, 43.42321153563648, 42.22270519319951, 41.13995982173981, 39.1836681586984, 37.26119123926237, 36.18799944825708, 35.3725306241052, 34.98530585885465, 30.083187054933084, 28.868682200124493, 29.78922144607843, 30.362914342490157, 30.899070232911463, 31.554056417755994, 32.51726396708683, 33.639453803843764, 35.10371706084656, 35.35719914783691, 35.7814595558668, 36.25635692086835, 37.932421546296304, 37.00972068580961, 38.1608874292717, 38.38262006240274, 38.25088105665785, 38.637276952225335, 38.42912311220044, 38.11813589256861, 37.274083635517606, 37.51873100202303, 37.68730025382756, 36.4818917376005, 36.70490005236539, 35.42272486902233, 35.995659019205824, 36.113609098049615, 36.42638471428572, 36.37647107796453, 37.003899202036656, 37.94177501400561, 39.5713718791602, 40.40827656621538, 41.22223371257392, 41.982898926859626, 46.003068382508566, 48.80520671955474, 50.58597733255524, 51.44572794086524, 51.763046443121695, 52.59935378997318, 52.51961988320884, 51.98568379956427, 51.48345939316838, 51.356794094460014, 51.864052212651735, 54.42496335457517, 50.564639732337376, 47.06917052380952, 48.39871785768752, 48.29740994389979, 48.22659528918003, 47.3017581564737, 47.2395739615624, 47.38641118518518, 48.08029114620293, 48.21145850739184, 48.0866800518136, 45.51756203283536, 44.64804105485528, 42.7499763855144, 43.11266447634609, 43.51438251431684, 43.69401487612823, 46.05640100645814, 50.3536499712107, 52.28997897580144, 51.72520239514668, 51.59546395136944, 51.59583749284158, 51.48894936017741, 52.13936324665422, 52.54154790655912, 52.1959395874572, 52.140231203937134, 59.23922479754124, 55.86235627248677, 52.7587007561469, 51.36449294389979, 54.21458502054156, 55.08191969063181, 53.90189619338819, 53.68623061640212, 56.31012539985801, 56.31412576394013, 57.20889243775287, 57.68859419204731, 53.29489551819431, 53.6708478172269, 54.20660469413321, 53.279769987784, 52.12199370829444, 51.447250273576095, 53.00599433061003, 53.95458059335846, 50.26310855042017, 49.30086250478979, 49.587492227836805, 49.21841184593838, 46.120815181216926, 45.12431848521631, 43.40360370681605, 42.09443681707128, 41.30438974004046, 40.38221171623094, 38.594428954898966, 36.566961278555866, 36.86615361850296, 34.87515510985228, 37.54937756481481, 37.53758717258014, 37.52187991563052, 37.86007357314037, 38.6988996633987, 39.10263663873327, 39.97850766409897, 40.067725600373485, 40.604088850333945, 41.38123694742679, 40.67667756015277, 41.29126468172883, 44.76399218720822, 49.65779162875688, 49.99211688258637, 51.07513774328294, 51.54655688766729, 50.94514534141962, 52.27657619581064, 53.304676130485525, 55.719182207438536, 56.32325969779024, 60.1749396992686, 60.24333677201992, 52.58846294911297, 51.20211929116091, 50.86168081522007, 49.64770467932554, 48.77707622609386, 48.11062433841945, 46.87850007633055, 45.7597948610333, 48.565552256535945, 47.65765245685503, 42.61288095899471, 41.02099473207418, 41.7838474535429, 41.86769512608155, 42.11112285115158, 42.139231332452844, 42.12594234469344, 43.11786367102397, 43.91483920736072, 44.16248359765018, 39.79341185558668, 40.54849827194211, 40.88226860706506, 40.37321062566137, 41.37217860955493, 41.59639302240897, 41.63616645650482, 41.73950479771048, 41.647030604884456, 40.47518609648303, 39.4345506828373, 38.74096431881614, 41.52399779746343, 40.97112253221289, 44.40282016635543, 43.89325017359166, 44.95509441363147, 45.13006155501089, 45.03593456948335, 44.85906944662311, 44.970988217475885, 45.06857464774613, 46.0285352360722, 45.97362392072376, 41.63357113414254, 39.46333083247145, 40.470287624102895, 38.95355028672579, 39.33300688878164, 38.64122904340636, 37.89099817410175, 37.56794646467476, 37.156452438686586, 36.66988387457205, 35.211132409997994, 35.46878649680984, 36.030128850257874, 36.46165328213659, 32.10882903477637, 31.11982991457975, 30.92812190515095, 31.64240129931852, 31.99888615522922, 32.20771415311643, 31.986323147599887, 31.94250896046496, 33.06238988700084, 32.89293864103087, 32.99999039777642, 33.064840702941616, 34.5224861052239, 35.27919747300019, 36.01061010529358, 36.644790436877706, 37.064615789215694, 37.33639930967943, 37.85084389036726, 38.01617261290071, 37.518313422657954, 37.57458991401794, 37.62195493783069, 37.95639946545286, 36.77869564500905, 35.244268033613444, 35.13087387659508, 33.28218228431373, 32.53500906139122, 32.16075808675693, 31.68037993495176, 31.528388707671954, 31.98159126539832, 31.5877747377062, 31.018537553376905, 30.21967190694055, 33.59863882191229, 33.05989078407451, 34.927267202500914, 36.962788081154685, 37.19223259033613, 37.08251034554933, 36.97473253361345, 37.13654366143599, 36.401914898842605, 36.68665355080922, 36.89204784000999, 36.96611875630123, 33.156527848817305, 31.56919595098688, 31.80073858287956, 32.68989873280423, 32.585881796509625, 32.44973126945223, 32.47028682874261, 31.980347165032686, 32.52074181419234, 32.22585124587613, 32.016243724816505, 31.367288279956423, 31.423154901104887, 30.87204103042328, 30.85688882059018, 30.60915527746654, 30.72267400645814, 30.86404415313311, 30.67884141316527, 30.60250128244113, 29.44830844008715, 29.57339733239573, 29.584452695144723, 29.781119419259007, 29.662848847027707, 28.384578158885773, 29.540713025210085, 30.049674166900093, 31.21210470868347, 31.136369425614696, 31.42491513569872, 31.463773792483664, 32.59471719732338, 32.50749504925304, 32.86161512007614, 32.860286932306266, 35.85230917577031, 38.51245419712789, 39.82531146685924, 39.19330144327731, 38.92465356683785, 39.1866260104264, 39.63248299463118, 40.57785646560847, 40.37778904754124, 40.508297419701215, 40.409355342905776, 40.461714812356696, 36.089979760659816, 33.09590447813941, 33.565199362356054, 33.76282410862123, 33.65086544979382, 33.231439953003424, 32.94992947097728, 32.07765125505758, 32.12945075770309, 32.25116423963845, 32.79670830096483, 33.460541246887644, 34.867787488075145, 33.95210630798709, 34.596174886321194, 34.67861347393402, 34.70256288681658, 35.03043215188298], [756.3979030798318, 744.3029706693902, 730.6473284400093, 723.0611296733582, 722.1851328819638, 714.7609265106598, 702.7790264705882, 683.9441634560458, 672.0358620825551, 674.0609660729068, 677.7800451516885, 679.2635464632742, 682.807789279723, 685.2804793825085, 689.7967151327421, 683.7788630184239, 676.0698775669156, 672.3643591186586, 672.4433544509027, 675.4675828200442, 676.5115122139744, 680.8615921511049, 677.7654927419151, 676.842075839947, 676.2879514027389, 672.4218956198256, 668.67498478338, 665.846640070806, 666.4971221741362, 675.8058245748522, 677.2545858699394, 672.8737225157173, 669.3227741937442, 684.9071565467167, 695.3134248529411, 698.7540808656241, 702.2590541085656, 706.4581684733893, 704.5068136155463, 702.8586980725179, 700.4124986349983, 689.9772430006225, 691.2145794003236, 697.2208884977434, 695.320073972689, 697.4192368479613, 688.1001537997198, 692.014893637255, 692.0123103777622, 693.8409925284782, 699.760824733738, 712.5978612307813, 726.8348839694211, 737.1607277546685, 747.7295644082633, 743.0021144103966, 738.7001618062558, 733.2390555472704, 740.4645704763461, 748.9494158469498, 754.9695508223622, 772.4803576111111, 795.3799704851385, 817.5889692044818, 810.5577101203237, 812.1496872436975, 810.807364893857, 819.6518335028013, 824.7663900365702, 855.7543177659509, 851.8125080492938, 853.6314525150173, 853.7982831908652, 874.5091958872548, 854.2002543436819, 840.0022579181451, 843.3923052979043, 844.8149972939619, 858.8160674601619, 856.5692364863057, 853.1174491984665, 824.045725139505, 821.9728719383753, 822.061179298989, 826.2387258516184, 800.8467269128643, 804.6018049290383, 804.1882596667439, 808.7635398282756, 812.7516334191566, 801.9475463548569, 804.9193313030659, 806.1936972732648, 812.7435121788048, 833.5308066798164, 837.1395888972924, 832.4826270038127, 826.0554992027701, 820.3341073904204, 824.485052254435, 816.629798620526, 810.8970960592903, 808.139450642468, 805.5578645942227, 798.5624005549331, 790.206784214986, 766.7242158711275, 760.324482642079, 758.3062881625428, 746.785621526844, 756.7117542507002, 751.2071089122315, 750.9882525532045, 748.6580185369592, 778.8528848211952, 816.0171727955961, 838.412794847728, 852.154815357143, 866.8350585327536, 872.3202690540771, 874.3736616304857, 885.2679131979457, 874.1160685329132, 872.1213756946777, 870.728830819093, 871.9047259050731, 840.7743783895157, 818.868946022409, 813.9724146289442, 803.1400550742296, 788.6706259278815, 791.1645125021224, 787.6421413466385, 782.3942514772688, 783.8472510295675, 787.5362605109483, 825.7914113380797, 843.8429520517429, 848.7122255286673, 839.7049524847494, 821.1902779488017, 815.9648760468409, 812.2146233016925, 803.2891793992497, 800.5481764030501, 800.0991422536571, 804.4890395071603, 811.0831221691618, 768.3951566462023, 747.7705070255992, 737.488920295207, 733.6465478070338, 730.9834959074074, 738.2897192732648, 760.3647100444522, 763.0609989366636, 760.364058640445, 751.4723773455493, 737.0449583508941, 723.1328783303767, 741.6089019473234, 745.3327483874104, 740.2451133825086, 754.6719201708685, 761.1313470277778, 763.3326476265951, 735.081034310499, 720.9322781825716, 719.2623776678338, 723.3873637811236, 723.7607517028478, 722.4045073334478, 690.6440626720354, 687.9861854782135, 685.466306846561, 662.3256342783224, 646.3623471811391, 644.5441046002956, 642.6122380845729, 657.2240064291882, 655.2682303426645, 657.8121260465149, 680.4467692242454, 707.4203302919351, 720.3645547482073, 712.0240350024898, 711.7052358288204, 706.6096872780113, 698.1720138177716, 716.98104339986, 724.6994430150099, 710.3363115935775, 707.2955312791005, 701.635369759415, 678.7695259962652, 652.4912811407563, 640.4386322424525, 633.4466333522408, 625.0855112574696, 622.6189499744008, 619.8168346668222, 593.950540140834, 583.4077323879552, 584.2011273299097, 579.3096849253812, 572.5693707961426, 563.6809423250078, 562.143627099751, 557.0218840248988, 555.5884267671082, 557.3284906535947, 559.5756180842671, 560.3140156626206, 581.1324700959046, 575.3388982085278, 569.0417620505757, 569.6291362776221, 565.2962599477058, 560.8539042979302, 559.0765916854186, 556.9483309936975, 561.0888349345627, 605.5882064864612, 626.9821240926705, 629.0769746019297, 609.6405987958294, 610.6335620220199, 612.0784893771716, 613.779171563181, 616.8832900171179, 617.8460584749455, 619.6473933636789, 618.4143831427793, 614.5421549648304, 566.1052948212729, 547.2248577531901, 539.3796257126517, 546.7383814675536, 548.6084754105198, 551.3947902428285, 550.8700916157019, 547.7111447045123, 545.2729301087768, 542.2077073204948, 544.8203284977435, 543.8403811360878, 540.8322332209773, 536.4601421317246, 534.8877743935574, 531.5486355347027, 532.9406400887021, 531.0422803821195, 530.2365453299097, 533.7789734325364, 535.3070708714598, 535.8041977850918, 536.1808419990872, 539.6858337880485, 542.4369438892002, 545.3219115393714, 542.0747693433707, 545.5675158132586, 545.3542850991286, 545.6340713104574, 544.169709186041, 538.6527466503268, 538.0397181906318, 538.9070913190164, 534.3858636615546, 530.7468009638967, 527.1112794575942, 525.127043566449, 522.7297717541563, 516.6930522806567, 510.8726761914099, 505.4686502574696, 506.9736965396825, 511.2239404814037, 516.2328090981948, 514.2912558589325, 513.4678825147142, 513.5810625578897, 513.843601302521, 513.7137811556956, 512.6673722058823, 510.5454741105865, 512.469128503657, 513.9292377173202, 511.7163498387021, 506.96786544436657, 499.7097570580914, 499.1563179308707, 496.9259307338157, 496.6868547371615, 496.418337515484, 498.2805082128073, 497.254182628618, 496.9843840283224, 494.86842171786486, 493.7957291570184, 492.6580650906794, 494.4593598076564, 493.9943776215375, 493.5818993172269, 491.4879191328976, 490.0599613980703, 489.0947272328042, 484.8113045274224, 482.2527776255835, 485.372159554933, 484.91882284157975, 483.4062410167289, 483.0035794275236, 483.0580613063336, 483.7003075739962, 482.2357759920635, 482.878910845705, 482.2125389379085, 484.12694097961406, 485.5330223361345, 486.50963289060064, 488.8897135254033, 489.856271128229, 492.51321744553377, 497.5214421891535, 500.48181804948655, 503.93201930929047, 506.640337346483, 510.7040947007094, 528.192569889309, 564.5160744051509, 578.514865851385, 583.9250151722689, 608.9303392324929, 610.1325053059445, 605.6628733197518, 608.2047051588858, 609.0002869285847, 605.7297354246033, 611.3080885055246, 609.8389362371615, 590.7787714620292, 557.7478932115624, 547.227315327342, 537.5063763319328, 516.4066972775444, 516.9561532307812, 521.5939471146125, 519.9113758727824, 522.2550731854167, 520.9964288195611, 514.9332536297852, 513.9909488415811, 513.9348575322907, 513.0068646617647, 510.4457739201681, 510.1390106357765, 519.525345929972, 519.0379463891184, 518.225535383131, 516.0185763720821, 510.4178372934173, 510.9506978698258, 516.4735516822284, 519.3229749810146, 521.9846524553376, 522.2289987910052, 521.3399634186119, 520.4432818944911, 513.2047718115467, 514.9336235378152, 516.4092780275444, 519.20138687216, 521.2130957176315, 522.3590747755355, 519.6942532212885, 518.1931425326798, 515.54842425, 516.8552458548086, 518.4177768716153, 516.9448988292094, 523.3575273281201, 522.4595108881108, 520.8828954174493, 520.4914194184563, 520.2228098106132, 518.2834763078004, 522.6962310392935, 520.1751390381263, 520.4514493870627, 522.2832670895581, 523.5166008638346, 523.1275328302987, 515.4055142562247, 516.3826590755524, 519.4845725084812, 521.8566193749318, 524.2131412802678, 531.1588893741052, 529.6714918521631, 533.1141163646125, 535.7431679040071, 538.3511832938842, 539.1037229280269, 540.7635424259258, 544.732831482493, 546.4070221144258, 544.8268381933133, 543.7541352317149, 544.4851269375195, 540.422060470666, 538.8475930510426, 536.4180560097261, 535.5584056801275, 538.5302766941331, 538.5037524345627, 548.9590201910208, 546.8622059999221, 546.0508609926859, 553.4064660355159, 555.569338074074, 554.9650821676005, 555.0188285511982, 557.2715154895736, 561.1065751091361, 561.438463216231, 559.0549480873173, 559.7715759599286, 549.1591452791783, 548.6701588424369, 550.758939538501, 543.9374673699813, 544.45109345845, 545.3443751202926, 544.7844589900404, 544.1242314008714, 541.1105844119203, 541.287928413751, 539.8993402560692, 539.4842442659509, 538.385180096483, 543.4510274712884, 542.4222617131835, 539.7593992373172, 541.103120825708, 539.9690038092127, 538.8542088789293, 539.7543756991909, 540.6700035917366, 540.4232616770482, 539.184571443433, 536.5873276275289, 533.1147575774976, 528.6934020564892, 527.6104922797066, 531.0261667672736, 528.896436156318, 526.8778381355431, 526.3451275515094, 526.6216376153575, 525.8531413752723, 535.4216496295518, 540.7753935820884, 543.4543488694366, 542.5737799339403, 552.775343526066, 553.0457177216776, 560.5901198229069, 558.8683571911765, 556.410003613601, 551.8205623769063, 546.2007801143013, 542.1991334675537, 528.7584677289915, 528.5012589727669, 524.6720523760504, 520.9197271869747, 540.0747452506224, 539.3172148695922, 528.5060959185341, 527.9253432647837, 527.6314883742608, 528.1296300509648, 530.6402986050421, 529.9395198762838, 529.8238140568004, 522.7840679030502, 523.976772237784, 518.9565285831777, 501.47554385628695, 500.4830262994864, 502.2959667200436, 500.42007343845313, 501.953883043726, 504.7715251528167, 504.533428821662, 504.1622181071429, 504.0381111444133, 503.9146441476034, 503.7676636695456, 507.72698655057576, 520.9640239408652, 518.9030440746965, 517.3656791166355, 520.8107100275442, 520.7396100659042, 518.531106927482, 519.4009944016495, 519.4622484663865, 522.6644865774198, 524.5093100617803, 522.0927622941955, 523.7473652906162, 544.7779008006536, 561.3514048278789, 565.0297024602617, 568.6231126679115, 567.3041720652039, 566.2352355427449, 566.2800246427794, 565.6506479228914, 559.8010536854965, 559.6081776876752, 563.3021362676626, 554.3727896703334, 519.2780155473856, 503.1459707601151, 499.8493821805166, 495.8065279621071, 495.5763398783847, 494.91706219117646, 491.32401681925, 489.6299590504979, 491.2469065130719, 488.61721634928415, 487.9220965440399, 486.44767245860567, 479.0671526774042, 479.9787384138655, 480.126357059446, 478.683245482493, 482.5639650336135, 483.5588054702751, 487.1265613732493, 489.7585563373794, 491.8424415669936, 491.8556944530813, 491.48354102964527, 490.46568208675694, 501.1226745452069, 505.0698508737162, 506.51341885776526, 508.7888687356832, 504.8050380087146, 503.9743298710706, 506.2890454479439, 506.9929168903672, 509.6176270912698, 513.6209796324307, 514.9224166965982, 514.5429837050264, 509.1704550656707, 505.1142551278056, 504.7736463810302, 506.47226076587305, 509.8958638435232, 513.41780960014, 510.13182696257394, 506.22841935854336, 503.695892856676, 503.1794341124339, 501.5384961396164, 499.65018599354187, 500.1035493780734, 502.2379254185341, 505.4947838143479, 503.5072929545596, 500.44557087387176, 498.3004224834981, 499.074662447479, 498.8576724501245, 498.6373141955337, 497.08262297860256, 499.2908024618736, 497.9351739147921, 497.720423297619, 496.6967181463585, 491.6518348928572, 492.8246627405074, 493.98267477396513, 492.66133002489886, 490.8194671826953, 492.2276236564737, 492.9069142359944, 495.0890076116558, 492.1525923634453, 490.5982227502334, 497.4805361325864, 499.484347642468, 504.8008440302676, 505.4926944474012, 503.7799891462029, 504.7600002250233, 504.8109313248521, 501.99452202769993, 499.4069477103952, 497.6660551700125, 496.2752479035169, 492.9075828028322, 488.4970005983504, 486.1576898481948, 480.6340619185341, 482.6354251906319, 483.1452421790384, 482.1190665553221, 482.8417115544662, 485.2340820383598, 487.99662464083406, 489.21191471148455, 488.94416171662, 487.2531583133364, 502.9313845272331, 504.3904408630563, 503.7859956976346, 500.95382379069406, 501.30112236974793, 500.7730520074697, 503.8230675773421, 502.1668604715219, 501.36025640320565, 502.1116200311236, 505.66967194413326, 506.920781546374, 491.9853194892624, 492.375057813649, 492.2769409046841, 493.1055167338504, 491.5589390334579, 488.4523377531902, 485.4976052054933, 485.3598635022564, 486.3328696295518, 485.6187690145503, 482.5471883943355, 479.8001863842203, 485.9924448422813, 484.29966460223056, 486.4523872804232, 489.1879961412503, 488.1275983488952, 486.0440240995175, 485.36516510441953, 485.0331203994994, 483.3249728955026, 481.4804110785091, 479.8710325622471, 477.6187219457672, 470.0200727396514, 469.911389382742, 467.4641807319483, 466.592747813492, 468.8248337094616, 470.711231133701, 469.9683026140679, 468.7915987257236, 468.0641366820728, 471.69644979956433, 472.4014542275132, 472.91711628797066, 482.4249705706505, 484.3364919474789, 484.9747848290538, 485.5123878820417, 484.4064930626361, 483.4047577592592, 488.8368482690632, 489.03441605493305, 490.99893145580455, 489.9050344469344, 489.35653834928416, 486.06059634414873, 478.3737154374416, 480.2602877409469, 484.8595756889427, 484.9992742085279, 487.2312038491286, 492.596119456794, 489.9381820760193, 489.96612412558346, 491.173333619281, 494.1928383486618, 494.29626998008087, 494.2811088683474, 496.21024629279486, 493.5948856693556, 491.6340503458605, 492.51881269950206, 497.8135468266417, 494.601251491052, 492.6240061935108, 492.1539614597728, 489.9761222501557, 487.3627792865703, 488.3478208142701, 489.6191850408496, 489.1949692273576, 490.4673394081077, 495.2785676180425, 499.48564869351065, 494.70243317024585, 495.03732875451294, 498.95051110527805, 499.71459263885646, 500.9088256552287, 502.8904312391068, 501.2998581355431, 501.00698113608775, 504.1324938227513, 506.33193168319065, 498.9215017386399, 496.1960371220043, 495.630366532373, 490.1773758412698, 487.3109784758241, 486.5560396605197, 486.1062943894335, 488.21422431963896, 488.9494027654062, 487.4321253304544, 486.1072283801743, 484.3824306650327, 483.8941145796763, 483.2373149652194, 484.0021681917211, 485.0433753300654, 481.0675975112823, 477.3031713782206, 476.5983436086212, 477.1505357808901, 477.7627040511204, 473.7502860287893, 470.87043809578273, 469.2966051097105, 474.0854738302988, 476.5056695321351, 474.4727363082789, 476.4601165906474, 479.7910123768286, 481.7440448828575, 490.7431278105354, 491.1755888754279, 491.5065479077186, 494.20902794413314, 509.1216581809056, 512.5778879585279, 522.8863449659196, 528.7775230568005, 530.8768954341737, 531.1619947026144, 532.6357631072984, 533.3573473171491, 522.7014543334111, 522.6662002615158, 521.4016790163399, 514.5390586096327, 531.6236236406785, 529.410552820572, 518.8648553807188, 521.1874879723779, 522.8968883046997, 524.3893738462497, 527.0934562610489, 529.9954168348116, 534.4469201647215, 537.4268696612979, 543.2479090617758, 540.5782507910052, 521.3475152368503, 521.6466639430555, 523.8997252654839, 521.9279946015406, 524.1991833575319, 522.9070374509804, 520.3815394407096, 519.2348125790538, 519.7562732980081, 516.8644856000622, 516.2385898332556, 519.2040529129318, 540.0891023658576, 540.3482799544545, 539.0490360192965, 543.3668960011672, 540.8767680487862, 539.411646252879, 541.1413955178183, 539.1639723800964, 542.0780900718177, 545.0554225568784, 544.364883710162, 534.5376166539837, 517.0576069304387, 512.5931741758482, 514.3727657975412, 518.5685419516807, 520.1147531698568, 519.7160401271047, 522.4306601024172, 521.04985289169, 520.8957786896713, 521.0532610629474, 537.6040276409119, 539.7694621262838, 546.5192995585803, 546.8166265220977, 543.062091996188, 539.0752107464209, 538.1582388388578, 538.5083062287582, 536.3827194687208, 536.2702041200591, 535.7565120434011, 535.2317839974322, 518.021929142079, 516.0086810210862, 507.84571591254274, 509.2423237270775, 513.4247784843286, 513.0644344276377, 515.3123067600374, 514.7416570324463, 515.6118588519296, 520.0732047975412, 526.2388738317596, 528.8787582624494, 530.3080466922535, 530.5542780532213, 545.6298386589635, 554.0719468037568, 557.8537640477746, 559.9982890455202, 560.9516653784625, 562.039725361578, 571.3316719087302, 570.0744543597884, 568.510870939309, 568.0410775696389, 571.7994387307034, 610.7337583592437, 642.9531069333956, 650.2024541341348, 647.1440686290852, 652.1375157456426, 656.2275958560537, 663.9412822057773, 659.8199368509961, 658.6971927528789, 659.0370670550111, 662.3328514896515, 666.5920806984128, 627.543591602552, 597.1532292515561, 587.983070075708, 595.3558129172185, 594.9371024970128, 591.9841323969032, 588.3604190375039, 587.2686043563648, 585.8043618710706, 585.4309901930445, 586.7474479936197, 585.649297589558, 583.7890770410831, 583.0787872773886, 582.6873609515438, 580.1484034127762, 584.773110617258, 590.2283611090103, 588.5680679453003, 587.7373190479304, 591.2975957313258, 595.741789681139, 597.2901033486617, 597.6876590069995, 596.7764632934952, 628.1766963207283, 643.5911312229964, 643.7921311311858, 639.9600703008871, 635.2519661819173, 637.2391068274198, 637.855563635154, 637.250072765873, 635.2646684929998, 635.8140548499845, 637.4856936775527, 634.7404966983348, 619.2648140149394, 604.7268356436351, 603.5731962921724, 609.7390345434952, 616.1703092387177, 625.3175809182229, 627.9323702125552, 629.237347605042, 631.8565555187095, 632.8798213421501, 635.0545697692188, 640.7683493245977, 656.168741781942, 662.2837656727293, 666.9256670036589, 667.6348835207565, 671.9547358699813, 668.97001589133, 679.0773801264396, 691.2594790311996, 698.6769476472923, 698.8992144026612, 701.176845920635, 697.997587551743, 703.4097677493775, 704.5795739810924, 706.9540004112979, 710.5795220388266, 710.9423894027389, 715.9874329996109, 721.4706297906941, 718.5610320259103, 719.3740172326487, 724.0564343651571, 739.5705591175691, 739.7035358546528, 735.951053157952, 738.0490800714546, 744.1896193137254, 747.0978929842048, 745.4579993674914, 761.6772318907562, 778.4968084221134, 786.5896478979147, 792.4432759977437, 800.70198331108, 796.2003650404607, 799.6110978800186, 799.0503369090413, 802.7250780652817, 803.0266105848118, 811.5575856350049, 820.0636681169306, 806.3892727321039, 796.4366281532391, 792.597802037037, 796.5436824529626, 801.6052246399004, 802.6053901114223, 805.2506406942888, 811.1749512740429, 814.298233709695, 817.9976790364923, 816.2529930557889, 815.3522528426703, 814.358870985761, 816.6017154171063, 817.5317295276844, 816.3520511858854, 809.0308875924371, 805.2137521625428, 800.1752582237783, 793.4172279469784, 788.5736603764393, 788.4341182394957, 787.2169418318502, 789.019861144348, 789.6498048301431, 788.089313492219, 783.6417279157628, 779.5193698499843, 780.6378551474479, 782.41225630291, 781.2822183642235, 783.3186382398045, 786.0782241618425, 792.2782876976241, 791.3126690115176, 793.6964957373887, 791.455408517471, 788.9993415318198, 789.9111478532524, 790.7281404274041, 792.027645526455, 792.94192566122, 793.7450583214286, 791.8492099343292, 791.7980064773745, 789.6464140181638, 791.5153564735119, 785.885748728758, 786.7013959807934, 795.2519922809181, 805.2505776950668, 823.7425214397759, 822.3518854745565, 816.5479589801587, 810.2777350095704, 801.6301650664486, 795.3249034292717, 783.2562143145814, 777.3553685904918, 775.6596468075785, 763.1969308793962, 747.1410434383753, 730.7854467100841, 708.8421853761282, 704.5116787440865, 709.1294132977747, 705.4005360224089, 709.1589122720565, 706.6639536086731, 710.1165982555244, 714.2585390858231, 708.1589718916123, 705.1153455748521, 698.6441833534859, 692.2673271411454, 681.9131558589323, 668.8508014484127, 657.3458599194678, 653.9526485022564, 681.0756297514006, 678.0652162115623, 665.9702494057734, 652.4822393462496, 654.0885715076253, 655.4455858031434, 656.8672009575164, 655.2930590645036, 664.7585731739807, 666.8488571377997, 664.5086894116533, 656.1619302150638, 635.7533188533301, 632.0553280795207, 649.7605104838158, 655.7498735226425, 665.2666470881575, 668.7368608213507, 666.0702032015303, 670.6392281202926, 663.0404726436352, 666.8998653671102, 683.0738391614535, 688.7974334892623, 710.9004464337069, 712.5568406594084, 692.6162038050868, 689.0312744042172, 676.0507220145503, 683.7386126315749, 691.3932603117454, 686.6038160968722, 682.8291984130733, 676.091210066181, 662.5810304230471, 649.0866199902738, 622.8810930687052, 617.4223369523769, 619.6603154621848, 616.0048620843448, 614.1856800132275, 596.6368114874728, 592.515129658419, 594.6546459513694, 595.155283481715, 597.8301526199035, 600.9002233055555, 604.6061684467787, 623.062837691144, 627.7626661113446, 629.078312254513, 632.0920898043106, 633.9222102297698, 636.3165556537505, 637.7587353695388, 637.5960964076409, 639.9246750898692, 637.0134718439376, 636.3624051255836, 627.9925434634298, 609.7678293092476, 610.720322391507, 613.6870325006199, 613.9285827664955, 615.1569575763306, 613.8862130727513, 612.3072802720369, 612.3853965987395, 610.710417448335, 612.3698264520917, 610.7159906600763, 608.8887218581543, 613.7443696977901, 612.2285535911142, 613.6891456732803, 614.5230452291471, 614.6610763110021, 613.5337996643324, 613.2994157000468, 613.0865513019763, 613.2810916223226, 613.1584262892935, 616.8112429623407, 615.2069112784002, 613.8043905185184, 614.8160260982353, 615.8458764141768, 619.4246125834112, 624.6762811636322, 631.4378893010426, 639.4272207954405, 641.8868178384687, 646.9970939262372, 651.0258465342359, 655.184800478729, 659.9363103566759, 668.1526646681449, 669.7714311374883, 671.958991863212, 679.618952993542, 677.0435627226794, 670.5487486650328, 668.8462831894647, 669.2872955718176, 669.3391137663398, 667.3128591056645, 665.7287206627764, 662.8139568610333, 659.5231533185924, 658.9578770534976, 656.1662902509337, 654.5486063651572, 659.9916493931686, 670.8951280152507, 670.9231805045908, 673.3945256227046, 674.9742587602707, 680.3311267666511, 684.4249573684997, 693.1155705786647, 699.2617688036104, 702.4765459589169, 708.596391793106, 708.1213427643785, 707.2732659016494, 705.2977244235917, 708.3434725552443, 704.9427812022252, 708.5683126882196, 712.838493663632, 718.7561633695144, 717.2591196970121, 717.2971199625739, 716.0199113242907, 714.4263080070806, 714.8598272323375, 715.767281464986, 714.041569498755, 713.5713402381673, 713.2386967489883, 714.680965540694, 712.4208589175225, 708.7814163194023, 705.8885831854964, 712.6855209038282, 714.9367011267889, 717.0083723186275, 719.0977731697011, 717.348965589947, 718.0359200743852, 720.3315459418767, 723.426711777381, 722.2104114494241, 721.8244016467179, 721.7298448470277, 721.2932826521163, 731.3567924726858, 732.1407906171023, 748.0478404456118, 759.6790129565048, 766.2124541822214, 766.7842843718487, 769.545897426782, 770.4413960258488, 775.1647153766729, 780.1957445922036, 783.87977237709, 783.3576416626206, 841.3175225578898, 885.9355330965608, 879.415655902272, 885.6376958169934, 893.9300576174137, 901.7920847186148, 909.7443866420303, 920.1764621087516, 924.873680366076, 927.1585754795104, 931.6588403883602, 935.1489720525192, 876.2351096752863, 841.2876001405838, 842.1455537770274, 831.4774135373594, 825.8537181636316, 825.7769914828042, 823.0351661319639, 814.0508389025832, 813.8250860421135, 813.1859139833813, 814.8329293953625, 812.7702357195767, 817.8144610339175, 817.3822128503734, 822.1318942962184, 826.3570556719576, 831.2010046041862, 831.9606994239995, 833.7810898260194, 837.2959455140834, 839.1825324697173, 841.8783617732648, 840.1756188175382, 837.337033184018, 832.3126298739495, 830.7866950707431, 836.6365260800427, 848.1038375129165, 847.5944035449735, 846.6708986778713, 845.6401945921012, 846.4679600469188, 856.8525947359166, 854.4892883128697, 853.7141725264552, 854.6951864781349, 859.9566000162296, 856.1379778278866, 856.4853719545578, 843.594839649782, 841.1891093019764, 840.3172400420947, 843.1553171284625, 834.6283172910831, 819.1971535897914, 819.1719770384376, 818.5483188400249, 810.4333162029255, 803.9826668968902, 804.6659719154994, 795.0161931949891, 793.0299097672736, 788.7141968226734, 785.2279331659663, 778.8243953301431, 784.6833345196857, 787.0006564845938, 787.9359254891068, 792.3058445041238, 796.6502264029723, 799.5974537982415, 806.0341947822756, 810.3566353822752, 813.0856089576662, 822.505385967476, 820.5249954737752, 847.6280405725179, 884.8149011336995, 891.3715000054773, 895.500533359166, 895.127818399004, 895.5746977178649, 893.3831393928571, 889.3220834330065, 888.0107511181359, 905.189578857454, 904.0239573442268, 909.9646617733428, 879.8584241370993, 843.9349958432151, 839.3734015978836, 845.6427267544352, 845.5804448912232, 844.7763707030812, 843.7508817248854, 845.1690000382042, 841.6164331280736, 823.8894215845783, 820.8525156004024, 818.7799149844382, 818.3845966980236, 821.8831929624928, 816.6342350405384, 808.2438554167484, 804.8960405584345, 801.0663860311236, 800.1937808219668, 793.2723633865231, 789.5508970024898, 783.824392100529, 779.0247121681438, 776.4192354058447, 769.3545090666453, 758.3990518486968, 751.1570695675381, 744.7311765537661, 737.9242734366387, 729.5849067416547, 723.5935448612668, 720.923131242219, 717.8619828442677, 714.3747331342203, 706.8765422447868, 701.9542958110023, 699.7305956948405, 698.2633272374898, 700.702278213174, 693.2317047484438, 692.1569349257062, 688.860944646981, 696.4424522930277, 697.596602885333, 702.8760466575629, 702.32504278914, 707.5262695863962, 717.9963783987707, 720.0887381767819, 719.2763216163153, 716.9702613639122, 716.049516851385, 712.3268830456739, 704.9472543162153, 719.9124906780268, 716.1170250984283, 705.0996012777778, 698.1382422320261, 680.8893073650689, 668.5602013572984, 662.9347151431685, 660.0531810711951, 657.3826916664332, 654.7514279515152, 656.4076816851568, 654.5179285158142, 636.0814092945844, 634.6758162501745, 637.8358297683628, 641.016478201992, 647.3113567623733, 650.12042839752, 654.1912425064583, 655.7392842485328, 657.6826856664333, 659.7740316165576, 659.2780812523227, 661.8517384708607, 678.2576267661098, 674.6549801414137, 672.6897051617647, 672.0260071798941, 671.0318709688764, 668.810500904998, 673.2492960809992, 675.9374492852473, 676.9144933770885, 676.7075645673197, 674.2685920665888, 663.5388327294031, 647.1708104286746, 645.2860815129942, 647.3814042056624, 647.0334762853097, 645.2313057379012, 643.9476576980444, 640.3927652541292, 633.5863320807656, 633.3547090171958, 631.5450457102397, 632.5171354159663, 629.4191889470899, 632.3061135695268, 631.9464456227124, 632.7737519596171, 633.7495194828821, 633.9959352698413, 630.4522748166044, 627.4051397339714, 624.128141094216, 625.1769963399471, 625.3530450908057, 627.9358256677559, 631.6777305890912, 628.1011559791473, 625.541972141588, 627.1938499557267, 628.6673134032835, 632.7087358042004, 638.466481875039, 641.2766594001712, 645.6868566003022, 645.9986439100886, 649.0409410205257, 653.2668875619742, 652.2088616964289, 660.0259436858232, 663.387348055911, 662.8089784475843, 667.5739290081439, 669.2474847238503, 669.4591419314994, 668.5494432091044, 663.4805570392645, 663.0316933704481, 665.1829138105871, 661.159260718176, 661.0389122324442, 652.2571217881132, 654.6006081280996, 654.1235912015251, 655.1336218340665, 656.5158386002959, 663.9697315742296, 663.1804113540713, 664.9163229220354, 668.1456004727552, 669.6110530618581, 677.2282329351851, 700.2143391124338, 731.0343144995331, 758.0973346902786, 772.0190039761904, 773.3359765286897, 771.5957315471986, 773.4228786760037, 776.3144984751791, 778.2812591038748, 776.1929224983661, 773.0972821728136, 766.1778003634232, 746.1140058223623, 716.3435083684251, 689.4842946309523, 677.584546580221, 676.9830546291001, 678.3779458123099, 676.6470502001246, 674.9679672583347, 675.9759607351384, 681.0508489943438, 685.9067072781992, 681.8270240816071, 688.5039164642079, 698.0515957378617, 700.0212608143479, 705.2998050638032, 706.4589642864145, 703.4390810572673, 699.6894212362201, 699.9772520670674, 726.3492133828197, 762.5750762922826, 760.7067551038749, 758.2734283972825, 764.7412743839091, 779.3887982669623, 781.8395020290789, 782.9092773296281, 786.4216308087457, 792.1299614862279, 798.239030432539, 792.9407754521992, 771.9988837268908, 745.2183537619488, 750.0107354274045, 757.0417676216152, 753.3612356400297, 758.5686166396669, 765.4290192947402, 768.229850913243, 778.0917281756924, 783.138028963918, 790.3199087195767, 811.3886459137877, 814.6079665732182, 826.8276551335828, 834.9590466240276, 847.0166675258972, 846.305994926704, 850.3352373411919, 850.6803473927423, 856.5802822331933, 844.8116634514723, 853.1460636248834, 854.6454735761048, 852.2896537742763, 852.2305805572673, 845.3023295521319, 845.9087987759103, 845.8965875859788, 845.0867542818238, 844.6048131137566, 847.5178627435417, 850.0241413639902, 855.4566445737389, 860.1404988054, 862.9904893863212, 868.8764802419079, 867.9539016665889, 870.2919397612823, 885.2884226630097, 884.7810941449579, 886.1512456237939, 885.0520434800808, 887.7324371649548, 887.8403364854497, 890.5021358004201, 894.129220507314, 893.4743422689074, 892.2580928564096, 892.3894674607064, 896.3476848431372, 898.4225473600217, 910.5016481643324, 925.853740854264, 936.9297698842948, 938.1724293164162, 937.063630492032, 935.490738378696, 933.5460343895894, 938.2790629397758, 939.9810813881888, 936.384455774432, 933.1708320374614, 915.5713806678642, 905.7298199238252, 889.1094993078898, 874.978252069561, 869.0913708122335, 875.7333511589635, 874.8800728997904, 869.7761578490507, 865.7408681198257, 861.8192019397761, 861.3421315665266, 857.7284917080104, 864.8833770113602, 864.7839328166822, 863.3179748630564, 869.0360596846406, 873.1874992188214, 868.0187815610021, 870.9900154290292, 885.3481601910987, 882.4103253534082, 884.1202505266108, 887.5329572266417, 889.3282815848379, 878.6246020624727, 871.7291916486097, 869.4265272713935, 861.6407555100965, 860.9331752962158, 860.1606274155306, 853.0676456039961, 839.341511343732, 835.4514040099112, 833.5825612647121, 829.0788164393855, 826.0628855736707, 823.9576501321195, 820.4099005447201, 813.0812733138688, 806.1936424309835, 806.3676972048708, 802.1515489616402, 797.99280249183, 795.8154248120136, 793.9444125723624, 786.3025092518416, 777.6199332213097, 773.5613571674253, 775.1886935777828, 773.2623606898777, 769.1026961721379, 772.9910115060158, 765.1526714003512, 762.574559729483, 754.532944641092, 745.8249997124428, 735.5300008998945, 723.3812350392186, 719.5997871730124, 727.5015888577857, 748.3714544994929, 771.3420815292549, 793.1741131432607, 810.9521535954253, 828.2635429512508, 848.2633076666008, 880.743660872945, 908.7419733883324, 936.231081482042, 971.212493830221, 993.4335825664256, 1008.600232555322, 1013.15598416122, 1008.7952428281978, 989.0847642382188, 1004.8727472100062, 1013.8968130355516, 1032.2667429867724, 1038.6555253352003, 1051.672281027778, 1052.023690459306, 1051.1445304236695, 1048.746885740274, 1040.9001412594926, 1040.2779752954202, 1043.8492412915286, 1062.849406695692, 1077.245770740196, 1074.3123215164176, 1055.7641794419512, 1048.0657325014004, 1033.7138962896825, 1035.988901517404, 1038.3860725959385, 1043.859235685652, 1047.1435145599128, 1042.9604894550264, 1043.7151107664176, 1038.237972828431, 1019.8804551186588, 1015.7517342698412, 1022.740203162854, 1019.71783765235, 1019.8226695469964, 1022.4702982990976, 1022.5530864147214, 1021.6089143926048, 1023.3195677464986, 1023.3159217188764, 1018.923273207594, 1026.9539230002893, 1045.3708780062248, 1043.1453449602311, 1045.458306796684, 1046.775150241752, 1044.131479590336, 1041.7160717363056, 1043.973322212574, 1046.2402884649082, 1042.6778077930285, 1039.735571648226, 1041.122172167756, 1026.9018266025178, 1013.887366206638, 1014.6438746427424, 1012.4072695193744, 1013.6274474593836, 1019.884868096483, 1019.9640363253968, 1016.042358793962, 1008.901691592826, 1006.6113665628696, 1008.61709246662, 1007.5156704644412, 1005.6984259169778, 1006.7774193140745, 1002.7586355782756, 1002.306580836757, 998.8394798079676, 991.8313000242872, 991.8978049882508, 992.040020342406, 993.347226924214, 997.2741183068782, 997.1083954644414, 996.8341440021009, 994.8411723548086, 993.0499438078898, 993.3951059099752, 996.1643980291057, 994.9034446640992, 992.7953962535864, 993.0730885166512, 996.205935257625, 996.4243099280682, 997.848894069172, 997.8593609293496, 995.8726980816992, 993.270127917282, 1002.6481131760816, 1004.1732135469758, 1008.2816929541706, 1008.7382978225958, 1013.7512932356052, 1015.7376498993932, 1018.9369471939, 1021.8997151047652, 1022.7367025755526, 1025.6031268283537, 1028.9199229803144, 1029.59674460263, 1020.1630539375974, 1021.1850182689074, 1021.9878760792872, 1025.9153948854796, 1025.415226824541, 1034.2973856842514, 1031.1307317168537, 1034.0135880550108, 1038.2978517496888, 1040.722974834178, 1044.169809480392, 1048.0604543130253, 1051.9674784076408, 1047.491980008523, 1051.1817415914254, 1051.6708197144412, 1053.8022750898692, 1043.5002177846252, 1078.7010290478524, 1085.3438666604418, 1085.900664912626, 1087.5699801111891, 1092.2896952077815, 1098.8954134660753, 1106.3160072062713, 1106.922874471837, 1107.7856578276533, 1110.86315481108, 1113.4351577322595, 1118.7805628309118, 1086.248054799642, 1078.4634005266105, 1080.013403423981, 1080.0615453765172, 1074.064517812627, 1069.703757103797, 1071.340206357814, 1072.1416705468278, 1075.4593621326906, 1078.0643893633048, 1075.2047124101414, 1075.7444757023009, 1077.1683372668106, 1077.8573685440651, 1082.022167267608, 1084.345117304117, 1086.552072975769, 1086.08975591869, 1094.5767694608085, 1098.243014129085, 1100.2083673872548, 1103.4225679127762, 1107.483247761127, 1108.9065052510896, 1112.8337680850452, 1116.611183993542, 1115.755450008559, 1119.4023878530863, 1121.9077476548396, 1125.6624466753035, 1135.2252202086834, 1139.126998089947, 1143.2829841833177, 1150.1587985918145, 1156.184743828198, 1160.1569504604731, 1169.2588502868814, 1178.6192877283693, 1184.5692552261532, 1195.22111515305, 1202.3478685680827, 1201.7128283976033, 1214.676793097417, 1218.337558756595, 1219.7125032301587, 1200.5434513728603, 1188.2417874984435, 1180.0609587917834, 1170.2571939852942, 1150.0903025617802, 1138.54835439488, 1110.8778730469965, 1095.911198738173, 1074.4286450869124, 1049.124120534547, 1017.7854742725644, 997.5314950624024, 982.8660415279336, 963.5287640909586, 938.1856343649238, 911.2695797279692, 890.24845840554, 875.6644658824307, 866.5124914677092, 847.5326567553687, 831.5437376015406, 815.7795986805165, 807.1963539239715, 804.9553901194366, 813.1959651851716, 824.7007842299404, 832.0205869749456, 846.1725698976035, 847.5223390512759, 852.4075307240896, 854.2443747363056, 859.0078857794119, 888.5619906425459, 912.8162283233584, 929.4745792112434, 933.5139844804304, 929.0490159247548, 918.3695898599252, 912.6840422005108, 907.6400918094772, 907.585622352388, 905.1033486708404, 898.763356680546, 895.0753651320546, 864.8181048670245, 846.7454548046736, 832.01417855512, 828.8099991492303, 830.4139619686429, 835.6611970243556, 839.4758556947556, 837.4868674234295, 841.5970153705591, 839.5390338387799, 844.0253300830221, 848.7580285406162, 858.9198945714285, 869.843291473473, 873.6888324767584, 876.5647051296296, 881.1636147913943, 888.2994375397603, 883.3344931553065, 878.8879340319018, 878.8851281446468, 879.3628026423124, 883.5767456304856, 881.6404243227514, 868.0688202493775, 857.946708482882, 853.4397424943952, 853.0930469655306, 845.4655565485527, 838.9564222024587, 838.8908672058823, 842.6257733423448, 835.9849389729226, 858.7115607624493, 875.4772360140057, 875.1898146208373, 870.3232275568784, 864.2859945708839, 859.4735928099907, 850.7627316645658, 844.7858448767506, 841.0821433653127, 834.4632309550465, 823.7042087887488, 824.0955497489106, 790.7091497734204, 765.8568610361809, 759.2982091539059, 755.450996188531, 754.5881208593214, 750.9643590380485, 763.2296323863211, 760.7194647195145, 750.6607698113912, 747.7938620325504, 744.5941270762527, 736.3653301172579, 732.0538407356053, 725.5760655697167, 718.6014839719887, 709.2255142065048, 702.2261126781045, 690.8605626402116, 664.2144658770808, 661.6177406098062, 658.1915735117608, 651.8792747098136, 650.3230107732039, 645.9233449547444, 650.8005959519745, 651.1020999731842, 650.1788823755057, 648.1583648648459, 656.0769513924681, 657.5105422129221, 671.0681128081231, 666.800708940943, 673.3697920494867, 676.6153324060148, 675.3276474060069, 670.8675926791913, 665.0662621528385, 667.0195307017741, 666.8511565778815, 662.534854798513, 679.4571789222608, 681.3828597203361, 672.1329259027408, 674.901664298456, 666.5701987038126, 662.4608928293376, 662.6101328836861, 661.8731537563804, 654.8754822665733, 647.2443499334735, 643.3540232167757, 638.8978332477435, 615.8777111867245, 611.5028155140055, 603.9689025480858, 596.3800791894647, 597.144130666511, 597.7996699858388, 593.4026354900404, 591.7163300167653, 593.3589190902583, 595.3365705991285, 595.9177535263772, 594.6761415434951, 617.3518042833022, 617.2479422766884, 620.6264700571119, 622.100944019997, 616.9019654586834, 610.167737408808, 607.1119658674914, 616.4575783320066, 618.227491608699, 617.4959026223934, 620.4352112577692, 613.3792419621848, 592.9006300729069, 590.0114529789436, 589.4350742518674, 591.5451209448814, 594.3406465329132, 597.9046996790382, 596.9009406415344, 586.3373441091834, 581.3084849908963, 581.1283306044248, 582.0348532615158, 579.808194429583, 585.9055924536259, 583.6001488999154, 583.2310069400871, 581.2501310147052, 578.6410962544351, 576.2887272066059, 574.3134592888266, 572.0607737788671, 572.7162987440865, 563.2612293979049, 561.6614196337534, 559.3644329204793, 562.7844160318239, 563.283867725483, 565.6403414042172, 563.5948335032679, 565.9925318146592, 567.2170483369125, 571.6655015305789, 573.6079538903211, 576.610402360661, 579.057028810421, 583.4566114216357, 586.7183729999825, 590.1499177211754, 591.9009062997485, 592.9532359318571, 597.1790569063269, 598.3616350977294, 597.1617779327731, 597.8813626669779, 598.9350340511983, 601.4447180296452, 602.0919081983349, 601.3290428794533, 596.0539791089104, 591.5735216055089, 590.3316478873327, 592.3028490715842, 593.7513892065048, 595.6428662400405, 613.3895799263927, 617.5724748438375, 619.4691312949851, 619.6700220073088, 622.5313746842515, 623.8559667528012, 625.1202008003423, 637.7692306380329, 641.561950044818, 643.9759073733271, 644.0782920901806], [64.5796703225179, 67.08232080790216, 71.01731472860256, 74.54769815413944, 74.19278636826954, 74.59280338366729, 74.97174790538438, 75.15547139007548, 75.45904254684096, 74.78344113244242, 77.30080784544701, 76.2707930908808, 75.53669603499777, 73.65634181800498, 69.59172568868527, 66.3808339379085, 66.33116507228448, 65.99044267016808, 65.5939419327731, 65.3426646048086, 64.65554463593215, 63.69980183924681, 62.01655467195767, 61.98488673809916, 60.83987314361063, 61.52820209663866, 60.94442148728344, 60.748968785014014, 61.04957569382651, 61.6666630182851, 61.364855771801416, 61.58994242973662, 61.52694476345767, 62.58915000544662, 61.7089507893713, 61.89248860008754, 63.14748362675397, 63.794481244553374, 64.40940412944616, 64.45957009842826, 63.74414730991874, 62.670337466619976, 61.91133952793339, 62.62187075746965, 63.07826851859178, 62.37379497072634, 63.4465384859944, 63.8320895728823, 62.2531811953065, 63.74575018145037, 63.393957759959534, 63.3906816058467, 63.75808848049851, 64.41301979512916, 65.05987192650066, 64.74362411414566, 64.52445229162646, 66.89834603405419, 67.59533652505446, 67.83076772572817, 68.12231578168839, 68.69664891184252, 72.28191846794273, 79.52711891588858, 80.32385240001236, 81.49478734298165, 81.92280589872655, 83.11958956186652, 82.64446851625299, 82.86482614635726, 83.39939871794274, 83.78396205539994, 84.0900723295985, 83.27041399058513, 80.14090935348582, 74.7350207989418, 74.30532829139433, 74.59231306971677, 74.3702367212107, 74.99097978466779, 74.96711161142234, 74.9414225480859, 75.59166062877372, 75.77281671140679, 76.21341643113911, 80.10278636725803, 82.74346065553999, 86.156660089169, 88.8967161346872, 90.93494096833176, 90.93236428018984, 90.52030295743852, 97.43461633667911, 97.91192557485216, 98.63333994366636, 101.46489053516964, 103.16359780539992, 104.23228496428572, 101.94828097222222, 100.1049342595705, 98.6283037772331, 98.91416705890134, 101.44164721553066, 102.984225466382, 95.14411388556192, 96.6029001148388, 97.27542336095549, 97.22585509298165, 94.4809701101774, 92.4669228208061, 93.5256594948646, 93.64589226953002, 92.46345692016808, 92.78721956683783, 91.76053673023654, 94.88254491557736, 94.33787953182384, 93.5116043340336, 99.8152854169779, 98.76091334311828, 97.12422060045128, 96.58110533278868, 94.46782796036024, 94.28344458704548, 93.82124539495798, 92.95523015437286, 91.41155149813258, 88.72240950816993, 87.90431625762527, 87.34424583776844, 81.84746770697167, 82.07555774529192, 82.91171438367569, 84.41652143572983, 85.44605686079987, 85.16629354349517, 85.08722627482103, 84.60679443689698, 84.38890451058201, 83.94296898147695, 84.65898718930906, 87.35737262254902, 85.9116041534738, 86.28068972245565, 86.06638761378709, 86.09951540087147, 86.09769650793196, 86.32063941199553, 86.20714550529101, 86.04350790483971, 86.93634832446311, 87.58261772237783, 86.34349063772176, 84.48003681146903, 83.7859979961543, 89.86157432587876, 89.82148565483972, 90.46777914176782, 89.9064220707283, 89.4671065636425, 88.50785948054776, 87.91456543347338, 86.98834848622782, 86.41626268930906, 85.1061943103797, 84.51344844989106, 84.89582108239964, 77.00920036869817, 76.22645672405498, 76.10224390009338, 75.85315313694366, 76.0054582377062, 76.0768725632763, 75.52179414729224, 75.52344969257703, 75.38639893456272, 74.73409543253968, 74.6420057237784, 74.55250180960162, 73.68751751563958, 72.35899935691592, 75.14191337156997, 75.11386133115468, 74.92172737029257, 75.84567710770894, 76.11306276602863, 75.66661094647012, 75.19660196615314, 73.53339546187364, 74.27888553711485, 73.77835389371305, 73.0475624194678, 72.37190998209748, 69.75748015094926, 67.95150216893869, 66.21378051423902, 64.4186425481637, 63.05821244067915, 62.42806848728347, 62.13305753322441, 61.253919998782514, 64.6318860081388, 63.41704795152505, 67.96291452427637, 67.40322381400017, 66.54196605135388, 66.41745225140056, 67.08707871309723, 66.58788620751633, 70.97281433151134, 71.26682064480237, 71.04029282438532, 70.4545467769122, 68.66482051384997, 67.8852216819172, 64.1167697980859, 63.53273610385352, 63.01979986671336, 62.197403947089946, 61.55377053197946, 60.66089684477124, 57.982963892545904, 57.96727320192968, 57.96488084780904, 57.56396843775288, 58.682082223544974, 58.610599285014, 59.25752778874882, 59.35984851402704, 60.47890425583567, 60.50987498557618, 59.461826444133216, 58.24665792544027, 57.59872985395268, 56.942704797074384, 56.90161403182384, 55.99449220572673, 53.76807549081855, 54.31619271023965, 53.061597383831305, 51.96752633341574, 52.05701525117946, 52.49593539013384, 52.92697055925149, 53.056342704914925, 52.84967413748832, 52.65981168375351, 52.35383550645815, 53.132601896669776, 53.28581116534392, 53.23821168222845, 54.15373433247744, 53.51459870110294, 53.46997215071584, 52.87834803960473, 52.97058602816299, 52.443389362278246, 52.422798906473695, 52.12401427790811, 52.186753672035486, 51.27367072275651, 51.28987876219852, 51.3720512089169, 51.03086608994708, 50.13252395629952, 50.41353699688764, 50.21135731893869, 50.125290279800815, 50.3747142815126, 50.28545147966276, 50.28295898918456, 54.29576071802112, 54.27958406305126, 53.530767315982, 53.597075209997655, 53.22685599996112, 52.54815734145588, 54.19441030983505, 54.245441979697866, 54.06854866310868, 53.77934175877017, 53.78793007409136, 52.332570583085015, 49.79178391767819, 49.58115354574387, 49.43700164651416, 49.55325090538437, 49.92403020043572, 50.436564867569246, 51.351465565748526, 52.00351834905073, 52.25944018191721, 51.69774067040149, 50.90004407376284, 50.58812023529411, 50.51844752614379, 50.17934412356054, 49.55642746039526, 49.20508904582944, 48.4194395821662, 47.41689098646125, 47.08023810115157, 46.620408642545904, 46.74364513429817, 46.76716398218176, 46.21434500778089, 47.613171273653904, 47.72182401268285, 47.49608086951447, 46.65133658294429, 46.86417242172424, 47.01690730851229, 46.18520339159664, 46.93110891861188, 46.7428957806567, 46.61644776774043, 46.2882699046841, 46.99297009816501, 45.4145252474323, 45.64239821910986, 45.88678195482351, 46.340509373045045, 46.20009204521993, 45.70031024064573, 45.88281730571544, 46.59760601438276, 46.874084770263245, 46.753770487560736, 46.7858133610031, 46.13959851603822, 45.85209708242672, 45.69279362535703, 45.31473265104361, 45.46380300715842, 45.53126778851541, 45.0469136637962, 45.21689816823714, 45.63066951379617, 45.4551649213352, 45.51939986500155, 45.498178064849206, 45.28522755501088, 45.5113495454404, 45.80249748042848, 46.48897443946467, 48.71218260457516, 48.82084337107066, 49.79612002723312, 49.100139051847336, 49.45962348895114, 49.953703838468726, 57.11308661360101, 57.77045559733893, 58.815273997976966, 59.19584005392156, 59.71036423907114, 58.11861779886399, 57.146204385305786, 58.12131905866791, 58.76500264656863, 58.32585105428597, 59.64664586932977, 58.718688678026766, 53.29143248350452, 53.10894606652661, 55.46841271078432, 56.38066779940865, 56.06608859775393, 55.74676977085278, 56.439787947945845, 56.36738158115469, 55.802658192499216, 55.78095437441643, 56.152502299408646, 56.27793013511064, 56.554446918348006, 56.889868509803925, 53.62316265935262, 53.7749078697479, 54.35096614861501, 54.510840004179, 53.87709978610333, 54.12879582399626, 54.80980920751633, 54.12479967398857, 54.41023427863367, 54.15215756427015, 54.14444034204793, 54.083159462496106, 53.67931177591037, 53.88447961507936, 53.56856044397759, 53.14653163429816, 53.09163983710282, 53.0053325130719, 51.95062835518521, 51.67417475527936, 52.39850159858388, 51.92843484469344, 52.02677982181762, 51.76231237247121, 51.79418252757512, 52.26254231411453, 53.22738171887644, 53.8674312387177, 54.09610223451603, 62.868846304522, 63.60216402495332, 64.37300552746655, 64.97023126322752, 65.53709442281357, 65.8505602491441, 66.85275261345899, 66.99498386807825, 67.47507751548397, 67.87290638834422, 67.81148155376594, 67.26567586457593, 59.97941611679117, 58.49364400622471, 58.537962491227695, 59.7282962547684, 60.004452679116085, 60.26058839845939, 59.87142963375349, 59.69527177009421, 59.2168957858699, 58.914159730781215, 59.10295465880796, 61.19070439727162, 60.91447624937753, 61.41419226945222, 59.35893130329909, 58.4448923462496, 57.11995358333334, 56.0613231235135, 55.37157708403361, 55.1985701656473, 55.32421009982882, 55.46533150711178, 53.93614956036559, 52.51577882267351, 52.92220071023965, 59.72325865042472, 59.68189973695119, 60.324100560508114, 60.25492055890133, 60.243276237937046, 60.69319930602241, 60.8637771415694, 60.51215625038904, 60.57766311990352, 60.74566363826128, 60.19087438928317, 61.24946151104888, 54.86602818635232, 55.94639109050864, 57.27167170276999, 58.45427211449515, 59.2929790984192, 59.230343121381885, 59.198338772591214, 59.8915921311858, 60.06692008979147, 60.051567014246274, 61.058802867960885, 60.25120200536881, 59.33071401563959, 57.69768629570981, 57.42608559640522, 55.423700370292565, 53.92209086064427, 52.48403239433551, 51.49627552500587, 50.20295996101774, 49.22777199603174, 47.3727890447797, 48.00335063067581, 50.79826654375216, 52.4831788304544, 55.58466316214208, 56.72640759430438, 57.31651474665422, 57.220866540538445, 57.46625386733582, 56.2532197396148, 55.211037496732025, 54.22469162265083, 53.71835469592281, 58.00600282444951, 56.032816472189815, 57.92380309889511, 54.82322389766575, 52.716364845549336, 52.35634256722689, 54.43515734601618, 55.22287221883754, 60.53496267749378, 61.491313105197634, 61.36113324151884, 59.26822427519128, 55.363465366829416, 54.682327143947184, 51.55439897675917, 50.82351556971677, 51.542482469498914, 51.41873838982259, 51.163908567615934, 50.78972500231547, 48.21968626517273, 49.48907357399627, 50.47767495424837, 50.52754280075058, 53.65021362799564, 53.69071222960622, 53.01607867900003, 54.31021087379396, 55.14739377077498, 55.22529947868036, 56.66801806128488, 56.69209413375349, 56.21976747385621, 55.107975697478985, 55.40326547370059, 54.52187572500326, 52.69297426143791, 53.31991743859631, 52.96206081356987, 51.62603920429181, 51.524530509539375, 50.95791596897046, 50.163986675303455, 48.83523706314069, 49.15853758093682, 49.08663365268854, 47.875301225101154, 47.91515771486864, 48.06656934982882, 47.472303688942525, 47.81255952054155, 47.359043912776215, 47.60904279162777, 46.95708580046266, 47.77171714285714, 48.13176506286959, 47.95804949805478, 47.57982229140148, 47.85435988414255, 46.90353855999986, 46.53015545821662, 46.67637356546777, 46.40417950031123, 45.78083210266851, 45.79468707773109, 45.41491722787116, 45.016054383208846, 44.19772249915125, 43.75497767086834, 43.51789318178689, 46.759672598255136, 46.38338603161705, 45.39823404909742, 46.33814765834112, 45.985687381108, 45.48184507250103, 46.59463919887956, 46.11571357679738, 46.45540958979148, 46.59290538211951, 47.028836465187645, 46.280005863445375, 43.40885648746828, 43.00843282155242, 43.509600019296606, 43.446210526921874, 44.40083003283535, 44.051455682817206, 43.43623809235917, 42.91326709492686, 42.92571872401183, 42.48236881987239, 42.3636775183629, 42.288054389392094, 42.37445281123561, 42.24290289215686, 42.04787408955804, 41.21909733255524, 40.44668328944911, 40.362869622626825, 40.89888241627762, 40.55926349862667, 41.01638869106596, 40.76643982158419, 40.77006040273887, 41.84712526027078, 41.80574561028269, 41.24329291014757, 40.94587459562714, 41.54127418362901, 41.72668272082166, 41.46047333119037, 42.21941311095549, 41.97990718552496, 42.53723406456907, 42.35958647926522, 43.164977076468, 42.01646033986928, 42.0187732575592, 41.61263609019868, 42.082699592125735, 43.0403744754442, 43.54567934559248, 43.22461607326228, 44.42471814145657, 44.530626019841264, 44.42635676867413, 44.52469915305011, 44.5060438846094, 45.23291346814938, 45.68895033893557, 45.52580342930867, 45.758845912148566, 45.67913333909119, 45.52914198665318, 45.61087686029183, 45.65163577863368, 45.33395599512527, 46.226423900793655, 46.13704385815437, 46.31667871763149, 46.55768527013697, 46.42793301027599, 46.21454147783181, 48.57465638169676, 48.39615012143376, 48.259810100606906, 47.59012055412363, 47.73633835457517, 47.28817068129474, 53.93606676788308, 53.44026544996887, 53.453860971294354, 53.38621434158107, 53.7878701609088, 53.85047060087103, 51.059983302287584, 52.21669639719888, 52.21918121590154, 51.4600144673916, 52.52041847440088, 51.92427864347961, 46.41037262494165, 47.02016586456519, 47.03669096599751, 47.29772324774355, 47.0478139440554, 46.65722594708995, 46.7926309870968, 46.448865620837225, 46.413020563025206, 46.87592449354186, 47.10315253758171, 46.52875175863679, 46.89533952808902, 46.40121473537192, 46.51163039122315, 46.3160941017507, 46.60727792605044, 46.61163309943977, 48.160555633030526, 47.997051154995326, 48.88636380211524, 49.27068562815126, 48.49588168059446, 49.15560544091451, 49.36277183699035, 48.89393141985683, 49.09805144133209, 49.361673914799255, 49.03396517728304, 48.32688472019919, 47.64823159911883, 47.47577347411686, 47.265291369878895, 46.93095005796763, 47.62172421136955, 46.54378408061002, 47.35445760169623, 47.36632611811391, 47.363324338779954, 47.899857877762216, 48.61328692086835, 48.378201886399005, 48.7806878828976, 56.800706315826325, 56.54666026649548, 56.18600742348016, 56.39545283168578, 56.009684066993465, 55.64418216933876, 55.23878026610644, 55.28228022890276, 54.69118525186742, 54.04700883641394, 53.51273210346557, 54.41966501353875, 46.73933447305284, 46.56906893899005, 46.58865296615118, 47.1198152803202, 46.50991334008779, 46.97860298101009, 46.984549314156034, 47.30161391094189, 47.52053061858077, 47.91084287558357, 47.35855878877347, 48.05509703559305, 49.470080729847496, 49.91373344895736, 49.318406719184445, 50.7856081774043, 51.06365797391068, 51.94839914130097, 51.926909923047, 52.50491933022097, 52.569350254060346, 52.30344708986929, 50.97342708761282, 51.572124516884536, 50.67539320510427, 57.85813753338002, 58.510429978446936, 57.466936877917846, 57.08550940094926, 57.21972364114535, 57.14169004221851, 57.03227228006538, 57.188202689137874, 57.28751594140991, 56.795661976268285, 56.52364964291745, 56.578946889978205, 49.25616024937752, 48.93099674824648, 49.5452669518363, 49.40698642864923, 49.56118536445689, 49.77310450412386, 49.83990256084656, 50.0106490725957, 50.56127184794392, 50.17875483185496, 51.763995031979455, 52.04586169452225, 52.936199683862434, 52.77652097508993, 54.70144684691068, 54.356432914410206, 54.956558113971774, 54.55862274727669, 54.48044132415188, 55.20033675609503, 54.98423664091192, 53.831369209955646, 54.525211486689486, 55.043815749336034, 53.76147996296296, 53.42200413593215, 52.10166910435024, 51.214668972144416, 51.49349454924211, 51.08564893285092, 51.16030235243157, 50.56377430493308, 50.56398562340492, 49.77136927878929, 51.86300753275754, 51.536008279878615, 55.9335077622938, 55.53903138686586, 56.467237981325866, 56.31841523233738, 55.99670043339558, 55.94863063398692, 59.8644399370526, 60.25682803991596, 60.561254949735456, 59.106669524514345, 58.15099700420168, 57.74639876081543, 54.424254153906, 54.50760138958916, 54.5481018920784, 54.21840473054777, 55.342501205259886, 54.230144962807344, 51.739093061079984, 51.95706253516962, 52.079028656784935, 51.19175373415902, 55.27977613865546, 55.54627327007469, 55.49673408255524, 54.652800616013074, 56.29274525645814, 56.241065392234674, 57.349909148303766, 57.38111612807345, 57.565354678026765, 57.61742350054466, 58.41046598373794, 56.85236601666536, 54.34884356621537, 55.06720495121382, 55.35465248467164, 55.11074534757236, 54.860097620214745, 54.678166464923095, 53.87571512138189, 53.45003759547152, 53.35594622004357, 52.7609968443822, 52.3739005410831, 52.53331046514161, 53.21970030726735, 53.372661540382815, 53.619279698257074, 52.70927179359376, 53.410227023576105, 53.03320953229069, 53.36386405275444, 53.149770811235605, 53.08362466821379, 53.34235147768961, 53.100532472144415, 51.49396228618114, 52.3942541053526, 51.23542825177668, 50.85870073996265, 51.37648882205104, 51.14902513525976, 51.207078341581074, 52.17343222657953, 52.21352604123872, 52.39777878903804, 53.54589691744476, 57.51035210978837, 56.32211115546218, 56.26129642561469, 56.65481110068472, 56.462387796247015, 56.31086201626206, 56.61020079660753, 55.64922856784872, 55.29284666682229, 55.25990719039838, 56.93564447128851, 57.547038791005285, 54.86776949984439, 54.62108460364146, 54.74600047549019, 55.341773640289446, 56.22372769452225, 55.404734035792096, 55.57570118238407, 55.59752642125739, 56.23918442125739, 56.319055181294736, 54.479513246342975, 52.18848337200436, 52.75349743635231, 52.67602031598194, 52.782479148615, 52.89743071802054, 52.65677277023031, 52.577093440631806, 53.72201037184875, 53.84228224198568, 53.908848166822274, 53.422012715208986, 53.01626802661064, 53.65312144903517, 54.47909053641457, 54.273973984514726, 53.94547546132897, 54.60683897868036, 54.23261275988173, 54.11781537143572, 54.68396310621954, 54.18898086111111, 54.182365309368194, 54.36110366643003, 55.45357307920946, 54.75938759547152, 54.41767801929662, 54.349118618736384, 54.83664969389978, 54.37974261780202, 53.98499290475931, 53.87036812428288, 54.19514793176159, 54.012501843215055, 54.5085093320884, 56.63024556431397, 58.33902697220019, 60.63672388095238, 63.318363974011824, 63.3125691060036, 61.253353600291135, 61.6929124151883, 61.03606681535948, 59.00587131321911, 59.553009074774366, 58.67654979738561, 58.65336989044506, 57.23573677512195, 54.94045217824732, 53.021489281937306, 52.229864181806334, 51.79761093798631, 56.88220997066605, 59.38309627089623, 61.08628966153128, 63.641177124754265, 64.72770947782446, 65.28938455532213, 71.99585325327381, 73.04882969887956, 73.48470694016495, 73.57878756257327, 73.06465492374728, 71.36833692265795, 73.34871786134454, 73.42447682197324, 73.54138318689697, 72.58092981050358, 72.97058048319329, 72.64153259685848, 66.8556945953159, 66.37661902746653, 66.53818236834734, 66.6472248802521, 67.13299012960151, 65.79480291223156, 64.51411875933707, 64.58317844397759, 64.18811176721263, 64.73852083295412, 65.74330362993632, 65.47154957579895, 65.42777162182735, 65.09394909694988, 65.35135246529723, 65.5854961180361, 66.4651953455234, 65.78911713087457, 65.65459362286025, 66.15488227754435, 68.0575063570268, 70.52287012493233, 70.87562383940242, 72.13592621680738, 75.57861241760038, 76.37483190620073, 77.86346604470121, 78.84308565966386, 80.26709241332088, 81.24404742452538, 81.10153074540928, 81.21617305003112, 81.15333071676324, 79.0841836171802, 81.16129034780579, 80.93974556263616, 80.93440898840649, 80.98448868572984, 80.3689641712308, 80.02570427684407, 80.39314325077808, 80.23818169545596, 80.59220392413631, 89.33975411523497, 89.33331609776174, 88.65438558849468, 88.66791523288205, 87.79878144849052, 87.12588840935263, 88.27298395627139, 90.05845529863056, 90.0509279521942, 89.7045151876195, 89.64518180283224, 88.88868458071136, 81.29089577443199, 80.06922705283223, 77.56843995420363, 77.76097386926033, 78.37574250949268, 77.50969188328405, 77.19476231333644, 76.13733789070312, 75.72663731963378, 76.5857999084079, 77.19947296599751, 79.72412636924538, 79.82474640180516, 80.57944879178338, 81.83823793349933, 81.93201754310614, 81.82722131062427, 83.24646744109866, 83.9111061949113, 84.54657808778676, 87.10722828453378, 88.42569105454339, 87.16078988636981, 85.99870563793269, 87.12308161212492, 94.04023993151084, 94.2098108115992, 94.7866853400161, 94.9263323450306, 94.67100610601408, 93.66075858051155, 92.48911527980027, 91.0432977385196, 88.82088934074652, 88.03747385410831, 87.50584344037442, 86.43454737402492, 77.97222357199074, 76.01133283943032, 74.92425246607532, 73.97123102295362, 73.48484372167755, 72.08262324961554, 71.17815531653184, 70.09170602386052, 69.2751374641301, 68.8254948951123, 67.9182084851385, 67.93005732409115, 68.58528634827265, 69.13004783633549, 71.21468888274015, 70.57917160348583, 69.66070000910365, 69.4911546593997, 68.89580155481121, 68.72038777871083, 69.08436711450425, 67.54899004558109, 69.19956940935263, 69.28563616275041, 68.76604186350569, 68.7697898916122, 67.5992670288496, 67.30635920422957, 66.43841813754733, 65.51646041017675, 65.41415692094616, 65.2564766606689, 69.9060660178895, 82.59601972476968, 87.10314270465246, 87.0803084449891, 91.58395558418924, 90.994442880374, 91.53772993425147, 91.48135834751024, 91.7479527181912, 91.97214013423007, 95.989019125817, 96.16652358395582, 90.78388692971626, 77.04810230310915, 73.07795244172114, 71.47494241319315, 67.53692949912724, 66.08342420556131, 66.89389349494243, 67.27523941573295, 67.64906958602941, 66.929490676704, 64.73507764231248, 64.93809822183317, 64.1389300286687, 64.69462275142084, 67.10900454899043, 69.30102532285117, 69.9455169642079, 71.15890392091957, 71.04564772042029, 70.75029747461421, 71.0561220087146, 70.77619041472144, 70.82900502884377, 70.64078391394335, 71.19974206162466, 70.88206793907304, 68.42429483608518, 68.36021858207526, 67.48695830364275, 65.45554487303133, 64.86918473723934, 64.66383885809424, 63.91890835620915, 62.68582219978797, 63.05904155523135, 62.20211234002356, 61.372983900504025, 60.88466314358725, 61.696041022175535, 61.70247645688868, 62.21252203474169, 62.66790938562091, 63.77145059570494, 63.46828982050331, 62.8364381175122, 62.67358520728291, 62.45876824968877, 62.54310059665422, 62.96698193661625, 61.83077162262683, 60.651650466308745, 60.36260321055089, 59.89254008185495, 59.13332420603343, 59.758553209270325, 60.05098267250234, 60.18324692193504, 59.98133871988795, 60.14214380983504, 60.0239856556178, 63.48843214478974, 63.47615843300666, 62.70193460443627, 64.09338282683231, 65.2287740007315, 65.34505734368567, 67.40518449418123, 67.8964104156904, 68.14468326482476, 71.36063973783324, 74.2499101809948, 75.31758983464974, 74.26900648537847, 75.20252089674759, 75.9461845719687, 76.11538245702562, 75.31329217258013, 74.13338224564924, 71.28988079769685, 70.42362762293807, 70.32059194392644, 67.46218838927793, 65.54762500544662, 63.49796817804622, 64.20710760776532, 63.49713695855834, 62.591911505368806, 61.93109767203678, 61.885991484488805, 61.70104128247613, 64.57051882205104, 66.00350637114846, 66.64552499295895, 66.3024722930426, 66.57987426476294, 67.01320146537503, 66.41418955704366, 65.8708497438531, 67.05438959243763, 66.11396115421724, 66.09109883971367, 65.4613901415344, 63.762477168767504, 62.73901112566137, 62.23373761990352, 61.66281828559563, 61.94341638523186, 61.15349487099284, 61.72517608457829, 61.81076650003047, 60.91856626889593, 61.36995795217042, 61.78528206535948, 62.66891856753812, 65.25025199673202, 65.66238986935886, 65.72426086873249, 68.02176486204482, 68.81819979363328, 68.60799727900456, 68.54031006769375, 68.77025781364767, 68.58791805571117, 68.281503078362, 67.38556836624649, 65.48155604481273, 64.15057806356988, 63.42274333191397, 63.37938972984749, 63.47068817955702, 65.20370662177093, 67.67140542732648, 67.85784023540825, 68.56675552769997, 70.35378120256121, 73.95949696981015, 76.6951797491441, 77.52718849377528, 79.69758327948958, 86.42468249348545, 97.1572256098956, 95.5102400337584, 94.13658848319326, 92.24121330905696, 92.450564192188, 91.16177180979165, 92.9580324753346, 92.5491773745701, 92.52050334064737, 93.53438591521314, 94.1325618341114, 87.00450426781693, 79.339716513151, 79.83738145317525, 79.8005917814603, 80.33260222089947, 81.40159054489574, 81.36950834679428, 81.28372243629282, 81.1569507736539, 80.50514782352488, 79.19411401959556, 79.4807516493931, 79.3235363366013, 78.93905653913788, 78.7003244514623, 79.07415039050083, 78.76105083175317, 79.22688882722404, 78.69617623900903, 77.4029294243276, 78.03583095829443, 77.86123431206144, 77.33015105617802, 78.13936536290072, 79.02949866799794, 80.61493221055088, 81.42875401082668, 82.52600805875392, 83.25377207351599, 87.05468075485608, 88.96372080787583, 92.2817973808073, 97.19770608598898, 100.34164217849757, 102.56369069957456, 105.58163106571864, 107.834667305839, 108.93397094322026, 111.9417797071273, 114.92534041036416, 116.02081955864134, 113.95631453446934, 113.29448865063802, 110.27485982718642, 118.82296972322324, 120.58098208016808, 119.91575559220098, 119.52618339689803, 118.79288941293184, 116.60943278882664, 114.0284499048358, 113.31341886114288, 113.66451735652038, 113.29208979966384, 113.51347333964756, 113.75560028718812, 104.97708196459696, 102.43826461409314, 100.84219326930608, 101.53346341112928, 100.6550823713819, 101.53486333037658, 102.78810954574126, 102.97433054077186, 101.97570999548708, 102.09163830711174, 102.29920127628256, 102.87003110932147, 104.8263471914838, 105.39794638857768, 104.5252419871181, 104.18435945456493, 103.565765851385, 104.11723618198324, 104.6757089327731, 103.50862764391664, 103.22807888982258, 103.52289015588278, 103.17303606450358, 102.03877704892528, 99.68011420546868, 108.0501457953626, 111.58554013030616, 116.24067098957232, 117.72218096195148, 118.04700473825083, 115.97895361352316, 117.00410567197548, 117.60332700031124, 117.72890501224715, 117.07278190888644, 116.4399645028011, 115.62314546895423, 107.71027709033612, 107.93759617088736, 109.78134714620622, 111.68344185893244, 111.07919488985762, 108.36419060506913, 108.37752837581698, 110.12612316067536, 109.7719874640523, 109.68958999903128, 110.03141655648926, 107.6572427584812, 105.61336480469966, 100.16644503921567, 96.65855704326174, 91.9355687168534, 89.53798371553461, 87.64603136224888, 86.43698664122314, 83.91686016269841, 83.08288917112559, 81.09354927614379, 80.97231549536843, 80.8184873874199, 80.20310378189322, 78.58031631228309, 76.89267829164339, 76.72628022159975, 76.78455037558356, 76.17683840356251, 75.9771438654684, 75.20524457547464, 75.08212288379731, 73.88615763793143, 76.29356550210083, 77.25497822309822, 82.57216367102396, 83.54506192033841, 83.98209763778054, 83.69331845946637, 83.55467970146603, 83.51635248691396, 88.53935599397087, 88.12252392544269, 87.82729222076642, 87.57240988551627, 85.19176799502023, 85.05878080143167, 81.52339793121692, 81.15105431276498, 82.99942078244631, 84.46752350202304, 85.20239391964549, 83.66293330078587, 78.89731072272085, 78.82767653577325, 78.08492648054776, 77.8308420836819, 79.1413521547619, 77.12926389164554, 76.91120618316215, 77.42692481113735, 77.27091544736035, 77.46497972930283, 77.39401576218751, 77.12563266977902, 77.75868172771398, 78.03191304975749, 78.89385207967634, 77.60930850331717, 77.29166676423903, 78.06713794462924, 77.5985466715162, 76.4565844060263, 76.30187414899878, 75.62337496008404, 76.26088548085902, 75.87226883948419, 76.40827431716465, 75.72760695681217, 74.85638066051976, 74.6882481267507, 76.22666612423048, 75.72783233607481, 75.88666583232181, 75.08469023783364, 75.6455683828976, 74.72973084718332, 73.98974387563608, 73.64142787083722, 73.03700164234779, 73.05227290734213, 73.62656819257704, 72.51871928944911, 72.05332845721382, 71.48814153991596, 71.4377284957205, 71.4992059467009, 71.55592060654764, 71.95084011725801, 71.77597978114758, 71.90741443619669, 72.74033156173944, 72.58810952069717, 75.88006655697377, 75.27806328859322, 79.81550885636476, 79.75089838328334, 79.24648885939932, 78.19198340530397, 79.07133832671958, 78.06007674362614, 77.96242478773732, 76.88778611204351, 74.5059492890817, 73.34625400326797, 70.9846657244236, 70.17599641867413, 64.66476024521805, 65.38039399222701, 65.27374759590276, 63.74486734422658, 64.44417314500276, 64.41271712602513, 64.4626579868503, 64.13873446930967, 64.00858970088457, 63.20496538313103, 62.769589538395394, 62.16633832804233, 62.58737614534702, 61.18111259990663, 61.31413456006847, 62.25383664091192, 61.90490598253622, 61.99552716977902, 62.47455513250856, 61.92870411990352, 62.22316829427327, 63.540803066214906, 64.75878337121594, 65.31365800605657, 65.51977345681605, 66.12617780711173, 65.31127045666241, 64.24607005882352, 64.52658302552132, 64.11172855205415, 63.66728454720231, 63.52689385247432, 63.24951077097015, 64.71526656830127, 66.8554829835045, 68.89201912561917, 68.03758976096644, 68.75571815919702, 69.2558747079832, 70.8628330851573, 72.86583000404606, 72.94668662247122, 72.96112116853408, 73.27743595447855, 73.37020215128771, 71.28304225792677, 69.8380927562286, 67.68865131965401, 68.11027295012555, 67.61667185308346, 66.75381157593401, 65.23085816051889, 64.170909262636, 63.928412581215376, 64.37938023426749, 64.34647790488461, 62.97041855827886, 63.99296527474719, 63.55499836227824, 63.23571061858077, 66.33894346039527, 68.570593033843, 68.9659655979614, 67.53433490109565, 67.79725736351669, 68.53060574673202, 75.54322105291006, 76.81472893844926, 78.50607804787063, 78.68960763663243, 79.73899500754747, 78.6843626351184, 78.52317386873638, 77.80888820658265, 77.54496189284482, 77.48573599898398, 79.48204320284007, 78.30849334313724, 73.01144065305012, 72.43237640153414, 72.2197277604264, 71.74277126151571, 71.91374742156863, 72.21985665483972, 72.47608712669253, 73.09284230682384, 74.16367017016742, 76.78395484998443, 77.30319606611553, 77.74270420144724, 78.71007790009338, 80.61615685690619, 82.01414047790226, 84.10535423677119, 85.27166460768753, 85.38262142509467, 86.19305047388217, 86.83132800723624, 87.83171081777155, 86.45928673295985, 87.8803176950669, 88.48434065336137, 90.79711144895738, 90.9027975987395, 90.66912211727488, 90.3135010043573, 92.15985021444132, 92.9969971931995, 94.16807996008014, 95.38747180424062, 96.27497182220668, 96.67745977910052, 96.99343720837224, 97.40795101633988, 96.03276443417369, 96.59784391479472, 97.45701009025832, 98.08799501712252, 99.08122651797385, 99.67698492592592, 98.99272019973544, 107.23313489807036, 107.51336018339558, 107.02570051808536, 111.07431196086212, 113.00154369094302, 114.84062022338938, 115.4228098941799, 116.11892263056332, 116.71459875194522, 117.6859109746343, 118.02021237542796, 119.66307092903828, 111.54486560912186, 111.3340824700436, 113.92942204176782, 112.32891671537504, 110.6014343909119, 108.83629495572154, 107.2506977761438, 106.26544143230625, 105.34470614137877, 102.6510540345476, 100.70535362032822, 101.514555241632, 101.29505993473748, 99.27898366589186, 97.10056418949276, 96.62505903310895, 96.3216195331401, 97.12213017909332, 96.53258986000316, 95.56324177816684, 95.39135616786297, 95.3927435908808, 93.67076083504512, 91.73685527968344, 92.75293570818036, 99.46130410967749, 98.51857238316605, 99.2209100382768, 98.370219337535, 98.19944356691566, 98.90778197844692, 98.57302509842826, 98.49845395502643, 99.05747147681296, 99.16819182065048, 100.37698871054636, 99.36139279730392, 93.48522388741053, 94.9286295140056, 97.02216735939606, 97.12580920712728, 96.55155522153768, 95.60974785697752, 95.67039378594772, 96.01241774813258, 96.2504389046802, 96.3197758003391, 97.06153373661688, 96.41529852800733, 94.46173884243696, 95.2816676005654, 96.78242655975724, 96.32133299128542, 95.29358806737538, 94.76905837558355, 94.33113079528478, 95.16833179170555, 95.62033886570184, 92.96037854481791, 92.10222391355433, 91.83923980897848, 89.08634786232622, 84.33733234819483, 79.96379749852163, 77.91918673770554, 76.40160117529373, 75.20242825256769, 74.05046552038593, 70.96321751347521, 68.0317616590414, 65.85852166285403, 68.0503226625428, 66.54078728104575, 71.10942565678494, 71.15815247689076, 71.21670807173982, 71.77611526867413, 72.22223573910813, 71.6228285986617, 74.17180008006535, 73.97235427834664, 74.09006090343915, 73.93990616666537, 72.43863329248366, 71.41758451811779, 74.22128467483661, 81.01549654466558, 81.93490100304042, 82.0808371538282, 82.47549284554934, 82.36900028695663, 79.70251484197011, 80.23315980754101, 80.34361561943666, 80.68288784803921, 83.25443808442266, 84.32210764814751, 76.50088347619047, 71.46228889810084, 73.98284718386245, 74.18705111422346, 74.3363266897182, 73.97053798132586, 74.93703358162153, 75.49993599961095, 76.32819724618737, 77.70801021016185, 74.79181283963585, 76.61499712861811, 76.91240809741676, 75.64694997206466, 73.96209119032058, 73.15157001283846, 73.42242256489261, 72.82776007117309, 71.38066666915655, 70.30693165694055, 69.16554449175226, 66.85401890063152, 68.49307640273888, 65.86561132228448, 65.49608140756303, 67.03120548913029, 66.36773975482416, 66.51473079715218, 65.4637109003268, 64.89335573242558, 64.82398134033613, 64.89023047455649, 65.27043841549954, 64.00260925114638, 63.6224193252412, 64.9379562393713, 65.01460586492375, 63.12893341606559, 63.711892212914336, 63.76357887861811, 64.68334440423995, 65.45123690351697, 65.57147239620292, 66.0513320507314, 70.21490783613446, 70.30589492647059, 71.09950523474946, 70.08641785333022, 69.518812587642, 69.66230343647425, 70.44535302030813, 70.44482327521008, 70.45968350256769, 70.08447128159041, 69.93572962472768, 71.069491695845, 69.94633418440709, 70.10900734547151, 69.78738422813569, 70.51567675163399, 69.09865088702148, 70.80323806261919, 74.59153006279179, 75.72063829673768, 76.79980319109866, 78.39018514526923, 79.08122209586055, 76.7677241538282, 75.72502108169935, 76.28052661772163, 75.68802241962341, 75.91799037620603, 76.23216782725775, 72.26887649936391, 69.54876679209461, 68.24678666321327, 67.03294015441371, 64.74339746981013, 63.32035991822284, 62.88940841221603, 63.06865653835979, 62.928132433629, 62.156222333756745, 63.09930718922995, 64.16774790913868, 64.37327074323325, 65.70079729352761, 65.94521272432306, 66.42495564526922, 67.31393917111345, 69.65956389659198, 70.62736143730174, 71.01875926361656, 70.98746581162465, 71.88058943650793, 71.67589672300096, 72.28777959422658, 73.20686881847183, 74.69844079201681, 77.0883170087924, 79.72554966230936, 83.08641448552754, 83.94788386577964, 84.87520035770245, 82.81089582251789, 80.67707724089635, 79.16510902676626, 78.70361028096795, 76.08024760768753, 72.76972023776393, 73.46817619825707, 70.31980213136477, 67.70005537550576, 65.47495013730288, 62.20023239379085, 59.49457206738251, 62.97252479046063, 66.60591159056958, 70.28919454217242, 71.43358975598738, 78.36733731442577, 82.26898795401493, 80.69668916308747, 83.82691185317461, 93.11438402961544, 92.54289404189066, 92.54191127147529, 92.35618058014316, 92.51687126019296, 90.99221474915254, 91.71720065063803, 91.85167088006992, 84.14934562573919, 82.7475892399228, 84.20730877575474, 82.92742719032057, 77.46883821599752, 78.05932709182036, 87.65013602948959, 87.9945595616655, 88.54722737130409, 86.51399845759414, 87.37075390359477, 89.84012280610021, 91.92976807345808, 93.0780972423819, 94.82701895467372, 93.82465937962962, 93.16520334794455, 92.74911247750804, 86.39143110286338, 87.38275497681295, 87.77643878091608, 88.77798923755057, 87.77088699688764, 88.4970006633948, 88.1618456049642, 88.21292945399937, 89.79007323373797, 92.89714578328017, 94.17154612229884, 94.79942617865738, 95.63764609310614, 97.03753090583568, 97.49103300545508, 99.77235988053695, 102.22955623630564, 104.94179938087456, 105.92947547836914, 106.6705393352269, 104.98444437029062, 102.48248833948024, 104.62029039052288, 107.87806515024576, 111.69630968129474, 114.87834821483035, 114.7130874379085, 113.43038475664753, 113.75786674808722, 122.5657449679032, 125.7590401336757, 126.54016807111734, 127.79324136577574, 131.0061535925148, 129.2131081625065, 126.94058502738612, 126.10052125591346, 122.52442646988794, 121.1386983777622, 118.54824822836916, 113.8048898795518, 101.59604171809836, 96.43061188265963, 94.1734854117232, 95.62068909477124, 91.4966643278867, 90.5834710682384, 89.08349876276917, 85.86733359138266, 86.27520839526922, 88.36253331854964, 89.7862379772033, 92.57022400505758, 94.6684570786648, 95.22866958162156, 94.16581117275996, 94.12960805423282, 94.11169267086834, 94.49795981908652, 94.16091911673736, 94.53242776556178, 93.86915447152194, 94.2468417047152, 92.96942632072827, 92.17194429186118, 92.9513089522986, 99.58978448117026, 100.3882425569516, 103.799195548864, 104.2852483812721, 104.2335975007781, 104.5403438583878, 104.33814470899472, 105.2550736694678, 105.48223111118892, 105.26928255656706, 105.45233117919388, 103.1011250262763, 94.72996284376391, 92.95406471366324, 91.78792120437804, 91.08737572619049, 90.65171428812636, 89.4543314894154, 89.1811117587146, 87.3752721503268, 86.82310996996577, 85.78937755174292, 85.54978759671646, 86.20252860219101, 87.65410591323054, 86.68422162041522, 86.57401098234325, 86.69944238938255, 86.5280331755369, 86.08953544164332, 85.72443875163398, 85.10927621630874, 84.45016377740708, 83.1506207440087, 83.47741029901961, 84.38027636655774, 83.94492003649236, 83.13165821648532, 82.09467255104263, 80.75511300545051, 80.56038764558045, 79.13079636251166, 79.52233429092747, 79.36378418292873, 79.22147108566051, 78.25999366534391, 80.71924312387176, 79.58637515133832, 82.30424113297542, 80.0488728453159, 79.96407009173669, 80.08495525933706, 78.88659426167133, 79.0485623600231, 82.31099705897915, 81.3201434377853, 80.67545264394647, 80.04656746023964, 80.61081677746652, 80.81705813266417, 77.33936988243074, 78.09004902010064, 78.1150909921413, 77.80180693432929, 77.68063272268907, 76.45120854974712, 73.58655404115963, 73.62025585633559, 72.10044539145657, 71.87145480228757, 67.940097208061, 67.85335071140678, 67.63727469094304, 67.07661634897292, 67.64049340546218, 67.34769564713663, 67.52449760473078, 67.47504892639277, 68.08918367253541, 68.80798417016807, 71.38968851906318, 71.59296049727669, 70.68836833076564, 72.70119871564867, 73.25112926626205, 73.34995057391373, 73.81400032463922, 74.38850107929532, 75.05781016153527, 74.3968275427232, 74.23990259142678, 73.46488798991723, 70.9161755646986, 70.85250643062069, 72.40490017524138, 70.72019071950605, 70.90506953104574, 70.30474810208527, 70.71459555322129, 70.57723277909015, 69.82212527956739, 69.75576343993153, 69.96959328944911, 70.42376323848428, 70.65179434733894, 69.12711034344849, 67.87094607765134, 67.9387362254902, 67.25772609586056, 67.34241130010894, 66.9713949773576, 66.61766027131964, 66.38327912488329, 65.8615433934018, 67.25797258237498, 67.11687826112667, 70.46057518331777, 70.66922296467476, 70.46186220557111, 71.53888827805142, 71.26453716511048, 70.29191851421352, 70.98223767771553, 70.64412224525366, 70.94724247650171, 70.58622096654217, 68.97179896669779, 68.62579504933083, 67.7228273312325, 70.59653186258949, 71.3818565394491, 71.32942829940865, 72.37893042872706, 72.4503477885154], [60.316020546483685, 61.08960212005914, 61.73570667219111, 62.17286026462808, 62.81174693059447, 63.063571968041934, 63.81626592001246, 64.50611295564893, 65.4474231161687, 66.53559968892002, 67.40158350628957, 68.44744680547774, 69.04716043253968, 70.0845709103408, 71.55404857910895, 74.99764921568041, 75.86370302213729, 76.53762917063491, 77.07631534265096, 77.06183071499444, 76.43662895905565, 76.84774166946778, 76.50393194786803, 76.21606239643634, 76.09712174190788, 75.79423646171803, 72.98068208904061, 71.39319597961408, 70.32272102388734, 69.94397718464052, 68.7170340953159, 68.7333532513221, 67.87674422734919, 69.49415963995547, 69.87656822771685, 70.11554861134454, 69.633076851575, 69.6489082499222, 69.71146548015872, 71.45904567608153, 71.4273096153906, 71.96095100988173, 72.10010529909741, 73.61325882049486, 72.5652810489418, 72.98296659277223, 72.87586332088391, 72.57738395518209, 73.53130864371306, 73.1241513256951, 70.95636043331453, 71.58100172182735, 73.05176948918455, 73.5393384380641, 72.92586817063491, 71.7559085729037, 72.07820552489885, 77.3450534414099, 77.49789887830688, 78.9010131388085, 79.86249161153324, 81.80797537387242, 83.40448078649237, 83.0454327106501, 82.45991137464986, 83.2084384423436, 85.43896422315592, 86.07103192440607, 84.60943806676003, 90.60824878602553, 91.45715840367257, 91.00514580469968, 92.19841511515718, 92.72313654710554, 93.36808559173669, 93.97587966876752, 94.27409886399006, 94.28511057469204, 93.9055906879085, 94.21903212775965, 93.59454851244942, 86.179249666122, 86.64223013577653, 86.96465744973544, 85.48072454319899, 85.33323132664177, 85.78541342281358, 86.83372181582634, 87.00380922626765, 87.27759642211329, 87.59028986399005, 88.09410111655774, 88.62001430999067, 88.41728538966699, 88.04044355485529, 88.029074232493, 90.02775252943123, 93.91146596162322, 92.63219788328664, 91.32518808356676, 90.49409373669468, 89.09093695175848, 87.92248927670077, 85.80142209889512, 84.41306748373793, 87.38973651817362, 86.20351314369812, 85.01786207679739, 80.9691832763674, 75.27507860127218, 74.68464816487706, 73.34116339883221, 72.6744924682326, 72.8162102577809, 73.44415432096173, 73.99916870287765, 72.58572695627139, 69.41838523310706, 68.63369150404606, 68.25621872385621, 68.17484185416991, 68.19642155718954, 67.7289060734516, 67.12631886375662, 67.0185683924681, 66.14254097175537, 64.64323909998444, 63.74294756753814, 62.96181024836147, 62.386371653570784, 62.10460147976968, 62.20569447346717, 62.748684403836016, 62.84946913009648, 62.6295358627451, 63.18726283014317, 63.258459537120046, 63.805717126828505, 63.51368196428572, 63.5575829781357, 63.54645036772487, 64.33982127373172, 64.86134818067227, 64.9604351197479, 63.94693589195845, 63.93824315018286, 64.20506558434485, 64.18664949712108, 63.98051139575949, 63.55846295276999, 64.18135241137566, 64.48615159912855, 65.09909978594122, 65.31459788737268, 65.29715762784002, 64.95190842569251, 65.7575296161687, 65.87499438787738, 65.89237918604108, 65.80957763966697, 65.72076575412387, 66.06595354410986, 65.3027328015873, 65.51253218067228, 64.79992873700591, 64.32068491240673, 64.21154825918146, 66.50934362083724, 65.43164333543417, 65.34337265725179, 64.93205249004045, 65.20626991798942, 64.88770280026456, 65.37635298638345, 64.89527433984378, 64.07543164169002, 63.55175648568316, 67.47974101851852, 65.78951918479613, 64.24984005336782, 63.90762941408461, 62.9852899745565, 61.80850821521943, 61.04576578205728, 59.71262440157174, 59.04965182057268, 58.62298079153376, 58.49786003423592, 57.99729047066605, 53.14214431053533, 52.71924208029879, 51.77273831248054, 51.373364051281264, 51.2966159763461, 51.273037816837856, 51.210854995331474, 50.74011396763149, 50.29900639705882, 50.143806499922206, 49.85272192927172, 49.57623470697168, 50.52397294421102, 50.32155993643013, 50.2262625508831, 49.99425458885777, 49.89087698085901, 49.49930408512294, 49.02509846537503, 49.11919883131031, 49.453382461873645, 48.87813873552755, 48.78303681784936, 47.73023523599439, 47.25985756699347, 47.21035113243076, 50.02288554691358, 51.05102740094927, 50.72984647011426, 50.58745517359166, 50.82524704995332, 51.34550636850295, 51.048296704404, 51.27243811834734, 51.39468339347962, 51.48480469467787, 51.92025633208839, 51.85721126514941, 48.40754967981637, 48.25328357088392, 47.83382240117557, 47.8645146394608, 47.72534504232804, 47.04154708053026, 47.12584643137255, 47.96064169724556, 47.901957740351705, 47.91171295751634, 49.071199134687205, 49.16237152212122, 49.47501090538438, 49.64087595922814, 49.67296944825709, 49.48052207913165, 48.92190631154296, 48.61631135115157, 48.29355990211641, 47.57767191756797, 47.24816257128983, 46.06418239534703, 45.36516621031746, 45.13540328801031, 44.90735471848739, 43.75949679398928, 43.61355372097728, 43.57247893417368, 43.73873372315594, 43.542639731637095, 43.65829598786181, 43.4939195961718, 43.46886125272332, 43.13681667755992, 45.397206782806826, 44.462910436585744, 44.53586714666978, 45.733528978135695, 45.842774179505135, 46.57678683162482, 51.98690055641145, 52.688703625817, 55.25342425782888, 54.379002963037536, 56.48583731629319, 55.40269438818861, 54.08372735901027, 54.06154618176159, 54.1003533085123, 53.3080704064737, 53.02270442841581, 51.49301289952278, 46.76036257671958, 44.90099169942421, 44.07108906543729, 43.4897019642079, 41.85360638920013, 41.81325703306878, 44.31215374867726, 44.47928923739367, 44.20659442382509, 44.18790536094642, 44.42473451929661, 44.23084787401961, 44.19000902163087, 44.29675898988485, 44.20645227692188, 44.05688974922191, 44.013507438530965, 43.25491584772798, 42.16559596739808, 41.92248093814192, 42.11351163064114, 41.41379995206972, 41.66406700147838, 41.88235852513228, 42.2022555655151, 41.69600986912543, 41.34371859842826, 41.72335029481793, 41.96712711041084, 41.23480580205415, 41.79496573669468, 41.8669975489418, 41.830707187752886, 41.88172807531901, 42.45128386601308, 42.010500048085895, 42.89741433963585, 42.91210275132275, 43.221607122549024, 43.15891889830377, 43.06561507298475, 42.666565928338, 54.51695963103019, 54.58228585457517, 54.9744034922662, 55.62208251163309, 54.70251726859633, 54.50056206076875, 53.984510463818864, 53.97334794359245, 53.86694980368814, 53.77418163857765, 54.07334806255837, 53.1446539615624, 52.48884690341259, 52.15796449945535, 51.584843563656776, 50.9257336800498, 51.43885150840336, 51.103281823218175, 51.09032658948024, 50.69825824502024, 50.65246002676626, 50.86168368627452, 50.57518872080468, 49.55798590460629, 43.99010281753813, 43.94839885084034, 44.1720989668534, 44.412925494475566, 44.48563701828509, 44.43027747338936, 44.5022178796264, 44.72971688632119, 44.99440315180517, 45.13067663787736, 45.23562870627854, 44.61594506448153, 53.432925668142445, 55.31946432671958, 56.96696031224713, 56.948188038281984, 57.26492105368815, 57.74612720059136, 58.10941245284781, 58.53208665001557, 58.57559031520387, 58.835675473389365, 59.01775536896981, 57.34331992545907, 47.464168732570805, 45.983113518907565, 44.656871768362905, 45.38320707142533, 45.04849415787426, 45.22630570409275, 45.05675691300965, 44.861146779022725, 44.75718466044195, 44.77341951719577, 44.794725991363215, 44.50911369779023, 44.95310855687831, 45.213555519141, 45.29827579302832, 45.236219295985066, 45.52928990966386, 45.19217409716906, 44.938425145395016, 44.795813696078426, 44.937450306567065, 44.56562854590726, 44.30617098910675, 44.38014773529411, 45.24692746755369, 45.4271888488627, 45.2794521408341, 45.32875273309148, 44.99149908545558, 45.32234187488328, 45.879423140445056, 46.3405899362123, 46.53211430407718, 46.857302872159984, 46.88138373353629, 45.75168838497966, 45.02470510504202, 44.73927925774231, 44.79827076121292, 45.09023150980392, 44.8190655740851, 44.58730049712108, 44.32633851681258, 43.63408979629629, 43.67411997619048, 43.2696430460804, 43.27866707306256, 43.20980568378462, 43.17736769545596, 42.9915047912264, 42.90750783800187, 42.1181465409249, 42.11979282109529, 41.98506565806101, 41.68286970759414, 41.47585229471461, 41.106017977513226, 41.53778933815749, 41.72198695019841, 41.441783186196695, 41.680836445508525, 41.75002068930906, 41.87364787472767, 41.51934669312169, 41.20617597704638, 41.13908929752567, 41.39071870845006, 41.53766871233984, 41.61751842413632, 40.92876005485528, 40.80004013398693, 40.81087978096794, 41.04227181893869, 40.95592415242764, 40.85101836733583, 41.222084299564266, 41.82834354123872, 42.00907531963897, 41.8420700017896, 41.7653359667756, 41.83863910636477, 42.62167110978836, 42.7277708775236, 42.59406718720821, 42.99696105852205, 43.03060712955182, 45.66648983574541, 45.83043058800187, 45.20582422012139, 45.02706429536259, 45.34130106577665, 45.69499242899484, 46.52794913733272, 45.89643409399315, 45.79343561982571, 45.66801886819172, 45.3748888478836, 44.62055029237148, 43.00714732804233, 42.91811503952693, 43.07001983582322, 42.88588442488718, 42.92359264744075, 41.531930531668216, 41.37494696996577, 41.73520836476813, 41.63670914075631, 41.23080591627762, 41.38265465911921, 41.23120472899159, 40.8705364440554, 41.62373973980703, 41.48108608800187, 41.18148740515095, 41.07877046537504, 41.23749230718954, 41.47047647362278, 40.9322055070028, 41.08074662317149, 41.08928270743853, 42.16847167436975, 42.35149949696546, 42.77687439106754, 41.5586094711329, 41.68025424121214, 41.903128417211335, 41.85933222413568, 41.576153314711725, 41.48069968640006, 41.89600128711484, 41.59517088717709, 40.74500878501401, 40.51537289679363, 40.10611274416433, 42.85330145510426, 43.41722452723312, 43.2339191713352, 42.910716484360414, 42.82742316136076, 42.748359073373805, 42.55462750465232, 42.67634303594772, 43.06251196700902, 42.959769393539126, 42.92642183488952, 42.58946604302832, 39.34729652310924, 39.18723312192655, 39.36528874151883, 39.41219805586291, 39.46247587947402, 39.84052452731093, 39.61917991308164, 39.36595930802989, 39.31345536453989, 39.07946732399692, 40.17806673863991, 40.41246309578275, 39.985225365001554, 39.41708355384376, 39.00373020883909, 38.90593137643947, 38.72751449525365, 38.78382825342359, 39.13637034220355, 38.67162060618128, 38.47450872447868, 38.82255313807255, 39.16090578898226, 39.2348950000253, 40.07445077606598, 40.187730396125126, 40.2916614196234, 40.44486877876919, 40.57406214285714, 40.1948549449891, 39.897139771710656, 39.80061080213196, 39.84015566254279, 38.57637542499222, 40.69607568409586, 40.41398181660441, 40.28168569654528, 40.59603835854342, 40.66368773747278, 40.41449063608777, 45.38858394460007, 45.55285615910365, 47.97793104806584, 47.81948899673203, 49.895907435729846, 49.0340679929972, 47.6401672359944, 47.60195574774354, 47.35319216900094, 47.14830057088391, 47.11210214612512, 46.236513083878, 42.39836694179895, 40.86763326322751, 39.86528149066294, 40.247289279878615, 38.60121570836576, 38.48484554263928, 38.709765649859946, 38.58364487223778, 38.80798278353564, 38.51073427377322, 38.904926729847496, 38.73873618666356, 38.53723489402427, 38.39987344592281, 38.23758340126312, 37.15291474260816, 37.40518985620915, 37.00479946568627, 37.00558995066915, 36.77222727233115, 36.584114968954246, 36.77272350919912, 37.03856634554933, 37.217410748727175, 37.22377067141301, 37.17693100062248, 37.37632312533784, 37.85168500746512, 37.8382806493931, 37.250651420401496, 37.99623360348584, 38.070476583800186, 38.47306473786181, 38.89602196981014, 38.72870911671335, 38.41160308146592, 39.35499916509752, 39.4223127271164, 39.95787987970744, 38.98899116448802, 38.85602704069405, 38.4630667456427, 40.51728233705968, 40.551651900871455, 40.58797073319329, 40.3271285299908, 40.080006386476825, 40.00398885208528, 39.89747135060691, 39.32565882438531, 39.32873404053844, 40.25926773148733, 40.328066781434806, 39.06649203976035, 38.65641362152976, 38.11448609419612, 37.91700951253631, 38.317532452147525, 38.550461814192346, 37.94888629316319, 37.84141901369437, 37.620302728913785, 37.52217650015562, 37.352854429427325, 37.62827465079366, 37.39848794638967, 41.27837276384999, 41.69071637963945, 41.79351132570806, 41.28390824146178, 41.33835873295986, 41.37632545401495, 41.17726715491753, 41.3140122264239, 41.32970332773109, 40.96853132366105, 40.83400972463431, 39.59983442094615, 45.83692911111112, 45.778419268395325, 46.01082497447868, 45.666249836445694, 45.617512708683485, 45.647841765561786, 45.913511794973545, 46.33892028330222, 46.31833440950825, 46.54316654209462, 46.37751290452847, 45.18096721358543, 37.42383824836602, 36.95961312636166, 36.78254271403284, 37.12405410782435, 36.87584359539371, 37.125083485449736, 36.88764053976035, 36.91817297728112, 37.30778336382535, 38.02713205088703, 38.291561291039024, 38.16459780734516, 38.37746858278867, 38.58400924198568, 38.4912854300498, 38.81942764215687, 39.43464345440398, 39.1638394457672, 39.15573175583568, 38.83171028423138, 38.62584407057268, 37.97380776019296, 38.37649795323684, 38.392786697089946, 39.19860416612201, 39.293039292852605, 39.56158315356301, 39.016256902272026, 38.5675430367258, 39.00395565106665, 39.3398110856676, 39.669460229847495, 39.90233795417056, 39.97908802334267, 39.878384702614376, 39.3115435349362, 39.79760521918768, 40.21064477762216, 40.12869183403361, 40.91513488824696, 40.74527734772797, 40.24443089231249, 40.38846688328665, 39.96750957056878, 39.869174263538746, 40.436953123560535, 40.18358715810768, 39.810527095004666, 39.61545710854341, 39.50952518899783, 39.54080674416433, 39.61288199478616, 39.6375483181606, 40.08901681481481, 39.89776078960473, 40.04894682282913, 39.96646848692811, 38.88541525326797, 39.30489648552886, 39.01800620168067, 38.952987537815126, 38.2820553872549, 38.12169294265484, 37.32795912130408, 37.20647842600373, 36.75337108378582, 36.45202070300343, 36.03720070124522, 36.11342852163087, 36.18819859064737, 35.691694976812954, 35.61582597533458, 36.13064721778712, 36.73844953361345, 36.95273309251478, 37.23959465771152, 37.514706857454094, 37.76941983191527, 37.89399027661064, 37.92397863594902, 37.68507809313725, 38.14964492273576, 38.18199702194212, 37.91972174789916, 37.97847982967632, 37.57639055999066, 40.31979394242141, 41.31049464067849, 41.65216683769064, 41.78795334018052, 42.13652990398381, 42.20449800319016, 43.19298793565204, 42.5101895804544, 42.50245106372549, 42.26387995420325, 42.546953923193534, 41.60172656956115, 39.62056512262683, 38.20881845961718, 37.97541708177715, 37.59188323404917, 37.824841914482825, 37.44796972424525, 37.39696511741364, 38.06952479651417, 38.59435801610644, 38.83601279150133, 39.0573191967009, 39.04451687114847, 39.09169639930103, 39.55713192016807, 39.32571353089014, 39.40689195894351, 38.98088886819172, 38.806692265172735, 38.88988770315905, 38.711890332387306, 38.16559565515095, 38.04231993915344, 38.60153233450047, 38.455345828042326, 38.50280364060068, 38.55894922595705, 38.53871274369748, 38.55100504193901, 38.62176929521282, 38.78956946669779, 38.99533596389667, 39.21788947821351, 39.33343527085278, 38.70024233107687, 38.83731228890445, 39.07623209407096, 41.81452912099284, 42.460747523576096, 42.736468364690325, 42.71309388647681, 42.88842535504202, 42.81357112169312, 42.838877328820416, 42.70446795759415, 43.04449446451915, 43.24650548669467, 43.716048453625895, 43.85196122829132, 40.86892914581388, 41.14334477606599, 41.35456322930283, 41.372295105664485, 41.482964501244936, 41.509318052987865, 41.642386205042015, 41.35844350451292, 41.09983011531279, 40.57465760042536, 41.58719408185497, 41.55884975412388, 41.29767934049176, 41.24462372873288, 41.20085482352941, 41.34772878376906, 41.43980604302832, 41.789560689620295, 41.53015382917382, 41.30283814169002, 41.46661274004046, 41.13282925272331, 40.948176523342674, 40.8941821721133, 41.42974324739991, 40.918165352163086, 40.82119020868348, 40.59467519662309, 40.5200464115465, 39.98517553330221, 40.23664089480237, 40.77389771778712, 40.93340527567694, 40.58193039659197, 42.97368888772176, 42.58493748272642, 43.05915107749767, 43.32406030010893, 43.614951107065046, 44.73246572696857, 50.24605966580884, 51.18753280080922, 54.22327588562092, 54.85870872759104, 57.60909442335824, 57.18824002948568, 56.78432780411674, 57.63512332833995, 59.60635872300031, 60.80100404868633, 61.363101265295946, 61.17114466158639, 57.17478058806671, 55.99982046202925, 54.9749220818368, 54.44669444693952, 53.06825695055958, 53.04651056816059, 56.89437008068783, 57.373505611785895, 57.0942804443245, 57.3263440320001, 58.08997168308435, 57.84979367945653, 58.35683810908808, 59.21743519701213, 60.24360512790163, 61.02468380252101, 61.92558270238096, 62.24078962830688, 60.302907003345794, 60.64680546585552, 61.12387559531591, 62.44516427190905, 62.91574202415803, 63.6883510839558, 63.88872685893247, 63.51483146257392, 63.48749222393402, 62.41629136922917, 62.70382519825707, 61.57042780882352, 71.12382226946002, 70.56188540273888, 69.2813146999423, 68.75996544099168, 67.63199330773745, 66.69443718339558, 67.99560557045336, 68.20958217619632, 68.45154378999379, 69.91636227692189, 70.51569605999066, 71.30518178338002, 69.47320298257083, 71.87723962900716, 73.43708830983505, 74.7306797332711, 76.52548398467165, 78.38265220269219, 80.11692661772487, 80.46626086290071, 82.00753046547818, 82.41443439223468, 83.30816482516342, 82.74104404590724, 78.22494966697789, 77.96448892542604, 77.70165975124493, 77.43730980571117, 77.78845533457827, 76.76302768907563, 76.82356928540304, 77.26269685527545, 75.89663452009806, 75.37342024091859, 74.93171799446714, 73.6031961207594, 82.76599689472455, 82.28849135084033, 82.2384258034547, 81.60649216534391, 82.01526462145969, 81.3010272587924, 81.47505706041926, 81.35800632741986, 82.5399435484257, 83.34219689298298, 82.97186468394024, 82.2782564396981, 82.9391530831777, 82.93878154660753, 82.79542843572986, 83.4546047577031, 83.91999966798942, 84.67175053695924, 84.2279786113212, 84.9379016266958, 85.48461972167756, 86.2097973586893, 87.17307982500778, 86.38463234547152, 79.12162763736579, 79.22961865437286, 80.0296701720932, 82.04057836515719, 82.35151234717101, 82.94041033979148, 84.01732740032679, 83.69798692151483, 83.23833563401702, 84.66009573786182, 85.49765695253656, 86.0142210051354, 87.79195062830688, 88.25710937737315, 89.42560607539686, 88.84850425365701, 89.4601150247225, 90.3167176746032, 91.64249956388112, 93.17582434033616, 93.9444616429732, 93.35192188109508, 92.18732000536882, 91.32605362817397, 93.2547498600218, 92.64236761297852, 91.21422661815838, 90.36192017966076, 88.90743209811701, 87.02752087729536, 85.415180528089, 84.08838226283846, 83.4687906556956, 82.68387843409586, 82.50117822992532, 81.38343626805165, 78.35311391402115, 77.61087031115781, 77.69800394637282, 78.08487533254609, 77.29844324844382, 76.88236753361345, 76.07672205119826, 75.29684117156863, 74.8598591206038, 74.6231279536259, 74.76926393923125, 74.52762387091502, 74.75890969072779, 76.05690736469033, 76.09865312873843, 75.03609443727565, 74.94198481458137, 74.75725739698102, 75.68703782438531, 75.82775951408341, 76.10087867545906, 76.01597167001246, 76.15109767317779, 75.9670635168067, 75.31364871030831, 74.50015673404917, 74.22459978344034, 74.61631916581076, 74.22391941814503, 74.84591746879863, 75.0604200410053, 75.63519817779334, 75.21916823342671, 74.25517210947713, 74.17637259256861, 74.44955691129785, 75.58520371344605, 75.95142706862485, 75.66437495883909, 75.30196773568316, 75.11749657189542, 74.27555857235514, 72.9335128743759, 71.8180612745098, 71.11970698840648, 70.61699576929661, 70.3516727622938, 69.10406690141612, 68.15777137721756, 67.25886766915654, 68.07277026696168, 67.17363753306878, 66.7937828627451, 66.10620107749767, 66.21175968211173, 66.20386621599751, 66.77482095915033, 65.18235749198568, 64.1443066599751, 63.27419768238406, 62.45349506714908, 61.15730357135075, 59.74001150171179, 58.24983427131964, 57.53778436422347, 56.74825848361829, 55.9173603182384, 54.304376253267975, 53.36854942141301, 53.16001014277933, 53.0226708671802, 52.9024471407563, 52.75826092537608, 52.40724319233258, 52.236461167257104, 51.96034154100529, 52.251976042794894, 52.28958067881848, 52.5132407491441, 52.40900550036959, 52.44918584928417, 52.85687114340181, 52.41534874673203, 51.57618754232804, 52.371929018362906, 52.3816812246343, 52.24719820611578, 52.728892755602246, 52.29355350089645, 51.80586633892391, 51.36821225342359, 51.23731297447869, 51.06456209863293, 50.08015490133831, 50.24078044646748, 49.69561390203859, 49.68727120160285, 49.409180365079365, 51.42447590791448, 52.60245935996928, 52.39575529547088, 52.27695890740741, 52.40590346187364, 52.52695906388111, 52.53110524495735, 53.01679323070339, 53.15855795650482, 53.22089398521631, 53.15385989526923, 53.03086041513255, 49.72741109632742, 49.58699625832556, 49.83577923669469, 49.795555291677054, 49.59888125855899, 49.206701220277, 49.187093423047, 50.38677365655152, 49.99736397331154, 49.66005358846872, 50.71556966845628, 51.05983287295946, 51.20238561173359, 51.69230403050109, 51.4809525157174, 51.49418314301276, 51.44056983356677, 51.546049042172434, 51.57418101447312, 50.61922089674759, 50.868311943115216, 50.27252155660015, 50.56150342619271, 50.82443806209151, 51.20084757773109, 50.05840048140368, 50.09810876431684, 50.26660408901338, 50.36412691771904, 50.80782538180827, 51.14102319483349, 51.22839425459072, 51.681333088779965, 51.638252669312166, 53.375693961291375, 52.48803320409274, 52.36223678804856, 52.71756335558669, 53.30880098179272, 53.63473715848701, 59.07341511718021, 59.24226898186728, 61.69668367172425, 62.28180594008715, 64.72125507228448, 63.60413899867725, 63.26977043946468, 64.50370196996577, 65.14594004380642, 67.17123270292562, 71.07104705516652, 70.81778977038593, 67.11601920860566, 66.30543473568316, 65.93864325836448, 66.38813292483594, 66.0648641844849, 67.1329598210428, 67.78088287690632, 68.65344564620291, 69.74610699058513, 69.06533671724246, 67.27380949559733, 67.73590806722689, 67.9627966888422, 68.85801538258637, 69.14438420261439, 67.92938443043883, 68.11418561352319, 67.78036017670401, 75.4609477289916, 74.74586506240274, 74.15883958027673, 73.41962750628696, 73.29685990943044, 73.65072286896982, 74.5271611181807, 74.53833787399434, 74.77687699704327, 74.30434442079054, 74.39036593572985, 74.1337655603797, 67.84531118024563, 68.42229011048865, 68.60380493930516, 69.91419091871501, 70.21287642192331, 70.07125306240273, 70.1980779947868, 70.16956880306569, 69.9686185322907, 70.67967150684719, 70.89394310045131, 70.46812823856209, 71.95228859158108, 71.91775050497976, 71.99835335939932, 71.06286668048358, 70.499164431108, 69.72114055921257, 71.42918903532524, 70.62285257376284, 70.82550103101075, 71.62839524027389, 72.01142818596328, 71.99118151575566, 72.37223788861984, 72.7602394423436, 73.4594761748366, 74.57008927668716, 78.432115762216, 78.18214127218137, 78.69918857563026, 80.45065471545286, 82.71652849852164, 85.2959917726424, 86.84825159811702, 86.92626190810768, 91.61096835893248, 93.3185995655929, 94.82135865172737, 96.44026022938064, 95.60953851781824, 96.51274597484505, 97.31863807781234, 96.7178668934018, 96.22234225840336, 95.32071673218176, 96.22402506084656, 97.2035736731248, 104.00525289043536, 105.73746838741052, 105.91718859461368, 105.55749919475568, 104.8299447850918, 106.64144156621538, 108.7061455493568, 111.38391990273888, 112.4600313398693, 112.48337834383884, 111.97372120821665, 111.99276916464363, 105.19038009518428, 107.43455814130095, 108.54642539729224, 109.14919702030814, 109.94800849027388, 110.00105672415964, 109.01832798646124, 108.12038470650482, 108.9188185630252, 107.83544291106442, 109.18905212472768, 107.59517407376283, 107.97899675669156, 105.14162089021164, 103.864843461718, 103.10314660997577, 103.33190386624648, 101.96193487261442, 102.002378729225, 102.12936216900091, 102.1127663274192, 104.4867501084656, 105.47060338305322, 106.5859914083411, 110.60306525272333, 111.01197505052195, 113.12063604341738, 115.04385286219392, 118.39859458380016, 119.38181678096085, 119.20854606994372, 118.90666559663214, 118.3716268007314, 118.41277217156863, 116.64494464347962, 113.22838574517584, 110.12521209043946, 107.70579687404344, 107.24290831629318, 105.16570152745489, 100.53914465351696, 99.56494282267352, 99.44653435561086, 98.24683066094973, 96.42022947353134, 94.10211358520074, 92.91239580551242, 101.26103455119566, 100.42100332322792, 100.36596362807346, 100.65399747899164, 101.74199816744478, 103.70492370650484, 103.38580100684716, 103.14815810812976, 104.71596304878555, 106.85364234037372, 110.01280147159522, 114.80983315679568, 106.4573262097728, 106.71364078991598, 106.84598180999068, 106.92694092413632, 105.63055887441644, 105.60716037184876, 106.480946835512, 106.08213011157795, 104.72300521965452, 102.7544519631964, 98.93977656928624, 94.60339168273018, 93.50925138772176, 93.81961990357566, 92.8725731865231, 91.33673710270774, 90.80422036585745, 92.55582396700902, 90.50202629707044, 89.58205017170842, 89.12140167903829, 89.39787177675979, 89.76637690809584, 89.13234478658964, 88.21201526159352, 86.77240332673078, 85.67362359135161, 85.22627758333334, 82.61676025264549, 78.20578482065048, 76.80226211723532, 75.46650587713974, 73.99302163017428, 73.09312270111094, 70.4879597980859, 69.67742257282781, 71.72834474540927, 70.76654327497666, 69.24113502964519, 68.55604583543418, 67.50779127536572, 67.18796735582012, 66.86674387861811, 67.20348721623094, 66.56516353439153, 66.32062499268598, 65.88542235232592, 64.77586706263617, 61.94912781901649, 61.939074112278256, 61.53829188683734, 61.65134509648304, 61.51224581084656, 61.36857270220069, 60.93431954744334, 60.09673043495175, 59.575245781045766, 59.15641058994709, 58.83623124008068, 58.89058840670712, 58.7744234381354, 60.10006177925616, 60.36276007732519, 60.01350703828198, 60.02229050875765, 59.7485250830221, 59.92845326665112, 60.1575149624183, 60.10086682861294, 60.217893264083415, 59.85736959617182, 59.33509784943978, 58.719834253297805, 58.05389779652972, 57.6384237289916, 60.17629331839402, 59.85149821825398, 60.510907831232494, 60.00912156573468, 60.24601833885777, 60.01260220630606, 59.98700247838825, 60.64680920704948, 60.99382399329893, 61.416650148848426, 61.64344065402193, 62.2036677612823, 58.704390762216, 59.154706550731404, 58.60761050334579, 59.646293230469965, 59.10395664838157, 59.98953078026315, 60.363366143635226, 60.9116110345005, 61.08095070803639, 60.842383360021785, 62.16013050130071, 62.363537958761285, 63.03121989859984, 63.53880130347679, 63.13675709718331, 62.03253995694004, 62.564113978826754, 62.67176038001867, 62.68925196171802, 61.72911239666978, 61.883787197003066, 60.8278672167756, 60.86540819708996, 61.027763689853714, 61.812089186585744, 69.10590586826955, 70.33937848708372, 71.1770084282602, 70.90096659187935, 70.17466853267973, 79.87757808488952, 97.16096478330223, 108.8808261511049, 108.84576525326798, 112.45635913515406, 125.42332452840024, 124.81784969989108, 118.15919962876144, 117.97030352575474, 118.01281752855589, 123.32234588842203, 123.82974017117957, 115.52202491727616, 96.81331692514784, 89.54958590569562, 88.25641193745236, 82.65888416398485, 71.32219448964817, 78.5954091860411, 85.50395393208356, 84.59942446847025, 84.76091624114758, 96.0519382566397, 101.541654888175, 99.72380056162464, 100.00760817903829, 99.47352919950204, 100.47858832928728, 101.7148296111111, 102.85974617455518, 94.79673895175848, 89.5012463529412, 90.85916570035792, 91.59594137230506, 75.309001958061, 72.43090239422868, 74.19910537255628, 75.68025262010647, 76.32142201909566, 77.3838286214837, 78.59300024799478, 79.68651319421402, 80.17404397008741, 82.8167582741103, 83.30328928452232, 94.5623179905994, 101.18047395345926, 119.07067472347886, 124.33552758177716, 124.01965553112356, 123.72177629784323, 122.8346665550848, 122.41900229637412, 121.45261697759103, 121.0797364854692, 119.40291757609712, 119.62094275830935, 107.0594472692188, 102.23517298467166, 81.72559463194885, 78.17708472523466, 78.21389307928857, 82.96250568464055, 83.29302220915032, 84.55985601842983, 84.5579963393246, 84.63422396180653, 84.60551839728188, 82.94553181127256, 82.23181786173292, 83.53952972914722, 83.37298275378022, 82.78486857780891, 81.53271679972647, 76.69199064993775, 75.3893086626193, 75.431206848748, 75.20392168300654, 75.37757963460119, 75.42212664871225, 77.00936978843372, 77.15416194187674, 77.24250511850295, 78.43949843477604, 79.58224881932773, 80.64086918928376, 81.46008437616518, 81.68813588725489, 87.00749136367659, 89.29415157384065, 91.49808288515406, 92.25914195710654, 93.3555392617193, 94.30060701960784, 95.40126088726852, 96.3911516367031, 97.69705286235605, 98.45865854699656, 99.75015031489262, 101.25564044775196, 107.6338312675848, 107.45867452326485, 108.0752771006069, 110.15911915530656, 110.27271465071584, 111.02974784453784, 111.83560021574594, 112.7440900471522, 112.6498210821662, 113.34289526032263, 113.1634320035643, 111.60560243627452, 105.39874216985685, 107.11434224027325, 107.20673957843135, 107.65514564159082, 108.91141023773602, 108.33738037348272, 107.15264848893368, 105.92246163686583, 105.55435881313868, 105.2504303348895, 104.97383849891068, 103.58109590774912, 101.26796957547462, 99.19113004271708, 97.50169727217552, 96.31982768456272, 95.47275474494242, 95.20809749400873, 95.61451636437909, 94.64907122905257, 94.42358800840336, 93.7516076292406, 93.55810158053222, 93.5175661234049, 98.05775094147153, 98.21894845238094, 98.18030613562092, 97.09089923661688, 96.18435416845628, 96.50738569203236, 96.12872400365508, 97.13246079895218, 97.1443402377062, 98.03660473295989, 98.24105839643636, 99.36972514324616, 95.490582109944, 95.13432254768648, 95.09345597175536, 95.72232799898846, 95.77281172128852, 95.89461338507628, 95.95299040507317, 94.97010732967632, 93.88803117584813, 93.06607558293652, 92.01187856395892, 89.65001079084966, 89.82803097486772, 90.1322224746343, 89.08252345066914, 87.48960819825707, 86.48443779092747, 85.26539723583878, 84.10118568946466, 84.03560823980703, 83.88423789324618, 83.33728454518149, 82.84629710788724, 82.18693846047307, 82.59351917363448, 81.92174586172648, 82.34813850373482, 84.7658453663243, 85.32863012005913, 85.55813989558045, 85.96762634414877, 86.41243759057545, 86.8974022794079, 87.74909285845007, 89.7712920400716, 89.53082222004356, 89.07126357889823, 88.58377104671001, 87.33491228642829, 84.11213878991596, 83.1229656363212, 81.9799873931029, 81.04337047096365, 79.9908222271488, 79.10554902791914, 77.89077069856832, 76.0704228522409, 74.63286190094927, 73.91416191136075, 73.00220348521631, 73.81838663035197, 73.10034526174914, 75.2011783053993, 74.25165894195457, 73.13134242771552, 71.93152701511762, 71.46531301540615, 68.54775400583567, 67.72885386352318, 67.11893598389355, 66.45704678727046, 64.9772576101774, 64.47351452777778, 65.17583312661584, 65.35256861741364, 64.61357377917834, 64.26857109562715, 63.41080388165266, 63.21772739906695, 64.936638554155, 65.71853185434173, 65.41554603905423, 65.46189228345783, 65.36905735994397, 64.85577353571298, 62.95431177318704, 59.91097652011944, 60.063966624260814, 60.34665973513852, 60.48229064291681, 60.65682073233737, 58.30302584251478, 58.13657930929039, 58.119443108854654, 59.05305321459695, 59.3122089877062, 59.42235157065048, 59.47208075669156, 59.220645123093696, 59.91204508337422, 60.18918646704861, 60.086247619281046, 60.10478320004669, 60.3253108006536, 60.68779465810769, 59.95893887916277, 59.45530569561158, 58.92307034270218, 61.74938916767819, 61.690774105353256, 61.54580785753191, 60.69797620650483, 60.39458169810146, 60.40204132990974, 60.36062620004539, 60.36778076283782, 59.74897276563959, 59.43588568464052, 59.8336132587146, 59.7206610821662, 56.90866583955804, 57.65162047524186, 57.65234784835438, 57.716921693744176, 57.860424411764704, 57.92615505524432, 57.92090631652662, 58.002362059990666, 58.27439731379358, 58.52968746199815, 59.50486787986306, 59.55751657314038, 59.35171057500649, 59.48352707150639, 59.84824493824828, 61.27337571661999, 61.28622332990326, 61.96210018409587, 62.94042833076564, 63.869929016962345, 64.7192748155715, 64.6788845867511, 65.0808513488173, 65.69696274424214, 66.70805809679428, 67.11088997587923, 67.15916152591036, 66.18288800194068, 66.36954922962575, 66.11864108520075, 65.75808972938064, 65.28965808745721, 64.97707525303456, 64.63797934663866, 66.80988548367118, 66.21829629022265, 65.8893823888889, 64.99591412815127, 64.7245027149082, 64.39198801999561, 69.56021118892002, 69.25976947813571, 71.11886426548398, 71.4080690994489, 73.62254698988488, 72.12327611873638, 70.54724184298163, 70.25643141551902, 70.70041137317149, 71.5322421381316, 71.88483553236851, 71.74621211157796, 68.32590607531901, 67.80569805648926, 67.1322284013076, 67.12787379582944, 69.97535272782447, 70.45439598303442, 70.9322419745565, 71.50965616255318, 72.03787001610644, 73.17304297230004, 74.7730343085123, 75.34924414083413, 75.06601899393091, 77.21252147634607, 77.84951427395089, 78.00531980508869, 74.9351881021631, 75.67783448117024, 77.39862276999689, 78.3204462735761, 79.78140821070652, 80.05098767658407, 80.27915094288826, 81.37867342149083, 82.05395716268481, 80.36615790725179, 81.6569546973072, 81.54418937107066, 82.56870576299409, 83.63293898816656, 83.88548299229693, 84.30108302622031, 83.68091947673514, 82.23372233024193, 82.24572397785364, 81.56226761352254, 82.36522082127296, 82.47457360418612, 83.18741026649549, 83.40193171553065, 82.9233648590881, 81.43635217561467, 82.65946740786781, 82.1163011109555, 81.68099421202925, 81.66788200392676, 85.01999838873327, 88.75878689091192, 89.29628824478682, 88.83626395253656, 86.82577044428884, 84.09486394981325, 83.47539111399004, 81.5924984081855, 82.07185762664828, 82.2281231729627, 82.02066577995645, 80.44962234811119, 76.52163723786181, 72.76360286258948, 74.55059453213508, 74.99093831022408, 76.99675560916589, 78.78671652131963, 80.21830407522762, 81.30634295946156, 90.13460488654104, 93.99732953338004, 94.421727833393, 96.37953193907563, 100.67351364558044, 100.78414175686532, 103.1930209703548, 104.4701083811858, 105.00567304108311, 104.93058473918455, 105.88102079707436, 106.16076954396203, 111.47411197370056, 112.2891346800498, 113.93540020121836, 112.20651925377112, 111.21307030368814, 111.13287217950511, 111.07582479575164, 111.9790803057451, 119.28784872798008, 120.25276438227512, 120.42916748972924, 119.27678473382288, 111.24595396887644, 109.67408166830064, 110.29923517927168, 110.80462898856209, 111.090308672656, 111.38008064193576, 111.27893600272331, 111.6343980889492, 103.91442370160286, 103.72134061546842, 103.4633758145036, 101.94216997004357, 101.84085221584188, 100.60689081325864, 99.70419440266107, 100.16758754388422, 99.97221956939713, 99.6579027708528, 101.92092016658889, 103.2410159291939, 102.6391455228758, 102.35834271576408, 102.74754486585744, 102.29940125334578, 106.57442545860567, 106.44921128006926, 108.580386849751, 107.91250633411144, 107.50373589572702, 106.7946297648615, 106.2944288761282, 106.18881795596016, 107.09483038017429, 107.18630398184656, 106.14102524579832, 105.12299091107998, 102.79205626346096, 102.42553496288518, 100.3792199246032, 100.34351701649548, 100.06617657065048, 99.29375219887956, 98.1495157481326, 96.16821717366946, 95.572684456427, 96.61663651649548, 96.01640997323376, 95.60684201626204, 94.80227598257082, 95.33739049027388, 94.23471145300344, 92.75312873895112, 91.62761634749457, 90.82496536836744, 88.89547734562714, 87.15683525271878, 84.68851624309058, 82.63321596490819, 81.82777713157421, 79.39300040668314, 78.72247451906317, 77.45340562722015, 77.24475493145036, 77.43505339892623, 77.76075893012761, 77.02476477692188, 77.10500217560562, 77.36233201812948, 77.68189796218488, 78.09720856084655, 78.44472735457516, 78.09155317226892, 77.53499366814502, 76.827071409197, 76.00844257111734, 74.31874874190787, 72.77053833667912, 71.48931496957671, 72.20485872735178, 72.22885517374728, 71.87356966604419, 71.6821534677093, 71.69160534539371, 71.17332469794584, 72.30651870790538, 71.58049698704482, 72.82317943907563, 73.16209187455176, 73.86367769011372, 73.75856712809939, 73.64182907544702, 73.71067590709617, 74.47227324315283, 73.93447225420168, 73.4108181642546, 72.12921608372237, 71.57889565616247, 71.53533121545284, 70.71755271920733, 70.5591165277311, 70.4789881492456, 69.79276951501711, 70.39705718043885, 69.4237743085123, 68.59158741913515, 68.42072375404607, 68.48651809897292, 67.8968297543573, 68.3535923906785, 67.94751900101151, 67.46486430314349, 69.07083574089636, 68.90728841433238, 68.33032942662621, 67.39166203633675, 66.98274086266339, 66.9050177393402, 66.35879910750921, 65.63565698604756, 64.81727100669157, 65.52874521661998, 65.31513396394662, 65.03079224595395, 62.79347867556858, 62.71494836677685, 62.49758355995424, 63.08107303307561, 62.645712096621246, 62.48022372685539, 62.392689712524735, 62.64060304888165, 62.019595960559606, 62.674899896204266, 63.22068268689697, 66.01400491853408, 67.58862260706505, 67.31636706045752, 66.34122329396203, 66.15351124144102, 65.75396536009958, 65.50930599961096, 65.24352650988173, 65.02438754652974, 64.18941368145036, 63.3916185795985, 62.61476900311235, 58.39181618253968, 58.13924164970432, 58.0659776844071, 57.539563204450666, 57.78957700404607, 57.83665200568005, 57.69205128677703, 57.875688839558045, 57.90288258714596, 57.766867595160285, 59.52777240911921, 59.50340365779645, 59.82133025863679, 59.67325390013746, 59.52093884943978, 59.57632892561469, 59.111668793806416, 59.34563299704326, 59.51389615172736, 59.45274793238406, 59.64235272253345, 58.28638640359476, 58.27672084889511, 58.36627269164332, 58.68876257306256, 58.74483465787425, 58.41612426960785, 57.75860459979899, 58.14674279318394, 57.576143969032046, 57.11916071195146, 56.64401442880486, 56.41523373882082, 55.72285905283224, 59.006976361188926, 59.63682332734204, 59.65950260099595, 59.6799929711329, 60.70835919856832, 61.3684203653906, 66.66365037659509, 67.31323969942422, 70.19830191306022, 70.9418984718721, 73.68310829930167, 73.79863528746498, 72.31470794595818, 71.68464790867253, 72.43125688841475, 72.623150237211, 72.45495160908938, 71.13287626583494, 67.7668506395151, 67.2604089465869, 65.92817478516962, 65.44463893650793, 63.97847156682423, 63.2969495205811, 66.2086197561469, 70.24524498563389, 70.50937451531215, 71.6038075262216]]} \ No newline at end of file diff --git a/demo/outlier.js b/demo/outlier.js new file mode 100644 index 0000000..26ccce8 --- /dev/null +++ b/demo/outlier.js @@ -0,0 +1,91 @@ +import uPlot from "./dist/uPlot/uPlot.esm.js"; + +import { getSize } from "./helpers.js"; +import { legendAsTooltipPlugin } from "./plugins.js"; + +class OutlierWorker { + constructor() { + this.worker = new Worker("./outlier.worker.js", { type: "module" }); + this.dataPromise = fetch("./outlier.data.json").then((res) => res.json()); + this.dataPromise.then((data) => { + this.data = data.data; + }); + } + + static create = () => { + return new Promise((resolve, reject) => { + const worker = new OutlierWorker(); + worker.worker.onmessage = (e) => { + if (e.data === "ready") { + worker.dataPromise.then(() => resolve(worker)); + } else { + reject(); + } + } + }) + } + + detect = async (opts) => { + return new Promise((resolve, reject) => { + const start = performance.now(); + this.worker.postMessage({ + opts, + data: this.data.slice(1).map(arr => new Float64Array(arr)), + }); + this.worker.onmessage = (e) => { + const elapsed = (performance.now() - start).toFixed(0); + resolve({ outliers: e.data, elapsed }); + }; + }); + } +} + +function setUpPlot(data, outlyingSeries) { + const opts = { + ...getSize(), + series: [ + {}, + ...data.slice(1).map((_, i) => { + return { + label: `${i + 1}`, + stroke: "black", + width: 1, + }; + }), + ], + plugins: [legendAsTooltipPlugin()], + }; + const u = uPlot(opts, data, document.getElementById("outlier-plot")); + window.addEventListener("resize", () => { + u.setSize(getSize()); + }); + return u; +} + +async function main() { + const worker = await OutlierWorker.create(); + + const u = setUpPlot(worker.data); + async function runOutlierDetection(opts) { + const { outliers, elapsed } = await worker.detect(opts); + const outlyingSeries = new Set(outliers.outlyingSeries); + outliers.seriesResults.forEach((res, i) => { + const seriesIdx = i + 1; + u.delSeries(seriesIdx); + u.addSeries({ + label: `${i} (${res.isOutlier ? "outlier" : "normal"})`, + stroke: res.isOutlier ? "red" : "black", + width: 1, + }, seriesIdx); + }); + u.redraw(); + document.getElementById("outlier-title").innerText = `Outlier detection with DBSCAN - done in ${elapsed}ms`; + } + runOutlierDetection({ sensitivity: 0.8 }); + + document.getElementById("outlier-sensitivity").addEventListener("change", function() { + runOutlierDetection({ sensitivity: parseFloat(this.value) }); + }) +} + +export default main; diff --git a/demo/outlier.worker.js b/demo/outlier.worker.js new file mode 100644 index 0000000..53b2174 --- /dev/null +++ b/demo/outlier.worker.js @@ -0,0 +1,11 @@ +import initOutlier, { OutlierDetector } from "./dist/@bsull/augurs/outlier.js"; + +await initOutlier(); + +self.onmessage = (e) => { + const { opts, data } = e.data; + const detector = OutlierDetector.dbscan(opts); + const outliers = detector.preprocess(data).detect(); + self.postMessage(outliers); +}; +self.postMessage("ready"); diff --git a/demo/plugins.js b/demo/plugins.js new file mode 100644 index 0000000..b2708a0 --- /dev/null +++ b/demo/plugins.js @@ -0,0 +1,62 @@ +import uPlot from "./dist/uPlot/uPlot.esm.js"; + +// converts the legend into a simple tooltip +export function legendAsTooltipPlugin({ + className, + style = { backgroundColor: "#f5f6fa", color: "black" }, +} = {}) { + let legendEl; + + function init(u, opts) { + legendEl = u.root.querySelector(".u-legend"); + + legendEl.classList.remove("u-inline"); + className && legendEl.classList.add(className); + + uPlot.assign(legendEl.style, { + textAlign: "left", + pointerEvents: "none", + display: "none", + position: "absolute", + left: 0, + top: 0, + zIndex: 100, + boxShadow: "2px 2px 4px rgba(0,0,0,0.5)", + ...style, + }); + + // hide series color markers + const idents = legendEl.querySelectorAll(".u-marker"); + + for (let i = 0; i < idents.length; i++) idents[i].style.display = "none"; + + const overEl = u.over; + overEl.style.overflow = "visible"; + + // move legend into plot bounds + overEl.appendChild(legendEl); + + // show/hide tooltip on enter/exit + overEl.addEventListener("mouseenter", () => { + legendEl.style.display = null; + }); + overEl.addEventListener("mouseleave", () => { + legendEl.style.display = "none"; + }); + + // let tooltip exit plot + // overEl.style.overflow = "visible"; + } + + function update(u) { + const { left, top } = u.cursor; + legendEl.style.transform = "translate(" + left + "px, " + top + "px)"; + } + + return { + hooks: { + init: init, + setCursor: update, + }, + }; +} diff --git a/demo/prophet.js b/demo/prophet.js new file mode 100644 index 0000000..833d6ca --- /dev/null +++ b/demo/prophet.js @@ -0,0 +1,1326 @@ +import uPlot from "./dist/uPlot/uPlot.esm.js"; +import { Worker } from "worker-with-import-map"; + +import { getSize } from "./helpers.js"; +import { legendAsTooltipPlugin } from "./plugins.js"; + +const df = { + ds: [ + 1197244800, 1197331200, 1197417600, 1197504000, 1197590400, 1197676800, + 1197763200, 1197849600, 1197936000, 1198022400, 1198108800, 1198195200, + 1198281600, 1198368000, 1198454400, 1198540800, 1198627200, 1198713600, + 1198800000, 1198886400, 1198972800, 1199059200, 1199145600, 1199232000, + 1199318400, 1199404800, 1199491200, 1199577600, 1199664000, 1199750400, + 1199836800, 1199923200, 1200009600, 1200096000, 1200182400, 1200268800, + 1200355200, 1200441600, 1200528000, 1200614400, 1200700800, 1200787200, + 1200873600, 1200960000, 1201046400, 1201132800, 1201219200, 1201305600, + 1201392000, 1201478400, 1201564800, 1201651200, 1201824000, 1201910400, + 1201996800, 1202083200, 1202169600, 1202256000, 1202342400, 1202428800, + 1202515200, 1202601600, 1202688000, 1202774400, 1202860800, 1202947200, + 1203033600, 1203120000, 1203206400, 1203292800, 1203379200, 1203465600, + 1203552000, 1203638400, 1203724800, 1203811200, 1203897600, 1203984000, + 1204070400, 1204243200, 1204416000, 1204675200, 1204761600, 1204848000, + 1204934400, 1205020800, 1205107200, 1205193600, 1205280000, 1205366400, + 1205452800, 1205539200, 1205625600, 1205712000, 1205798400, 1205884800, + 1205971200, 1206057600, 1206144000, 1206230400, 1206316800, 1206403200, + 1206489600, 1206576000, 1206662400, 1206748800, 1206835200, 1206921600, + 1207008000, 1207094400, 1207180800, 1207267200, 1207353600, 1207440000, + 1207526400, 1207612800, 1207699200, 1207785600, 1207872000, 1207958400, + 1208044800, 1208131200, 1208217600, 1208304000, 1208390400, 1208476800, + 1208563200, 1208649600, 1208736000, 1208822400, 1208908800, 1208995200, + 1209081600, 1209168000, 1209254400, 1209340800, 1209427200, 1209513600, + 1209600000, 1209686400, 1209772800, 1209859200, 1209945600, 1210032000, + 1210118400, 1210204800, 1210291200, 1210377600, 1210464000, 1210550400, + 1210636800, 1210723200, 1210809600, 1210896000, 1210982400, 1211068800, + 1211155200, 1211241600, 1211328000, 1211414400, 1211500800, 1211587200, + 1211673600, 1211760000, 1211846400, 1211932800, 1212019200, 1212105600, + 1212192000, 1212451200, 1212537600, 1212624000, 1212710400, 1212796800, + 1212883200, 1212969600, 1213056000, 1213142400, 1213228800, 1213315200, + 1213401600, 1213488000, 1213574400, 1213660800, 1213747200, 1213833600, + 1213920000, 1214006400, 1214092800, 1214179200, 1214265600, 1214352000, + 1214438400, 1214524800, 1214611200, 1214697600, 1214784000, 1214956800, + 1215043200, 1215129600, 1215216000, 1215302400, 1215388800, 1215475200, + 1215561600, 1215648000, 1215734400, 1215820800, 1217548800, 1217635200, + 1217721600, 1217808000, 1217894400, 1217980800, 1218067200, 1218153600, + 1218240000, 1218326400, 1218412800, 1218499200, 1218585600, 1218672000, + 1218758400, 1218844800, 1218931200, 1219017600, 1219104000, 1219190400, + 1219276800, 1219363200, 1219449600, 1219536000, 1219622400, 1219708800, + 1219795200, 1219881600, 1219968000, 1220054400, 1220140800, 1220227200, + 1220313600, 1220400000, 1220486400, 1220572800, 1220659200, 1220745600, + 1220832000, 1220918400, 1221004800, 1221091200, 1221177600, 1221264000, + 1221350400, 1221436800, 1221523200, 1221609600, 1221696000, 1221782400, + 1221868800, 1221955200, 1222041600, 1222128000, 1222214400, 1222300800, + 1222387200, 1222473600, 1222560000, 1222646400, 1222732800, 1222819200, + 1222905600, 1222992000, 1223078400, 1223164800, 1223251200, 1223337600, + 1223424000, 1223510400, 1223596800, 1223683200, 1223769600, 1223856000, + 1223942400, 1224028800, 1224115200, 1224201600, 1224288000, 1224374400, + 1224460800, 1224720000, 1224806400, 1224892800, 1224979200, 1225065600, + 1225152000, 1225238400, 1225324800, 1225411200, 1225497600, 1225584000, + 1225670400, 1225756800, 1225843200, 1225929600, 1226016000, 1226102400, + 1226188800, 1226275200, 1226361600, 1226448000, 1226534400, 1226620800, + 1226707200, 1226793600, 1226880000, 1226966400, 1227052800, 1227139200, + 1227225600, 1227312000, 1227398400, 1227484800, 1227571200, 1227657600, + 1227744000, 1227830400, 1227916800, 1228003200, 1228089600, 1228176000, + 1228262400, 1228348800, 1228435200, 1228521600, 1228608000, 1228694400, + 1228780800, 1228867200, 1228953600, 1229040000, 1229126400, 1229212800, + 1229299200, 1229385600, 1229472000, 1229558400, 1229644800, 1229731200, + 1229817600, 1229904000, 1229990400, 1230076800, 1230163200, 1230249600, + 1230336000, 1230422400, 1230508800, 1230595200, 1230681600, 1230768000, + 1230854400, 1230940800, 1231027200, 1231113600, 1231200000, 1231286400, + 1231372800, 1231459200, 1231545600, 1231632000, 1231718400, 1231804800, + 1231891200, 1231977600, 1232064000, 1232150400, 1232236800, 1232323200, + 1232409600, 1232496000, 1232582400, 1232668800, 1232755200, 1232841600, + 1232928000, 1233014400, 1233100800, 1233187200, 1233273600, 1233360000, + 1233446400, 1233532800, 1233619200, 1233705600, 1233792000, 1233878400, + 1233964800, 1234051200, 1234137600, 1234224000, 1234310400, 1234396800, + 1234483200, 1234569600, 1234656000, 1234742400, 1234828800, 1234915200, + 1235001600, 1235088000, 1235174400, 1235260800, 1235347200, 1235433600, + 1235520000, 1235606400, 1235692800, 1235779200, 1235865600, 1235952000, + 1236038400, 1236124800, 1236211200, 1236297600, 1236384000, 1236470400, + 1236556800, 1236643200, 1236729600, 1236816000, 1236902400, 1236988800, + 1237075200, 1237161600, 1237248000, 1237334400, 1237420800, 1237507200, + 1237593600, 1237680000, 1237766400, 1237852800, 1237939200, 1238025600, + 1238112000, 1238198400, 1238284800, 1238371200, 1238457600, 1238544000, + 1238630400, 1238716800, 1238803200, 1238889600, 1238976000, 1239062400, + 1239148800, 1239235200, 1239321600, 1239408000, 1239494400, 1239580800, + 1239667200, 1239753600, 1239840000, 1239926400, 1240012800, 1240099200, + 1240185600, 1240272000, 1240358400, 1240444800, 1240531200, 1240617600, + 1240704000, 1240790400, 1240876800, 1240963200, 1241049600, 1241136000, + 1241222400, 1241308800, 1241395200, 1241481600, 1241568000, 1241654400, + 1241740800, 1241827200, 1241913600, 1242000000, 1242086400, 1242172800, + 1242259200, 1242345600, 1242432000, 1242518400, 1242604800, 1242691200, + 1242777600, 1242864000, 1242950400, 1243036800, 1243123200, 1243209600, + 1243296000, 1243382400, 1243468800, 1243555200, 1243641600, 1243728000, + 1243814400, 1243900800, 1243987200, 1244073600, 1244160000, 1244246400, + 1244332800, 1244419200, 1244505600, 1244592000, 1244678400, 1244764800, + 1244851200, 1244937600, 1245024000, 1245110400, 1245196800, 1245283200, + 1245369600, 1245456000, 1245542400, 1245628800, 1245715200, 1245801600, + 1245888000, 1245974400, 1246060800, 1246147200, 1246233600, 1246320000, + 1246406400, 1246492800, 1246579200, 1246665600, 1246752000, 1246838400, + 1246924800, 1247011200, 1247097600, 1247184000, 1247270400, 1247356800, + 1247443200, 1247529600, 1247616000, 1247702400, 1247788800, 1247875200, + 1247961600, 1248048000, 1248134400, 1248220800, 1248307200, 1248393600, + 1248480000, 1248566400, 1248652800, 1248739200, 1248825600, 1248912000, + 1248998400, 1249084800, 1249171200, 1249257600, 1249344000, 1249430400, + 1249516800, 1249603200, 1249689600, 1249776000, 1249862400, 1249948800, + 1250035200, 1250121600, 1250208000, 1250294400, 1250380800, 1250467200, + 1250553600, 1250640000, 1250726400, 1250812800, 1250899200, 1250985600, + 1251072000, 1251158400, 1251244800, 1251331200, 1251417600, 1251504000, + 1251590400, 1251676800, 1251763200, 1251849600, 1251936000, 1252022400, + 1252108800, 1252195200, 1252281600, 1252368000, 1252454400, 1252540800, + 1252627200, 1252713600, 1252800000, 1252886400, 1252972800, 1253059200, + 1253145600, 1253232000, 1253318400, 1253404800, 1253491200, 1253577600, + 1253750400, 1254096000, 1254182400, 1254268800, 1254355200, 1254441600, + 1254528000, 1254614400, 1254700800, 1254787200, 1254873600, 1254960000, + 1255046400, 1255132800, 1255219200, 1255305600, 1255392000, 1255737600, + 1255824000, 1255910400, 1255996800, 1256083200, 1256169600, 1256256000, + 1256342400, 1256428800, 1256515200, 1256601600, 1256688000, 1256774400, + 1256860800, 1256947200, 1257033600, 1257120000, 1257206400, 1257292800, + 1257379200, 1257465600, 1257552000, 1257638400, 1257724800, 1257811200, + 1257897600, 1257984000, 1258070400, 1258156800, 1258329600, 1258416000, + 1258502400, 1258588800, 1258675200, 1258761600, 1258934400, 1259020800, + 1259107200, 1259193600, 1259280000, 1259366400, 1259452800, 1259539200, + 1259625600, 1259712000, 1259798400, 1259884800, 1259971200, 1260057600, + 1260144000, 1260230400, 1260316800, 1260403200, 1260489600, 1260576000, + 1260662400, 1260748800, 1260835200, 1260921600, 1261008000, 1261094400, + 1261180800, 1261267200, 1261353600, 1261440000, 1261526400, 1261612800, + 1261699200, 1261785600, 1261872000, 1261958400, 1262044800, 1262131200, + 1262217600, 1262304000, 1262390400, 1262476800, 1262563200, 1262649600, + 1262736000, 1262822400, 1262908800, 1262995200, 1263081600, 1263168000, + 1263254400, 1263340800, 1263427200, 1263513600, 1263600000, 1263686400, + 1263772800, 1263859200, 1263945600, 1264032000, 1264118400, 1264377600, + 1264464000, 1264550400, 1264636800, 1264723200, 1264809600, 1264896000, + 1264982400, 1265068800, 1265155200, 1265241600, 1265328000, 1265414400, + 1265500800, 1265673600, 1265760000, 1265846400, 1265932800, 1266019200, + 1266105600, 1266192000, 1266278400, 1266364800, 1266451200, 1266537600, + 1266624000, 1266710400, 1266796800, 1266969600, 1267056000, 1267142400, + 1267228800, 1267315200, 1267401600, 1267488000, 1267574400, 1267660800, + 1267747200, 1267833600, 1267920000, 1268006400, 1268092800, 1268179200, + 1268265600, 1268352000, 1268438400, 1268524800, 1268611200, 1268697600, + 1268784000, 1268870400, 1268956800, 1269043200, 1269129600, 1269216000, + 1269302400, 1269388800, 1269475200, 1269561600, 1269648000, 1269734400, + 1269820800, 1269907200, 1269993600, 1270080000, 1270166400, 1270252800, + 1270339200, 1270425600, 1270512000, 1270598400, 1270684800, 1270771200, + 1270857600, 1270944000, 1271030400, 1271116800, 1271203200, 1271289600, + 1271376000, 1271462400, 1271548800, 1271635200, 1271721600, 1271808000, + 1271894400, 1271980800, 1272067200, 1272153600, 1272240000, 1272326400, + 1272412800, 1272499200, 1272585600, 1272672000, 1272758400, 1272844800, + 1272931200, 1273017600, 1273104000, 1273190400, 1273276800, 1273363200, + 1273449600, 1273536000, 1273622400, 1273708800, 1273795200, 1273881600, + 1273968000, 1274054400, 1274140800, 1274227200, 1274313600, 1274400000, + 1274486400, 1274572800, 1274659200, 1274745600, 1274832000, 1274918400, + 1275004800, 1275091200, 1275177600, 1275264000, 1275350400, 1275436800, + 1275523200, 1275609600, 1275696000, 1275782400, 1275868800, 1275955200, + 1276041600, 1276128000, 1276214400, 1276300800, 1276387200, 1276473600, + 1276560000, 1276646400, 1276732800, 1276819200, 1276905600, 1276992000, + 1277078400, 1277164800, 1277251200, 1277337600, 1277424000, 1277596800, + 1277769600, 1277856000, 1277942400, 1278028800, 1278115200, 1278201600, + 1278374400, 1278806400, 1278892800, 1278979200, 1279065600, 1279152000, + 1279238400, 1279324800, 1279411200, 1279497600, 1279584000, 1279670400, + 1279756800, 1279843200, 1279929600, 1280016000, 1280102400, 1280188800, + 1280275200, 1280361600, 1280448000, 1280534400, 1280620800, 1280707200, + 1280793600, 1280880000, 1280966400, 1281052800, 1281139200, 1281225600, + 1281312000, 1281398400, 1281484800, 1281571200, 1281657600, 1281744000, + 1281830400, 1281916800, 1282003200, 1282089600, 1282176000, 1282262400, + 1282348800, 1282435200, 1282521600, 1282608000, 1282694400, 1282780800, + 1282867200, 1282953600, 1283040000, 1283126400, 1283212800, 1283299200, + 1283385600, 1283472000, 1283558400, 1283644800, 1283731200, 1283817600, + 1283904000, 1283990400, 1284076800, 1284163200, 1284249600, 1284336000, + 1284422400, 1284508800, 1284595200, 1284681600, 1284768000, 1284854400, + 1284940800, 1285027200, 1285113600, 1285200000, 1285286400, 1285372800, + 1285459200, 1285545600, 1285632000, 1285718400, 1285804800, 1285891200, + 1285977600, 1286064000, 1286150400, 1286236800, 1286323200, 1286409600, + 1286496000, 1286582400, 1286668800, 1286755200, 1286841600, 1286928000, + 1287014400, 1287100800, 1287187200, 1287273600, 1287360000, 1287446400, + 1287532800, 1287619200, 1287705600, 1287792000, 1287878400, 1287964800, + 1288051200, 1288137600, 1288224000, 1288310400, 1288396800, 1288483200, + 1288569600, 1288656000, 1288742400, 1288828800, 1288915200, 1289001600, + 1289088000, 1289174400, 1289260800, 1289347200, 1289433600, 1289520000, + 1289606400, 1289692800, 1289779200, 1289865600, 1289952000, 1290038400, + 1290124800, 1290211200, 1290297600, 1290384000, 1290470400, 1290556800, + 1290643200, 1290729600, 1290816000, 1290902400, 1290988800, 1291075200, + 1291161600, 1291248000, 1291334400, 1291420800, 1291507200, 1291593600, + 1291680000, 1291766400, 1291852800, 1291939200, 1292025600, 1292112000, + 1292198400, 1292284800, 1292371200, 1292457600, 1292544000, 1292630400, + 1292716800, 1292803200, 1292889600, 1292976000, 1293062400, 1293148800, + 1293235200, 1293321600, 1293408000, 1293494400, 1293580800, 1293667200, + 1293753600, 1293840000, 1293926400, 1294012800, 1294099200, 1294185600, + 1294272000, 1294358400, 1294444800, 1294531200, 1294617600, 1294704000, + 1294790400, 1294876800, 1294963200, 1295049600, 1295136000, 1295222400, + 1295308800, 1295395200, 1295481600, 1295568000, 1295654400, 1295740800, + 1295827200, 1295913600, 1296000000, 1296086400, 1296172800, 1296259200, + 1296345600, 1296432000, 1296518400, 1296604800, 1296691200, 1296777600, + 1296864000, 1296950400, 1297036800, 1297123200, 1297209600, 1297296000, + 1297382400, 1297468800, 1297555200, 1297641600, 1297728000, 1297814400, + 1297900800, 1297987200, 1298073600, 1298160000, 1298246400, 1298332800, + 1298419200, 1298505600, 1298592000, 1298678400, 1298764800, 1298851200, + 1298937600, 1299024000, 1299110400, 1299196800, 1299283200, 1299369600, + 1299456000, 1299542400, 1299628800, 1299715200, 1299801600, 1299888000, + 1299974400, 1300060800, 1300147200, 1300233600, 1300320000, 1300406400, + 1300492800, 1300579200, 1300665600, 1300752000, 1300838400, 1300924800, + 1301011200, 1301097600, 1301184000, 1301270400, 1301356800, 1301443200, + 1301529600, 1301616000, 1301702400, 1301788800, 1301875200, 1301961600, + 1302048000, 1302134400, 1302220800, 1302307200, 1302393600, 1302480000, + 1302566400, 1302652800, 1302739200, 1302825600, 1302912000, 1302998400, + 1303084800, 1303171200, 1303257600, 1303344000, 1303430400, 1303516800, + 1303603200, 1303689600, 1303776000, 1303862400, 1303948800, 1304035200, + 1304121600, 1304208000, 1304294400, 1304380800, 1304467200, 1304553600, + 1304640000, 1304726400, 1304812800, 1304899200, 1304985600, 1305072000, + 1305158400, 1305244800, 1305331200, 1305417600, 1305504000, 1305590400, + 1305676800, 1305763200, 1305849600, 1305936000, 1306022400, 1306108800, + 1306195200, 1306281600, 1306368000, 1306454400, 1306540800, 1306627200, + 1306713600, 1306800000, 1306886400, 1306972800, 1307059200, 1307145600, + 1307232000, 1307318400, 1307404800, 1307491200, 1307577600, 1307664000, + 1307750400, 1307836800, 1307923200, 1308009600, 1308096000, 1308182400, + 1308268800, 1308355200, 1308441600, 1308528000, 1308614400, 1308700800, + 1308787200, 1308873600, 1308960000, 1309046400, 1309132800, 1309219200, + 1309305600, 1309392000, 1309478400, 1309564800, 1309651200, 1309737600, + 1309824000, 1309910400, 1309996800, 1310083200, 1310169600, 1310256000, + 1310342400, 1310428800, 1310515200, 1310601600, 1310688000, 1310774400, + 1310860800, 1310947200, 1311033600, 1311120000, 1311206400, 1311292800, + 1311379200, 1311465600, 1311552000, 1311638400, 1311724800, 1311811200, + 1311897600, 1311984000, 1312070400, 1312156800, 1312243200, 1312329600, + 1312416000, 1312502400, 1312588800, 1312675200, 1312761600, 1312848000, + 1312934400, 1313020800, 1313107200, 1313193600, 1313280000, 1313366400, + 1313452800, 1313539200, 1313625600, 1313712000, 1313798400, 1313884800, + 1313971200, 1314057600, 1314144000, 1314230400, 1314316800, 1314403200, + 1314489600, 1314576000, 1314662400, 1314748800, 1314835200, 1315008000, + 1315094400, 1315180800, 1315267200, 1315353600, 1315440000, 1315526400, + 1315612800, 1315699200, 1315785600, 1315872000, 1315958400, 1316044800, + 1316131200, 1316217600, 1316304000, 1316390400, 1316476800, 1316563200, + 1316649600, 1316736000, 1316822400, 1316908800, 1316995200, 1317081600, + 1317168000, 1317254400, 1317340800, 1317427200, 1317513600, 1317600000, + 1317686400, 1317772800, 1317859200, 1317945600, 1318032000, 1318118400, + 1318204800, 1318291200, 1318377600, 1318464000, 1318550400, 1318636800, + 1318723200, 1318809600, 1318896000, 1318982400, 1319155200, 1319241600, + 1319328000, 1319414400, 1319500800, 1319587200, 1319673600, 1319760000, + 1319846400, 1319932800, 1320019200, 1320105600, 1320192000, 1320278400, + 1320364800, 1320451200, 1320537600, 1320624000, 1320710400, 1320796800, + 1320883200, 1320969600, 1321056000, 1321142400, 1321228800, 1321315200, + 1321401600, 1321488000, 1321574400, 1321660800, 1321747200, 1321833600, + 1321920000, 1322006400, 1322092800, 1322179200, 1322265600, 1322352000, + 1322438400, 1322524800, 1322611200, 1322697600, 1322784000, 1322870400, + 1322956800, 1323043200, 1323129600, 1323216000, 1323302400, 1323388800, + 1323475200, 1323561600, 1323648000, 1323734400, 1323820800, 1323907200, + 1323993600, 1324080000, 1324166400, 1324252800, 1324339200, 1324425600, + 1324512000, 1324598400, 1324857600, 1324944000, 1325030400, 1325116800, + 1325203200, 1325289600, 1325376000, 1325462400, 1325548800, 1325635200, + 1325721600, 1325808000, 1325894400, 1325980800, 1326067200, 1326153600, + 1326240000, 1326326400, 1326412800, 1326499200, 1326585600, 1326672000, + 1326758400, 1326844800, 1326931200, 1327017600, 1327104000, 1327190400, + 1327276800, 1327363200, 1327449600, 1327536000, 1327622400, 1327708800, + 1327795200, 1327881600, 1327968000, 1328054400, 1328140800, 1328227200, + 1328313600, 1328400000, 1328486400, 1328572800, 1328659200, 1328745600, + 1328832000, 1328918400, 1329004800, 1329091200, 1329177600, 1329264000, + 1329350400, 1329436800, 1329523200, 1329609600, 1329696000, 1329782400, + 1329868800, 1329955200, 1330041600, 1330128000, 1330214400, 1330300800, + 1330387200, 1330473600, 1330560000, 1330646400, 1330732800, 1330819200, + 1330905600, 1330992000, 1331078400, 1331164800, 1331251200, 1331337600, + 1331424000, 1331510400, 1331596800, 1331683200, 1331769600, 1331856000, + 1331942400, 1332028800, 1332115200, 1332201600, 1332288000, 1332374400, + 1332460800, 1332547200, 1332633600, 1332720000, 1332806400, 1332892800, + 1332979200, 1333065600, 1333152000, 1333238400, 1333324800, 1333411200, + 1333497600, 1333584000, 1333670400, 1333756800, 1333843200, 1333929600, + 1334016000, 1334102400, 1334188800, 1334275200, 1334361600, 1334448000, + 1334534400, 1334620800, 1334707200, 1334793600, 1334880000, 1334966400, + 1335052800, 1335139200, 1335225600, 1335312000, 1335398400, 1335484800, + 1335571200, 1335657600, 1335830400, 1335916800, 1336003200, 1336089600, + 1336176000, 1336262400, 1336348800, 1336435200, 1336521600, 1336608000, + 1336694400, 1336780800, 1336867200, 1336953600, 1337040000, 1337126400, + 1337212800, 1337299200, 1337385600, 1337472000, 1337558400, 1337644800, + 1337731200, 1337817600, 1337904000, 1337990400, 1338076800, 1338163200, + 1338249600, 1338336000, 1338422400, 1338508800, 1338595200, 1338681600, + 1338768000, 1338854400, 1338940800, 1339027200, 1339113600, 1339200000, + 1339286400, 1339372800, 1339459200, 1339545600, 1339632000, 1339718400, + 1339804800, 1339891200, 1339977600, 1340064000, 1340150400, 1340236800, + 1340323200, 1340409600, 1340496000, 1340582400, 1340668800, 1340755200, + 1340841600, 1340928000, 1341014400, 1341100800, 1341187200, 1341273600, + 1341360000, 1341446400, 1341532800, 1341619200, 1341705600, 1341792000, + 1341878400, 1341964800, 1342051200, 1342137600, 1342224000, 1342310400, + 1342396800, 1342483200, 1342569600, 1342656000, 1342742400, 1342828800, + 1342915200, 1343001600, 1343088000, 1343174400, 1343260800, 1343347200, + 1343433600, 1343520000, 1343606400, 1343692800, 1343779200, 1343865600, + 1343952000, 1344038400, 1344124800, 1344211200, 1344297600, 1344384000, + 1344470400, 1344556800, 1344643200, 1344729600, 1344816000, 1344902400, + 1344988800, 1345075200, 1345161600, 1345248000, 1345334400, 1345420800, + 1345507200, 1345593600, 1345680000, 1345766400, 1345852800, 1345939200, + 1346025600, 1346112000, 1346198400, 1346284800, 1346371200, 1346457600, + 1346544000, 1346630400, 1346716800, 1346803200, 1346889600, 1346976000, + 1347062400, 1347148800, 1347235200, 1347321600, 1347408000, 1347494400, + 1347580800, 1347667200, 1347753600, 1347840000, 1347926400, 1348012800, + 1348099200, 1348185600, 1348272000, 1348358400, 1348444800, 1348531200, + 1348617600, 1348704000, 1348790400, 1348876800, 1348963200, 1349049600, + 1349136000, 1349222400, 1349308800, 1349395200, 1349481600, 1349568000, + 1349654400, 1349740800, 1349827200, 1349913600, 1350000000, 1350086400, + 1350172800, 1350259200, 1350345600, 1350432000, 1350518400, 1350604800, + 1350691200, 1350777600, 1350864000, 1350950400, 1351036800, 1351123200, + 1351209600, 1351296000, 1351382400, 1351468800, 1351555200, 1351641600, + 1351728000, 1351814400, 1351900800, 1351987200, 1352073600, 1352160000, + 1352246400, 1352332800, 1352419200, 1352505600, 1352592000, 1352678400, + 1352764800, 1352851200, 1352937600, 1353024000, 1353110400, 1353196800, + 1353283200, 1353369600, 1353456000, 1353542400, 1353628800, 1353715200, + 1353801600, 1353888000, 1353974400, 1354060800, 1354147200, 1354233600, + 1354320000, 1354406400, 1354492800, 1354579200, 1354665600, 1354752000, + 1354838400, 1354924800, 1355011200, 1355097600, 1355184000, 1355270400, + 1355356800, 1355443200, 1355529600, 1355616000, 1355702400, 1355788800, + 1355875200, 1355961600, 1356048000, 1356134400, 1356220800, 1356307200, + 1356393600, 1356480000, 1356566400, 1356652800, 1356739200, 1356825600, + 1356912000, 1356998400, 1357084800, 1357171200, 1357257600, 1357344000, + 1357430400, 1357516800, 1357603200, 1357689600, 1357776000, 1357862400, + 1357948800, 1358035200, 1358121600, 1358208000, 1358294400, 1358380800, + 1358467200, 1358553600, 1358640000, 1358726400, 1358812800, 1358899200, + 1358985600, 1359072000, 1359158400, 1359244800, 1359331200, 1359417600, + 1359504000, 1359590400, 1359676800, 1359763200, 1359849600, 1359936000, + 1360022400, 1360108800, 1360195200, 1360281600, 1360368000, 1360454400, + 1360540800, 1360627200, 1360713600, 1360800000, 1360886400, 1360972800, + 1361059200, 1361145600, 1361232000, 1361318400, 1361404800, 1361491200, + 1361577600, 1361664000, 1361750400, 1361836800, 1361923200, 1362009600, + 1362096000, 1362182400, 1362268800, 1362355200, 1362441600, 1362528000, + 1362614400, 1362700800, 1362787200, 1362873600, 1362960000, 1363046400, + 1363132800, 1363219200, 1363305600, 1363392000, 1363478400, 1363564800, + 1363651200, 1363737600, 1363824000, 1363910400, 1363996800, 1364083200, + 1364169600, 1364256000, 1364342400, 1364428800, 1364515200, 1364601600, + 1364688000, 1364774400, 1364860800, 1364947200, 1365033600, 1365120000, + 1365206400, 1365292800, 1365379200, 1365465600, 1365552000, 1365638400, + 1365724800, 1365811200, 1365897600, 1365984000, 1366070400, 1366156800, + 1366243200, 1366329600, 1366416000, 1366502400, 1366588800, 1366675200, + 1366761600, 1366848000, 1366934400, 1367020800, 1367107200, 1367193600, + 1367280000, 1367366400, 1367452800, 1367539200, 1367625600, 1367712000, + 1367798400, 1367884800, 1367971200, 1368057600, 1368144000, 1368230400, + 1368316800, 1368403200, 1368489600, 1368576000, 1368662400, 1368748800, + 1368835200, 1368921600, 1369008000, 1369094400, 1369180800, 1369267200, + 1369353600, 1369440000, 1369526400, 1369612800, 1369699200, 1369785600, + 1369872000, 1369958400, 1370044800, 1370131200, 1370217600, 1370304000, + 1370390400, 1370476800, 1370563200, 1370649600, 1370736000, 1370822400, + 1370908800, 1370995200, 1371081600, 1371168000, 1371254400, 1371340800, + 1371427200, 1371513600, 1371600000, 1371686400, 1371772800, 1371859200, + 1371945600, 1372032000, 1372118400, 1372204800, 1372291200, 1372377600, + 1372464000, 1372550400, 1372636800, 1372723200, 1372809600, 1372896000, + 1372982400, 1373068800, 1373155200, 1373241600, 1373328000, 1373414400, + 1373500800, 1373587200, 1373673600, 1373760000, 1373846400, 1373932800, + 1374019200, 1374105600, 1374192000, 1374278400, 1374364800, 1374451200, + 1374624000, 1374710400, 1374796800, 1374883200, 1374969600, 1375056000, + 1375142400, 1375228800, 1375315200, 1375401600, 1375488000, 1375574400, + 1375660800, 1375747200, 1375833600, 1375920000, 1376006400, 1376092800, + 1376179200, 1376265600, 1376352000, 1376438400, 1376524800, 1376611200, + 1376697600, 1376784000, 1376870400, 1376956800, 1377043200, 1377129600, + 1377216000, 1377302400, 1377388800, 1377475200, 1377561600, 1377648000, + 1377734400, 1377820800, 1377907200, 1377993600, 1378080000, 1378166400, + 1378252800, 1378339200, 1378425600, 1378512000, 1378598400, 1378684800, + 1378771200, 1378857600, 1378944000, 1379030400, 1379116800, 1379203200, + 1379289600, 1379376000, 1379462400, 1379548800, 1379635200, 1379721600, + 1379808000, 1379894400, 1379980800, 1380067200, 1380153600, 1380240000, + 1380326400, 1380412800, 1380499200, 1380585600, 1380672000, 1380758400, + 1380844800, 1380931200, 1381017600, 1381104000, 1381190400, 1381276800, + 1381363200, 1381449600, 1381536000, 1381622400, 1381708800, 1381795200, + 1381881600, 1381968000, 1382054400, 1382140800, 1382227200, 1382313600, + 1382400000, 1382486400, 1382572800, 1382659200, 1382745600, 1382832000, + 1382918400, 1383004800, 1383091200, 1383177600, 1383264000, 1383350400, + 1383436800, 1383523200, 1383609600, 1383696000, 1383782400, 1383868800, + 1383955200, 1384041600, 1384128000, 1384214400, 1384300800, 1384387200, + 1384473600, 1384560000, 1384646400, 1384732800, 1384819200, 1384905600, + 1384992000, 1385078400, 1385164800, 1385251200, 1385337600, 1385424000, + 1385510400, 1385596800, 1385683200, 1385769600, 1385856000, 1385942400, + 1386028800, 1386115200, 1386201600, 1386288000, 1386374400, 1386460800, + 1386547200, 1386633600, 1386720000, 1386806400, 1386892800, 1386979200, + 1387065600, 1387152000, 1387238400, 1387324800, 1387411200, 1387497600, + 1387584000, 1387670400, 1387756800, 1387843200, 1387929600, 1388016000, + 1388102400, 1388188800, 1388275200, 1388361600, 1388448000, 1388534400, + 1388620800, 1388707200, 1388793600, 1388880000, 1389052800, 1389139200, + 1389225600, 1389312000, 1389398400, 1389484800, 1389571200, 1389657600, + 1389744000, 1389830400, 1389916800, 1390003200, 1390089600, 1390176000, + 1390262400, 1390348800, 1390435200, 1390521600, 1390608000, 1390694400, + 1390780800, 1390867200, 1390953600, 1391040000, 1391126400, 1391212800, + 1391299200, 1391385600, 1391472000, 1391558400, 1391644800, 1391731200, + 1391817600, 1391904000, 1391990400, 1392076800, 1392163200, 1392249600, + 1392336000, 1392422400, 1392508800, 1392595200, 1392681600, 1392768000, + 1392854400, 1392940800, 1393027200, 1393113600, 1393200000, 1393286400, + 1393372800, 1393459200, 1393545600, 1393632000, 1393718400, 1393804800, + 1393891200, 1393977600, 1394064000, 1394150400, 1394236800, 1394323200, + 1394409600, 1394496000, 1394582400, 1394668800, 1394755200, 1394841600, + 1394928000, 1395014400, 1395100800, 1395187200, 1395273600, 1395360000, + 1395446400, 1395532800, 1395619200, 1395705600, 1395792000, 1395878400, + 1395964800, 1396051200, 1396137600, 1396224000, 1396310400, 1396396800, + 1396483200, 1396569600, 1396656000, 1396742400, 1396828800, 1396915200, + 1397001600, 1397088000, 1397174400, 1397260800, 1397347200, 1397433600, + 1397520000, 1397606400, 1397692800, 1397779200, 1397865600, 1397952000, + 1398038400, 1398124800, 1398211200, 1398297600, 1398384000, 1398470400, + 1398556800, 1398643200, 1398729600, 1398816000, 1398902400, 1398988800, + 1399075200, 1399161600, 1399248000, 1399334400, 1399420800, 1399507200, + 1399593600, 1399680000, 1399766400, 1399852800, 1399939200, 1400025600, + 1400112000, 1400198400, 1400284800, 1400371200, 1400457600, 1400544000, + 1400630400, 1400716800, 1400803200, 1400889600, 1400976000, 1401062400, + 1401148800, 1401235200, 1401321600, 1401408000, 1401494400, 1401580800, + 1401667200, 1401753600, 1401840000, 1401926400, 1402012800, 1402099200, + 1402185600, 1402272000, 1402358400, 1402444800, 1402531200, 1402617600, + 1402704000, 1402790400, 1402876800, 1402963200, 1403049600, 1403136000, + 1403222400, 1403308800, 1403395200, 1403481600, 1403568000, 1403654400, + 1403740800, 1403827200, 1403913600, 1404000000, 1404086400, 1404172800, + 1404259200, 1404345600, 1404432000, 1404518400, 1404604800, 1404691200, + 1404777600, 1404864000, 1404950400, 1405036800, 1405123200, 1405209600, + 1405296000, 1405382400, 1405468800, 1405555200, 1405641600, 1405728000, + 1405814400, 1405900800, 1405987200, 1406073600, 1406160000, 1406246400, + 1406332800, 1406419200, 1406505600, 1406592000, 1406678400, 1406764800, + 1406851200, 1406937600, 1407024000, 1407110400, 1407196800, 1407283200, + 1407369600, 1407456000, 1407542400, 1407628800, 1407715200, 1407801600, + 1407888000, 1407974400, 1408060800, 1408147200, 1408233600, 1408320000, + 1408406400, 1408492800, 1408579200, 1408665600, 1408752000, 1408838400, + 1408924800, 1409011200, 1409097600, 1409270400, 1409356800, 1409443200, + 1409529600, 1409616000, 1409702400, 1409788800, 1409875200, 1409961600, + 1410048000, 1410134400, 1410220800, 1410307200, 1410393600, 1410480000, + 1410566400, 1410652800, 1410739200, 1410825600, 1410912000, 1410998400, + 1411084800, 1411171200, 1411257600, 1411344000, 1411430400, 1411516800, + 1411603200, 1411689600, 1411776000, 1411862400, 1411948800, 1412035200, + 1412121600, 1412208000, 1412294400, 1412380800, 1412467200, 1412553600, + 1412640000, 1412726400, 1412812800, 1412899200, 1412985600, 1413072000, + 1413158400, 1413244800, 1413331200, 1413417600, 1413504000, 1413590400, + 1413676800, 1413763200, 1413849600, 1413936000, 1414022400, 1414108800, + 1414195200, 1414281600, 1414368000, 1414454400, 1414540800, 1414627200, + 1414713600, 1414800000, 1414886400, 1414972800, 1415059200, 1415145600, + 1415232000, 1415318400, 1415404800, 1415491200, 1415577600, 1415664000, + 1415750400, 1415836800, 1415923200, 1416009600, 1416096000, 1416182400, + 1416268800, 1416355200, 1416441600, 1416528000, 1416614400, 1416700800, + 1416787200, 1416873600, 1416960000, 1417046400, 1417132800, 1417219200, + 1417305600, 1417392000, 1417478400, 1417564800, 1417651200, 1417737600, + 1417824000, 1417910400, 1417996800, 1418083200, 1418169600, 1418256000, + 1418342400, 1418428800, 1418515200, 1418601600, 1418688000, 1418774400, + 1418860800, 1418947200, 1419033600, 1419120000, 1419206400, 1419292800, + 1419379200, 1419465600, 1419552000, 1419638400, 1419724800, 1419811200, + 1419897600, 1419984000, 1420070400, 1420156800, 1420243200, 1420329600, + 1420416000, 1420502400, 1420588800, 1420675200, 1420761600, 1420848000, + 1420934400, 1421020800, 1421107200, 1421193600, 1421280000, 1421366400, + 1421452800, 1421539200, 1421625600, 1421712000, 1421798400, 1421884800, + 1421971200, 1422057600, 1422144000, 1422230400, 1422316800, 1422403200, + 1422489600, 1422576000, 1422662400, 1422748800, 1422835200, 1422921600, + 1423008000, 1423180800, 1423267200, 1423353600, 1423440000, 1423526400, + 1423612800, 1423699200, 1423785600, 1423872000, 1423958400, 1424044800, + 1424131200, 1424217600, 1424304000, 1424390400, 1424476800, 1424563200, + 1424649600, 1424736000, 1424822400, 1424908800, 1424995200, 1425081600, + 1425168000, 1425254400, 1425340800, 1425427200, 1425513600, 1425600000, + 1425686400, 1425772800, 1425859200, 1425945600, 1426032000, 1426118400, + 1426204800, 1426291200, 1426377600, 1426464000, 1426550400, 1426636800, + 1426723200, 1426809600, 1426896000, 1426982400, 1427068800, 1427155200, + 1427241600, 1427328000, 1427414400, 1427500800, 1427587200, 1427673600, + 1427760000, 1427846400, 1427932800, 1428019200, 1428105600, 1428192000, + 1428278400, 1428364800, 1428451200, 1428537600, 1428624000, 1428710400, + 1428796800, 1428883200, 1428969600, 1429056000, 1429142400, 1429228800, + 1429315200, 1429401600, 1429488000, 1429574400, 1429660800, 1429747200, + 1429833600, 1429920000, 1430006400, 1430092800, 1430179200, 1430265600, + 1430352000, 1430438400, 1430524800, 1430611200, 1430697600, 1430784000, + 1430870400, 1430956800, 1431043200, 1431129600, 1431216000, 1431302400, + 1431388800, 1431475200, 1431561600, 1431648000, 1431734400, 1431820800, + 1431907200, 1431993600, 1432080000, 1432166400, 1432252800, 1432339200, + 1432425600, 1432512000, 1432598400, 1432684800, 1432771200, 1432857600, + 1432944000, 1433030400, 1433116800, 1433203200, 1433289600, 1433376000, + 1433462400, 1433548800, 1433635200, 1433721600, 1433808000, 1433894400, + 1433980800, 1434067200, 1434153600, 1434240000, 1434326400, 1434412800, + 1434499200, 1434585600, 1434672000, 1434758400, 1434844800, 1434931200, + 1435017600, 1435104000, 1435190400, 1435276800, 1435363200, 1435449600, + 1435536000, 1435622400, 1435708800, 1435795200, 1435881600, 1435968000, + 1436054400, 1436140800, 1436227200, 1436313600, 1436400000, 1436486400, + 1436572800, 1436659200, 1436745600, 1436832000, 1436918400, 1437004800, + 1437091200, 1437177600, 1437264000, 1437350400, 1437436800, 1437523200, + 1437609600, 1437696000, 1437782400, 1437868800, 1437955200, 1438041600, + 1438128000, 1438214400, 1438300800, 1438387200, 1438473600, 1438560000, + 1438646400, 1438732800, 1438819200, 1438905600, 1438992000, 1439078400, + 1439164800, 1439251200, 1439337600, 1439424000, 1439510400, 1439596800, + 1439683200, 1439769600, 1439856000, 1439942400, 1440028800, 1440115200, + 1440201600, 1440288000, 1440374400, 1440460800, 1440547200, 1440633600, + 1440720000, 1440806400, 1440892800, 1440979200, 1441065600, 1441152000, + 1441238400, 1441324800, 1441411200, 1441497600, 1441584000, 1441670400, + 1441756800, 1441843200, 1441929600, 1442016000, 1442102400, 1442188800, + 1442275200, 1442361600, 1442448000, 1442534400, 1442620800, 1442707200, + 1442793600, 1442880000, 1442966400, 1443052800, 1443139200, 1443225600, + 1443312000, 1443398400, 1443484800, 1443571200, 1443657600, 1443744000, + 1443830400, 1443916800, 1444003200, 1444089600, 1444176000, 1444262400, + 1444348800, 1444435200, 1444521600, 1444694400, 1444780800, 1444867200, + 1444953600, 1445040000, 1445126400, 1445212800, 1445299200, 1445385600, + 1445472000, 1445558400, 1445644800, 1445731200, 1445817600, 1445904000, + 1445990400, 1446076800, 1446163200, 1446249600, 1446336000, 1446422400, + 1446508800, 1446595200, 1446681600, 1446768000, 1446854400, 1446940800, + 1447027200, 1447113600, 1447200000, 1447286400, 1447372800, 1447459200, + 1447545600, 1447632000, 1447718400, 1447804800, 1447891200, 1447977600, + 1448064000, 1448150400, 1448236800, 1448323200, 1448409600, 1448496000, + 1448582400, 1448668800, 1448755200, 1448841600, 1448928000, 1449014400, + 1449100800, 1449187200, 1449273600, 1449360000, 1449446400, 1449532800, + 1449619200, 1449705600, 1449792000, 1449878400, 1449964800, 1450051200, + 1450137600, 1450224000, 1450310400, 1450396800, 1450483200, 1450569600, + 1450656000, 1450742400, 1450828800, 1450915200, 1451001600, 1451088000, + 1451174400, 1451260800, 1451347200, 1451433600, 1451520000, 1451606400, + 1451692800, 1451779200, 1451865600, 1451952000, 1452038400, 1452124800, + 1452211200, 1452297600, 1452384000, 1452470400, 1452556800, 1452643200, + 1452729600, 1452816000, 1452902400, 1452988800, 1453075200, 1453161600, + 1453248000, + ], + y: [ + 9.59076113897809, 8.51959031601596, 8.18367658262066, 8.07246736935477, + 7.8935720735049, 7.78364059622125, 8.41405243249672, 8.82922635473185, + 8.38251828808963, 8.06965530688617, 7.87929148508227, 7.76174498465891, + 7.52940645783701, 8.38526052015541, 8.62011072542292, 7.85243908535751, + 7.85399308722424, 8.0519780789023, 7.92660259918138, 7.83834331555712, + 9.70314458114435, 9.38597294061934, 8.29379960884682, 8.43468076984177, + 8.26204284396694, 8.10681603894705, 7.95014988765202, 9.50925907635395, + 8.84678466694523, 8.43054538469057, 8.2482674474469, 8.28172399041139, + 8.29279885820037, 8.19918935907807, 9.99652241850332, 10.1270710070787, + 8.93379604393486, 8.56617381363786, 8.54772239645106, 8.39976009452414, + 8.22309055116153, 8.83898679349679, 10.8972021813751, 9.44493807333551, + 8.92332474406756, 8.5434455625603, 8.49556089128912, 8.41737285613403, + 8.57262789830434, 8.73648935100155, 8.63408694288774, 8.67351294567119, + 8.82423661734664, 8.53797573059877, 9.69806112202708, 12.0974568371517, + 10.6352783566883, 9.69171658751689, 9.31560088263368, 8.97081334141145, + 8.58914169072882, 8.61740045183326, 8.61631428228404, 8.21554741194707, + 8.06495089174914, 8.11342663994365, 7.79934339821592, 7.6275443904885, + 7.55590509361135, 7.71154897962915, 7.78862606562503, 7.70841066725737, + 7.76853330092603, 7.69530313496357, 7.37838371299671, 7.91059061225648, + 7.62657020629066, 7.57353126274595, 7.56786260546388, 7.5522372875608, + 7.33693691370762, 8.12474302038557, 7.88758403166028, 7.81963630236759, + 7.38398945797851, 7.81439963380449, 7.5422134631934, 7.54855597916987, + 7.6889133368648, 7.4770384723197, 7.35883089834235, 7.03262426102801, + 7.11801620446533, 7.34987370473834, 7.32646561384032, 7.36391350140582, + 7.27793857294566, 7.25134498337221, 7.00215595440362, 7.16394668434255, + 7.7591874385078, 7.51860721681525, 7.41397029019044, 7.44249272279444, + 7.2283884515736, 6.99117688712121, 7.2115567333138, 7.31121838441963, + 7.34923082461333, 7.51425465281641, 7.39326309476384, 7.28619171470238, + 7.27309259599952, 7.16857989726403, 7.61134771740362, 7.61775957660851, + 7.42595365707754, 8.18200013629341, 7.39939808333135, 7.1066061377273, + 7.08086789669078, 7.42117752859539, 7.49164547360513, 7.38585107812521, + 7.68294316987829, 7.6889133368648, 7.2591161280971, 8.14496941708788, + 8.71391062849392, 8.09101504171053, 7.84031298332016, 7.64873978895624, + 8.02092771898158, 7.83002808253384, 7.72753511047545, 7.83597458172157, + 7.62657020629066, 7.64444076155657, 7.54855597916987, 7.44073370738926, + 7.07326971745971, 7.02642680869964, 7.39203156751459, 7.29301767977278, + 7.36137542897735, 7.51261754467451, 7.46049030582534, 7.11476944836646, + 7.12528309151071, 7.45587668749182, 7.31721240835984, 7.41034709782102, + 7.40245152081824, 7.29437729928882, 6.98933526597456, 6.99301512293296, + 7.4312996751559, 7.36201055125973, 7.454719949364, 7.36833968631138, + 7.14361760270412, 6.8351845861473, 6.89060912014717, 6.97447891102505, + 7.26612877955645, 7.27031288607902, 7.26542972325395, 7.15773548424991, + 6.86589107488344, 7.15383380157884, 7.21670948670946, 7.20191631753163, + 7.21229446850034, 7.18614430452233, 6.82001636467413, 6.88243747099785, + 7.18311170174328, 7.24279792279376, 7.1929342212158, 7.18387071506245, + 6.97073007814353, 6.9177056098353, 7.22256601882217, 7.35691824235602, + 7.24279792279376, 7.22329567956231, 7.16317239084664, 7.24136628332232, + 6.98656645940643, 6.96318998587024, 7.25063551189868, 7.1608459066643, + 7.13249755166004, 7.09174211509515, 7.01211529430638, 6.85751406254539, + 6.82762923450285, 7.13009851012558, 7.27724772663148, 7.03878354138854, + 6.89060912014717, 6.95749737087695, 7.29573507274928, 7.49720722320332, + 7.31055015853442, 7.20489251020467, 7.22256601882217, 7.25770767716004, + 7.42595365707754, 7.11720550316434, 7.24992553671799, 8.27690348126706, + 7.60638738977265, 7.64396194900253, 8.01234963932779, 7.93020620668468, + 7.50878717063428, 7.52131798019924, 7.58984151218266, 7.50052948539529, + 7.37023064180708, 7.38523092306657, 7.30249642372733, 7.27517231945277, + 7.39203156751459, 7.51697722460432, 7.90912218321141, 7.72312009226633, + 7.67042852219069, 7.62900388965296, 7.43070708254597, 7.57967882309046, + 7.9483852851119, 7.79564653633459, 8.00736706798333, 7.79069603117474, + 7.83280751652486, 7.51479976048867, 7.6275443904885, 7.85515700588134, + 7.96485088744731, 7.74586822979227, 8.08085641964099, 8.25997565976828, + 7.7698009960039, 8.17751582384608, 9.28173036806286, 8.33854487998858, + 7.83042561782033, 7.8087293067444, 7.81681996576455, 7.55485852104068, + 8.55506684384432, 8.20794694104862, 8.08363720314155, 7.79110951061003, + 7.67089483136212, 7.64012317269536, 7.55013534248843, 8.24931374626064, + 8.3039999709552, 8.12681372072611, 7.70616297019958, 7.66387725870347, + 7.52671756135271, 7.92588031673756, 7.92153563213355, 8.03398273468322, + 7.72577144158795, 7.69439280262942, 7.44949800538285, 7.39141523467536, + 7.34601020991329, 8.10137467122858, 8.15651022607997, 7.97108575350561, + 7.87283617502572, 7.63530388625941, 7.58781721999343, 7.34213173058472, + 8.17751582384608, 8.34093322600088, 8.47657950853094, 7.87359778968554, + 7.71735127218533, 7.49052940206071, 7.37588214821501, 8.07558263667172, + 8.16536363247398, 7.58528107863913, 7.60738142563979, 7.26752542782817, + 8.04012466444838, 8.10922495308995, 8.80687326653069, 7.74716496652033, + 7.48099216286952, 7.34665516317654, 7.24708058458576, 7.93808872689695, + 9.03562977818356, 8.04109100370863, 7.40610338123702, 7.97384437594469, + 7.76811037852599, 7.4713630881871, 8.03008409426756, 8.72939712269206, + 7.93701748951545, 7.66528471847135, 7.58018941794454, 7.7106533235012, + 7.26122509197192, 8.04654935728308, 8.09346227450118, 7.76726399675731, + 7.49665243816828, 7.5522372875608, 7.49720722320332, 7.3125534981026, + 7.93880224815448, 9.05870319731322, 8.19422930481982, 7.51914995766982, + 7.55118686729615, 7.71378461659875, 7.60589000105312, 8.49902922078857, + 8.29179710504873, 7.89469085042562, 7.79028238070348, 7.65539064482615, + 7.61035761831284, 7.53101633207792, 8.23137604557397, 8.00670084544037, + 7.85864065562079, 7.69712131728263, 7.59588991771854, 7.73587031995257, + 7.35115822643069, 8.03138533062553, 8.39434736141739, 7.82364593083495, + 8.08671792030391, 7.77148876011762, 8.68895923427068, 7.74716496652033, + 7.96067260838812, 8.62461158818351, 7.99665387546261, 7.62070508683826, + 7.4318919168078, 7.46278915741245, 7.4489161025442, 8.25140306538056, + 8.55525939222269, 8.31581113188354, 8.30992298925832, 7.75876054415766, + 8.80821966511841, 9.12194622121359, 10.1538181636943, 9.26785427817679, + 8.43424627059531, 8.13768818497761, 8.04494704961772, 8.22897764335831, + 8.14118979345769, 9.21562637640542, 8.73278832497312, 8.51016857647927, + 8.10409905614358, 7.95014988765202, 7.85205020726589, 7.65633716643018, + 8.04430540699064, 8.80101783354071, 7.82963038915019, 7.77737360265786, + 7.93522953981691, 7.67229245562876, 7.38832785957711, 7.51152464839087, + 7.66340766489348, 7.78945456608667, 7.80791662892641, 7.82484569102686, + 7.90654723236804, 7.70210434005105, 8.47762041629641, 9.14952823257943, + 8.06211758275474, 8.06652149046999, 8.05959232888755, 8.04942705711069, + 7.7621706071382, 8.09773057366422, 8.01829613851552, 7.61677580869837, + 7.84267147497946, 7.76853330092603, 7.53047999524554, 7.33236920592906, + 7.22402480828583, 7.41637847919293, 7.42714413340862, 7.39756153552405, + 7.49554194388426, 7.39939808333135, 7.00850518208228, 7.11801620446533, + 7.48380668766583, 7.57147364885127, 7.64826303090192, 7.47420480649612, + 7.47250074473756, 7.2115567333138, 7.34342622914737, 7.48211892355212, + 7.41095187558364, 7.40306109109009, 7.45298232946546, 7.42356844425917, + 7.08506429395255, 7.21081845347222, 7.35627987655075, 7.30451594646016, + 7.46565531013406, 7.86901937649902, 7.24850407237061, 7.07834157955767, + 7.2211050981825, 7.33432935030054, 7.29233717617388, 7.2991214627108, + 7.28344822875663, 7.30182234213793, 7.06219163228656, 7.18159194461187, + 7.50549227473742, 7.87473912517181, 7.57865685059476, 7.36707705988101, + 7.25700270709207, 7.05617528410041, 7.50273821075485, 7.44307837434852, + 7.48155570190952, 7.48211892355212, 7.51914995766982, 7.65964295456468, + 7.24422751560335, 7.23273313617761, 7.34213173058472, 7.42117752859539, + 7.49220304261874, 7.31521838975297, 7.14124512235049, 7.00940893270864, + 7.08757370555797, 7.30451594646016, 7.37462901521894, 7.51261754467451, + 7.51752085060303, 7.37400185935016, 7.14124512235049, 7.16162200293919, + 7.48493028328966, 7.51261754467451, 7.44483327389219, 7.47420480649612, + 7.67182679787878, 7.84227877911735, 7.92407232492342, 7.82843635915759, + 7.58680353516258, 7.62997570702779, 7.70975686445416, 7.52671756135271, + 7.19368581839511, 7.25770767716004, 7.45414107814668, 7.48155570190952, + 7.55903825544338, 7.44483327389219, 7.3375877435386, 7.13568734702814, + 7.08506429395255, 7.27239839257005, 7.5109777520141, 7.49886973397693, + 7.44424864949671, 7.40306109109009, 6.91671502035361, 6.97728134163075, + 7.48268182815465, 7.41397029019044, 7.37211802833779, 7.33367639565768, + 7.39510754656249, 7.03614849375054, 6.87419849545329, 6.98471632011827, + 7.45587668749182, 7.49498623395053, 7.33106030521863, 7.10496544826984, + 6.99393297522319, 6.93049476595163, 7.21817683840341, 7.4759059693674, + 7.36454701425564, 7.23993259132047, 7.30921236569276, 7.13886699994552, + 6.97260625130175, 7.18841273649695, 7.33498187887181, 7.33432935030054, + 7.43248380791712, 7.39141523467536, 6.96129604591017, 7.02197642307216, + 7.21376830811864, 7.50988306115491, 7.32843735289516, 7.49665243816828, + 7.20042489294496, 7.08422642209792, 7.14913159855741, 7.25629723969068, + 7.19818357710194, 7.28892769452126, 7.12849594568004, 7.0825485693553, + 6.82219739062049, 6.94793706861497, 7.11232744471091, 7.19967834569117, + 7.31721240835984, 7.09837563859079, 7.04490511712937, 7.30451594646016, + 7.79358680337158, 7.80547462527086, 7.48324441607385, 7.35691824235602, + 7.50714107972761, 7.37525577800975, 7.19668657083435, 7.22329567956231, + 7.35244110024358, 7.31721240835984, 7.44424864949671, 7.35564110297425, + 7.32448997934853, 7.21450441415114, 7.2841348061952, 7.54009032014532, + 7.47477218239787, 7.82923253754359, 7.68109900153636, 7.72973533138505, + 7.3031700512368, 7.28207365809346, 7.48549160803075, 7.61874237767041, + 7.69393732550927, 7.53955882930103, 7.43838353004431, 7.27378631784489, + 7.35564110297425, 7.65822752616135, 7.84345640437612, 8.36846113761584, + 8.1721644521119, 7.81156848934518, 7.57507169950756, 7.6586995582683, + 7.86633892304654, 7.78113850984502, 7.75491027202143, 7.70885960104718, + 8.20712916807133, 7.71154897962915, 7.73455884435476, 7.96762673933382, + 8.40380050406115, 8.29279885820037, 7.98548435673382, 8.67180090964268, + 7.78239033558746, 7.78696700261487, 7.94661756324447, 8.17357548663415, + 7.80954132465341, 7.80302664363222, 8.05134093329298, 7.97315543344413, + 7.86901937649902, 8.16251625014018, 8.04012466444838, 7.96346006663897, + 7.83834331555712, 7.91315518592807, 7.95331834656043, 8.07620452723903, + 7.98241634682773, 8.1285852003745, 7.95472333449791, 8.1101268019411, + 8.21365270303, 8.04686951095958, 8.9242570208881, 8.61721950548336, + 8.51959031601596, 8.01433573729942, 8.05769419481559, 8.10440130792161, + 7.99395754757357, 8.43185314424922, 9.73820008829795, 10.1799822793473, + 8.36194190614495, 9.94884325425692, 8.75904072752422, 8.25166392360559, + 8.07868822922987, 8.17357548663415, 7.88908440703551, 9.09985563880091, + 9.40656483393913, 9.16440114003474, 8.48735234940522, 8.43141741439483, + 8.2776661608515, 8.31213510764841, 8.79011689289247, 10.2800386504796, + 9.07577987858049, 8.69918135930895, 9.08658956454001, 8.86149186428691, + 8.54441917766983, 8.44762872803033, 8.25270667656764, 8.10982627601848, + 8.13681086367554, 8.7268056084461, 9.38269576445829, 8.57828829077605, + 8.23880116587155, 8.12237124340655, 8.05515773181968, 7.83241092718792, + 8.89754559870933, 8.72566970568704, 8.56407677731509, 8.2190566610606, + 8.14757773620177, 8.0013550258267, 7.78945456608667, 8.81195017753998, + 9.00220857828241, 8.59304250369967, 8.28197705886776, 8.46505743699571, + 8.49474306257865, 8.40514368760761, 10.558699193753, 9.12456459495478, + 8.73182058296211, 8.52892411429194, 8.50512061018197, 8.27639470486331, + 9.1239106439778, 8.58597270681106, 8.31556648356428, 8.66112036022288, + 8.92572027356022, 8.44139147799996, 9.2277872855799, 9.26473385580652, + 9.27491014262548, 8.39298958795693, 8.58522560180806, 8.42376124662369, + 8.33782726244791, 9.05975001334368, 9.29825967001407, 8.76186337327473, + 8.50754681436443, 8.39931015075952, 8.52357279838028, 8.37953902611744, + 9.09110628405248, 9.76198159024195, 8.92956770782534, 8.53070154144103, + 8.58709231879591, 9.79784922051313, 8.66475075577385, 9.17232692977797, + 9.20140053040671, 9.33052053223229, 8.68457030082437, 8.50248556254396, + 8.28878581042693, 8.29804166137157, 9.16293424957891, 9.54795481317617, + 9.01724094201035, 8.78492762605832, 8.38662882139512, 8.33447155460094, + 8.53601494565683, 8.70863965598719, 8.73004395324502, 8.37562962709445, + 8.31898612539206, 8.46442512587758, 8.5972974356579, 8.92279162396964, + 9.49167735686812, 9.21014035197352, 8.67795057029435, 8.60226936377136, + 8.61450137388324, 8.65886634973238, 8.77940359789435, 11.0079327963967, + 9.75324588920559, 9.22513045744882, 9.0177260256968, 8.93695560422523, + 9.00932517273497, 11.4840629202851, 10.2642341958449, 9.69443180053954, + 9.44041981429151, 9.35374783527091, 9.22847494217167, 9.30392178559771, + 10.2401740519157, 9.91595945403145, 10.1115174660403, 9.85859478364539, + 10.1190020766858, 10.0005688901867, 11.1914521795828, 10.4633318857817, + 9.65406419220144, 9.11975899374495, 8.79573360595074, 8.44848599340645, + 8.2666784433059, 8.21851757748959, 8.24249315318763, 8.00803284696931, + 8.0452677166078, 7.9287663216267, 7.74500280351584, 7.86633892304654, + 7.94165125293056, 8.31041499418829, 7.82803803212583, 7.87359778968554, + 7.75705114203201, 7.72621265050753, 7.77527584648686, 7.79523492900217, + 7.74975340627444, 8.06808962627824, 8.72583205652757, 7.65444322647011, + 7.60339933974067, 7.75319426988434, 7.77022320415879, 7.63143166457691, + 7.54380286750151, 7.60439634879634, 7.58426481838906, 7.5109777520141, + 7.67461749736436, 7.71289096149013, 7.70165236264223, 7.63819824428578, + 7.56268124672188, 7.40367029001237, 7.46622755621548, 7.61233683716775, + 7.80180040190897, 8.02878116248715, 7.73017479524622, 7.63964228785801, + 7.56320059235807, 7.48661331313996, 7.5076900778199, 7.65396918047877, + 7.61283103040736, 7.45414107814668, 7.36707705988101, 7.45298232946546, + 7.47873482556787, 7.98514393119862, 7.82164312623998, 7.66058546170326, + 7.5595594960077, 7.57660976697304, 7.4500795698075, 7.49886973397693, + 7.51588908521513, 7.60837447438078, 7.58629630715272, 7.68063742756094, + 7.7848892956551, 7.5522372875608, 7.59890045687141, 7.64826303090192, + 7.66996199547358, 7.85554467791566, 8.09651291750159, 8.92105701815743, + 8.3986348552921, 7.98820359702258, 8.00269416228394, 8.07309119969315, + 7.98309894071089, 7.84619881549743, 7.78655180642871, 7.44483327389219, + 7.5422134631934, 7.6425241342329, 7.6511201757027, 7.51152464839087, + 7.67693714581808, 7.9912539298402, 7.44190672805162, 7.38398945797851, + 7.60589000105312, 7.58680353516258, 7.62119516280984, 7.29573507274928, + 7.48885295573346, 7.27309259599952, 7.34665516317654, 7.47363710849621, + 7.35564110297425, 7.2283884515736, 7.39694860262101, 7.47533923656674, + 7.40974195408092, 7.34601020991329, 7.4079243225596, 7.38398945797851, + 7.38087903556412, 7.20637729147225, 7.09340462586877, 7.10987946307227, + 7.05531284333975, 7.11639414409346, 7.19218205871325, 7.24921505711439, + 7.41938058291869, 7.56216163122565, 7.43307534889858, 7.28550654852279, + 7.9355873855892, 9.01954299670119, 7.22548147278229, 7.02731451403978, + 6.7990558620588, 5.44673737166631, 5.32300997913841, 5.26269018890489, + 6.30627528694802, 6.65286302935335, 7.21964204013074, 7.38832785957711, + 7.13886699994552, 7.04315991598834, 7.20637729147225, 7.02997291170639, + 7.00760061395185, 6.91869521902047, 6.88448665204278, 6.13772705408623, + 7.20637729147225, 7.13727843726039, 7.05444965813294, 7.11232744471091, + 6.92657703322272, 6.81454289725996, 7.35500192110526, 7.13169851046691, + 7.07749805356923, 7.24208235925696, 7.24708058458576, 7.646353722446, + 7.45645455517621, 7.30988148582479, 7.23777819192344, 7.27517231945277, + 7.46908388492123, 7.45066079621154, 8.12740456269308, 7.77485576666552, + 7.52131798019924, 7.54960916515453, 7.94979721616185, 7.79770203551669, + 7.79975331828725, 7.9002660367677, 7.85825418218603, 7.94165125293056, + 7.67136092319064, 8.13534694890671, 8.68777949199177, 8.45318786144033, + 8.06463647577422, 8.00936307663004, 7.87739718635329, 7.85515700588134, + 8.14089846060785, 7.92117272158701, 7.9707403900071, 7.96519829061218, + 8.13476078241865, 7.79852305362521, 8.30770596654951, 8.28071107566285, + 8.74448811385292, 8.59137258959049, 8.44052810648075, 8.50976567558744, + 8.35514473946184, 8.28096440055337, 8.44052810648075, 8.31385226739821, + 8.08085641964099, 8.18590748148232, 8.85680335672838, 8.07309119969315, + 8.14148104145742, 8.18785544369562, 8.11522197256233, 8.15908865466791, + 8.20439841814938, 8.28500889544988, 8.08271113423758, 8.24564690087386, + 8.2220164372022, 8.45126704130007, 8.5519810169019, 8.62515033292133, + 9.13194630454817, 8.33997857199043, 9.86620096775011, 9.27077674078001, + 8.77183540978982, 8.49474306257865, 8.61631428228404, 8.94780609305705, + 9.07577987858049, 9.50046944807102, 11.4261031610143, 9.29550838434606, + 8.61721950548336, 8.47699600166482, 8.32772616646141, 8.30375241556341, + 9.330431852234, 9.41613428495528, 8.92292493064183, 8.44591198941127, + 8.31115254800169, 8.27052509505507, 8.20166019080868, 9.00981411052738, + 9.30909914399945, 9.12847934549586, 8.44741429680832, 8.25426877009018, + 8.32482129876878, 8.10288913464087, 9.15957325492253, 8.85109068766498, + 9.54057893384188, 8.49043845410742, 8.56464913257253, 8.352318548226, + 8.10440130792161, 9.15334665045606, 10.0752957033132, 8.71800933084636, + 8.34474275441755, 8.2630748358026, 8.25608813381491, 8.00869818298853, + 8.52971447196991, 8.861350110796, 9.78914235075127, 8.50025047068593, + 8.40559101483493, 8.9441588309704, 8.866581653304, 9.01456876745782, + 9.13010597926558, 10.2465097200211, 8.58969988220299, 8.65067458279072, + 8.78124833323686, 8.33302993974291, 9.06762406977459, 9.52332462729018, + 8.70996000607173, 8.37101068123816, 8.37770121259764, 8.40043463080604, + 8.18283871076603, 8.8750074860484, 9.21034037197618, 8.71456755083648, + 8.31752199628717, 8.55929436743487, 8.60465446718623, 8.73375513136489, + 9.54057893384188, 10.1616893196654, 8.8167050156216, 8.31409733540581, + 8.7106195279423, 8.74369111054302, 8.39231000926955, 9.23073106162392, + 10.2561143136283, 8.9138193508572, 8.65032450401942, 8.39004140575575, + 8.3091845276863, 8.22228507387272, 9.28238192484115, 9.92260366972836, + 9.16889318206201, 8.74830491237962, 8.81507308884446, 9.76330552193627, + 8.56883642456808, 8.92611897115338, 9.12891337328045, 9.7195647143752, + 8.78124833323686, 8.48838210956212, 8.53640741034004, 8.14409846333852, + 9.10664513563742, 9.11569996782206, 9.68421151274841, 8.80011394676631, + 8.54752839121231, 8.3221510702129, 8.09529377684465, 8.92345797969497, + 9.37974553683691, 8.90327158572421, 8.87556669199055, 8.44139147799996, + 8.59674347017425, 9.00969189848934, 9.39897529082673, 9.99392223000734, + 9.06149227523977, 8.97119446318447, 8.94689552388845, 9.18696938565294, + 9.0980671294934, 10.8781037947059, 9.38269576445829, 9.19897604189713, + 8.62119278143472, 8.61323037961318, 8.69517199877606, 8.72029728739272, + 9.50031980347665, 9.34757739028127, 8.78370269863522, 8.70217786562968, + 8.6821990260005, 8.48363640788739, 8.40916244720253, 8.97309789628247, + 9.55030649785165, 8.78630387828258, 8.60813018640834, 8.49494758246892, + 8.44870019497094, 8.19174002127746, 8.38091517312361, 9.07394774707063, + 8.35608503102148, 8.3485378253861, 8.53503310954457, 8.43489794868941, + 8.5354259596773, 8.99168672593482, 9.77713036365961, 8.63887970967284, + 8.28324144138542, 8.27333659850449, 8.15908865466791, 7.91352101728389, + 7.8407064517494, 8.02486215028641, 7.97143099776935, 8.47782846789396, + 7.95787735848981, 8.02355239240435, 7.54908271081229, 7.51969240411654, + 7.87169266432365, 7.68156036255954, 7.73236922228439, 7.78239033558746, + 7.65633716643018, 7.48324441607385, 7.59890045687141, 7.78613643778307, + 7.75061473277041, 7.76472054477148, 7.70481192293259, 7.6586995582683, + 7.34729970074316, 7.54433210805369, 7.74716496652033, 7.6889133368648, + 7.77064523412918, 7.61184239958042, 7.48773376143644, 7.55747290161475, + 7.56837926783652, 7.52563997504154, 7.66199755890189, 7.41637847919293, + 7.44366368311559, 7.31654817718298, 7.17472430983638, 7.24779258176785, + 7.41397029019044, 7.52940645783701, 7.63964228785801, 8.26975694753298, + 8.33134542484572, 7.78447323573647, 7.48099216286952, 7.58781721999343, + 7.67182679787878, 7.59739632021279, 7.67740043051481, 7.48436864328613, + 7.26122509197192, 7.39203156751459, 7.42833319419081, 7.55747290161475, + 7.48885295573346, 7.42714413340862, 8.21527695893663, 8.49371983523059, + 8.14322675036744, 8.12177741916107, 8.20794694104862, 8.5197898172635, + 8.57470709761684, 8.04782935745784, 7.48773376143644, 7.56631101477246, + 7.9976631270201, 8.00836557031292, 7.91498300584839, 7.8804263442924, + 7.84893372636407, 7.50823877467866, 7.66058546170326, 8.02747653086048, + 8.10046489102936, 8.18088094199639, 8.33351070898294, 8.64100247714252, + 8.46315930292375, 8.01201823915906, 7.79564653633459, 7.70571282389443, + 7.77863014732581, 7.81237820598861, 7.56164174558878, 7.26332961747684, + 7.35564110297425, 7.47477218239787, 7.53422832627409, 7.62997570702779, + 7.62608275807238, 7.44483327389219, 7.11963563801764, 7.37023064180708, + 7.54115245513631, 7.5137092478397, 7.59034694560257, 7.54802896993501, + 7.36833968631138, 7.11314210870709, 7.23705902612474, 7.48717369421374, + 7.61233683716775, 8.21716859576607, 7.66669020008009, 7.32646561384032, + 7.09340462586877, 7.13966033596492, 7.40367029001237, 7.42595365707754, + 7.43779512167193, 7.55328660560042, 7.32184971378836, 7.10332206252611, + 7.11069612297883, 7.48211892355212, 7.54591815120932, 7.32778053842163, + 7.21964204013074, 7.36327958696304, 7.18841273649695, 7.25063551189868, + 7.4500795698075, 7.19743535409659, 7.41938058291869, 7.37963215260955, + 7.40306109109009, 7.51588908521513, 7.63723438878947, 7.52617891334615, + 7.3185395485679, 7.38212436573751, 7.74975340627444, 7.67600993202889, + 7.26612877955645, 7.58324752430336, 7.56682847920833, 7.56008046502183, + 7.63288550539513, 7.50052948539529, 7.42356844425917, 7.39018142822643, + 7.21007962817079, 7.94555542825349, 7.5999019592085, 7.56268124672188, + 7.61184239958042, 8.99998964246073, 8.73793385811414, 8.26796230533871, + 7.77904864492556, 7.57865685059476, 7.60539236481493, 8.29179710504873, + 7.61775957660851, 7.35883089834235, 7.68662133494462, 7.75362354655975, + 7.77904864492556, 8.05706068196577, 7.8984110928116, 7.79729127354747, + 7.51534457118044, 7.48268182815465, 7.88683299895506, 8.39728289474368, + 8.26770566476243, 8.23615566168312, 8.38890517111471, 9.0788640091878, + 9.63299030483845, 8.94780609305705, 8.53934599605737, 8.3478273457825, + 8.32530602975258, 8.25556865328375, 8.09712193091871, 8.13593277200489, + 8.01895468315572, 8.0861025356691, 8.13329386122263, 8.04974629095219, + 8.19063168090354, 8.04334217044161, 8.43814998407578, 8.10741881171997, + 8.16876982367527, 8.17470288246946, 8.29129585190541, 8.3059782109673, + 8.42310226801664, 8.75621009188674, 8.72583205652757, 8.70748291785937, + 8.51077262361331, 8.70217786562968, 8.580543506917, 9.22542600939422, + 8.41116578677071, 8.45190772471761, 8.77183540978982, 8.23880116587155, + 8.15708378502887, 8.03915739047324, 8.1185050675871, 9.18563775933581, + 9.15239341202133, 9.02617712030286, 9.74226190403691, 10.0828463914793, + 9.11107237031751, 9.73878978049572, 9.614938437645, 9.34801317710126, + 8.55429627936774, 8.44955654270043, 8.43054538469057, 8.60538720215215, + 9.219894584781, 9.50076867009599, 9.52230033688749, 8.47886807709457, + 8.28349412616251, 8.26898820950666, 8.28324144138542, 9.03013657115323, + 10.2525586604481, 9.16659744902826, 8.27537637483641, 8.3466420902212, + 8.42156296040099, 8.19450550976564, 8.87766093359367, 8.9941724343984, + 9.55676293945056, 8.4144957931779, 8.31139827843664, 8.365672383775, + 8.14902386805177, 8.96826881077645, 8.88322423027899, 8.70450228972123, + 8.23297179059344, 8.17301131172497, 8.13446757027756, 8.83433697401764, + 9.08975340898706, 9.0107912695156, 8.71751837264977, 8.42200300441249, + 8.20712916807133, 8.05484022110102, 8.83156587912106, 10.1827467519768, + 8.80986280537906, 8.76013937002663, 8.88502565805085, 8.56159277871292, + 8.2495751500002, 9.35660287895444, 9.12750209366718, 8.79102985704596, + 8.65347080970879, 8.74337213127397, 8.86742743852498, 8.44009614103127, + 9.37568530456302, 9.74102744483773, 8.83622857152601, 8.46104603079324, + 8.21635833238616, 8.22844388300403, 8.0471895621705, 9.07234187381889, + 9.46761478200654, 8.98669669562029, 8.43923164994653, 8.42398080969406, + 8.58802437217683, 8.25400859056484, 8.74512525946224, 9.49514330367712, + 8.72469504674049, 8.35960327084147, 8.76374072050946, 8.7279402223939, + 8.38548870041881, 9.3130774494273, 9.3061958576197, 9.84675845829004, + 8.79679268767466, 8.64611397148308, 8.9398431242785, 8.84375938191798, + 9.7005142080113, 9.53914039514886, 8.9082888855571, 9.02183976410551, + 9.10963566785455, 8.87164566750187, 8.38228942895144, 9.23229753932823, + 9.85287823470959, 8.84707231256781, 8.53346016388011, 8.58802437217683, + 8.48549610467298, 8.18979961872823, 9.49687178267057, 9.46280968867222, + 8.84347078162738, 8.36310917603352, 8.60575336839572, 6.58617165485467, + 7.63578686139558, 9.24879155835043, 8.88072457615146, 8.69617584694468, + 8.45382731579442, 8.14467918344776, 9.07635173197287, 10.2446985435045, + 9.85828095969805, 9.18758338485357, 8.76248954737158, 8.5016733797582, + 8.65521448931361, 10.0388921895423, 9.46436224293533, 8.97309789628247, + 8.95557714628151, 8.91945316857545, 8.72631895096224, 8.73921611506174, + 10.26196586942, 10.5694947531438, 9.56120848888113, 9.60400276796519, + 10.0861007334703, 9.72841962445348, 9.41205597587677, 9.84357829978222, + 11.5721750241742, 10.2817184876905, 10.1697672187275, 9.68290322361684, + 9.89550578279447, 9.37627844951961, 9.58217975243469, 10.3414521187349, + 10.3339704236196, 10.2182252970113, 9.73406247747719, 10.1874627630566, + 9.88857693980037, 11.075086947327, 12.6735418157462, 10.9246967023573, + 10.1815358690196, 9.86339445896968, 9.92573816147095, 9.40153907670774, + 9.33441468707811, 9.14750706280461, 8.91395385889425, 9.1801903950253, + 9.05718919248201, 8.71275997496021, 8.40312823512826, 8.29479935899257, + 9.11591979635669, 8.95156964301882, 8.3513747067213, 8.65381978894806, + 8.6429443967218, 8.71620797115185, 8.36497397843873, 8.37378460812088, + 8.51719319141624, 8.31825432879885, 8.39547743273214, 8.3228800217699, + 8.24564690087386, 8.63194942871443, 8.31066090590723, 8.43294163896865, + 11.6448305358502, 11.3632879189498, 10.6929444132335, 10.3343929611261, + 9.98608085083998, 10.2820952064744, 10.1943645158844, 10.0954706196007, + 10.1468650106811, 10.140888975597, 10.2095373998461, 10.033682134194, + 11.0828346170357, 11.1744832892926, 10.7792895676801, 9.9475044379529, + 9.37602428761711, 8.99776577201121, 8.83287946027762, 8.89822898560123, + 8.76467807411661, 8.54110501146255, 8.39615486303918, 8.31238059678675, + 8.34117174717076, 8.1300590399928, 8.35819745992578, 8.35561499576018, + 8.18172045512811, 8.10952565975287, 8.06463647577422, 7.82324569068552, + 7.85476918349913, 8.10167774745457, 8.09040229659332, 7.98989937494294, + 8.09894674894334, 8.65381978894806, 8.04109100370863, 8.04974629095219, + 8.22147894726719, 8.17075142375753, 8.3354314778808, 8.25660734462616, + 8.05769419481559, 7.70796153183549, 7.91717198884578, 8.2602342916073, + 8.28803156777646, 8.36869318309779, 8.63355299253243, 9.27246974344173, + 8.67556352738768, 8.48342956126343, 8.17188200612782, 8.20658361432075, + 8.18896686364888, 8.03073492409854, 8.05484022110102, 9.15514473650823, + 8.83331693749932, 8.34972083747249, 8.18339736999843, 7.95647679803678, + 7.86940171257709, 7.70930833338587, 7.81923445385907, 7.83241092718792, + 7.88683299895506, 8.03786623470962, 7.952615111651, 7.76768727718691, + 7.47816969415979, 7.539027055824, 7.99799931797973, 8.30967689598773, + 8.02878116248715, 7.79028238070348, 7.76174498465891, 7.47647238116391, + 7.63964228785801, 7.65586401761606, 7.81963630236759, 7.81359155295243, + 7.99057688174392, 7.81278281857758, 7.65775527113487, 7.69439280262942, + 7.84149292446001, 7.93343838762749, 7.6511201757027, 7.72356247227797, + 7.88004820097158, 7.94093976232779, 7.75876054415766, 7.63336964967958, + 7.84854348245668, 7.89729647259588, 7.72223474470961, 7.71244383427499, + 7.53955882930103, 7.91169052070834, 7.80139132029149, 8.4013333053217, + 8.18144069571937, 7.86288203464149, 7.92407232492342, 7.56682847920833, + 7.51914995766982, 7.64873978895624, 7.77064523412918, 7.60986220091355, + 7.59186171488993, 7.539027055824, 7.34536484041687, 7.46336304552002, + 7.51479976048867, 7.6425241342329, 7.67600993202889, 7.55799495853081, + 7.6889133368648, 7.60638738977265, 7.58222919427646, 7.74196789982069, + 7.78239033558746, 8.00636756765025, 8.65102453904976, 8.40357646462927, + 8.3850322878139, 8.02812905943176, 7.95787735848981, 7.99530662029082, + 7.99226864327075, 7.9359451033537, 7.98786409608569, 7.78364059622125, + 7.8087293067444, 8.0532511535491, 7.97590836016554, 8.12237124340655, + 8.55986946569667, 8.9274468162562, 8.28576542051433, 8.28399930424853, + 8.16337131645991, 7.91425227874244, 7.86441990499457, 8.07215530818825, + 8.0802374162167, 8.12088602109284, 8.11312710422178, 8.14438886554762, + 8.06463647577422, 7.944846711002, 8.24143968982973, 9.00736702745136, + 8.66233195708248, 8.80056599227992, 8.3742461820963, 8.56407677731509, + 8.38434727808281, 8.12651816878071, 8.39072252736229, 8.3351915834332, + 8.9278448262117, 9.0079793598445, 8.37816098272068, 8.20330402679528, + 8.38571682862785, 8.31115254800169, 8.74145611599836, 9.44295889365291, + 9.14590851181679, 8.58951385299586, 8.46484671104403, 8.36590507720246, + 8.56541176368671, 8.4724050086261, 8.96648377906443, 8.56006109164341, + 8.4690528160883, 8.74385056203024, 10.0138206842205, 8.69114649853968, + 8.78094111357239, 9.83900236330972, 11.614940390377, 9.62865589206317, + 8.78293635634926, 8.68118104152169, 9.00097644407034, 8.74623928838306, + 9.8072519446553, 9.61266722758384, 10.5920994642943, 8.75542238014849, + 8.56063574925907, 9.40516674990861, 8.45807992692373, 9.54959444997195, + 9.60602446822924, 8.67726913926287, 8.17103418920548, 8.24143968982973, + 8.51097389160232, 8.32360844234357, 9.25922576970599, 9.84966474583862, + 8.83317113302287, 8.49780647761605, 8.63408694288774, 9.04227668692893, + 8.55004752828718, 9.81809304951918, 9.9020865716205, 8.91637191488169, + 8.33206770728955, 8.23668532271246, 8.40178233990491, 8.24170315972982, + 9.03562977818356, 9.10409057213347, 10.8321415433937, 8.7787879291047, + 8.48011418317482, 8.48941081040379, 8.25062008217469, 9.54344981789221, + 9.09717167387054, 8.66939912430557, 8.34924780056679, 8.34069464792507, + 8.49474306257865, 8.53326337159373, 9.21979553074694, 10.4442990717924, + 8.87696334026227, 8.68185981297147, 8.49821422481843, 8.56845648535378, + 8.45871626165726, 9.71818154670121, 9.68700923909068, 8.83010431791379, + 8.38799525294456, 8.4984180360899, 8.84721610435754, 8.28096440055337, + 9.26492324974647, 9.11173476822206, 8.70682132339263, 8.33182700443606, + 8.36660283278374, 8.27690348126706, 8.12946976478423, 9.17915925449261, + 9.68558026801716, 8.65521448931361, 8.29454951514368, 8.6522484224091, + 8.92970011431345, 8.3959291039232, 9.46753746341524, 9.88979422540413, + 8.84922702143852, 8.61431990214696, 8.48156601377309, 8.74909824839902, + 8.65364531455174, 9.3482745580655, 9.67683786189263, 9.64290170574605, + 8.72891172506098, 8.77894188184151, 9.96057651952026, 8.73777346032728, + 9.25263328416643, 9.26624800391448, 9.42730487221368, 8.79300509129753, + 8.70300863746445, 8.43944784279138, 8.29104513108173, 9.31325790598287, + 9.34792603492875, 8.791486026749, 8.51899157335762, 8.41294317004244, + 8.29679586577005, 8.21256839823415, 9.25655579577315, 9.65226597708712, + 8.63746202380718, 8.60776488960062, 8.96533457380484, 8.68372406230387, + 8.53267276226462, 9.49016666846238, 10.142858720955, 9.11162439903702, + 9.08500388066489, 9.05508908670489, 9.33626792857397, 9.23960786965675, + 10.1327324527083, 9.49122438992696, 9.1122864315008, 9.06357899058078, + 8.97297111339799, 9.14548179962769, 10.5418617072488, 11.5075208865114, + 10.1931676276506, 9.27995971385624, 8.84635304331433, 8.73262709966039, + 8.65504025810836, 8.45446636150793, 8.96367227561502, 10.0210927946104, + 9.00565049932022, 8.86092472971904, 8.58522560180806, 8.536211197252, + 8.45850419506756, 8.53444354482276, 10.1042218823372, 8.65067458279072, + 8.51218064959269, 8.48549610467298, 8.57791192645094, 8.54985397365579, + 9.60622641363735, 10.0261917925116, 8.87024156729927, 8.52793528794814, + 8.38343320123671, 8.20083725837985, 8.09285102753838, 8.03883475778775, + 8.08641027532378, 8.03657340970731, 7.97522083865341, 7.84267147497946, + 7.8935720735049, 7.81762544305337, 7.82284529027977, 7.9672801789422, + 8.00670084544037, 7.91132401896335, 7.85166117788927, 7.87207397986687, + 7.75362354655975, 7.68294316987829, 7.84384863815247, 8.19146305132693, + 7.97831096986772, 7.92334821193015, 7.87131120332341, 7.74370325817375, + 7.77863014732581, 7.83518375526675, 7.83834331555712, 7.84619881549743, + 7.92044650514261, 7.75790620835175, 7.58629630715272, 7.51479976048867, + 7.75790620835175, 7.80343505695217, 8.07899825868515, 8.38068594676157, + 8.0643219609108, 7.85282781228174, 7.90396563403217, 7.84463264446468, + 7.88945914940452, 8.22550309756692, 8.54071438645758, 8.01928379291679, + 7.83122021460429, 8.43315919580623, 8.09620827165004, 7.86633892304654, + 7.77904864492556, 7.77359446736019, 7.77275271646874, 7.76811037852599, + 7.48099216286952, 7.74370325817375, 7.5963923040642, 7.68063742756094, + 7.53849499941346, 7.4500795698075, 7.44307837434852, 7.54855597916987, + 7.64060382639363, 7.67647364638916, 7.56734567601324, 8.07682603129881, + 7.70120018085745, 7.36833968631138, 7.3664451483276, 7.48661331313996, + 7.5740450053722, 7.568895663407, 7.63964228785801, 7.85321638815607, + 7.31188616407716, 7.53636393840451, 7.68248244653451, 7.73193072194849, + 8.01201823915906, 7.98036576511125, 8.17131687471973, 7.97796809312855, + 7.79482315217939, 8.30424746507847, 8.05642676752298, 7.77779262633883, + 8.22897764335831, 7.900636613018, 7.46164039220858, 7.54908271081229, + 7.81681996576455, 7.72223474470961, 7.71556953452021, 7.72621265050753, + 7.58171964012531, 7.26542972325395, 7.30114780585603, 7.47420480649612, + 7.58882987830781, 7.61085279039525, 7.64778604544093, 7.60190195987517, + 7.25417784645652, 7.1800698743028, 7.37713371283395, 7.57507169950756, + 7.50714107972761, 7.58578882173203, 7.40731771046942, 7.03085747611612, + 7.15070145759253, 7.25417784645652, 7.45066079621154, 7.55118686729615, + 7.61332497954064, 7.42714413340862, 7.350516171834, 7.28824440102012, + 7.434847875212, 7.53743003658651, 7.35244110024358, 7.28207365809346, + 7.3031700512368, 7.29369772060144, 7.22983877815125, 7.57507169950756, + 7.97418866928601, 7.61579107203583, 7.47420480649612, 7.33432935030054, + 7.31920245876785, 7.40488757561612, 7.42476176182321, 7.47022413589997, + 7.36770857237437, 7.2841348061952, 7.32580750259577, 7.29097477814298, + 7.19142933003638, 7.28961052145117, 7.33236920592906, 7.39572160860205, + 7.56734567601324, 7.62119516280984, 7.26892012819372, 7.26961674960817, + 7.30787278076371, 7.28138566357028, 7.32118855673948, 7.51207124583547, + 7.50052948539529, 7.11314210870709, 7.1420365747068, 7.32383056620232, + 7.42892719480227, 7.52886925664225, 7.41997992366183, 7.4730690880322, + 7.3375877435386, 7.35436233042148, 7.58273848891441, 7.62608275807238, + 7.7596141506969, 7.94058382710424, 7.59085212368858, 7.41818082272679, + 7.41155628781116, 7.59789795052178, 6.63594655568665, 7.64730883235624, + 7.82763954636642, 7.63385355968177, 8.53030683056162, 8.52951694110507, + 7.85127199710988, 7.79564653633459, 7.58222919427646, 7.43897159239586, + 7.63867982387611, 7.52725591937378, 7.72488843932307, 7.91352101728389, + 8.65956043270316, 8.29579811063615, 8.13241267450091, 7.92551897978693, + 7.82843635915759, 7.84424071814181, 7.77695440332244, 7.76684053708551, + 7.78986855905471, 7.69393732550927, 7.71556953452021, 8.15277405274407, + 8.2529671950008, 7.94129557090653, 7.80954132465341, 7.81923445385907, + 7.81237820598861, 7.54538974961182, 8.47428569040496, 7.79193595693806, + 7.66809370908241, 7.80547462527086, 7.9672801789422, 7.99429498641598, + 7.80954132465341, 8.70317470904168, 7.9672801789422, 8.09620827165004, + 8.03786623470962, 8.58016799057763, 10.8718582692757, 9.19248185367487, + 9.15069651904867, 9.82319898130729, 8.76888532613486, 8.50855599802057, + 8.72972059026726, 8.92145757894788, 8.52991196382401, 10.4159817834027, + 10.3369892693381, 9.14644164612595, 8.50875771259514, 8.38617292897783, + 8.36100710822691, 8.12976444579417, 8.73198193834769, 8.73584667745758, + 10.8196982812101, 10.6590929669357, 9.84945366404364, 8.88820487145502, + 8.92771217382708, 9.66738540005753, 10.1635029066262, 9.3379417165699, + 9.17719715338293, 8.87905466204227, 8.57866451350434, 8.73004395324502, + 9.9533247873833, 10.2387447656008, 9.20311432688444, 8.74719318352693, + 8.77554943448619, 9.2098402469345, 8.52813313145457, 9.05765528431053, + 9.42294862137501, 9.02917814290207, 9.09773142759353, 9.44809663565824, + 9.11250701162742, 8.80267284031282, 9.20843856468659, 11.0470891404358, + 9.32758993202642, 8.67880170661265, 8.57659353469768, 8.43598313599069, + 8.19007704971905, 9.06044728240157, 9.27030595314362, 8.5016733797582, + 8.18729927015515, 8.0959035329611, 8.04334217044161, 7.952615111651, + 8.39908510293591, 8.79102985704596, 8.3030093814735, 8.11910083763749, + 8.23031079913502, 8.15765701519647, 7.82923253754359, 8.57395152523485, + 9.61132880805727, 8.92385758009988, 8.3654396361887, 8.31188955823036, + 8.63141433550626, 8.45382731579442, 8.90585118120802, 10.8674821444793, + 9.15514473650823, 8.43944784279138, 8.44354665124794, 8.57262789830434, + 8.372398606513, 8.73600738456922, 10.3885029394023, 8.70880479511728, + 8.19533366716287, 8.22147894726719, 8.27512163021651, 8.16990264735914, + 8.82232217747174, 9.80543361206074, 9.38907215991958, 8.98130449495713, + 8.57922858233569, 8.48776438072542, 8.72192834304709, 8.9182485910357, + 9.65162297294974, 8.86474666090541, 8.50936261230105, 8.63177109612367, + 9.20271134481169, 8.90381521172292, 9.02653771890043, 9.23766366762507, + 8.89508153175417, 8.6429443967218, 8.12976444579417, 8.29179710504873, + 8.09803475617607, 9.51878049751247, 9.90468683311161, 8.93734984826739, + 8.57885257180297, 8.71588010229646, 8.48899945704546, 8.50572771330696, + 9.30008966411979, 10.1461591836579, 9.17709377818255, 8.83564692253477, + 8.83287946027762, 8.92305821954573, 8.89329814421792, 8.60263667323371, + 8.99143781491923, 8.80687326653069, 8.85409390765552, 8.93102321585603, + 8.85280791762332, 10.6933076203563, 11.3075604350077, 9.83745458193169, + 9.60508151672137, 9.74537068443899, 9.67564548044036, 9.43468320386588, + 11.5036223246441, 11.9767789709185, 10.5425744562461, 10.004282662571, + 9.73281784848262, 9.86646043169905, 9.37092743662413, 9.490544554572, + 10.139152384404, 9.99984264077889, 10.0327159505439, 10.3803736928726, + 10.453053004618, 10.2401383446439, 11.7605196483804, 12.846746888829, + 10.7668837086558, 9.84522264440415, 9.29035230994557, 9.10331179921766, + 8.79573360595074, 8.62335338724463, 8.41825644355621, 8.31090675716845, + 8.23615566168312, 8.13123654969612, 7.92768504561578, 7.7591874385078, + 7.72665366484764, 7.83518375526675, 7.88419993367604, 7.91461770904068, + 7.92551897978693, 7.75319426988434, 7.50878717063428, 7.55747290161475, + 7.80261806344267, 7.68386398025643, 7.9844627322622, 7.85166117788927, + 7.68478394352278, 7.3375877435386, 7.40367029001237, 7.86787149039632, + 7.8984110928116, 7.58426481838906, 7.71423114484909, 7.88945914940452, + 7.32580750259577, 7.48885295573346, 7.55381085200823, 7.66996199547358, + 7.98820359702258, 8.00436556497957, 7.6511201757027, 7.48661331313996, + 7.44949800538285, 7.59538727885397, 7.60986220091355, 7.54802896993501, + 7.61775957660851, 7.59538727885397, 7.34665516317654, 7.40123126441302, + 8.09315669772264, 7.92371033396924, 7.69074316354187, 8.43901541035221, + 7.78239033558746, 7.30854279753919, 7.26192709270275, 7.43720636687129, + 7.54009032014532, 7.58528107863913, 7.60887062919126, 7.46450983463653, + 7.15695636461564, 7.48773376143644, 7.4489161025442, 7.47022413589997, + 7.43602781635185, 7.52185925220163, 7.41034709782102, 7.15617663748062, + 7.13807303404435, 7.36264527041782, 7.51697722460432, 7.61726781362835, + 7.49554194388426, 7.39203156751459, 7.17472430983638, 8.09132127353041, + 7.51534457118044, 7.8458075026378, 7.69120009752286, 7.83478810738819, + 7.67740043051481, 7.24850407237061, 7.40245152081824, 7.69439280262942, + 7.82604401351897, 7.61184239958042, 7.5137092478397, 7.67600993202889, + 7.24064969425547, 7.65539064482615, 8.13944052187461, 8.37493814383537, + 7.90174751852014, 8.02387999273488, 8.75020786252571, 8.081784206935, + 7.70436116791031, 7.86825426552061, 7.81963630236759, 7.76089319585102, + 7.66715825531915, 7.63433723562832, 7.35115822643069, 7.58933582317062, + 7.91022370709734, 7.85476918349913, 7.64683139143048, 7.49164547360513, + 7.5234813125735, 7.0352685992811, 7.06561336359772, 7.22983877815125, + 7.50823877467866, 8.31164394850298, 8.01400499477946, 7.49720722320332, + 7.83161727635261, 7.15148546390474, 7.41095187558364, 7.63094658089046, + 7.4759059693674, 7.58832367733522, 7.24636808010246, 7.10332206252611, + 7.10414409298753, 7.1929342212158, 7.40123126441302, 7.43955930913332, + 7.70796153183549, 7.350516171834, 7.32251043399739, 7.28550654852279, + 7.36770857237437, 7.26752542782817, 7.22475340576797, 7.22256601882217, + 7.35179986905778, 6.97541392745595, 7.04315991598834, 7.48099216286952, + 7.20340552108309, 7.22402480828583, 7.11314210870709, 7.07918439460967, + 6.88550967003482, 6.87419849545329, 7.72312009226633, 7.49665243816828, + 7.22402480828583, 7.27239839257005, 7.07918439460967, 6.85435450225502, + 6.93049476595163, 7.15617663748062, 7.31455283232408, 7.22693601849329, + 7.65681009148038, 7.54009032014532, 7.21007962817079, 7.24992553671799, + 7.29437729928882, 7.51914995766982, 7.42237370098682, 8.22362717580548, + 7.49276030092238, 7.22475340576797, 7.25629723969068, 7.4489161025442, + 7.65539064482615, 7.67136092319064, 7.92407232492342, 7.80098207125774, + 7.45645455517621, 7.36264527041782, 8.21311069759668, 8.23642052726539, + 7.92153563213355, 7.74500280351584, 7.57814547241947, 7.56682847920833, + 7.65822752616135, 8.27078101316267, 7.80302664363222, 7.6226639513236, + 7.70029520342012, 8.05864371221562, 7.64108424917491, 7.83636976054512, + 8.37355374121463, 8.60940767540405, 8.17723488551019, 8.03689677268507, + 7.95331834656043, 7.7848892956551, 8.07371464110986, 8.28045768658256, + 8.19918935907807, 8.00034949532468, 7.88720858581393, 7.83715965000168, + 7.97968130238774, 8.51839247199172, 8.35631996582815, 7.93236215433975, + 7.83676478326407, 8.53719187792293, 8.02649693894541, 7.9728107841214, + 8.37447688921464, 8.25322764558177, 8.44591198941127, 8.49269555981584, + 8.83913175254611, 8.07589363029886, 8.75020786252571, 10.702412661625, + 10.0599783492956, 8.79315687091382, 8.71440336070394, 9.05625635659347, + 8.62155320674048, 9.96142621745657, 9.70856696016566, 9.19644426678407, + 8.61431990214696, 8.88903257187474, 9.01627006814768, 8.19918935907807, + 9.16219999664825, 9.60750445504496, 8.44290058683438, 8.15737044118677, + 8.18451375303372, 8.83898679349679, 8.21283958467648, 8.33615081612066, + 8.59044365315583, 8.70134640303916, 8.26642147298455, 8.27461194620955, + 8.36637030168165, 8.03527891114467, 9.23151460720759, 9.96467672084855, + 8.84548923675327, 8.67299964255444, 8.40065937516029, 8.58035576637388, + 8.02059914989697, 9.1075321519945, 9.43835205468725, 8.50126704086598, + 8.3133619511344, 8.3255483071614, 8.47637119689598, 8.20111164444276, + 8.70051424854327, 11.2744652095441, 9.60757167515724, 8.87863674743007, + 8.76592651372944, 9.85639594500228, 8.43424627059531, 8.8034242116007, + 9.38176948760371, 8.76029622047005, 8.55506684384432, 8.46884293047519, + 8.53129331579502, 8.04558828080353, 9.0902045707362, 9.45414892373398, + 9.0590522577624, 8.25945819533241, 8.18952211074809, 8.19533366716287, + 7.69393732550927, 8.29004161870449, 9.03288694657909, 8.38274709486331, + 8.21797820315073, 8.12474302038557, 8.04686951095958, 7.57301725605255, + 8.3986348552921, 8.71144331907547, 8.25114213909075, 7.99226864327075, + 8.00536706731666, 8.08085641964099, 7.52833176670725, 8.20248244657654, + 9.07440609473535, 8.2147358333823, 7.96797317966293, 8.12829017160705, + 7.9536697786498, 7.66669020008009, 7.96554557312999, 9.14216859187285, + 8.28702502516506, 8.28324144138542, 8.30102525383845, 8.38799525294456, + 7.70975686445416, 8.11102783819368, 8.74560285240295, 8.39140318535794, + 8.11969625295725, 8.2358907259285, 8.10681603894705, 7.71199650704767, + 8.4252971767117, 8.84937050375457, 8.49310539588715, 8.17413934342947, + 8.10228362448007, 7.8336002236611, 7.52294091807237, 7.91022370709734, + 8.3654396361887, 9.06056344665796, 8.17919979842309, 8.01631789850341, + 8.10319175228579, 7.81439963380449, 8.38799525294456, 8.74814616962193, + 8.31287139434261, 7.92334821193015, 7.84658997529119, 8.3020178097512, + 8.43620003220671, 8.93458687038968, 8.88861880730088, 8.66423293406555, + 8.50004703258127, 8.41825644355621, 8.4721958254855, 8.30721262662831, + 9.88659568486591, 10.694985739443, 9.76019438270965, 9.11007795003779, + 8.79951090136887, 8.7830896717961, 8.42989086301344, 8.87877607170755, + 9.75938620856187, 8.9520876435484, 8.66112036022288, 8.58485183989005, + 8.39660622842712, 7.92371033396924, 8.08548677210285, 8.35890061242164, + 8.30350479887278, 8.27792025817214, 8.36357570275064, 8.59822003005861, + 8.08116577772543, 9.03443816698441, 10.2832245120716, 9.27322127001538, + 8.71407489954152, 8.23350314023399, 7.88419993367604, 7.81278281857758, + 7.93128476152589, 8.4144957931779, 8.15651022607997, 7.85709386490249, + 7.9098566672694, 7.80913539812054, 7.5076900778199, 8.20385137218388, + 7.82164312623998, 7.80384330353877, 7.76089319585102, 7.70345904786717, + 8.06117135969092, 7.350516171834, 7.48380668766583, 7.54062152865715, + 7.69666708152646, 7.50384074669895, 7.39817409297047, 7.04228617193974, + 7.05272104923232, 7.36264527041782, 7.6231530684769, 7.79523492900217, + 8.42683075133585, 7.9168074909376, 7.23633934275434, 7.20637729147225, + 7.55642796944025, 7.58273848891441, 7.68294316987829, 7.60688453121963, + 7.70345904786717, 7.15148546390474, 7.04053639021596, 7.33888813383888, + 7.48436864328613, 7.35179986905778, 7.42356844425917, 7.29165620917446, + 6.81673588059497, 6.91075078796194, 7.32118855673948, 7.99159228206809, + 7.71289096149013, 7.28276117960559, 7.30586003268401, 6.90575327631146, + 7.87321705486274, 7.08590146436561, 7.27100853828099, 7.21376830811864, + 7.16626597413364, 7.21303165983487, 6.82979373751242, 6.80128303447162, + 7.15773548424991, 7.04577657687951, 7.09174211509515, 7.23417717974985, + 7.28000825288419, 6.69703424766648, 7.028201432058, 7.17472430983638, + 7.22329567956231, 7.33693691370762, 7.36201055125973, 7.26332961747684, + 6.81124437860129, 7.3185395485679, 7.64012317269536, 7.40549566319947, + 7.57250298502038, 7.48549160803075, 7.33302301438648, 7.20563517641036, + 7.09090982207998, 7.32646561384032, 7.35564110297425, 7.46336304552002, + 7.56734567601324, 7.74975340627444, 7.14440718032114, 6.89972310728487, + 7.33106030521863, 7.2211050981825, 7.7376162828579, 7.36327958696304, + 7.29097477814298, 7.03878354138854, 6.93244789157251, 7.30586003268401, + 7.68616230349291, 7.47929963778283, 7.26961674960817, 7.30921236569276, + 6.74051935960622, 6.80572255341699, 7.14282740116162, 7.18690102041163, + 7.14045304310116, 8.76155013912964, 8.27944348771267, 7.43720636687129, + 7.16006920759613, 7.04141166379481, 7.17472430983638, 7.41276401742656, + 7.25629723969068, 7.2848209125686, 6.72623340235875, 6.93244789157251, + 7.07411681619736, 7.20266119652324, 7.16472037877186, 7.06731984865348, + 6.90675477864855, 6.67708346124714, 6.51767127291227, 7.04315991598834, + 7.04315991598834, 6.9177056098353, 7.05789793741186, 6.85540879860993, + 6.64378973314767, 6.52502965784346, 6.89060912014717, 6.92657703322272, + 7.00488198971286, 6.87316383421252, 6.89060912014717, 6.4425401664682, + 6.8351845861473, 7.27239839257005, 7.07749805356923, 7.34407285057307, + 7.29165620917446, 7.27170370688737, 7.454719949364, 6.69208374250663, + 6.96318998587024, 7.01660968389422, 6.79122146272619, 6.82001636467413, + 6.61873898351722, 6.47389069635227, 6.49978704065585, 6.8596149036542, + 6.88141130364254, 6.99759598298193, 7.15226885603254, 7.19668657083435, + 6.70808408385307, 6.98286275146894, 7.12849594568004, 7.08924315502751, + 7.19893124068817, 8.090708716084, 7.39387829010776, 7.05012252026906, + 7.19518732017871, 7.44132038971762, 7.41758040241454, 7.47420480649612, + 7.39264752072162, 7.18538701558042, 6.86484777797086, 6.83410873881384, + 7.28756064030972, 7.22402480828583, 7.24422751560335, 7.30653139893951, + 7.31721240835984, 6.95844839329766, 6.82546003625531, 7.18159194461187, + 7.27655640271871, 7.27100853828099, 7.82444593087762, 7.41938058291869, + 7.00760061395185, 7.07326971745971, 7.26542972325395, 7.60240133566582, + 7.55747290161475, 7.58222919427646, 7.28961052145117, 7.3304052118444, + 7.2211050981825, 7.4312996751559, 7.75018416225784, 7.62997570702779, + 7.73061406606374, 7.82404601085629, 7.22620901010067, 7.4770384723197, + 7.86326672400957, 7.94909149983052, 7.7698009960039, 7.57967882309046, + 7.54908271081229, 7.29165620917446, 7.78986855905471, 7.65681009148038, + 7.53476265703754, 7.66528471847135, 8.06652149046999, 8.14931284363534, + 7.72533003791713, 7.71735127218533, 7.67786350067821, 7.89506349809157, + 8.07992777075827, 8.1934002319521, 8.66509582133973, 7.84463264446468, + 8.77909581088053, 9.05870319731322, 8.42178300661158, 8.07215530818825, + 8.40469616018909, 9.72184576464693, 8.11402544235676, 8.43076346341785, + 8.54888563814873, 8.3228800217699, 8.00836557031292, 8.11999382772511, + 8.58260632996447, 7.60986220091355, 8.41205487329293, 9.5410100922274, + 8.55948610360649, 8.14438886554762, 7.9912539298402, 7.88532923927319, + 7.4599147662411, 8.37516869138682, 8.7268056084461, 8.07527154629746, + 7.80057265467065, 7.74975340627444, 7.91971976092457, 7.35627987655075, + 8.17301131172497, 8.26100978602383, 7.84658997529119, 7.74022952476318, + 7.83042561782033, 7.36137542897735, 8.2987883944492, 8.7417757069247, + 8.39705739017626, 7.77821147451249, 7.93379687481541, 7.86018505747217, + 7.94236223767433, 8.19808924895612, 8.42901750051251, 8.05674377497531, + 7.81116338502528, 7.78655180642871, 8.1086232683546, 7.62119516280984, + 8.09285102753838, 9.39224517527379, 8.45318786144033, 8.09437844497296, + 7.9912539298402, 8.32820949174873, 7.64108424917491, 8.48632152774915, + 9.16356318041725, 8.18841130807903, 7.82644313545601, 7.96067260838812, + 7.67229245562876, 7.16317239084664, 7.90211754627645, 9.63430006272051, + 8.84822206837138, 8.38320455141292, 8.16451026874704, 8.05293303679757, + 7.56112158953024, 8.25634777291802, 8.67282848294769, 8.30647216010058, + 8.05896001776942, 7.87245515006398, 8.19533366716287, 7.59135704669855, + 8.02158453345511, 12.1496715918794, 11.5230440984914, 8.71177264560569, + 8.05610965954506, 8.08147504013705, 7.45876269238096, 8.01400499477946, + 8.49678638163858, 7.98104975966596, 7.77779262633883, 8.2602342916073, + 7.86633892304654, 7.31055015853442, 7.71824095195932, 8.31947369244219, + 8.23668532271246, 7.80751004221619, 7.59186171488993, 7.52886925664225, + 7.17165682276851, 7.89133075766189, 8.36007143564403, 8.11042723757502, + 7.77527584648686, 7.34729970074316, 7.30182234213793, 7.12044437239249, + 8.87877607170755, 9.25061821847475, 9.24792513230345, 8.39140318535794, + 8.00469951054955, 7.58933582317062, 7.82524529143177, 8.24931374626064, + 9.29514097366865, 8.56826646160024, 8.35255436947459, 8.29579811063615, + 8.29029259122431, 7.78572089653462, 8.28172399041139, 8.4707303170059, + 8.13505390861157, 8.06714903991011, 8.02355239240435, 8.02191277898571, + 7.81722278550817, 9.27387839278017, 10.3337753460756, 9.12587121534973, + 8.89137400948464, + ], +}; + +class ProphetWorker { + constructor() { + this.worker = new Worker("./prophet.worker.js", { type: "module" }); + } + + static create = () => { + return new Promise((resolve, reject) => { + const worker = new ProphetWorker(); + worker.worker.onmessage = (e) => { + if (e.data === "ready") { + resolve(worker); + } else { + reject(); + } + } + }) + } + + fitPredict = async (data, opts) => { + return new Promise((resolve, reject) => { + const start = performance.now(); + this.worker.postMessage({ data, opts }); + this.worker.onmessage = (e) => { + const elapsed = (performance.now() - start).toFixed(0); + resolve({ predictions: e.data, elapsed }); + }; + }); + } +} + +async function main() { + const uPlotOpts = { + series: [ + {}, + { + label: "y", + stroke: "red", + width: 1, + }, + ], + plugins: [legendAsTooltipPlugin()], + ...getSize(), + }; + + let data = [df.ds, df.y]; + const u = new uPlot(uPlotOpts, data, document.getElementById("prophet-plot")); + window.addEventListener("resize", () => { + u.setSize(getSize()); + }); + + const worker = await ProphetWorker.create(); + + async function runProphet(opts) { + const { predictions, elapsed } = await worker.fitPredict(df, opts); + if (data.length > 2) { + data = data.slice(0, 2); + } + data.push(predictions.yhat.point); + if (predictions.yhat.intervals) { + data.push(predictions.yhat.intervals.lower, predictions.yhat.intervals.upper); + } + if (u.series.length === 2) { + const newSeries = [ + { + label: "yhat", + stroke: "green", + width: 1, + }, + { + label: "lower", + stroke: "blue", + width: 0, + }, + { + label: "upper", + stroke: "blue", + width: 0, + }, + ]; + + const band = { + series: [3, 4], + fill: "rgba(0, 0, 255, .2)", + dir: 1, + }; + + newSeries.forEach((s, i) => u.addSeries(s, i + 2)); + u.addBand(band); + } + u.setData(data); + document.getElementById("prophet-title").innerText = + `Forecasting with Prophet - done in ${elapsed}ms`; + } + runProphet(undefined) + document.getElementById("prophet-interval-width").addEventListener("change", function() { + const intervalWidth = parseFloat(this.value); + runProphet({ intervalWidth }); + }) +} + +export default main; diff --git a/demo/prophet.worker.js b/demo/prophet.worker.js new file mode 100644 index 0000000..7b17867 --- /dev/null +++ b/demo/prophet.worker.js @@ -0,0 +1,25 @@ +import initProphet, { + initLogging, + Prophet, +} from "./dist/@bsull/augurs/prophet.js"; +import { optimizer } from "./dist/@bsull/augurs-prophet-wasmstan/prophet-wasmstan.js"; + +await initProphet(); + +self.onmessage = (e) => { + const { data, opts } = e.data; + const df = { + ds: data.ds, + y: data.y, + }; + const prophet = new Prophet({ + optimizer, + uncertaintySamples: 500, + intervalWidth: 0.8, + ...(opts ?? {}) + }); + prophet.fit(df); + const predictions = prophet.predict(); + self.postMessage(predictions); +}; +self.postMessage("ready");