const shifts = [
  [1, 2, 3, 4, 5, 6, 7, 8],
  [1, 2, 3, 4, 5, 6, 7, 6],
  [1, 2, 3, 4, 5, 6, 5, 6],
  [1, 2, 3, 4, 5, 6, 5, 4],
  [1, 2, 3, 4, 5, 4, 5, 6],
  [1, 2, 3, 4, 5, 4, 5, 4],
  [1, 2, 3, 4, 5, 4, 3, 4],
  [1, 2, 3, 4, 5, 4, 3, 2],
  [1, 2, 3, 4, 3, 4, 5, 6],
  [1, 2, 3, 4, 3, 4, 5, 4],
  [1, 2, 3, 4, 3, 4, 3, 4],
  [1, 2, 3, 4, 3, 4, 3, 2],
  [1, 2, 3, 4, 3, 2, 3, 4],
  [1, 2, 3, 4, 3, 2, 3, 2],
  [1, 2, 3, 4, 3, 2, 1, 2],
  [1, 2, 3, 4, 3, 2, 1, 0],
  [1, 2, 3, 2, 3, 4, 5, 6],
  [1, 2, 3, 2, 3, 4, 5, 4],
  [1, 2, 3, 2, 3, 4, 3, 4],
  [1, 2, 3, 2, 3, 4, 3, 2],
  [1, 2, 3, 2, 3, 2, 3, 4],
  [1, 2, 3, 2, 3, 2, 3, 2],
  [1, 2, 3, 2, 3, 2, 1, 2],
  [1, 2, 3, 2, 3, 2, 1, 0],
  [1, 2, 3, 2, 1, 2, 3, 4],
  [1, 2, 3, 2, 1, 2, 3, 2],
  [1, 2, 3, 2, 1, 2, 1, 2],
  [1, 2, 3, 2, 1, 2, 1, 0],
  [1, 2, 3, 2, 1, 0, 1, 2],
  [1, 2, 3, 2, 1, 0, 1, 0],
  [1, 2, 3, 2, 1, 0, -1, 0],
  [1, 2, 3, 2, 1, 0, -1, -2],
  [1, 2, 1, 2, 3, 4, 5, 6],
  [1, 2, 1, 2, 3, 4, 5, 4],
  [1, 2, 1, 2, 3, 4, 3, 4],
  [1, 2, 1, 2, 3, 4, 3, 2],
  [1, 2, 1, 2, 3, 2, 3, 4],
  [1, 2, 1, 2, 3, 2, 3, 2],
  [1, 2, 1, 2, 3, 2, 1, 2],
  [1, 2, 1, 2, 3, 2, 1, 0],
  [1, 2, 1, 2, 1, 2, 3, 4],
  [1, 2, 1, 2, 1, 2, 3, 2],
  [1, 2, 1, 2, 1, 2, 1, 2],
  [1, 2, 1, 2, 1, 2, 1, 0],
  [1, 2, 1, 2, 1, 0, 1, 2],
  [1, 2, 1, 2, 1, 0, 1, 0],
  [1, 2, 1, 2, 1, 0, -1, 0],
  [1, 2, 1, 2, 1, 0, -1, -2],
  [1, 2, 1, 0, 1, 2, 3, 4],
  [1, 2, 1, 0, 1, 2, 3, 2],
  [1, 2, 1, 0, 1, 2, 1, 2],
  [1, 2, 1, 0, 1, 2, 1, 0],
  [1, 2, 1, 0, 1, 0, 1, 2],
  [1, 2, 1, 0, 1, 0, 1, 0],
  [1, 2, 1, 0, 1, 0, -1, 0],
  [1, 2, 1, 0, 1, 0, -1, -2],
  [1, 2, 1, 0, -1, 0, 1, 2],
  [1, 2, 1, 0, -1, 0, 1, 0],
  [1, 2, 1, 0, -1, 0, -1, 0],
  [1, 2, 1, 0, -1, 0, -1, -2],
  [1, 2, 1, 0, -1, -2, -1, 0],
  [1, 2, 1, 0, -1, -2, -1, -2],
  [1, 2, 1, 0, -1, -2, -3, -2],
  [1, 2, 1, 0, -1, -2, -3, -4],
  [1, 0, 1, 2, 3, 4, 5, 6],
  [1, 0, 1, 2, 3, 4, 5, 4],
  [1, 0, 1, 2, 3, 4, 3, 4],
  [1, 0, 1, 2, 3, 4, 3, 2],
  [1, 0, 1, 2, 3, 2, 3, 4],
  [1, 0, 1, 2, 3, 2, 3, 2],
  [1, 0, 1, 2, 3, 2, 1, 2],
  [1, 0, 1, 2, 3, 2, 1, 0],
  [1, 0, 1, 2, 1, 2, 3, 4],
  [1, 0, 1, 2, 1, 2, 3, 2],
  [1, 0, 1, 2, 1, 2, 1, 2],
  [1, 0, 1, 2, 1, 2, 1, 0],
  [1, 0, 1, 2, 1, 0, 1, 2],
  [1, 0, 1, 2, 1, 0, 1, 0],
  [1, 0, 1, 2, 1, 0, -1, 0],
  [1, 0, 1, 2, 1, 0, -1, -2],
  [1, 0, 1, 0, 1, 2, 3, 4],
  [1, 0, 1, 0, 1, 2, 3, 2],
  [1, 0, 1, 0, 1, 2, 1, 2],
  [1, 0, 1, 0, 1, 2, 1, 0],
  [1, 0, 1, 0, 1, 0, 1, 2],
  [1, 0, 1, 0, 1, 0, 1, 0],
  [1, 0, 1, 0, 1, 0, -1, 0],
  [1, 0, 1, 0, 1, 0, -1, -2],
  [1, 0, 1, 0, -1, 0, 1, 2],
  [1, 0, 1, 0, -1, 0, 1, 0],
  [1, 0, 1, 0, -1, 0, -1, 0],
  [1, 0, 1, 0, -1, 0, -1, -2],
  [1, 0, 1, 0, -1, -2, -1, 0],
  [1, 0, 1, 0, -1, -2, -1, -2],
  [1, 0, 1, 0, -1, -2, -3, -2],
  [1, 0, 1, 0, -1, -2, -3, -4],
  [1, 0, -1, 0, 1, 2, 3, 4],
  [1, 0, -1, 0, 1, 2, 3, 2],
  [1, 0, -1, 0, 1, 2, 1, 2],
  [1, 0, -1, 0, 1, 2, 1, 0],
  [1, 0, -1, 0, 1, 0, 1, 2],
  [1, 0, -1, 0, 1, 0, 1, 0],
  [1, 0, -1, 0, 1, 0, -1, 0],
  [1, 0, -1, 0, 1, 0, -1, -2],
  [1, 0, -1, 0, -1, 0, 1, 2],
  [1, 0, -1, 0, -1, 0, 1, 0],
  [1, 0, -1, 0, -1, 0, -1, 0],
  [1, 0, -1, 0, -1, 0, -1, -2],
  [1, 0, -1, 0, -1, -2, -1, 0],
  [1, 0, -1, 0, -1, -2, -1, -2],
  [1, 0, -1, 0, -1, -2, -3, -2],
  [1, 0, -1, 0, -1, -2, -3, -4],
  [1, 0, -1, -2, -1, 0, 1, 2],
  [1, 0, -1, -2, -1, 0, 1, 0],
  [1, 0, -1, -2, -1, 0, -1, 0],
  [1, 0, -1, -2, -1, 0, -1, -2],
  [1, 0, -1, -2, -1, -2, -1, 0],
  [1, 0, -1, -2, -1, -2, -1, -2],
  [1, 0, -1, -2, -1, -2, -3, -2],
  [1, 0, -1, -2, -1, -2, -3, -4],
  [1, 0, -1, -2, -3, -2, -1, 0],
  [1, 0, -1, -2, -3, -2, -1, -2],
  [1, 0, -1, -2, -3, -2, -3, -2],
  [1, 0, -1, -2, -3, -2, -3, -4],
  [1, 0, -1, -2, -3, -4, -3, -2],
  [1, 0, -1, -2, -3, -4, -3, -4],
  [1, 0, -1, -2, -3, -4, -5, -4],
  [1, 0, -1, -2, -3, -4, -5, -6],
  [-1, 0, 1, 2, 3, 4, 5, 6],
  [-1, 0, 1, 2, 3, 4, 5, 4],
  [-1, 0, 1, 2, 3, 4, 3, 4],
  [-1, 0, 1, 2, 3, 4, 3, 2],
  [-1, 0, 1, 2, 3, 2, 3, 4],
  [-1, 0, 1, 2, 3, 2, 3, 2],
  [-1, 0, 1, 2, 3, 2, 1, 2],
  [-1, 0, 1, 2, 3, 2, 1, 0],
  [-1, 0, 1, 2, 1, 2, 3, 4],
  [-1, 0, 1, 2, 1, 2, 3, 2],
  [-1, 0, 1, 2, 1, 2, 1, 2],
  [-1, 0, 1, 2, 1, 2, 1, 0],
  [-1, 0, 1, 2, 1, 0, 1, 2],
  [-1, 0, 1, 2, 1, 0, 1, 0],
  [-1, 0, 1, 2, 1, 0, -1, 0],
  [-1, 0, 1, 2, 1, 0, -1, -2],
  [-1, 0, 1, 0, 1, 2, 3, 4],
  [-1, 0, 1, 0, 1, 2, 3, 2],
  [-1, 0, 1, 0, 1, 2, 1, 2],
  [-1, 0, 1, 0, 1, 2, 1, 0],
  [-1, 0, 1, 0, 1, 0, 1, 2],
  [-1, 0, 1, 0, 1, 0, 1, 0],
  [-1, 0, 1, 0, 1, 0, -1, 0],
  [-1, 0, 1, 0, 1, 0, -1, -2],
  [-1, 0, 1, 0, -1, 0, 1, 2],
  [-1, 0, 1, 0, -1, 0, 1, 0],
  [-1, 0, 1, 0, -1, 0, -1, 0],
  [-1, 0, 1, 0, -1, 0, -1, -2],
  [-1, 0, 1, 0, -1, -2, -1, 0],
  [-1, 0, 1, 0, -1, -2, -1, -2],
  [-1, 0, 1, 0, -1, -2, -3, -2],
  [-1, 0, 1, 0, -1, -2, -3, -4],
  [-1, 0, -1, 0, 1, 2, 3, 4],
  [-1, 0, -1, 0, 1, 2, 3, 2],
  [-1, 0, -1, 0, 1, 2, 1, 2],
  [-1, 0, -1, 0, 1, 2, 1, 0],
  [-1, 0, -1, 0, 1, 0, 1, 2],
  [-1, 0, -1, 0, 1, 0, 1, 0],
  [-1, 0, -1, 0, 1, 0, -1, 0],
  [-1, 0, -1, 0, 1, 0, -1, -2],
  [-1, 0, -1, 0, -1, 0, 1, 2],
  [-1, 0, -1, 0, -1, 0, 1, 0],
  [-1, 0, -1, 0, -1, 0, -1, 0],
  [-1, 0, -1, 0, -1, 0, -1, -2],
  [-1, 0, -1, 0, -1, -2, -1, 0],
  [-1, 0, -1, 0, -1, -2, -1, -2],
  [-1, 0, -1, 0, -1, -2, -3, -2],
  [-1, 0, -1, 0, -1, -2, -3, -4],
  [-1, 0, -1, -2, -1, 0, 1, 2],
  [-1, 0, -1, -2, -1, 0, 1, 0],
  [-1, 0, -1, -2, -1, 0, -1, 0],
  [-1, 0, -1, -2, -1, 0, -1, -2],
  [-1, 0, -1, -2, -1, -2, -1, 0],
  [-1, 0, -1, -2, -1, -2, -1, -2],
  [-1, 0, -1, -2, -1, -2, -3, -2],
  [-1, 0, -1, -2, -1, -2, -3, -4],
  [-1, 0, -1, -2, -3, -2, -1, 0],
  [-1, 0, -1, -2, -3, -2, -1, -2],
  [-1, 0, -1, -2, -3, -2, -3, -2],
  [-1, 0, -1, -2, -3, -2, -3, -4],
  [-1, 0, -1, -2, -3, -4, -3, -2],
  [-1, 0, -1, -2, -3, -4, -3, -4],
  [-1, 0, -1, -2, -3, -4, -5, -4],
  [-1, 0, -1, -2, -3, -4, -5, -6],
  [-1, -2, -1, 0, 1, 2, 3, 4],
  [-1, -2, -1, 0, 1, 2, 3, 2],
  [-1, -2, -1, 0, 1, 2, 1, 2],
  [-1, -2, -1, 0, 1, 2, 1, 0],
  [-1, -2, -1, 0, 1, 0, 1, 2],
  [-1, -2, -1, 0, 1, 0, 1, 0],
  [-1, -2, -1, 0, 1, 0, -1, 0],
  [-1, -2, -1, 0, 1, 0, -1, -2],
  [-1, -2, -1, 0, -1, 0, 1, 2],
  [-1, -2, -1, 0, -1, 0, 1, 0],
  [-1, -2, -1, 0, -1, 0, -1, 0],
  [-1, -2, -1, 0, -1, 0, -1, -2],
  [-1, -2, -1, 0, -1, -2, -1, 0],
  [-1, -2, -1, 0, -1, -2, -1, -2],
  [-1, -2, -1, 0, -1, -2, -3, -2],
  [-1, -2, -1, 0, -1, -2, -3, -4],
  [-1, -2, -1, -2, -1, 0, 1, 2],
  [-1, -2, -1, -2, -1, 0, 1, 0],
  [-1, -2, -1, -2, -1, 0, -1, 0],
  [-1, -2, -1, -2, -1, 0, -1, -2],
  [-1, -2, -1, -2, -1, -2, -1, 0],
  [-1, -2, -1, -2, -1, -2, -1, -2],
  [-1, -2, -1, -2, -1, -2, -3, -2],
  [-1, -2, -1, -2, -1, -2, -3, -4],
  [-1, -2, -1, -2, -3, -2, -1, 0],
  [-1, -2, -1, -2, -3, -2, -1, -2],
  [-1, -2, -1, -2, -3, -2, -3, -2],
  [-1, -2, -1, -2, -3, -2, -3, -4],
  [-1, -2, -1, -2, -3, -4, -3, -2],
  [-1, -2, -1, -2, -3, -4, -3, -4],
  [-1, -2, -1, -2, -3, -4, -5, -4],
  [-1, -2, -1, -2, -3, -4, -5, -6],
  [-1, -2, -3, -2, -1, 0, 1, 2],
  [-1, -2, -3, -2, -1, 0, 1, 0],
  [-1, -2, -3, -2, -1, 0, -1, 0],
  [-1, -2, -3, -2, -1, 0, -1, -2],
  [-1, -2, -3, -2, -1, -2, -1, 0],
  [-1, -2, -3, -2, -1, -2, -1, -2],
  [-1, -2, -3, -2, -1, -2, -3, -2],
  [-1, -2, -3, -2, -1, -2, -3, -4],
  [-1, -2, -3, -2, -3, -2, -1, 0],
  [-1, -2, -3, -2, -3, -2, -1, -2],
  [-1, -2, -3, -2, -3, -2, -3, -2],
  [-1, -2, -3, -2, -3, -2, -3, -4],
  [-1, -2, -3, -2, -3, -4, -3, -2],
  [-1, -2, -3, -2, -3, -4, -3, -4],
  [-1, -2, -3, -2, -3, -4, -5, -4],
  [-1, -2, -3, -2, -3, -4, -5, -6],
  [-1, -2, -3, -4, -3, -2, -1, 0],
  [-1, -2, -3, -4, -3, -2, -1, -2],
  [-1, -2, -3, -4, -3, -2, -3, -2],
  [-1, -2, -3, -4, -3, -2, -3, -4],
  [-1, -2, -3, -4, -3, -4, -3, -2],
  [-1, -2, -3, -4, -3, -4, -3, -4],
  [-1, -2, -3, -4, -3, -4, -5, -4],
  [-1, -2, -3, -4, -3, -4, -5, -6],
  [-1, -2, -3, -4, -5, -4, -3, -2],
  [-1, -2, -3, -4, -5, -4, -3, -4],
  [-1, -2, -3, -4, -5, -4, -5, -4],
  [-1, -2, -3, -4, -5, -4, -5, -6],
  [-1, -2, -3, -4, -5, -6, -5, -4],
  [-1, -2, -3, -4, -5, -6, -5, -6],
  [-1, -2, -3, -4, -5, -6, -7, -6],
  [-1, -2, -3, -4, -5, -6, -7, -8]
];

