diff --git a/CHANGELOG.md b/CHANGELOG.md index ff35b4dd501..43116f531e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,8 +2,9 @@ ## New Features -- PR #6460 Add is_timestamp format check API - PR #6528 Enable `fixed_point` binary operations +- PR #6460 Add is_timestamp format check API +- PR #6568 Add function to create hashed vocabulary file from raw vocabulary - PR #6581 Add JNI API to check if PTDS is enabled ## Improvements diff --git a/python/cudf/cudf/core/column/string.py b/python/cudf/cudf/core/column/string.py index a566fd347cb..6980024fb39 100644 --- a/python/cudf/cudf/core/column/string.py +++ b/python/cudf/cudf/core/column/string.py @@ -4201,6 +4201,8 @@ def subword_tokenize( ---------- hash_file : str Path to hash file containing vocabulary of words with token-ids. + This can be created from the raw vocabulary + using the ``cudf.utils.hash_vocab_utils.hash_vocab`` function max_length : int, Default is 64 Limits the length of the sequence returned. If tokenized string is shorter than max_length, diff --git a/python/cudf/cudf/tests/data/vocab_hash/bert-base-uncased-vocab-5per.txt b/python/cudf/cudf/tests/data/vocab_hash/bert-base-uncased-vocab-5per.txt new file mode 100644 index 00000000000..7d156a38f28 --- /dev/null +++ b/python/cudf/cudf/tests/data/vocab_hash/bert-base-uncased-vocab-5per.txt @@ -0,0 +1,2475 @@ +[PAD] +[unused0] +[unused1] +[unused2] +[unused3] +[unused4] +[unused5] +[unused6] +[unused7] +[unused8] +[unused9] +[unused10] +[unused11] +[unused12] +[unused13] +[unused14] +[unused15] +[unused16] +[unused17] +[unused18] +[unused19] +[unused20] +[unused21] +[unused22] +[unused23] +[unused24] +[unused25] +[unused26] +[unused27] +[unused28] +[unused29] +[unused30] +[unused31] +[unused32] +[unused33] +[unused34] +[unused35] +[unused36] +[unused37] +[unused38] +[unused39] +[unused40] +[unused41] +[unused42] +[unused43] +[unused44] +[unused45] +[unused46] +[unused47] +[unused48] +[unused49] +[unused50] +[unused51] +[unused52] +[unused53] +[unused54] +[unused55] +[unused56] +[unused57] +[unused58] +[unused59] +[unused60] +[unused61] +[unused62] +[unused63] +[unused64] +[unused65] +[unused66] +[unused67] +[unused68] +[unused69] +[unused70] +[unused71] +[unused72] +[unused73] +[unused74] +[unused75] +[unused76] +[unused77] +[unused78] +[unused79] +[unused80] +[unused81] +[unused82] +[unused83] +[unused84] +[unused85] +[unused86] +[unused87] +[unused88] +[unused89] +[unused90] +[unused91] +[unused92] +[unused93] +[unused94] +[unused95] +[unused96] +[unused97] +[unused98] +[UNK] +[CLS] +[SEP] +[MASK] +[unused99] +[unused100] +[unused101] +[unused102] +[unused103] +[unused104] +[unused105] +[unused106] +[unused107] +[unused108] +[unused109] +[unused110] +[unused111] +[unused112] +[unused113] +[unused114] +[unused115] +[unused116] +[unused117] +[unused118] +[unused119] +[unused120] +[unused121] +[unused122] +[unused123] +[unused124] +[unused125] +[unused126] +[unused127] +[unused128] +[unused129] +[unused130] +[unused131] +[unused132] +[unused133] +[unused134] +[unused135] +[unused136] +[unused137] +[unused138] +[unused139] +[unused140] +[unused141] +[unused142] +[unused143] +[unused144] +[unused145] +[unused146] +[unused147] +[unused148] +[unused149] +[unused150] +[unused151] +[unused152] +[unused153] +[unused154] +[unused155] +[unused156] +[unused157] +[unused158] +[unused159] +[unused160] +[unused161] +[unused162] +[unused163] +[unused164] +[unused165] +[unused166] +[unused167] +[unused168] +[unused169] +[unused170] +[unused171] +[unused172] +[unused173] +[unused174] +[unused175] +[unused176] +[unused177] +[unused178] +[unused179] +[unused180] +[unused181] +[unused182] +[unused183] +[unused184] +[unused185] +[unused186] +[unused187] +[unused188] +[unused189] +[unused190] +[unused191] +[unused192] +[unused193] +[unused194] +[unused195] +[unused196] +[unused197] +[unused198] +[unused199] +[unused200] +[unused201] +[unused202] +[unused203] +[unused204] +[unused205] +[unused206] +[unused207] +[unused208] +[unused209] +[unused210] +[unused211] +[unused212] +[unused213] +[unused214] +[unused215] +[unused216] +[unused217] +[unused218] +[unused219] +[unused220] +[unused221] +[unused222] +[unused223] +[unused224] +[unused225] +[unused226] +[unused227] +[unused228] +[unused229] +[unused230] +[unused231] +[unused232] +[unused233] +[unused234] +[unused235] +[unused236] +[unused237] +[unused238] +[unused239] +[unused240] +[unused241] +[unused242] +[unused243] +[unused244] +[unused245] +[unused246] +[unused247] +[unused248] +[unused249] +[unused250] +[unused251] +[unused252] +[unused253] +[unused254] +[unused255] +[unused256] +[unused257] +[unused258] +[unused259] +[unused260] +[unused261] +[unused262] +[unused263] +[unused264] +[unused265] +[unused266] +[unused267] +[unused268] +[unused269] +[unused270] +[unused271] +[unused272] +[unused273] +[unused274] +[unused275] +[unused276] +[unused277] +[unused278] +[unused279] +[unused280] +[unused281] +[unused282] +[unused283] +[unused284] +[unused285] +[unused286] +[unused287] +[unused288] +[unused289] +[unused290] +[unused291] +[unused292] +[unused293] +[unused294] +[unused295] +[unused296] +[unused297] +[unused298] +[unused299] +[unused300] +[unused301] +[unused302] +[unused303] +[unused304] +[unused305] +[unused306] +[unused307] +[unused308] +[unused309] +[unused310] +[unused311] +[unused312] +[unused313] +[unused314] +[unused315] +[unused316] +[unused317] +[unused318] +[unused319] +[unused320] +[unused321] +[unused322] +[unused323] +[unused324] +[unused325] +[unused326] +[unused327] +[unused328] +[unused329] +[unused330] +[unused331] +[unused332] +[unused333] +[unused334] +[unused335] +[unused336] +[unused337] +[unused338] +[unused339] +[unused340] +[unused341] +[unused342] +[unused343] +[unused344] +[unused345] +[unused346] +[unused347] +[unused348] +[unused349] +[unused350] +[unused351] +[unused352] +[unused353] +[unused354] +[unused355] +[unused356] +[unused357] +[unused358] +[unused359] +[unused360] +[unused361] +[unused362] +[unused363] +[unused364] +[unused365] +[unused366] +[unused367] +[unused368] +[unused369] +[unused370] +[unused371] +[unused372] +[unused373] +[unused374] +[unused375] +[unused376] +[unused377] +[unused378] +[unused379] +[unused380] +[unused381] +[unused382] +[unused383] +[unused384] +[unused385] +[unused386] +[unused387] +[unused388] +[unused389] +[unused390] +[unused391] +[unused392] +[unused393] +[unused394] +[unused395] +[unused396] +[unused397] +[unused398] +[unused399] +[unused400] +[unused401] +[unused402] +[unused403] +[unused404] +[unused405] +[unused406] +[unused407] +[unused408] +[unused409] +[unused410] +[unused411] +[unused412] +[unused413] +[unused414] +[unused415] +[unused416] +[unused417] +[unused418] +[unused419] +[unused420] +[unused421] +[unused422] +[unused423] +[unused424] +[unused425] +[unused426] +[unused427] +[unused428] +[unused429] +[unused430] +[unused431] +[unused432] +[unused433] +[unused434] +[unused435] +[unused436] +[unused437] +[unused438] +[unused439] +[unused440] +[unused441] +[unused442] +[unused443] +[unused444] +[unused445] +[unused446] +[unused447] +[unused448] +[unused449] +[unused450] +[unused451] +[unused452] +[unused453] +[unused454] +[unused455] +[unused456] +[unused457] +[unused458] +[unused459] +[unused460] +[unused461] +[unused462] +[unused463] +[unused464] +[unused465] +[unused466] +[unused467] +[unused468] +[unused469] +[unused470] +[unused471] +[unused472] +[unused473] +[unused474] +[unused475] +[unused476] +[unused477] +[unused478] +[unused479] +[unused480] +[unused481] +[unused482] +[unused483] +[unused484] +[unused485] +[unused486] +[unused487] +[unused488] +[unused489] +[unused490] +[unused491] +[unused492] +[unused493] +[unused494] +[unused495] +[unused496] +[unused497] +[unused498] +[unused499] +[unused500] +[unused501] +[unused502] +[unused503] +[unused504] +[unused505] +[unused506] +[unused507] +[unused508] +[unused509] +[unused510] +[unused511] +[unused512] +[unused513] +[unused514] +[unused515] +[unused516] +[unused517] +[unused518] +[unused519] +[unused520] +[unused521] +[unused522] +[unused523] +[unused524] +[unused525] +[unused526] +[unused527] +[unused528] +[unused529] +[unused530] +[unused531] +[unused532] +[unused533] +[unused534] +[unused535] +[unused536] +[unused537] +[unused538] +[unused539] +[unused540] +[unused541] +[unused542] +[unused543] +[unused544] +[unused545] +[unused546] +[unused547] +[unused548] +[unused549] +[unused550] +[unused551] +[unused552] +[unused553] +[unused554] +[unused555] +[unused556] +[unused557] +[unused558] +[unused559] +[unused560] +[unused561] +[unused562] +[unused563] +[unused564] +[unused565] +[unused566] +[unused567] +[unused568] +[unused569] +[unused570] +[unused571] +[unused572] +[unused573] +[unused574] +[unused575] +[unused576] +[unused577] +[unused578] +[unused579] +[unused580] +[unused581] +[unused582] +[unused583] +[unused584] +[unused585] +[unused586] +[unused587] +[unused588] +[unused589] +[unused590] +[unused591] +[unused592] +[unused593] +[unused594] +[unused595] +[unused596] +[unused597] +[unused598] +[unused599] +[unused600] +[unused601] +[unused602] +[unused603] +[unused604] +[unused605] +[unused606] +[unused607] +[unused608] +[unused609] +[unused610] +[unused611] +[unused612] +[unused613] +[unused614] +[unused615] +[unused616] +[unused617] +[unused618] +[unused619] +[unused620] +[unused621] +[unused622] +[unused623] +[unused624] +[unused625] +[unused626] +[unused627] +[unused628] +[unused629] +[unused630] +[unused631] +[unused632] +[unused633] +[unused634] +[unused635] +[unused636] +[unused637] +[unused638] +[unused639] +[unused640] +[unused641] +[unused642] +[unused643] +[unused644] +[unused645] +[unused646] +[unused647] +[unused648] +[unused649] +[unused650] +[unused651] +[unused652] +[unused653] +[unused654] +[unused655] +[unused656] +[unused657] +[unused658] +[unused659] +[unused660] +[unused661] +[unused662] +[unused663] +[unused664] +[unused665] +[unused666] +[unused667] +[unused668] +[unused669] +[unused670] +[unused671] +[unused672] +[unused673] +[unused674] +[unused675] +[unused676] +[unused677] +[unused678] +[unused679] +[unused680] +[unused681] +[unused682] +[unused683] +[unused684] +[unused685] +[unused686] +[unused687] +[unused688] +[unused689] +[unused690] +[unused691] +[unused692] +[unused693] +[unused694] +[unused695] +[unused696] +[unused697] +[unused698] +[unused699] +[unused700] +[unused701] +[unused702] +[unused703] +[unused704] +[unused705] +[unused706] +[unused707] +[unused708] +[unused709] +[unused710] +[unused711] +[unused712] +[unused713] +[unused714] +[unused715] +[unused716] +[unused717] +[unused718] +[unused719] +[unused720] +[unused721] +[unused722] +[unused723] +[unused724] +[unused725] +[unused726] +[unused727] +[unused728] +[unused729] +[unused730] +[unused731] +[unused732] +[unused733] +[unused734] +[unused735] +[unused736] +[unused737] +[unused738] +[unused739] +[unused740] +[unused741] +[unused742] +[unused743] +[unused744] +[unused745] +[unused746] +[unused747] +[unused748] +[unused749] +[unused750] +[unused751] +[unused752] +[unused753] +[unused754] +[unused755] +[unused756] +[unused757] +[unused758] +[unused759] +[unused760] +[unused761] +[unused762] +[unused763] +[unused764] +[unused765] +[unused766] +[unused767] +[unused768] +[unused769] +[unused770] +[unused771] +[unused772] +[unused773] +[unused774] +[unused775] +[unused776] +[unused777] +[unused778] +[unused779] +[unused780] +[unused781] +[unused782] +[unused783] +[unused784] +[unused785] +[unused786] +[unused787] +[unused788] +[unused789] +[unused790] +[unused791] +[unused792] +[unused793] +[unused794] +[unused795] +[unused796] +[unused797] +[unused798] +[unused799] +[unused800] +[unused801] +[unused802] +[unused803] +[unused804] +[unused805] +[unused806] +[unused807] +[unused808] +[unused809] +[unused810] +[unused811] +[unused812] +[unused813] +[unused814] +[unused815] +[unused816] +[unused817] +[unused818] +[unused819] +[unused820] +[unused821] +[unused822] +[unused823] +[unused824] +[unused825] +[unused826] +[unused827] +[unused828] +[unused829] +[unused830] +[unused831] +[unused832] +[unused833] +[unused834] +[unused835] +[unused836] +[unused837] +[unused838] +[unused839] +[unused840] +[unused841] +[unused842] +[unused843] +[unused844] +[unused845] +[unused846] +[unused847] +[unused848] +[unused849] +[unused850] +[unused851] +[unused852] +[unused853] +[unused854] +[unused855] +[unused856] +[unused857] +[unused858] +[unused859] +[unused860] +[unused861] +[unused862] +[unused863] +[unused864] +[unused865] +[unused866] +[unused867] +[unused868] +[unused869] +[unused870] +[unused871] +[unused872] +[unused873] +[unused874] +[unused875] +[unused876] +[unused877] +[unused878] +[unused879] +[unused880] +[unused881] +[unused882] +[unused883] +[unused884] +[unused885] +[unused886] +[unused887] +[unused888] +[unused889] +[unused890] +[unused891] +[unused892] +[unused893] +[unused894] +[unused895] +[unused896] +[unused897] +[unused898] +[unused899] +[unused900] +[unused901] +[unused902] +[unused903] +[unused904] +[unused905] +[unused906] +[unused907] +[unused908] +[unused909] +[unused910] +[unused911] +[unused912] +[unused913] +[unused914] +[unused915] +[unused916] +[unused917] +[unused918] +[unused919] +[unused920] +[unused921] +[unused922] +[unused923] +[unused924] +[unused925] +[unused926] +[unused927] +[unused928] +[unused929] +[unused930] +[unused931] +[unused932] +[unused933] +[unused934] +[unused935] +[unused936] +[unused937] +[unused938] +[unused939] +[unused940] +[unused941] +[unused942] +[unused943] +[unused944] +[unused945] +[unused946] +[unused947] +[unused948] +[unused949] +[unused950] +[unused951] +[unused952] +[unused953] +[unused954] +[unused955] +[unused956] +[unused957] +[unused958] +[unused959] +[unused960] +[unused961] +[unused962] +[unused963] +[unused964] +[unused965] +[unused966] +[unused967] +[unused968] +[unused969] +[unused970] +[unused971] +[unused972] +[unused973] +[unused974] +[unused975] +[unused976] +[unused977] +[unused978] +[unused979] +[unused980] +[unused981] +[unused982] +[unused983] +[unused984] +[unused985] +[unused986] +[unused987] +[unused988] +[unused989] +[unused990] +[unused991] +[unused992] +[unused993] +notions +bc +宀 +rudd +1839 +appeals +fabric +charges +roadside +interview +goethe +rr +##ス +heroine +housing +##xx +owens +who +青 +prominent +##ments +spare +sloane +paranormal +昭 +physiological +reply +josiah +mort +316 +descend +pencil +nepal +minus +janata +106 +hardin +enamel +ђ +##urance +scans +happening +advising +identifies +institutional +dominican +charts +convince +51st +kingdoms +heritage +comedy +banker +##me +##its +1611 +##dos +##pire +fog +bulky +light +reborn +consultation +##loading +teachers +ashe +frank +bandits +governmental +##rdon +privileged +##mins +##ᅭ +adherence +ko +motionless +fighters +sui +significant +others +incurred +posts +defected +alexandra +continue +tormented +encourage +delaying +stomach +conscience +deserve +pumps +tanaka +##fles +flushed +parks +##nam +##hold +submitted +duran +monroe +parasites +emptiness +prakash +break +##xley +haynes +neil +gallons +##onus +manages +69 +aragon +memorable +matching +inclination +molten +humboldt +riders +##ː +marketed +##yala +squealed +##qual +talk +tournaments +##boot +##a +##gart +##rra +##ifies +deny +personal +nancy +splits +##ˈ +permitting +projected +fool +attach +pill +1776 +##ს +raoul +cocaine +conservation +luther +appeal +##tal +dq +##gny +##vial +reasonable +unitarian +melville +stephens +##民 +balancing +lowe +swore +matrix +concluded +##cap +tee +capacity +searing +living +lc +qualified +shoes +##sam +rounds +293 +237 +attic +shafts +older +underworld +tehran +simulcast +##abe +##lich +quarterfinals +elton +unreasonable +ষ +m1 +upbringing +faith +misconduct +##ᄀ +miner +sudanese +dense +whimpered +sabre +professionally +ex +grasp +infections +knee +shoving +ł +##ehan +##ʊ +skyscraper +##mont +purchases +fright +drivers +buyer +shit +foreigner +1764 +gloria +##rem +rejecting +petra +spots +memoirs +tracey +##gy +##ades +reused +##igh +3 +hopeless +rita +specialised +〈 +portion +distress +##ו +##tub +jamestown +clause +journalists +network +napoleon +##դ +fortunate +focus +ahead +concordia +168 +hitch +managed +superliga +shu +euroleague +clock +johnny +merits +softened +grimaced +losses +ferdinand +gmbh +wreath +##astic +harlem +den +algae +43rd +##kushima +welding +abilities +##nting +assumption +announcer +auditioned +mathematician +retrospective +##谷 +laced +motive +fixed +joshua +emerging +foreign +brutal +れ +seaside +manfred +connects +##nesian +heir +ս +experience +jem +##sett +mark +harper +##de +one +additive +bypass +assembly +continents +boom +minimal +##wheel +unification +participating +shareholder +arizona +casimir +##স +viet +##inski +restoring +abolished +dea +glowed +aeronautics +selfish +serbia +easily +count +##llet +justified +descendant +racer +authentic +##care +weightlifting +annapolis +songs +abrams +deciduous +costing +silence +spent +##form +##kou +screens +braden +##scribe +1934 +permit +##ric +##ane +gaston +comet +gift +trembled +##fa +everyday +forged +milwaukee +##« +larger +nickel +danes +appropriated +malibu +banquet +shared +26 +##ucher +ky +##urse +ᅴ +divided +##itarian +endeavors +blank +kw +investor +##ners +moldova +veteran +pandit +deposited +involved +pace +experiencing +£ +algorithms +safely +##pore +xp +unite +fin +clearance +intriguing +indications +almighty +##iable +corvette +##uding +panzer +monster +ban +eternal +trap +shot +saxophonist +##iam +dai +studio +##eak +baltic +placed +northern +suppliers +fungus +prasad +##qu +priorities +robinson +list +conner +1960 +hendricks +##ani +shoulder +kite +starting +remorse +mysteriously +##master +lena +1923 +##〜 +##ln +pianist +##ision +adulthood +century +skier +cannot +mai +summarized +oxfordshire +##dded +ordination +##vis +tin +resource +expanse +inmate +doyle +##osa +stained +yemen +spoken +stealth +natalie +neatly +stamp +pens +beautiful +ک +pulp +shortlisted +anastasia +models +theory +coincided +##dor +deception +##rt +comparable +##न +offered +##ק +indonesian +canberra +martinez +whereas +clutch +aqua +roadway +dorothea +triumph +landfall +ernesto +##quist +מ +turk +##bau +##num +teammate +injuring +vampire +##լ +somewhat +sophia +standards +##♦ +actions +judas +electoral +robertson +crap +depictions +inherited +##ffey +byron +demands +gorilla +##mona +misunderstood +dante +##yah +##ark +compiled +gaulle +win +activity +giggling +polynomials +plantation +included +ɛ +kai +282 +vol +1650 +nationally +stick +friar +bourbon +vow +erratic +drifting +pornography +क +remains +##ನ +dumping +rifle +backdrop +found +pondered +gil +##hetic +outlaw +secure +razor +survived +behind +objectives +josef +##空 +##typical +intuitive +within +##秀 +torch +relevant +scoop +sox +buckle +motion +##gging +chorale +genetically +##ར +##· +yell +yielding +##riam +campbell +archive +hillsborough +diamond +somerville +glitter +graduating +##॥ +kendall +天 +videos +disdain +nigerian +##esses +##hoe +jillian +bloomberg +##miya +fleeting +quilt +facebook +witnessed +destruction +cleansing +christophe +explained +mistaken +##toy +college +##arus +islanders +releasing +tourist +psychotic +thrilled +alt +rafael +wessex +pastry +enthusiast +assists +##ress +出 +##aker +eu +specializing +##borg +##if +unofficially +studied +locating +cello +hawks +chevalier +182 +tissues +cactus +onslaught +##kur +purely +清 +invited +##χ +joey +##ered +##uin +##brook +club +billion +culturally +##hale +##hot +##quisite +riches +ghosts +definite +fern +boycott +worse +arrange +##西 +##br +timber +eva +might +truss +nude +r +envisioned +1635 +dependence +##ault +##lding +##nh +eyelashes +##agi +spun +##vich +grouped +problem +helium +##dge +dent +##rick +mustache +progress +cuthbert +##鈴 +hurling +1779 +shepherd +pd +tiffany +pad +modules +scientology +rapper +electors +colorado +enforcement +##inate +##rent +murderer +boise +pollard +mason +drafting +straightforward +accompanying +extensions +scaled +yamamoto +. +facilitate +bombardment +101 +inviting +##mute +198 +dammit +layne +dubai +clint +shelves +briggs +##istan +revised +remembers +soloist +gables +cranes +##ower +##ok +kaladin +1961 +abdul +weiss +startup +thereof +hose +unofficial +##berg +knicks +enroll +das +satisfactory +playwright +functional +##oted +exposure +credited +国 +returned +searched +wii +banning +champaign +asthma +##son +##yk +elias +##ᵉ +directorial +##vos +swing +karin +fours +cbc +##bers +residences +exploration +depending +credentials +sykes +а +##マ +restarted +##nivorous +357 +attacks +trumpets +combinations +banking +stops +##listic +maneuvers +duffy +mutation +stop +explorers +behaviour +subtly +developing +ions +responsibility +racks +colombo +widowed +addison +ironic +ventured +utc +##ゆ +eh +volvo +extinguished +248 +##ク +enclosure +impulse +shocks +rainforest +waiter +##月 +circumstances +windmill +cambrian +granada +nichols +ordained +terraces +renewed +geese +cite +##oc +anticipating +eccentric +macau +jing +##itz +spike +stunt +democratic +talmud +flooded +blew +tate +sharks +##ali +##ロ +blanc +defense +driven +snapped +halfway +whispering +##mist +debuted +##good +legion +sun +alias +##lier +rigid +amounted +mari +relates +allowed +negotiations +rosary +investigators +gossip +transcribed +broker +nocturnal +《 +reckon +##ट +##kla +wil +amid +lincolnshire +н +mister +remarked +##yd +##hardt +##escence +##を +soothe +accounted +pavel +nonstop +baronetcy +##irs +##aly +preparing +specializes +##ena +strategies +steelers +語 +145 +madness +##ays +stresses +isolate +uranium +vu +collections +cabbage +bremen +jews +trailers +森 +##eg +protectorate +174 +collapsing +止 +offer +302 +ached +degrees +421 +physiology +silk +toward +eventual +##court +talents +##ular +cheng +parameters +surge +fifties +##ز +proclaimed +billing +watery +handbook +compositions +##nished +piano +ministries +⽥ +arterial +##nous +##th +publishes +integration +hotter +decision +souza +pitchfork +started +hezbollah +##s +vietnamese +initiated +ubiquitous +と +af +electrical +bend +minnesota +pigeon +cardiovascular +##ol +sparrow +readers +wilkinson +bled +hugo +brute +1811 +dust +distinguishing +##lett +goldstein +pontiac +detainees +bautista +94 +##wald +##45 +年 +blowing +bartholomew +##dit +airplane +projection +##furt +lighting +##ke +1830s +cantata +tumbling +iraqi +shape +mortals +albans +shannon +warlock +ventral +smug +quoting +buy +overboard +kelley +##lifting +order +##50 +foothills +lahore +##ctus +refugee +##ion +deepest +wetland +telugu +น +clears +hiring +freighter +throbbing +attacked +##lian +haiti +repeal +##れ +##59 +paddy +bladder +beating +soviets +pit +blackmail +##ifier +timed +advances +##tment +gesellschaft +ronan +newtown +niger +neon +##boards +barbarians +barrie +longitude +##cio +immigrant +annum +sprint +trumpeter +1956 +uprising +##ও +sustain +interchange +blazed +motif +sediment +absorbing +wah +jun +艹 +310 +##miento +##nas +venture +##idal +extend +locker +constraint +newport +identifying +arctic +##ہ +cary +handkerchief +##ٹ +upright +nouns +म +admitting +contested +duke +healing +##29 +photographers +equestrian +thrusts +##fi +249 +propose +balloons +interfering +terrifying +leinster +sweeps +ₕ +##hi +accuracy +trunk +bundesliga +slug +handled +stance +vibrations +northbound +gamma +##oor +cigar +buster +thirds +loch +##nessy +detector +nascar +terminated +321 +chooses +horizontal +genesis +##urs +##bility +listen +45th +worker +mc +mexican +kendrick +info +##uw +pediatric +rev +isolated +observation +##nified +orient +delicate +breakers +##chet +1662 +hovered +##nl +beck +75 +##tama +hawaii +wrestler +singers +tire +suspected +measurement +ᄊ +sprawling +gordon +excess +support +kind +commemorated +skilled +insertion +consider +mustered +covent +##mad +##vision +##ria +arsenic +ನ +policemen +enrollment +ios +graveyard +peruvian +unemployment +regulations +above +civilians +cents +worry +townspeople +forced +##uru +##sz +cause +sighs +compiler +sable +fact +surgery +dc +##pants +##beat +sings +##field +recall +cape +eyeing +hana +bullshit +baird +navigator +netting +squire +delayed +##nai +cretaceous +medina +presided +lengths +##trix +schedules +cardiac +heal +brody +lal +entire +crossings +preach +brigade +diva +breaks +boogie +##tre +cycling +goblin +spread +engineers +servants +1000 +posthumous +beyond +jerry +¶ +procession +togo +coyote +organist +##abad +them +##view +app +##alle +interviewed +oblivion +##rosis +hu +talking +530 +bombing +philosopher +escalated +miocene +oyster +donkey +assaults +##graphs +honest +falcons +korean +collaborator +azerbaijan +gunpowder +stuck +demo +embryo +forty +##or +finland +wrenched +confederation +eng +paving +##west +baroque +execute +personnel +lars +##oise +yanked +needy +leah +nicknamed +bestowed +guangzhou +hanson +##bbling +hundred +kilometer +night +##│ +##fields +racehorse +curved +後 +median +guantanamo +superstructure +##isan +##odes +grins +み +##channel +burnley +##pins +auxiliary +caine +white +valuation +##lving +expert +##rea +mauritius +iona +font +valentine +tribes +##bate +profitable +##rogate +ebony +soo +initial +marin +helicopters +debates +dragging +decent +##ours +yourself +microscopy +compilation +intensive +bronx +kimberly +wills +digging +rumored +werner +##fleet +bracing +sloan +album +meaningful +marine +essence +hindi +##dorf +doubt +thirties +habits +mangrove +miracles +ballast +` +bodied +persist +browning +mas +##sl +child +historically +certificates +polished +lucivar +benevolent +tipperary +repealed +centennial +##analysis +middle +difficulty +archived +elk +ha +lamp +barrow +##ध +meteor +##cellular +turkey +藤 +dune +xml +##hered +lo +unbearable +ottoman +licked +talon +ლ +yorker +smashed +damage +landau +visited +##ressed +suit +reactors +gracefully +cleveland +baptiste +martini +unified +ratified +kobe +attract +accelerated +##duk +suffix +builders +infection +wit +##qa +entering +ninety +touching +hue +headline +advises +##ש +sand +rms +##am +paddington +ebook +brightened +td +butter +rayon +bilingual +granite +³ +eden +##vres +distinguish +madman +syntax +rigorous +shortages +##sian +bancroft +praised +administrators +##bolic +##pool +paved +compatible +morrow +thumping +declares +convincing +freelance +differently +accelerating +arrive +##nated +preliminary +wraps +fringe +glow +##tension +stockings +emmanuel +according +carmen +sprayed +pulsed +lyman +angola +styled +sewing +confronting +##idad +bitterness +eating +presley +district +stevie +##ddle +##nel +clutches +carry +##¡ +##para +royals +1936 +rebranded +departing +ᵏ +overrun +legend +kitty +##400 +enchanted +funny +activities diff --git a/python/cudf/cudf/tests/data/vocab_hash/ground_truth_vocab_hash_5per.txt b/python/cudf/cudf/tests/data/vocab_hash/ground_truth_vocab_hash_5per.txt new file mode 100644 index 00000000000..b63a3b883a4 --- /dev/null +++ b/python/cudf/cudf/tests/data/vocab_hash/ground_truth_vocab_hash_5per.txt @@ -0,0 +1,3100 @@ +26899 +27424 +618 +0 0 +9308113254891556867 0 +436896553784417287 3 +2385682838371229189 10 +1558319825288788995 15 +1694636932519955459 18 +10804654694511444996 21 +18098925775253437954 25 +6737924902096233986 27 +12420164637450604548 29 +10052209762446030853 33 +17136277123483534341 38 +3816962228559380485 43 +10000432285949172226 48 +3595721221582369282 50 +8300629869194307073 52 +13201888020163964420 53 +1911143973647033348 57 +6800828846832400386 61 +11236791597074179585 63 +9168098438593696772 64 +7262274946389325317 68 +2138829751639336965 73 +5569775297965074438 78 +6731361918165622787 84 +1000159591814497798 87 +12420398894488158722 93 +17276977059282736646 95 +7635600731429963779 101 +18378821292746091014 104 +2022931426448033286 110 +6648129782745846792 116 +4965400020463248899 124 +5551261944186869761 127 +11423501398563713540 128 +12015445961309659140 132 +14804906647292574211 136 +6319334893796554242 139 +7402632997775432193 141 +11021449308525840900 142 +7668313675584212486 146 +8416534454442286083 152 +14786755608460337669 155 +10252394770332982789 160 +10551221318314345989 165 +16096303530760742404 170 +9259785140742614530 174 +14075929275811587074 176 +317926420102044679 178 +779174831516893192 185 +1715448660039157764 193 +4021514903658568197 197 +14867534496075520001 202 +12719282834178743811 203 +17465980749405462021 206 +8925774748288079874 211 +7623696658283396611 213 +17929326859744067590 216 +12671154751486019589 222 +12039326031585824261 227 +18347446751167835650 232 +17064637144737108996 234 +11021218191937939462 238 +13156493120251779587 244 +8337641745437302789 247 +7529617071985650692 252 +15855511622382862341 256 +9880671126311259651 261 +4648648374527148548 264 +9643729509462706180 268 +16079254189330675202 272 +5912862662665074690 274 +3064447562379233285 276 +4679971614763188741 281 +5680163499515301381 286 +13723289572021756419 291 +12449253329930581508 294 +4151764428362670084 298 +11785134993959286786 302 +3078863087420124165 304 +15185198810953060869 309 +8297057339576492548 314 +13461860185754054147 318 +3436285402337504774 321 +14202036946604226052 327 +1429187245268482565 331 +1523079254859276295 336 +16225831803604224005 343 +7556943554185476098 348 +17338728822182943748 350 +16838388931654467591 354 +5518924113746022405 361 +16613589795813448195 366 +16245874414877492227 369 +16854419533518505478 372 +2539676113398158854 378 +12042249427062731780 384 +18319457514850241026 388 +4667739140302370305 390 +0 391 +6381331313726406148 391 +3908582673448970756 395 +12826200984566221323 399 +1008697446161023492 410 +1045330962753696770 414 +12519080959524890629 416 +3292967686690497028 421 +9027706222753190402 425 +7627948746545135618 427 +7113204062919493122 429 +1902402424944787974 431 +8582449967256837125 437 +5093494603780084229 442 +15952412032150427656 447 +11024499228689010178 455 +6599137048949621252 457 +12441911088884211715 461 +587330806707068418 464 +6920270191183132164 466 +6534248742955117062 470 +17914513122977299972 476 +18340097295513629191 480 +13676127406031174657 487 +1387609897069507076 488 +1763073162200316424 492 +10502193626894192132 500 +6191089615101093380 504 +3995303291068676098 508 +12574723308968873478 510 +9457112246136620037 516 +2659981631401145858 521 +5678978765742315521 523 +2321007311402405891 524 +7262894069470853636 527 +5310255954615393799 531 +0 538 +4947937557054473220 538 +16886302206430107652 542 +1841567627260397061 546 +1726903440913575428 551 +14879875423439711745 555 +10406819091468369412 556 +11283521635310509569 560 +3680912523998301189 561 +15838266909581394435 566 +12391804375709570050 569 +1020307774365172228 571 +1922720619059759621 575 +10324920589640484359 580 +7346645981525338116 587 +14105351180271546371 591 +18409889360013782019 594 +4787164988982490117 597 +10284218591671275522 602 +13929073926559228929 604 +13709653197282269188 605 +11724057172276600835 609 +866864533352873475 612 +1687533916118276610 615 +14962991064861439492 617 +3075368686919669253 621 +7596099351713916421 626 +9307207198362792453 631 +7250040662483023365 636 +3682040329320065539 641 +793686382876029444 644 +14333782297404873732 648 +1825793630924954627 652 +84619541393612289 655 +13182271411077086213 656 +9374841722325437444 661 +11891971769486715395 665 +8043937648578607618 668 +14046873830950905859 670 +8968303908578660869 673 +12592319890201396232 678 +11282395698657584643 686 +3688562500562735107 689 +4497389441661304322 692 +864575183575292419 694 +1036491259062044675 697 +14213351843646783493 700 +7708978415027076099 705 +6987701493730463747 708 +4532132061628409865 711 +1889838133194080259 720 +14464742354403783685 723 +11471457412392914945 728 +17301684950834749955 729 +2740600303999292421 732 +1861681694596322820 737 +2466512513818280965 741 +567322683033477639 746 +4219982383453752324 753 +4414272813071813121 757 +18296812503650796552 758 +14106238638274939908 766 +8343039090563483140 770 +12899982907471985156 774 +5995542065075040773 778 +1943074365889546244 783 +16642415363908390916 787 +681630493618758662 791 +4461862742627854853 797 +3899665054961662466 802 +9373615873629220356 804 +1672886650488992771 808 +16881710947150074885 811 +5794767402723235334 816 +5402108652823464964 822 +11161133355542430211 826 +17005555433296348161 829 +16516779711980265477 830 +1238971681242829316 835 +7495779865157534723 839 +5869815147311233538 842 +12543930235265506819 844 +16347355750539933194 847 +1618182687158588418 857 +5475339393482339330 859 +1820163941351445507 861 +9781870903757679621 864 +6959962931369883652 869 +6165520526154289668 873 +4608135616958660097 877 +5347147311423033859 878 +4274882894736749062 881 +12469579236131750918 887 +14358338421054221826 893 +14307263809632171012 895 +12240285085875511812 899 +3612936311740236807 903 +15402889954020054020 910 +4862865790365874693 914 +12873671979026176002 919 +5762125948543834631 921 +16549663359069884422 928 +17127464586321114627 934 +5489118657490741761 937 +1439915557249128451 938 +5591921604825754115 941 +12215727902556801029 944 +1292449902890727941 949 +252852670543746566 954 +6662678800904557571 960 +11937079555774719491 963 +9580831801307231749 966 +585888224829458434 971 +2614731491636606978 973 +4039106186911400965 975 +85542184548733958 980 +1232905200495278082 986 +12898496382527018499 988 +4488285801271117316 991 +5603423086377753092 995 +2857864416179998726 999 +100295911725428228 1005 +15911528881864497155 1009 +10785833246735411207 1012 +7176774503550155271 1019 +14860337537539733508 1026 +16041518408725938691 1030 +11338701253034655748 1033 +14943908174444697092 1037 +3242489974158897670 1041 +3082940798033554949 1047 +3158850387764404229 1052 +2812954313732796417 1057 +17857707129346166789 1058 +5269004761822808068 1063 +6111611187710453252 1067 +7026790498114792451 1071 +10421187431999041539 1074 +10962946788411535365 1077 +11508567829579753477 1082 +5586796232331222020 1087 +10664688802114188290 1091 +7101223008705196548 1093 +15730557498751873029 1097 +15622178182517453828 1102 +13023280475588667395 1106 +12736192986547669507 1109 +54449156097307139 1112 +7793412450098625026 1115 +13082902456897469447 1117 +11032923750376691202 1124 +768621266939883522 1126 +7680301716982797315 1128 +2529765954999401987 1131 +3092278718215461382 1134 +9721979104592801286 1140 +7638965909717933573 1146 +14786119811292616708 1151 +6950372959952776705 1155 +12443107208611825154 1156 +9339657551534781955 1158 +2637569863210881541 1161 +17203452450577793542 1166 +17969146007912340484 1172 +2200068367901267460 1176 +12757405660591319556 1180 +2215466944120424966 1184 +10360201018982236676 1190 +8757372217936483331 1194 +4619739097826383361 1197 +5258481580443618818 1198 +12767191547735252995 1200 +709131867671395842 1203 +14381518510326427139 1205 +7474380832040809474 1208 +10420528068240579075 1210 +4871472258172502537 1213 +14752872109699970567 1222 +1512107771448952322 1229 +8931318797796630019 1231 +17442635440581817347 1234 +6352160538927010308 1237 +7854574878209706502 1241 +12790477974029380098 1247 +1694268250394806274 1249 +18190476908103646723 1251 +6347737109409161731 1254 +18109962854929396739 1257 +18427225309876158471 1260 +9821587521358472709 1267 +6090671432051474948 1272 +10840793900646830595 1276 +16995529728013218306 1279 +3884460060356541442 1281 +11328174051558773766 1283 +2190762182871099394 1289 +10795994333162192385 1291 +5749185296348500997 1292 +15519907096103866882 1297 +4660993720606920707 1299 +865021105594269187 1302 +15732547829511033859 1305 +10370189278075376644 1308 +5643403162652225545 1312 +7491082473953581573 1321 +10267635999979525638 1326 +16917208132136155651 1332 +14938122712096231426 1335 +10458787752950376965 1337 +4661643778774054919 1342 +7378032314220749314 1349 +18262506560361936388 1351 +1777721411781745668 1355 +16284189979364697095 1359 +465731536183074823 1366 +1279204163871993862 1373 +1281083695929372167 1379 +1248628108208937989 1386 +16877732867220667397 1391 +12694354789085753351 1396 +11607902699193694212 1403 +4736550549618409987 1407 +3707377337025079300 1410 +15252497877242817539 1414 +1387328235986371593 1417 +6603032558061404163 1426 +17360253640789048836 1429 +4366853681792936456 1433 +12654867339467232261 1441 +17526554569512741895 1446 +17362261302665304067 1453 +1571924693327722498 1456 +5346032278378646020 1458 +4905765968575512581 1462 +6735440265877186050 1467 +2684582464658702853 1469 +12305455794035352066 1474 +10214763548894856708 1476 +5898818347968949767 1480 +8853876862443757062 1487 +1778255355643845123 1493 +9880096907488009732 1496 +14128719217189307399 1500 +1038097769717637636 1507 +16182828358028252163 1511 +9758783803467969029 1514 +5734508289193397251 1519 +17317991154864180229 1522 +3929011798945830403 1527 +2397676608572967937 1530 +15050420126488734213 1531 +9030951389346630659 1536 +6828609694434054148 1539 +15161672926172597254 1543 +12561916901436574724 1549 +13175017957196582402 1553 +5163667233751697414 1555 +8298531402410056193 1561 +3302216018490556417 1562 +8188022378496687108 1563 +6899994089344537605 1567 +14371356649301229570 1572 +6234142974089459201 1574 +8108331937702179332 1575 +6988695179225596420 1579 +4783268154102625283 1583 +5158962768530123268 1586 +8451852824882960900 1590 +16684923005574289925 1594 +435360132353818115 1599 +11179708428252470790 1602 +12560590898560496643 1608 +9052444957053236231 1611 +6942914933011863557 1618 +4685132753411777032 1623 +16127598791952926725 1631 +17139405263038539779 1636 +14416974839438770179 1639 +184674079454644738 1642 +15371113443157556742 1644 +6125564898470072836 1650 +6049476413298229761 1654 +2016046076376584709 1655 +9102901609995427333 1660 +14279380086715328002 1665 +16071171343743534084 1667 +3003661872837116932 1671 +1544053734049606146 1675 +17912839388887512068 1677 +18367485572659629066 1681 +62486557281101315 1691 +15341749693046047746 1694 +4462259451528626691 1696 +2198440243211776514 1699 +1739990500338348548 1701 +6736705032720670728 1705 +460022204996210692 1713 +13316259771467543558 1717 +11844773108515011076 1723 +13208087868677074947 1727 +15327490137854692355 1730 +12082487592532424709 1733 +16377323572476873736 1738 +0 1746 +622886781057602561 1746 +16338526270417904138 1747 +9002667202186955781 1757 +8853816989295250439 1762 +11704947860454198788 1769 +10586310579976363524 1773 +12274078960777730562 1777 +9504312777814311939 1779 +12938939440083727877 1782 +4482870732030096900 1787 +11469312931933075457 1791 +3010319078507518468 1792 +11746036803692802052 1796 +2845804857533704708 1800 +6113501269614124035 1804 +1300574605566718978 1807 +10066236704043377154 1809 +7972385596552911875 1811 +9467192894482478598 1814 +14898777861151503875 1820 +1944274375974874115 1823 +10386723956120624646 1826 +18320025862115844613 1832 +1387818835494813188 1837 +18296018469774430211 1841 +14855935328857078786 1844 +6009618969907709956 1846 +2589125298910864388 1850 +16233494802218098697 1854 +2481120375688643077 1863 +17348525962385858053 1868 +12345390066536357892 1873 +11898897602124667396 1877 +2640139887503545347 1881 +6231765986224989698 1884 +9439401787143523334 1886 +12293464382470856197 1892 +16085904910360067589 1897 +7252534814412510724 1902 +11702778818573550086 1906 +9474460568585535494 1912 +5394564267141025283 1918 +2149355951313254402 1921 +17924873918814083585 1923 +598191802606476803 1924 +8284578931129436164 1927 +10209356185787986442 1931 +1435256119122221570 1941 +1751234962195953666 1943 +4311520098760549381 1945 +14246310464944558596 1950 +12371324908926062594 1954 +1728194076248328196 1956 +3206212432676588545 1960 +608028375064114693 1961 +12735035537535459848 1966 +1161317385392644610 1974 +5963411090947829250 1976 +14747492552155802116 1978 +16061594303567645704 1982 +11401558272625990148 1990 +9760118054252460548 1994 +1590553955289263625 1998 +10340997646340822531 2007 +523412383725034499 2010 +611878128332703238 2013 +16958179163660410371 2019 +4049722845406929413 2022 +7868172937392666114 2027 +5918378978107988996 2029 +12787502422435844615 2033 +1060009293879599108 2040 +2360292516675315714 2044 +9882807690136518146 2046 +14696092264443978756 2048 +1467831371341617669 2052 +532975774202937346 2057 +11905286291268558854 2059 +531011598217908739 2065 +828942665123565063 2068 +16920169218690190853 2075 +7591945855482943490 2080 +14985689627450757635 2082 +14044560149551330824 2085 +17188203557127851010 2093 +12477774362747447814 2095 +1435155859536064516 2101 +1383226851914584068 2105 +5950622975418741254 2109 +11573330487936600066 2115 +3499677126004927489 2117 +7754519505545821700 2118 +3063606795384108551 2122 +9141715975960833030 2129 +184455528113873410 2135 +14290946452897026052 2137 +3303218105480425475 2141 +4921212561864013316 2144 +11659206998782866434 2148 +3483784077328335362 2150 +15349300100599457794 2152 +2991158137975641607 2154 +11671836184239777283 2161 +13903348973527331847 2164 +13972685059135606789 2171 +5067855901273612291 2176 +11203581229879824387 2179 +7398166954536630787 2182 +8137301061780033541 2185 +14461051202225956357 2190 +18364391265692359173 2195 +13202854215310531076 2200 +8735953751694682627 2204 +15668075878531113478 2207 +12181518985980303366 2213 +2996117190304599556 2219 +6321134583181571077 2223 +18292784224560228355 2228 +9730339360761143298 2231 +15423393047428954630 2233 +2289663845294497287 2239 +17293282718410542598 2246 +16848796704425902087 2252 +15868806819374243844 2259 +7170876063537340419 2263 +7450653208363214856 2266 +8532024281356555270 2274 +16059255557578908162 2280 +1877124332184628739 2282 +2891997770652300804 2285 +9380477352886239748 2289 +0 2293 +18421659490129039873 2293 +10046669908312212994 2294 +5751756535955732485 2296 +9063799367706849795 2301 +197150231261699074 2304 +12240146887946385922 2306 +14309589056601523716 2308 +1624985398293287428 2312 +7587234449739517958 2316 +15018247234507853314 2322 +14339897192752756740 2324 +241576182571638276 2328 +8692544418167008260 2332 +18142354925381021188 2336 +4357033544932333062 2340 +17783269028567291398 2346 +2150566123188780038 2352 +6826864893756137990 2358 +2570512448148033537 2364 +3926559756499773957 2365 +7320130823370788355 2370 +8279967564081321986 2373 +10487133814282217989 2375 +4474596476108096515 2380 +9162424448056197124 2383 +14148207203733810691 2387 +17544170151884681732 2390 +8376160833193445378 2394 +17178210789916656645 2396 +168694152552959492 2401 +8301334775237721091 2405 +5366880444274330116 2408 +2275685050251168772 2412 +5129073922893954566 2416 +7337914693295266824 2422 +9232645461774346756 2430 +9281558265232282115 2434 +17538929436013548545 2437 +8171970898838379521 2438 +407976145144453637 2439 +11917619836674704901 2444 +7463384942613006339 2449 +11628547823982306307 2452 +8367507709438611460 2455 +7426323158152134659 2459 +4692304143317559813 2462 +3164999859583895048 2467 +2475 +7352605297446749095 +7088047764357120496 +1873618248285620134 +15293063541372749212 +6979009792504496341 +3755115258874496180 +2534438137508857227 +7299919415988454234 +18411981910273949730 +17205553309096936780 +5248951067483899801 +7247233534530159373 +7192573503860179570 +6928015970770550971 +5302201063430293086 +14184058584951490062 +5354604945682204822 +7139887622401884709 +5727354401416546391 +7351759274033218447 +7087201740943589848 +6979855828815315184 +7299073392574923586 +3886521448658569638 +72483853 +6979009762410823886 +6927169947357020323 +3226253748217055407 +6926323880952529025 +15291089452348344358 +11366435697098950012 +13310078522289489702 +28484163972630126 +619366483213223113 +2795970204732164463 +6206321690771458217 +7087201710849917393 +15287705195328439433 +111740332 +7034515829391622532 +15882855708138472805 +7299073362481251131 +13237708561380147209 +9273081553817896179 +7246387481022956270 +18029523497279423740 +6927169917263347868 +13513632858282984745 +7193701599564661409 +7139041568894681606 +15802896446603200075 +7086355687436386745 +7033669805978091884 +17956211270007850924 +4563816462554630517 +11129540511026317143 +13237708531286474754 +7194547635875480252 +9003675253593868694 +18413109975884759114 +17205553334892496668 +7193701569470988954 +1413046541639878608 +946825488890267006 +7033669775884419429 +7352887339644027831 +12155898262057583711 +2989761681675846645 +6980983894426124568 +14604797433968658301 +18412263952471228466 +7245541427515753167 +15292781524969719388 +15846041951231805521 +7192855546057458306 +1873618493337240604 +6928298012967829707 +11016920455496205379 +15289961373839132475 +7085509633929183642 +10531295876509927661 +9870724660790479 +17144416678735644465 +429916096632 +7353733375954846674 +7032823752470888781 +638094591060870297 +16092841662109387098 +7301047494496551813 +8541237495103949042 +7818890396069135776 +5178673286195185763 +8250235334236768512 +1841584140945524876 +18412263922377556011 +6928297982874157252 +7141015700909982288 +7192855515963785851 +1836789879294462027 +9870724716497203 +14947088600271026 +13702113181256910523 +7140169634505490990 +10225919154718574698 +7352041286136824728 +7087483753047196129 +10864467494618334192 +1773948700787017845 +417019004815 +7032823722377216326 +14193031196214429556 +7299355404678529867 +17264773178461980386 +1278770520813602818 +6980137840918921465 +18411417898964025363 +11722522519282124676 +7192009492550255203 +9870725379720958 +6153353810106713963 +4536471466122020769 +6927451959460626604 +1127379439846033088 +6204347640438458139 +7139323611091960342 +7141015670816309833 +292816209 +9407029712610658618 +6600019782220383520 +7300201440989348710 +1682680374277112930 +4859408499100419349 +7247515559531053849 +7299355374584857412 +18411417868870352908 +5272120000921863921 +16551960241296116093 +6927451929366954149 +17186370626574550605 +15292499534362314294 +7139323580998287887 +7086637699539993026 +7298509351171326764 +2625321593698060269 +7033951818081698165 +6979291787411718362 +282724672 +15692070679858513338 +6926605905953423501 +17630638801202448322 +7247515529437381394 +15043322321877076105 +2792885536610780866 +1845823063 +11773758314556753827 +6176104209096443228 +7072090857947137391 +16846695548644688878 +15291935475760760928 +15459386004803160013 +8343160331046226180 +152372727 +7034797854392517008 +13108405724425291903 +7354015418152125410 +7298509321077654309 +929260878924941285 +7033951787988025710 +16107267423789974637 +7246669506023850746 +5138916826085984492 +7245823439619359448 +28766150282052641 +11719741672025753203 +9945828332568577291 +15282335361333069253 +7085791646032789923 +1899651063193470519 +9391897706793207408 +7354015388058452955 +11398792770463140027 +7033105764574495062 +2572415617593705468 +8983295826499536249 +14732267094484321768 +6925759852446220398 +1714226175 +4310109704341227252 +4227285979208156735 +161798587300055395 +18413392000885653590 +1732546113203799682 +7246669475930178291 +90526560417220980 +2522831856378709294 +7193983594471883430 +1378362890422519435 +10318013789890151505 +1910933862240552025 +14683276054533375891 +7141297713013588569 +4847114588453668997 +7353169364644922307 +1934287791725413661 +7033105734480822607 +6981265919427019044 +450064107389060609 +11929763 +6980419853022527746 +18411699911067631644 +7193137571058352782 +7198684663705634814 +7192291504653861484 +17174064760732583170 +1801586532 +7139605623195566623 +524384476410218364 +2209547647594924308 +7032259711067291959 +7526932862385391531 +7353169334551249852 +7931231880446346780 +7300483453092954991 +3584013211340638230 +6981265889333346589 +18412545947378450487 +6979573829608997098 +18015051914722281720 +10683744 +7247797571634660130 +7193137540964680327 +18411699880973959189 +7140451659506385466 +14383047196674041 +14448472746991225173 +7352323311137719204 +7087765778048090605 +7139605593101894168 +33560403334269270 +7806125477758371395 +1574206491118601300 +16092233475575710729 +4721835318523791115 +15292499560155382992 +6979573799515324643 +13614615898053870661 +6927733984461521080 +14782687056266790897 +6926887918057029782 +7247797541540987675 +2843459484954527603 +1786086408025671247 +9289441360305064013 +7138759569688363520 +5566476498435049615 +6672837949675865094 +7352323281044046749 +5459976717197837927 +2325612370 +16165083394671708123 +7087765747954418150 +5566476532828210437 +109033155035858516 +7299637399585751888 +5246976991356848017 +6927733954367848625 +15292499547258292377 +7246951518127457027 +7244428084583335163 +7194265636669162166 +7086698151192823114 +10049924856077420313 +7086919724540887502 +7138759539594691065 +7298791376172221240 +7086073658136396204 +15289397375427675165 +8052454368722028838 +11251542888998503501 +14003328469233502159 +8631928107028383434 +18413674012989259871 +2528053666090387191 +2624757569491043976 +2907319229923985027 +6926041864549826679 +15291935475760891195 +14871830661500634496 +6154481914409125818 +7194265606575489711 +12484855343804385078 +17299513090802386086 +9870724574938647 +7086919694447215047 +7034233812988920186 +7353451376748528588 +15289961386737730869 +7298791346078548785 +7246105464620253924 +17094850760611596031 +6981547931530625325 +15287141218410562876 +12642214096204597433 +7193419583161959063 +18443164073222080895 +491719075 +2844912017228892087 +12020808312486430123 +6103488045384926186 +70256349 +8556410824327300183 +7033387789575389538 +12237172509275325915 +5893456428412241171 +1576180593040230658 +7353451346654856133 +1201738978701542472 +7032541723170898240 +7300765465196561272 +18412827959482056768 +17018729383741883913 +7193419553068286608 +16870411475888572178 +33278412725618157 +10808445661528262808 +15228627241849521321 +10895941260599690580 +7140733671609991747 +1893141935297136496 +7762829005246892330 +814482688 +1873618476140922442 +7352605323241325485 +7088047790151696886 +7033387759481717083 +29894172902294792 +7245259411113050821 +18411981936068526120 +7299919441783030624 +6980701878023422222 +15293063567167325906 +12913795363565864010 +18279521768686553293 +825323228049442984 +2366626164980320297 +7192573529654755960 +6928015996565127361 +7511405001902393465 +12020126521146280357 +17297538988880889455 +3169683337105049483 +4320397392167437764 +2996806038868067480 +13880529192106525749 +12258258950024070758 +9457728271880882414 +1948083978070788460 +7088047760058024431 +6747869491765118557 +396563964949038476 +2283061350295603413 +18411981905974853665 +9870724676257796 +6979009788205400276 +1873618463243831315 +7299919411689358169 +7247233530231063308 +7192573499561083505 +6928015966471454906 +13172383304428291992 +7139887618102788644 +9894329350782060506 +5622264594716035131 +7351759269734122382 +13970089714745935549 +7087201736644493783 +11780790212937254859 +5640826309532256347 +6250067602413848771 +7034515855186198922 +1997667752184056011 +6979855824516219119 +7299073388275827521 +8773391357768107870 +6927169943057924258 +5386265453423232211 +6979009758111727821 +2245985413502404712 +7139041594689257996 +6926323876653432960 +8472178325545420517 +7299073358182155066 +7034515825092526467 +13237708557081051144 +1249061871705589231 +7246387476723860205 +18413110001679335504 +2791055589805656257 +6927169912964251803 +916886386616763786 +15801863628634588225 +8864802475807081547 +2308422057122989461 +9870725183834332 +12011043047629784321 +7193701595265565344 +2203332293412784251 +4203593881757353951 +8253013595490092090 +7139041564595585541 +7758389320980628720 +7086355683137290680 +13519837262133135719 +6064762127302393958 +7033669801678995819 +6985684972259117296 +10277194893975947111 +11865320555827824922 +13067141397934573091 +2940293779302123205 +13237708526987378689 +14428924761094490470 +18413109971585663049 +7194547631576384187 +8910270495612602670 +7193701565171892889 +11835120105125054734 +7353733401749423064 +6922632561930405347 +7352887335344931766 +7033669771585323364 +18412263948172132401 +7245541423216657102 +6980983890127028503 +17070057731888842956 +2071645033680471512 +6156737994042444103 +13228094635257760069 +4799330753387759873 +6928298008668733642 +13889891850651109005 +7192855541758362241 +7085509629630087577 +13143536835616770002 +8031770806726101038 +9140276259359819415 +7140169660300067380 +17094376519214238045 +1693503902275602273 +5778348214553282767 +1773948726581593258 +7032823748171792716 +12757875056923772971 +7353733371655750609 +16812272571148667179 +1009366474452567451 +7301047490197455748 +18412263918078459946 +6108201112818484768 +2707637655416932544 +9407593762612381184 +6928297978575061187 +7141015696610886223 +5214737420442796133 +15394822466617411907 +7140169630206394925 +5109952608322914327 +7032823718078120261 +7087483748748100064 +7352041281837728663 +18411417894664929298 +16275783350713190092 +1092700946662950361 +7299355400379433802 +32432389312218921 +6980137836619825400 +6927451955161530539 +7604559457759135281 +5728764444738258095 +7192009488251159138 +7139323606792864277 +16857332490755245458 +3343560 +464309651771 +11312578691943499042 +10024345359443035686 +5353476841380448450 +882239428633953381 +12060668540762391720 +2052891733976941648 +6979291813206294752 +7300201436690252645 +18411417864571256843 +7247515555231957784 +5887022448955360480 +2787671392973227504 +7299355370285761347 +6619090118045271448 +879419277503366844 +2008078727273646424 +15865913240105781170 +14383064393516769 +12743882002561632192 +13555232411643742491 +15289397319538705607 +812124046 +1873618514833704373 +7139323576699191822 +7086637695240896961 +6908100892141816223 +7298509346872230699 +2695321185936868691 +1945545813249623166 +7033951813782602100 +15289397353931868102 +6979291783112622297 +9632241780191791292 +6926605901654327436 +1631882651478525035 +7247515525138285329 +7245823465413935838 +4442788352416548793 +4443634474708830204 +3239382674005951948 +7034797850093420943 +8597138013777561025 +7354015413853029345 +7033951783688929645 +7246669501724754681 +1873618519133194353 +5462796868327441521 +16038494049631274362 +7245823435320263383 +17008002440344700481 +10420287313124918500 +17164650024200374474 +154011658 +7193983620266459820 +9611454020314924519 +11422235346247419176 +7085791641733693858 +2621625390044283947 +7033105760275398997 +2577002748724381918 +7354015383759356890 +6678552048861382680 +6925759848147124333 +2118540511074649695 +18413391996586557525 +6980419878817104136 +11485232201928082493 +14154340218780386747 +7193983590172787365 +5357989108122126648 +6154199898006423584 +7141297708714492504 +7353169360345826242 +1873618252584388545 +15287141218410825094 +72513270612231730 +6981265915127922979 +6980419848723431681 +7193137566759256717 +4985063574640920329 +18411699906768535579 +14463310864315779363 +7192291500354765419 +8998114985810134320 +10207847739528775756 +12638147294677239230 +7139605618896470558 +15287141188317152890 +7032259706768195894 +7353169330252153787 +13725680859840121166 +7300483448793858926 +5257405381051615158 +6349026413187499377 +18412545943079354422 +6979573825309901033 +7193137536665584262 +15292499474174116987 +2789363547278214886 +7247797567335564065 +4223816177647289670 +1873618458944604000 +9181763921242359034 +4000515045254367287 +12910411188229637865 +7140451655207289401 +8515376925833300352 +7087765773748994540 +7139605588802798103 +7352323306838623139 +7299637425380328278 +8484110780235385151 +11640650963542673608 +14101060887774700 +6927733980162425015 +13724983541464369033 +6979573795216228578 +1419747374885111438 +6926887913757933717 +1930668198955452810 +7138759565389267455 +7087765743655322085 +5675796533981283930 +92079366 +7086073683930972594 +7299637395286655823 +14383047197066244 +6826664259619390926 +7246951513828360962 +6927733950068752560 +9870724846126197 +7194265632370066101 +11653222680468915374 +7822735708193293328 +7086919720241791437 +14378284476977055283 +11527067173424792740 +7298791371873125175 +7086073653837300139 +212338786 +7034233838783496576 +498701699429 +5514354658380875071 +4770844606942742432 +12507909061331388812 +16431008191725831459 +7558005371879032024 +6926041860250730614 +98436550 +15287987237524997760 +18413674008690163806 +571813020932180290 +162989216 +5152482613269497204 +12689613402799605552 +11847668771932013896 +7194265602276393646 +550243203354855282 +17971473236626703405 +8937544163598010547 +15091099644146747549 +7298791341779452720 +7353451372449432523 +7034233808689824121 +6981547927231529260 +7300765490991137662 +7246105460321157859 +18412827985276633158 +16505476999257589058 +12490303189019657716 +7193419578862862998 +11945800880170403371 +692605700306896591 +16294470476861867997 +11823044541028697510 +7033387785276293473 +7354297408760251366 +985637089627933081 +7032541718871802175 +2635993685958396071 +9894523072925796113 +7300765460897465207 +18412827955182960703 +3485224758199257354 +7193419548769190543 +12430143129524439379 +2380943364365616692 +9305145756033811687 +7140733667310895682 +7352605318942229420 +13486365294955398350 +18383714950999639313 +7033387755182621018 +7088047785852600821 +7299919437483934559 +9870724671539207 +7245259406813954756 +6100103917337838794 +2517386234133546535 +6980701873724326157 +5406444717745899883 +18411981931769430055 +7192573525355659895 +16358593412853139153 +6928015992266031296 +12424382439595705495 +7139887643897365034 +10906583509962065513 +2691365739792435341 +12452979941127620409 +2625321597996828341 +5558136804797384674 +17944163576803951650 +7299919407390262104 +18411981901675757600 +6979009783906304211 +6928015962172358841 +6926323902448009350 +7247233525931967243 +10714918364066023692 +14383042897708902 +9562777431589128006 +14399056675416442168 +7139887613803692579 +7087201732345397718 +7351759265435026317 +1094393045078770756 +6979855820217123054 +10709931946762503359 +7034515850887102857 +5782296465685677189 +7299073383976731456 +27356072568228011 +9870724725998874 +10305085813919844606 +12189320918056831076 +2625321585099736377 +6927169938758828193 +813631719 +2538734585 +6926323872354336895 +3722579929450415844 +7139041590390161931 +8109001260751259400 +2103039510800303200 +6591652942651787148 +17675072908219975424 +2113895771772946077 +13237708552781955079 +13964897540691461690 +7034515820793430402 +7299073353883059001 +4081176587746805898 +18413109997380239439 +7246387472424764140 +495542969232394639 +285870162 +14714880334493255623 +13730298810256196609 +7139041560296489476 +9870725380375539 +7193701590966469279 +7086355678838194615 +9087257516001788955 +6500635606105786312 +5353476845680198762 +6293435923465308245 +1042835216333014619 +3191712388857988942 +7033669797379899754 +2791055637096302358 +8238066788924721312 +236521418 +7245541449011233492 +6156456003434055403 +14045391212846450114 +5142301044413892722 +7194547627277288122 +32432363518297616 +33560403333547721 +18413109967286566984 +5779476207078738131 +9870724609606766 +16854238106389710928 +7396235467053271442 +13369405230387234641 +7353733397450326999 +12370327100086618251 +8954142712877746247 +153456695047357500 +7352887331045835701 +6153071780807312570 +7033669767286227299 +11662233534561978119 +18412263943873036336 +28484129580255433 +13672484538110837999 +7245541418917561037 +6980983885827932438 +1873618484739049391 +1469680747315529380 +6928298004369637577 +7192855537459266176 +5778348193057605937 +7085509625330991512 +421317903336 +7140169656000971315 +7353733367356654544 +4312966040774706541 +236453759050 +104307364886481272 +7472754 +7032823743872696651 +6980137862414401790 +18164832428166481311 +3342493899775477828 +7301047485898359683 +17149817495305717253 +18412263913779363881 +17947829764244047033 +15691697526684648453 +7141015692311790158 +1873618454645376268 +15685038007044278084 +7140169625907298860 +13816341447826081654 +13938987348593804675 +6366943767402055912 +12279042692635953334 +7352041277538632598 +7087483744449003999 +17619527108083517127 +7299355396080337737 +16737240503404332379 +14932478444660590859 +15273884660262765959 +18411417890365833233 +6980137832320729335 +15287705229721143272 +6927451950862434474 +7192009483952063073 +10354526296759273115 +460010554417 +5572809636517250537 +7139323602493768212 +13925023889216243624 +7300201432391156580 +1518418403436004696 +3523407702141503062 +6979291808907198687 +17299513159587988488 +7247515550932861719 +5269329687486663025 +1491033538627700799 +11619890057073068122 +9733674716123433175 +17461812064821184287 +15288833316828087421 +7139323572400095757 +2322094249834514694 +7086637690941800896 +3693573093146429379 +1873618527731189820 +1782138217079048145 +7298509342573134634 +7033951809483506035 +28202057289434486 +5150516383306155674 +6049123076685497339 +2625321585099868576 +15703528257170507956 +13819044485072465 +6979291778813526232 +7245823461114839773 +6926605897355231371 +12241985901088998680 +18141240613009360196 +16530489490799724510 +7085791667528270248 +1873618510533364055 +7354015409553933280 +2553424131400403162 +7034797845794324878 +6204347606046082147 +15292138696292895124 +7349438249010596137 +434216371783 +7246669497425658616 +29894241687898103 +7245823431021167318 +7193983615967363755 +11123291787522213546 +9870724570482570 +13819048784561829 +32150304124504126 +16911052854443771624 +7085791637434597793 +3866984390250988963 +7354015379460260825 +16425638839461283996 +11957902820310123780 +7033105755976302932 +2373415502940997012 +6925759843848028268 +18413391992287461460 +4141551246163838791 +14505034101877245842 +15292781563661912115 +6980419874518008071 +7193983585873691300 +2850570111682611307 +5034923912583317800 +10169273990111757991 +14375674833933502504 +7141297704415396439 +1467988623105721525 +5510538250602219377 +16573157102592722994 +7353169356046730177 +6981265910828826914 +18412545968873930812 +7861398105913427821 +8429692928904464468 +7300483474588435316 +13774681046469379319 +11406639409630546199 +18411699902469439514 +7193137562460160652 +5246976944067250249 +6980419844424335616 +13940478354871813627 +13701595356116681867 +16426766960961390571 +7192291496055669354 +5340613827489301924 +7139605614597374493 +11949535933962127511 +11248024162254325150 +5213027855012595380 +13150190137466815618 +6351416861983902064 +1467988623104476637 +7032259702469099829 +15292217517958891213 +9870725207164369 +755605599842665995 +18412545938780258357 +6979573821010804968 +17933750666284107619 +7300483444494762861 +7193137532366488197 +1880166547305399311 +7247797563036468000 +7140451650908193336 +7087765769449898475 +7352323302539527074 +17682574712751982576 +7299637421081232213 +10223260478366353693 +11663374006463433041 +9077802184452213114 +613166273235716174 +6979573790917132513 +2137124098070087866 +6927733975863328950 +878291220490619127 +15361003727878554622 +6926887909458837652 +29330208881903963 +2152780467316000177 +5357989129618589597 +7646567114842638318 +7138759561090171390 +1466296546184988453 +1873618239687690255 +16874641756321417469 +7086073679631876529 +1584662439 +1811826159652440291 +7299637390987559758 +12802594135359554633 +10846196352290785698 +18413674034484740200 +6927733945769656495 +7246951509529264897 +6926041886045307004 +5458848587100981366 +7194265628070970036 +429917013116 +7086919715942695372 +15287987297712736594 +10756726237632137002 +7034233834484400511 +15290807375757707399 +7086073649538204074 +7298791367574029110 +28202074486146284 +9392472737220396979 +14847634415788360916 +15289397366829483851 +6518315999997593014 +15290807392954288538 +6926041855951634549 +18413674004391067741 +7194265597977297581 +527217511716357463 +16363166289661921249 +17620704769380124659 +447112350000 +16699231963845560721 +13522668423781746725 +7298791337480356655 +7353451368150336458 +1894834111096227152 +7034233804390728056 +7300765486692041597 +18412827980977537093 +6981547922932433195 +7246105456022061794 +14266293419834869195 +9302231382455945522 +10803332050175068476 +7193419574563766933 +2211239741711975644 +11079423192795514730 +1945545830446729386 +7140733693105472072 +8758866611300140123 +15936300577150731882 +7354297404461155301 +1873618467543975108 +1040015035110261938 +2710531354671711585 +14424533014481667245 +7033387780977197408 +7032541714572706110 +1459422918 +9870724626318937 +12478172948446053915 +15292781563662043248 +1732546104605738522 +7245259432608531146 +7300765456598369142 +9944700266957440235 +13252643833684952629 +18412827950883864638 +4896553002078767161 +30458188511250577 +18359396230774917168 +7140733663011799617 +11272180868443080721 +16874923798518695576 +5885976095793742930 +7088047781553504756 +7352605314643133355 +7033387750883524953 +168849237244052984 +7245259402514858691 +18411981927470333990 +5249797159683556626 +7299919433184838494 +8328636978065704368 +6980701869425230092 +451651625195341092 +6928015987966935231 +1873618501935892373 +7192573521056563830 +11737382248731378999 +7139887639598268969 +775817183132189744 +15801421542798591337 +3273906465467926857 +17504806456180148447 +4999048390027118623 +5949516568421532902 +6979855846011699444 +14540810596246029752 +15290525359354677342 +17939521450163242260 +7318928098821080086 +7299919403091166039 +6979009779607208146 +18411981897376661535 +7081697764708451986 +7247233521632871178 +969023931668825518 +6926323898148913285 +8108333368108254535 +7139887609504596514 +18169457873000663376 +7087201728046301653 +17740106858442524965 +7351759261135930252 +7299073379677635391 +13010413693461201911 +6979855815918026989 +5910883915778885296 +7034515846588006792 +8618954206934992460 +7246387498219340530 +18129074234833831896 +6927169934459732128 +1873618540628542454 +7139041586091065866 +10442852986254656567 +2395019873428113205 +6926323868055240830 +468604683425 +8087249190780536753 +1251886678142749075 +2719268023842506192 +15484720670843995730 +7741956108160599025 +12822961480931869999 +7034515816494334337 +7029767686712723344 +10163069590560376057 +13237708548482859014 +7194547653071864512 +3698377064121436540 +7246387468125668075 +18413109993081143374 +3404560976776923069 +7139041555997393411 +7193701586667373214 +450980818488526510 +7086355674539098550 +9249568750854341715 +6153071806601889139 +1873618446048036460 +7033669793080803689 +7245541444712137427 +6980983911622508828 +18413109962987470919 +7990307559300466109 +13222096480399393786 +1197790749063775841 +12902749409780696076 +7194547622978192057 +5561192151909205460 +7085509651125567902 +3357575107008071546 +1873618544926787278 +7353733393151230934 +7352887326746739636 +8268575981438895233 +6716515055005533871 +6980983881528836373 +18412263939573940271 +7245541414618464972 +7192855533160170111 +15289115337529558626 +13365777358560822813 +3028626790437816712 +6471725307461895704 +6928298000070541512 +17785259814435424400 +848960360419623992 +3511510786883322944 +1873618497636533880 +7085509621031895447 +7140169651701875250 +7353733363057558479 +8373123327081842861 +7032823739573600586 +7352041303333208988 +2947421221745985235 +15287987271918683167 +747201041967810181 +7301047481599263618 +6980137858115305725 +17447639780156180862 +504901560953342357 +7141015688012694093 +2524806052879271814 +7140169621608202795 +10940245256426751073 +7087483740149907934 +14383051495835695 +6176793320558560244 +7352041273239536533 +7300201458185732970 +9870725054269136 +18411417886066737168 +6980137828021633270 +15169666149850743870 +7299355391781241672 +931541139053413675 +11888218815508972893 +6927451946563338409 +10585391818487171337 +7192009479652967008 +10367111403802331152 +13105031987622054228 +5541264770713322802 +7139323598194672147 +5432665585007396118 +879419204419586170 +7086637716736377286 +1388146554381010284 +14288862971683801479 +16285378285009240167 +39519722 +6979291804608102622 +14947330030372718319 +7300201428092060515 +9009348648356481082 +9870725377033977 +14338844047743256282 +7247515546633765654 +10576074740845971129 +15288269284021110607 +16485145185525761680 +4927877544240416780 +7086637686642704831 +7034797871588901268 +7298509338274038569 +6979291774514430167 +7033951805184409970 +6926605893056135306 +7245823456815743708 +5701497137720395794 +13553803778814903538 +15291089469543613858 +15293909556187366880 +7085791663229174183 +7034797841495228813 +3459957951274485460 +7354015405254837215 +7872981627489289774 +6925759869642604658 +13088377121872283058 +5780604350074062210 +7246669493126562551 +17785259857426319623 +9870724661970361 +14101043691849748 +18413392018082037850 +4009970402599045444 +12596269962708321697 +7245823426722071253 +15417905864638990439 +13819027288885075 +2235142484806141593 +7193983611668267690 +15290807375757968455 +2061656954403227379 +13749155634582652047 +7085791633135501728 +5352762575340504654 +9231301807315879437 +7033105751677206867 +11733354 +6925759839548932203 +879419277504153303 +18413391987988365395 +6980419870218912006 +7093139039356454668 +245051885476 +7193983581574595235 +7192291521850245744 +5670079292018853456 +1731418116379051588 +7141297700116300374 +3295137431799203195 +15287141209812633373 +7353169351747634112 +7300483470289339251 +6981265906529730849 +18412545964574834747 +18411699898170343449 +6980419840125239551 +7193137558161064587 +7140451676702769726 +9282455518003529325 +7192291491756573289 +13517017123900556406 +12909283101122299560 +13001682132658816270 +7139605610298278428 +268323666682316511 +434215519994 +5195983173921998653 +7032259698170003764 +12400858092474729508 +1049541662233592999 +1652992377389188147 +9870724610131038 +6979573816711708903 +18412545934481162292 +7300483440195666796 +8122508159220254825 +6926887935253414042 +4854750274073986812 +7247797558737371935 +7140451646609097271 +8603359422188488186 +7087765765150802410 +7352323298240431009 +17228001359505262946 +830681586991892086 +16575900413863724702 +7299637416782136148 +5223960103625950402 +5622546645510588659 +6927733971564232885 +104307364887005000 +6926887905159741587 +15894193095142279476 +15412359869797107874 +7138759556791075325 +1466296571978319404 +6598609717403059389 +7086073675332780464 +3461791464603256049 +2624757569490846836 +18390735680858949823 +7299637386688463693 +6926041881746210939 +18413674030185644131 +7246951505230168832 +7194265623771873971 +2388013311603639908 +2661960728632166488 +1626046306172405994 +3292988330812113977 +7086919711643599307 +3350348129897809669 +7298791363274933045 +2949113337358451846 +13819040186107746 +7086073645239108009 +460011078998 +5726358075983398113 +3531693765072848000 +13521137881826199057 +7034233830185304446 +14262234001769891808 +15896859674140673387 +7246105481816638184 +15586729198849165186 +12999620585941961130 +6926041851652538484 +5515482706794513640 +18413674000091971676 +8245128912192341302 +4935175925304394923 +2914587895472588825 +16743444847067268462 +5511666307614640418 +9870724573497757 +10183587777134266649 +17461812064821708117 +7032541740367282500 +9870724662102366 +3000062970512082916 +7034233800091631991 +7353451363851240393 +4764015496858961551 +6981547918633337130 +18412827976678441028 +7246105451722965729 +7300765482392945532 +1413046558836524843 +9870724848157861 +6864771691154835689 +7193419570264670868 +2836065437668410391 +7140733688806376007 +5569296739845342906 +988739295852300565 +7033387776678101343 +11272445595878688522 +7354297400162059236 +14795036413642344215 +32432389311890484 +7706082920376043056 +5745384143842640959 +7245259428309435081 +7032541710273610045 +6493133948225848344 +6980701895219806482 +18412827946584768573 +2672695638434121742 +16252369836876630326 +1731136082779636780 +7300765452299273077 +4980727526481134825 +1623790192145992094 +5462796864028870900 +2573543666009113907 +14648423506775771260 +5344573059049392338 +13159245476491953264 +3016351 +28202074485294367 +8850604587316807925 +9433463473978082775 +8898527545369692553 +13497936734142399877 +7140733658712703552 +9242938543921759733 +17504292068232266828 +9870724716561847 +9462223648962578817 +7352605310344037290 +7088047777254408691 +6980701865126134027 +7245259398215762626 +18411981923171237925 +15082773189987797150 +7299919428885742429 +7247233547427447568 +11231012565665252996 +1873618497636796488 +6928015983667839166 +7192573516757467765 +8392045041254729237 +214958343501 +232154924118 +8773072981860484929 +17623817999021377174 +7139887635299172904 +13669583310057374915 +11952920104999651164 +7351759286930506642 +6095117356077024274 +6979855841712603379 +11911353550168000303 +4094565860123281828 +6979009775308112081 +2574671718721652501 +15289115337528575529 +6461237536894486399 +6588601354970859314 +829835576475584056 +12171433882329483024 +10601803635978405977 +6926323893849817220 +15798241638577277014 +13487493291780737431 +7247233517333775113 +7139887605205500449 +8339857016756570529 +32432363517708539 +7351759256836834187 +5781052833705625408 +7087201723747205588 +1873618501936285893 +161798583001876730 +7034515842288910727 +1413046550237676700 +10371546090728785591 +7579950199755704475 +15838740426298100091 +7299073375378539326 +6979855811618930924 +7246387493920244465 +1466296524689441838 +6927169930160636063 +6151097687482829151 +7515235746198914183 +2625039568697361387 +12568193962150069461 +7139041581791969801 +16683469352030111006 +1644749190600984028 +6926323863756144765 +3207856338718361997 +7086355700333674940 +11303992210264950105 +9391897685297203230 +12384683746431141169 +8177758353543530791 +17532367729421977465 +10164317815380509716 +13237708544183762949 +8111257460758677865 +7246387463826572010 +14101039392621716 +18413109988782047309 +7194547648772768447 +12269921124804134294 +5301355009923286798 +7193701582368277149 +460011210063 +7086355670240002485 +17641922897637607789 +14095300710942181622 +2436256590268073848 +7352887352541316026 +7033669788781707624 +7245541440413041362 +2431982719322294696 +6980983907323412763 +7563081637033018877 +4409898123206658145 +5046514566388713097 +14814059329512276972 +15800256793861162595 +11057351737720178980 +17330360441647925497 +7194547618679095992 +1873618523431110529 +11242798885672060886 +3189961255353123861 +7085509646826471837 +12105446909435184997 +17097227825074210038 +1626046323367871520 +7353733388852134869 +13819010092565514 +12633597574996166830 +16921919712692601988 +7352887322447643571 +7301047507393840008 +28202057290090175 +6980983877229740308 +13520119278536099331 +7645347347796264438 +9622122612430014405 +18412263935274844206 +7245541410319368907 +7192855528861074046 +9870724653384918 +5885976121588451299 +6928297995771445447 +7085509616732799382 +7140169647402779185 +10769578373240915520 +9819715104592692881 +7087483765944484324 +7352041299034112923 +7032823735274504521 +33560399034844152 +7301047477300167553 +6980137853816209660 +10944945458828937260 +13669905534306158122 +18026193457867982798 +5993604028623815795 +28766124487935334 +7192009505447543398 +5564352154681083943 +7141015683713598028 +1839019217048569077 +15288269228133516664 +7300201453886636905 +7087483735850811869 +6718814190576731851 +13940760358377162540 +7352041268940440468 +7299355387482145607 +6980137823722537205 +18411417881767641103 +6927451942264242344 +7192009475353870943 +15290807461739890121 +2188969976 +8455366527925159925 +18068492228830365096 +14880915248833168401 +14101065186935955 +7139323593895576082 +14311414805250836811 +9870726375998595 +7086637712437281221 +4958753984641959947 +13105552693218576372 +6979291800309006557 +7300201423792964450 +16165083394671772777 +13808562234416563902 +6926605918850711696 +7247515542334669589 +2624757565191619772 +5881584636093073417 +32150338517076320 +785983290288965090 +7086637682343608766 +7034797867289805203 +2979056014524680069 +9870726617761288 +14540120362423748755 +7298509333974942504 +1521238580360316800 +12976673671053247650 +7033951800885313905 +6926605888757039241 +7245823452516647643 +17952330525185607811 +9870725377427411 +15291935458564376817 +1603012832 +7085791658930078118 +6488020650427614617 +12919095062694397133 +7034797837196132748 +7354015400955741150 +6925759865343508593 +18413392013782941785 +7246669488827466486 +4938567614984488112 +9870724720559650 +7498048152822089063 +7193983607369171625 +7141297725910876764 +27638110467000252 +16349719711739348122 +11636885203347441199 +9106532716476499902 +4548898661544101372 +7085791628836405663 +15502606039934830517 +7562235613620865220 +7033105747378110802 +14426789124208003302 +8393023341868484594 +1251886678143272957 +15788821327926658275 +9870725383784222 +18413391983689269330 +6980419865919815941 +6925759835249836138 +5357989095224838157 +33842436932831545 +7192291517551149679 +11348511994799130885 +1349355141337056383 +7141297695817204309 +1201533247087773761 +32714336928793738 +4543926375081576497 +191950179678159950 +7032259723964580154 +11040187364284696123 +7353169347448538047 +14686192518692538500 +13757953135961245442 +18412545960275738682 +2185568528717121049 +7300483465990243186 +14835653469557491533 +1572796400505981136 +9788517128793228302 +6981265902230634784 +15290807375758362619 +7193137553861968522 +16118290484606469999 +16418446140666480289 +18411699893871247384 +16862372087833823519 +4206448621224592673 +7192291487457477224 +7140451672403673661 +455853151859508766 +5962976017044669465 +7139605605999182363 +8666576866089109507 +7032259693870907699 +6979573812412612838 +7300483435896570731 +8344402900088457576 +18412545930182066227 +5727354427211187592 +2625039560098645916 +5515200746281044358 +6926887930954317977 +5247593352906999919 +7247797554438275870 +7140451642310001206 +7087765760851706345 +7073611506224269312 +7355013769965733687 +13174099600966486052 +7352323293941334944 +11443887989255375246 +4146446263661364495 +7299637412483040083 +1571386258306042085 +5946179046742821181 +7246951531024745222 +6927733967265136820 +10639573055207376941 +6926887900860645522 +6994602712723555674 +5299098861505284222 +15289961412532110933 +5353476845679871617 +13513632884077627122 +7138759552491979260 +1144540847698347111 +7086073671033684399 +1901711630905639974 +31586254121535116 +9870726869747307 +5996988225456506285 +4526720883860178668 +2052034288295085986 +18413674025886548066 +2624475548788787270 +6926041877447114874 +8839539261532342355 +7246951500931072767 +4197549521920329467 +5197111291121763775 +2118540506775095159 +825887278052213957 +7194265619472777906 +5476138965309065280 +16588826745223579283 +7086919707344503242 +7034233825886208381 +7298791358975836980 +7603297094028494723 +7246105477517542119 +6981547944427913520 +6926041847353442419 +5353326642538940524 +16771372229407671518 +18413673995792875611 +1873618501935302415 +9091855447660366104 +2624475535891695220 +5248721418517808451 +695707940923638942 +1784668047839200521 +5123966563937617496 +9476180711086229037 +15289397293744457077 +2363364065503545615 +4187198287186888894 +14772210831162279241 +155104173409961345 +7032541736068186435 +7353451359552144328 +1744698334901438782 +1720270693428495876 +5863211220867680084 +7300765478093849467 +6981547914334241065 +18412827972379344963 +7246105447423869664 +1375340101 +1166767807772951618 +7193419565965574803 +15287141235607340513 +7140733684507279942 +9870726915359992 +427623910551390043 +7354297395862963171 +7352605336138613680 +7033387772379005278 +10744889200825600252 +12314414645940914243 +5835546371352167427 +7032541705974513980 +10066835850599860118 +14525018628252960934 +6980701890920710417 +7245259424010339016 +14735929132254102647 +13413734718255400134 +27920045185435350 +4259434058519872846 +11061538999702718852 +13453688972047942746 +4689994313342912648 +9870724605543603 +15693612750414022248 +7140733654413607487 +21103793 +1576744569957320370 +14491088305759127384 +14386655907411854458 +7088047772955312626 +28484120982325551 +7352605306044941225 +7245259393916666561 +6587273635278948726 +14242239340761843231 +18411981918872141860 +5885543833259738430 +6980701860827037962 +7299919424586646364 +7192573512458371700 +8271097636514235902 +7247233543128351503 +6928015979368743101 +7139887631000076839 +688165077222754128 +2596888135805175368 +805831884 +7351759282631410577 +7087201749541781978 +6979855837413507314 +2730758514787288045 +8477529075407324712 +6971520520943961491 +6979009771009016016 +1996539656478525349 +2783379539012682990 +9840570834876761539 +7247233513034679048 +5831598141713614638 +6926323889550721155 +8795062046652761419 +12021254591056840488 +8901578402287847519 +7351759252537738122 +8386285046382069117 +7087201719448109523 +7299073371079443261 +6979855807319834859 +7034515837989814662 +7218388648619280099 +10542598463376393433 +6927169925861539998 +7246387489621148400 +12120495559683868478 +13802551532558419223 +7139041577492873736 +11739843167758321863 +7086355696034578875 +17274157458060281885 +13267938307966371294 +12545157304493803906 +1413892608044762406 +13237708539884666884 +8487173076311541556 +18413109984482951244 +5991347858709874014 +30740204913755543 +7246387459527475945 +7194547644473672382 +17199514878479894463 +468607961144 +7193701578069181084 +11847668836417537503 +7086355665940906420 +1585891583597414023 +2131214311901497365 +7352887348242219961 +7033669784482611559 +9870725370086799 +12482638774054029707 +851940374707963849 +85348920764663585 +7245541436113945297 +27638024484357488 +6980983903024316698 +1785796031766792562 +32432333424428255 +7192855554655650436 +3909861025052296211 +8482084103035029713 +7194547614379999927 +6313103561496593691 +7085509642527375772 +5674063562281978264 +15287423178926065096 +7353733384553038804 +15398206672049014438 +14477731067643037065 +7301047503094743943 +7352887318148547506 +1584875219904694498 +6980983872930644243 +18412263930975748141 +1065200468752795466 +15177810505157773571 +6928297991472349382 +8054291783896991432 +12361766690509292773 +1053111882941597244 +7192855524561977981 +16593903001780618524 +5782296379703953450 +7141015709508174418 +7085509612433703317 +10965002685862053593 +985637059534194074 +7140169643103683120 +9870726291523332 +16878319014468388994 +1731418094883636884 +7352041294735016858 +7032823730975408456 +7087483761645388259 +6980137849517113595 +3232458045602335021 +827861392871065158 +7301047473001071488 +6446727831346940293 +5779476262966527373 +7192009501148447333 +6927451968058818734 +2625321597996762500 +245619828089948399 +7141015679414501963 +6722191038494869768 +7882137511871513597 +7087483731551715804 +7352041264641344403 +9870725382801118 +9272877412921575399 +7300201449587540840 +9870724775282169 +16436379939763521713 +17202169176751932566 +7299355383183049542 +18411417877468545038 +10754752208794749200 +7192009471054774878 +2430620139577280307 +8611086590374315409 +6927451937965146279 +805963576 +15291935514452624488 +7139323589596480017 +10812503129128502459 +8959988790532114083 +7086637708138185156 +2783943580416542774 +14720813411196273775 +10364150078460660033 +14362448656949381213 +15043322265989679329 +7300201419493868385 +7298509359769518894 +6979291796009910492 +1575898520748295875 +14922019929361876657 +5672976447337596765 +5831598141713745162 +6926605914551615631 +7247515538035573524 +2624475544489559534 +16260410401650050515 +2246314295 +7086637678044512701 +1873618544926328642 +7034797862990709138 +1096931248591407021 +7298509329675846439 +7033951796586217840 +7246669514622042876 +17941158134117828894 +10269743533867795671 +5347675226580976647 +3417860786310088910 +15688521365104690176 +7245823448217551578 +5134111493730665580 +5674104474255755027 +7717191090462393385 +6926605884457943176 +3596136887273981730 +32996417817806584 +7085791654630982053 +11573430836645528786 +7033105773172687192 +7002851749355521472 +5003335381653063809 +7354015396656645085 +7034797832897036683 +18413392009483845720 +7246669484528370421 +13979993538309916391 +6925759861044412528 +7193983603070075560 +10992311089537484262 +16267581173591573925 +2622783424577865887 +13819035887273179 +7141297721611780699 +16904712944498902101 +7033105743079014737 +6981265928025211174 +15289397375428134676 +4858945738627876093 +6149598375218383178 +6925759830950740073 +9870725377820485 +18413391979390173265 +6888657822347363642 +18411699919665823774 +1256116924183939300 +95187572621051114 +6980419861620719876 +7192291513252053614 +18103065826041137485 +10222816969990211254 +7141297691518108244 +7353169343149441982 +1283514803232966177 +2002437706943169624 +7032259719665484089 +5458807696621832226 +7300483461691147121 +7912204187237025199 +5570988786673059738 +18412545955976642617 +10756162204825814253 +6981265897931538719 +8790289859117385450 +13727996608218204062 +7193137549562872457 +18411699889572151319 +7247797580232852260 +12994192120810309276 +7140451668104577596 +7192291483158381159 +12595141854107535638 +530653668674242947 +7352323319735911334 +828143439366588588 +17782439637510194255 +9302231356660189158 +9870724574152005 +6702109864571701358 +7139605601700086298 +12221091663415674606 +7032259689571811634 +6818388851727926589 +6241248994235910470 +1495860772 +16414620023533864954 +6979573808113516773 +6926887926655221912 +764904305988667453 +1945545821847553660 +7247797550139179805 +257824245644068756 +32714354125768093 +5582375653047993645 +7138759578286555650 +7140451638010905141 +7087765756552610280 +18216242462685529942 +9870724653909453 +7352323289642238879 +14665067898537833 +8621549700391504088 +7299637408183944018 +9870726605571596 +7246951526725649157 +6927733962966040755 +1535116265 +11108455537719445229 +6926887896561549457 +3189738274038088907 +546637851 +2835565962349970524 +11203378729712550962 +5095261602624047103 +7138759548192883195 +7086919733139079632 +7022272817292838188 +8784323283773883651 +1559288237147293403 +7086073666734588334 +8223467025204184800 +13165236096819726188 +15603385639994459498 +18413674021587452001 +7246951496631976702 +6926041873148018809 +6206603763061885007 +67325673392440852 +1760429919 +7194265615173681841 +7719447165796222449 +848307201366754599 +7086919703045407177 +1300970856318961162 +7034233821587112316 +481505314442 +7353451385346720718 +16860434610997626540 +7298791354676740915 +9870724715972410 +7246105473218446054 +6981547940128817455 +2710500877822855357 +8910392170934372316 +9870724821026326 +11204987448696309768 +9538952396691932645 +16145254715685996093 +9026822436951032807 +933515197985065029 +17256118064413607864 +9870724723574767 +15637617634654488066 +15167687298960066085 +3229097897723823367 +232710822722865204 +7032541731769090370 +1095239150174733620 +7353451355253048263 +5661738430124328056 +7246105443124773599 +948019863933683111 +12569464285503162148 +18412827968080248898 +12806893037197853951 +6981547910035145000 +7300765473794753402 +7193419561666478738 +8781693865030060215 +9350227582874420345 +2146416191707613108 +5141454990908000668 +7140733680208183877 +99231065340118997 +1384869222252742270 +7088047798749889016 +2755882956846859405 +7033387768079909213 +7352605331839517615 +1854737581649037059 +7245259419711242951 +6980701886621614352 +7032541701675417915 +7192573538252948090 +15287141166821409947 +15009813827273492365 +1873618519132277025 +15859000273729226306 +9194029999668660035 +18061482934504720304 +15620129942127970446 +63936358548900149 +7088047768656216561 +1299603461807998560 +7352605301745845160 +1912255148622875001 +1884114781242131983 +1873618471842023452 +6979009796803592406 +18411981914573045795 +7299919420287550299 +16311679952720365302 +6980701856527941897 +11966722661119886674 +7247233538829255438 +16633803289536038978 +6293788 +7192573508159275635 +6928015975069647036 +7139887626700980774 +15287987246124173226 +7087201745242685913 +7351759278332314512 +10417684559046444665 +6187441192028997511 +6979855833114411249 +1627738421784085859 +9821766011289404660 +2201358182892963955 +2917029403468826036 +6979009766709919951 +6927169951656116388 +7247233508735582983 +6926323885251625090 +15292217457771480209 +17852636614813549786 +7351759248238642057 +7087201715149013458 +1873618510534673791 +7034515833690718597 +17119958815989303480 +9440398924256576696 +7299073366780347196 +10246365349637458074 +13237708565679243274 +6927169921562443933 +3124549171711117404 +7246387485322052335 +6173800107753209956 +8070402889435842339 +7193701603863757474 +5903201844931986950 +9942444152932271115 +7139041573193777671 +17445466366832674018 +7086355691735482810 +16337104745239479432 +39608547845342982 +11685864050243995219 +9870724855301167 +2624475527293240350 +12073088508578760599 +7344550947391473690 +13237708535585570819 +103179325071230022 +10145345834749004124 +15248610667087201439 +7194547640174576317 +18413109980183855179 +9612643166216521167 +2292825785040635134 +464308864142 +7193701573770085019 +7406197765746854162 +16499980877748898004 +8868431006280779480 +8692390532950198617 +10906015674175259968 +7086355661641810355 +7352887343943123896 +10864636259949152234 +8099428861213869098 +4451132852614006819 +7033669780183515494 +6814198485741601955 +7245541431814849232 +12239027656080492550 +6980983898725220633 +9789319859965200232 +6928298017266925772 +7192855550356554371 +10277198458468566225 +10155047267998762621 +33560403333744444 +11548493110908748854 +7085509638228279707 +9870727015827078 +7852905094729042252 +5890488336741041777 +7032823756769984846 +7353733380253942739 +9870724569302118 +2390363305267037366 +7352887313849451441 +7301047498795647878 +2785415304742897065 +5197675268039181352 +2440417245444768861 +18412263926676652076 +18006978259953256063 +1148489064437843751 +6209141837602293106 +6928297987173253317 +7141015705209078353 +7192855520262881916 +6698767362340226194 +7140169638804587055 +1873618501935826611 +7032823726676312391 +7087483757346292194 +15287141265701537621 +7352041290435920793 +9391368372458883286 +7301047468701975423 +18411417903263121428 +15274450213741529511 +2576363855830648001 +6980137845218017530 +7299355408977625932 +16414819240624849959 +7192009496849351268 +12524340376691672164 +29048140890506751 +17786951981635864475 +11226550812567013593 +6927451963759722669 +5812662174917002591 +12350988444867429435 +16904712944497919197 +6444753720828101815 +8249591958531213230 +11026052076656986043 +7141015675115405898 +593494716095857647 +490104423410 +5558136817694804187 +5299098870104786949 +7300201445288444775 +507301005145 +7087483727252619739 +5903884228619468800 +18411417873169448973 +1873618489038734736 +5887800003173221669 +18441542378572155291 +7247515563830149914 +12588077379430713565 +7299355378883953477 +7563081654230386389 +6927451933666050214 +7192009466755678813 +13733412026998916877 +12944621759895439337 +3054485070182287068 +13297153724119713646 +7139323585297383952 +2625321580800574862 +7086637703839089091 +9603332665379260396 +6979291791710814427 +7033951822380794230 +7298509355470422829 +33278412726339059 +18029805427700663298 +7247515533736477459 +7410231591516636514 +6926605910252519566 +17946822069105788673 +7034797858691613073 +4261009806383449657 +447113660592 +7033951792287121775 +7298509325376750374 +7246669510322946811 +4534407021717685362 +882239441530390089 +7245823443918455513 +6926605880158847111 +15287141209813681996 +6155327963617691259 +7085791650331885988 +6520986101609792887 +7354015392357549020 +6208295814188697765 +17554608171616110273 +7033105768873591127 +7246669480229274356 +18413392005184749655 +2803649555476907539 +6925759856745316463 +2599235317102217269 +7193983598770979495 +434216567980 +8106071886713521650 +15746639385482889572 +7042686759039796981 +1154748910884030612 +7141297717312684634 +12243195703567124314 +1873618463243306305 +7353169368944018372 +12450159764203178109 +4148105506751382809 +7033105738779918672 +6981265923726115109 +33560368940713974 +17169981030136022953 +6980419857321623811 +4347925833116092296 +18411699915366727709 +7192291508952957549 +5623513681448666797 +33560403333875172 +9870724666886005 +7139605627494662688 +18158855401059780058 +31586288515352537 +15287987271918618035 +14808173258166110477 +7141297687219012179 +10906583505664280685 +7353169338850345917 +6210168527151630153 +7032259715366388024 +2126679883759814820 +2149273943172056336 +4347925901902415544 +30176172108350955 +7300483457392051056 +6209987959894705607 +18412545951677546552 +6981265893632442654 +7193137545263776392 +5303893075865503190 +1893500283777910651 +18411699885273055254 +7247797575933756195 +5081553090054654323 +7140451663805481531 +8247724729662703889 +15291935458565162174 +7139605597400990233 +7352323315436815269 +7087765782347186670 +7032259685272715569 +316743096613078208 +8854892867934423142 +6979573803814420708 +29612199490947173 +6926887922356125847 +8812300966546965802 +11722969585197581469 +7247797545840083740 +8270229298440046551 +6232418373048731093 +1873618252584978388 +7138759573987459585 +4977791693940394284 +7087765752253514215 +7352323285343142814 +7880607085181405609 +18332726249486944491 +3305725656990746261 +7299637403884847953 +5729046448243673423 +7246951522426553092 +71108415 +6927733958666944690 +17393050773869299132 +2928740603216529441 +7138759543893787130 +16150166559522883585 +10364366638615365781 +7086919728839983567 +13883199269509858330 +6478223379528812725 +6661826795216177518 +7086073662435492269 +1873618441748613473 +17733865212901721719 +12164227723825907371 +936899463602964420 +7246951492332880637 +10590197086357423139 +18413674017288355936 +6926041868848922744 +6736241924278258064 +16008494395543127400 +11957793163459888268 +7194265610874585776 +13819010092238498 +9966383549812704714 +27356055372105278 +14101043691783933 +11185827869741483157 +7086919698746311112 +7034233817288016251 +1411918557712287647 +18056758355458721953 +10913804840997816088 +7298791350377644850 +1627738408887257463 +7353451381047624653 +5565348488711768192 +2560318637201230152 +6981547935829721390 +7246105468919349989 +9181763891149276690 +8262357255499876300 +7193419587461055128 +496747170645214674 +10898149942002910916 +13913370016116443282 +5992475971611657642 +7353451350953952198 +9759732344438719525 +15945141101920192007 +7032541727469994305 +9735614383619770157 +18412827963781152833 +7300765469495657337 +10284111861439072375 +6981547905736048935 +7193419557367382673 +14137369733883168373 +2392267112159643424 +2150364374056305808 +5724666024857831081 +7140733675909087812 +7033387763780813148 +515898869092 +7352605327540421550 +7088047794450792951 +6980701882322518287 +7245259415412146886 +12083278685454862534 +5532932791479699590 +7192573533953852025 +4144026118870010131 +5248951067485144858 +6928016000864223426 +30740204914411808 +12245079979070720255 +5622546645511767792 +16663012318422238821 +15860561610643605152 +31304293607146765 +795150206 +785983290289883252 +100 +101 +102 diff --git a/python/cudf/cudf/tests/test_hash_vocab.py b/python/cudf/cudf/tests/test_hash_vocab.py new file mode 100644 index 00000000000..698dcba650f --- /dev/null +++ b/python/cudf/cudf/tests/test_hash_vocab.py @@ -0,0 +1,25 @@ +# Copyright (c) 2020, NVIDIA CORPORATION. +from cudf.utils.hash_vocab_utils import hash_vocab +import os +import filecmp +import pytest + + +@pytest.fixture(scope="module") +def datadir(datadir): + return os.path.join(datadir, "vocab_hash") + + +def test_correct_bert_base_vocab_hash(datadir, tmpdir): + # The vocabulary is 5% drawn from bert-base-uncased + # sampling script at: + # https://gist.github.com/VibhuJawa/4fc5981d2cbba1ab8b1e78cdf6aede72 + vocab_path = os.path.join(datadir, "bert-base-uncased-vocab-5per.txt") + + groundtruth_path = os.path.join( + datadir, "ground_truth_vocab_hash_5per.txt" + ) + output_path = tmpdir.join("cudf-vocab-hash.txt") + hash_vocab(vocab_path, output_path) + + assert filecmp.cmp(output_path, groundtruth_path, shallow=False) diff --git a/python/cudf/cudf/utils/hash_vocab_utils.py b/python/cudf/cudf/utils/hash_vocab_utils.py new file mode 100644 index 00000000000..532fa925670 --- /dev/null +++ b/python/cudf/cudf/utils/hash_vocab_utils.py @@ -0,0 +1,300 @@ +# Copyright (c) 2020, NVIDIA CORPORATION. +# This function is from the rapidsai/clx repo at below link +# https://github.com/rapidsai/clx/blob/267c6d30805c9dcbf80840f222bf31c5c4b7068a/python/clx/analytics/_perfect_hash.py +import numpy as np + +PRIME = np.uint64(281474976710677) + +# Coefficients ranges for inner hash - This are important to set to be +# large so that we have randomness in the bottom bits when modding +A_SECOND_LEVEL_POW = np.uint8(48) +B_SECOND_LEVEL_POW = np.uint8(7) + +A_LBOUND_SECOND_LEVEL_HASH = 2 ** 16 +A_HBOUND_SECOND_LEVEL_HASH = 2 ** A_SECOND_LEVEL_POW + +B_LBOUND_SECOND_LEVEL_HASH = 0 +B_HBOUND_SECOND_LEVEL_HASH = 2 ** B_SECOND_LEVEL_POW + +# Extremely generous and should not ever happen. This limit is imposed +# To ensure we can bit pack all the information needed for the bin hash +# functions - a, b and table size +MAX_SIZE_FOR_INITIAL_BIN = 2 ** 8 - 1 + + +# Shifts for bit packing +A_SECOND_LEVEL_SHIFT_AMT = np.uint8(64 - A_SECOND_LEVEL_POW) +B_SECOND_LEVEL_SHIFT_AMT = np.uint8( + 64 - A_SECOND_LEVEL_POW - B_SECOND_LEVEL_POW +) +BITS_FOR_INNER_TABLE_SIZE = np.uint8(8) + +NOT_FOUND = -1 + + +def _sdbm_hash(string): + hv = 0 + mask = (1 << 48) - 1 + for c in string: + hv = ord(c) + (hv << 6) + (hv << 16) - hv + hv &= mask + return hv + + +def _hash_func(k, a, b, size): + k = np.uint64(k) + a = np.uint64(a) + b = np.uint64(b) + size = np.uint64(size) + return ((a * k + b) % PRIME) % size + + +def _longest_bin_length(bins): + return len(max(bins, key=len)) + + +def _make_bins(data, num_bins, a, b): + bins = [[] for i in range(num_bins)] + + for item in data: + bins[_hash_func(item, a, b, num_bins)].append(item) + return bins + + +def _new_bin_length(orig_length): + return int(orig_length) + + +def _get_space_util(bins, init_bins): + return sum(_new_bin_length(len(b)) for b in bins) + 2 * init_bins + + +def _pick_initial_a_b(data, max_constant, init_bins): + while True: + a = np.random.randint(2 ** 12, 2 ** 15) + b = np.random.randint(2 ** 12, 2 ** 15) + bins = _make_bins(data, init_bins, a, b) + score = _get_space_util(bins, init_bins) / len(data) + + longest = _new_bin_length(_longest_bin_length(bins)) + + if score <= max_constant and longest <= MAX_SIZE_FOR_INITIAL_BIN: + print( + "Attempting to build table using {:.6f}n space".format(score) + ) + print("Longest bin was {}".format(longest)) + break + + return bins, a, b + + +def _find_hash_for_internal(hash_bin): + if not hash_bin: + return [[], 0, 0] + + new_length = _new_bin_length(len(hash_bin)) + + while True: + a = np.random.randint( + A_LBOUND_SECOND_LEVEL_HASH, A_HBOUND_SECOND_LEVEL_HASH + ) + b = np.random.randint( + B_LBOUND_SECOND_LEVEL_HASH, B_HBOUND_SECOND_LEVEL_HASH + ) + bins = _make_bins(hash_bin, new_length, a, b) + + max_length = len(max(bins, key=len)) + if max_length == 1: + bins = [b[0] if b else 0 for b in bins] + return bins, a, b + + +def _perfect_hash(integers, max_constant): + num_top_level_bins = len(integers) // 4 + + init_bins, init_a, init_b = _pick_initial_a_b( + integers, max_constant, num_top_level_bins + ) + flattened_bins = [] + + internal_table_coeffs = np.zeros( + shape=[num_top_level_bins], dtype=np.uint64 + ) + offset_into_flattened_table = np.zeros( + shape=[num_top_level_bins + 1], dtype=np.uint64 + ) + + max_bin_length = 0 + for i, b in enumerate(init_bins): + if i % 500 == 0: + print(f"Processing bin {i} / {len(init_bins)} of size = {len(b)}") + internal_table, coeff_a, coeff_b = _find_hash_for_internal(b) + bin_length = len(internal_table) + max_bin_length = max(bin_length, max_bin_length) + internal_table_coeffs[i] = ( + coeff_a << A_SECOND_LEVEL_SHIFT_AMT + | coeff_b << B_SECOND_LEVEL_SHIFT_AMT + | bin_length + ) + offset_into_flattened_table[i + 1] = ( + offset_into_flattened_table[i] + bin_length + ) + flattened_bins.extend(internal_table) + + print( + "Final table size {} elements compared to {} for original".format( + len(flattened_bins), len(integers) + ) + ) + + print("Max bin length was", max_bin_length) + + return ( + init_a, + init_b, + num_top_level_bins, + flattened_bins, + internal_table_coeffs, + offset_into_flattened_table, + ) + + +def _pack_keys_and_values(flattened_hash_table, original_dict): + + for i in range(len(flattened_hash_table)): + if flattened_hash_table[i] in original_dict: + value = original_dict[flattened_hash_table[i]] + flattened_hash_table[i] <<= 16 + flattened_hash_table[i] |= value + + +def _load_vocab_dict(path): + vocab = {} + with open(path, mode="r") as f: + counter = 0 + for line in f: + vocab[line.strip()] = counter + counter += 1 + + return vocab + + +def _store_func( + out_name, + outer_a, + outer_b, + num_outer_bins, + hash_table, + inner_table_coeffs, + offsets_into_ht, + unk_tok_id, + first_token_id, + sep_token_id, +): + + with open(out_name, mode="w+") as f: + f.write("{}\n".format(outer_a)) + f.write("{}\n".format(outer_b)) + f.write("{}\n".format(num_outer_bins)) + f.writelines( + "{} {}\n".format(coeff, offset) + for coeff, offset in zip(inner_table_coeffs, offsets_into_ht) + ) + f.write("{}\n".format(len(hash_table))) + f.writelines("{}\n".format(kv) for kv in hash_table) + f.writelines( + "{}\n".format(tok_id) + for tok_id in [unk_tok_id, first_token_id, sep_token_id] + ) + + +def _retrieve( + k, + outer_a, + outer_b, + num_outer_bins, + hash_table, + inner_table_coeffs, + offsets_into_ht, +): + + bin_hash = _hash_func(k, outer_a, outer_b, num_outer_bins) + start_offset_in_ht = offsets_into_ht[bin_hash] + inner_table_values = inner_table_coeffs[bin_hash] + + one = np.uint64(1) + + inner_a = inner_table_values >> A_SECOND_LEVEL_SHIFT_AMT + inner_b = (inner_table_values >> B_SECOND_LEVEL_SHIFT_AMT) & ( + (one << B_SECOND_LEVEL_POW) - one + ) + size = inner_table_values & ((one << BITS_FOR_INNER_TABLE_SIZE) - one) + + inner_offset = _hash_func(k, inner_a, inner_b, size) + kv = hash_table[start_offset_in_ht + inner_offset] + + key, value = kv >> 16, kv & ((1 << 16) - 1) + indicator = key == k + + return indicator * value + (not indicator) * NOT_FOUND + + +def hash_vocab( + vocab_path, + output_path, + unk_tok="[UNK]", + first_token="[CLS]", + sep_token="[SEP]", +): + """ + Write the vocab vocabulary hashtable to the output_path + """ + np.random.seed(1243342) + vocab = _load_vocab_dict(vocab_path) + keys = list(map(_sdbm_hash, vocab.keys())) + + hashed_vocab = {_sdbm_hash(key): value for key, value in vocab.items()} + + error_message = """Collision occurred and only sdbm token hash current supported :( + Can be extended to use random hashes if needed""" + + assert len(hashed_vocab) == len(vocab), error_message + + ( + outer_a, + outer_b, + num_outer_bins, + hash_table, + inner_table_coeffs, + offsets_into_ht, + ) = _perfect_hash(keys, 10) + + _pack_keys_and_values(hash_table, hashed_vocab) + _store_func( + output_path, + outer_a, + outer_b, + num_outer_bins, + hash_table, + inner_table_coeffs, + offsets_into_ht, + vocab[unk_tok], + vocab[first_token], + vocab[sep_token], + ) + + for key, value in hashed_vocab.items(): + val = _retrieve( + key, + outer_a, + outer_b, + num_outer_bins, + hash_table, + inner_table_coeffs, + offsets_into_ht, + ) + assert ( + val == value + ), "Incorrect value found. Got {} expected {}".format(val, value) + + print("All present tokens return correct value.")