const snlook = [
  0.0,
  0.5236816406249994,
  0.7855224609374982,
  0.9540880210697628,
  1.0760159511119103,
  1.1703795885492223,
  1.2467156021243369,
  1.3104304755968557,
  1.3648656002348538,
  1.4122187219792046,
  1.4540046650257359,
  1.4913070772186618,
  1.524925686349654,
  1.555466892408545,
  1.5834016083086482,
  1.6091032627214368,
  1.6328733792111176,
  1.6549591827052488,
  1.6755659893279085,
  1.6948661230625561,
  1.713005479755239,
  1.7301084681239605,
  1.7462818088933272,
  1.761617513495797,
  1.7761952602791684,
  1.7900843184684145,
  1.8033451254170796,
  1.816030592805064,
  1.8281871971995631,
  1.839855896464578,
  1.8510729037394256,
  1.8618703437232706,
  1.8722768109007824,
  1.8823178455348473,
  1.8920163403470796,
  1.901392888546651,
  1.9104660820776924,
  1.919252767515187,
  1.9277682658651745,
  1.936026561557611,
  1.9440404651161078,
  1.9518217533157969,
  1.9593812900743632,
  1.9667291308429764,
  1.9738746128584548,
  1.9808264332736207,
  1.9875927168897807,
  1.9941810749654583,
  2.000598656362484,
  2.006852192108625,
  2.0129480343005706,
  2.0188921901382435,
  2.024690351767919,
  2.030347922514503,
  2.0358700400002636,
  2.0412615965762826,
  2.046527257432066,
  2.0516714766967445,
  2.056698511800745,
  2.061612436328714,
  2.066417151561829,
  2.07111639687969,
  2.0757137591680856,
  2.0802126813583945,
  2.0846164702068744,
  2.088928303407021,
  2.0931512361153204,
  2.097288206959665,
  2.101342043590216,
  2.1053154678244357,
  2.109211100430972,
  2.113031465591184,
  2.116778995071893,
  2.1204560321386077,
  2.124064835234638,
  2.127607581448302,
  2.1310863697875804,
  2.134503224279241,
  2.1378600969073016,
  2.1411588704039803,
  2.14440136090469,
  2.14758932047735,
  2.150724439535086,
  2.153808349140441,
  2.156842623208322,
  2.1598287806141805,
  2.162768287213258,
  2.1656625577761672,
  2.1685129578455893,
  2.1713208055184197,
  2.1740873731573362,
  2.176813889035413,
  2.1795015389171106,
  2.1821514675787324,
  2.1847647802711805,
  2.1873425441276666,
  2.1898857895188306,
  2.192395511357564,
  2.194872670355703,
  2.1973181942345987,
  2.1997329788914786,
  2.2021178895233864,
  2.204473761710403,
  2.206801402459753,
  2.2091015912123253,
  2.2113750808130592,
  2.213622598446569,
  2.215844846539335,
  2.2180425036297056,
  2.2202162252069244,
  2.2223666445203154,
  2.2244943733597373,
  2.226600002808357,
  2.228684103968744,
  2.230747228663279,
  2.2327899101097715,
  2.2348126635732157,
  2.2368159869945177,
  2.238800361597038,
  2.240766252471733,
  2.2427141091416622,
  2.2446443661066025,
  2.2465574433684714,
  2.248453746938246,
  2.25033366932503,
  2.2521975900079103,
  2.254045875891204,
  2.2558788817436857,
  2.2576969506223725,
  2.259500414281393,
  2.2612895935664863,
  2.263064798795627,
  2.2648263301262683,
  2.2665744779096806,
  2.2683095230328285,
  2.2700317372482393,
  2.2717413834922784,
  2.27343871619224,
  2.2751239815626483,
  2.2767974178911543,
  2.278459255814381,
  2.2801097185840855,
  2.2817490223239716,
  2.2833773762774805,
  2.2849949830468828,
  2.2866020388239723,
  2.2881987336126577,
  2.2897852514437402,
  2.2913617705821534,
  2.2929284637269234,
  2.2944854982041036,
  2.2960330361529557,
  2.2975712347055697,
  2.2991002461602013,
  2.3006202181485143,
  2.302131293796954,
  2.303633611882463,
  2.305127306982731,
  2.3066125096211607,
  2.308089346406773,
  2.309557940169178,
  2.311018410088826,
  2.3124708718226827,
  2.3139154376255022,
  2.3153522164668403,
  2.31678131414397,
  2.3182028333908327,
  2.3196168739831697,
  2.3210235328399684,
  2.3224229041213604,
  2.3238150793230665,
  2.3252001473675534,
  2.3265781946919866,
  2.3279493053330946,
  2.3293135610090743,
  2.3306710411986096,
  2.3320218232171364,
  2.3333659822904274,
  2.334703591625601,
  2.336034722479646,
  2.3373594442255445,
  2.338677824416081,
  2.3399899288454145,
  2.3412958216085014,
  2.342595565158433,
  2.3438892203617683,
  2.345176846551933,
  2.3464585015807473,
  2.3477342418681544,
  2.349004122450206,
  2.3502681970253776,
  2.3515265179992517,
  2.352779136527655,
  2.3540261025582736,
  2.355267464870827,
  2.3565032711158254,
  2.3577335678519886,
  2.358958400582344,
  2.3601778137890714,
  2.3613918509671357
];