#![no_std]
#![doc(
html_logo_url = "https://raw.githubusercontent.com/RustCrypto/meta/master/logo.svg",
html_favicon_url = "https://raw.githubusercontent.com/RustCrypto/meta/master/logo.svg"
)]
#![deny(unsafe_code)]
#![warn(missing_docs, rust_2018_idioms)]
pub use digest;
use block_buffer::{
generic_array::typenum::consts::U64 as BB_U64, generic_array::GenericArray as BB_GenericArray,
BlockBuffer,
};
use byteorder::{ByteOrder, LE};
use digest::generic_array::typenum::{U24, U64};
use digest::generic_array::GenericArray;
type BlockBuffer512 = BlockBuffer<BB_U64>;
const PADDING_BLOCK: [u8; 64] = [
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
];
const H0: [u64; 3] = [
0x0123_4567_89AB_CDEF,
0xFEDC_BA98_7654_3210,
0xF096_A5B4_C3B2_E187,
];
#[derive(Clone)]
pub struct Tiger {
length_bytes: u64,
buffer: BlockBuffer512,
state: [u64; 3],
}
impl Default for Tiger {
fn default() -> Self {
Tiger {
length_bytes: 0,
buffer: Default::default(),
state: H0,
}
}
}
impl Tiger {
#[inline]
fn fill_up_to(from: usize, to: usize, modulo: usize) -> usize {
let _from = from + 1;
let _to = to + modulo;
1 + ((_to - _from) % modulo)
}
#[inline]
fn finalize(&mut self) -> [u64; 3] {
{
let self_state = &mut self.state;
let pad_size = Self::fill_up_to(self.buffer.position(), 64 - 8, 64);
self.buffer.input_block(&PADDING_BLOCK[..pad_size], |d| {
Self::compress(self_state, d)
});
let mut length: [u8; 8] = [0, 0, 0, 0, 0, 0, 0, 0];
LE::write_u64(&mut length, (self.length_bytes << 3) as u64);
self.buffer
.input_block(&length, |d| Self::compress(self_state, d));
assert_eq!(self.buffer.position(), 0);
}
self.state
}
fn consume(&mut self, input: &[u8]) {
self.length_bytes += input.len() as u64;
let self_state = &mut self.state;
self.buffer
.input_block(input, |d| Self::compress(self_state, d));
}
#[inline]
fn compress(state: &mut [u64; 3], input: &BB_GenericArray<u8, BB_U64>) {
let mut inputs: [u64; 8] = Default::default();
LE::read_u64_into(input, &mut inputs);
let mut a = state[0];
let mut b = state[1];
let mut c = state[2];
Self::pass(&mut a, &mut b, &mut c, &inputs, 5);
Self::key_schedule(&mut inputs);
Self::pass(&mut c, &mut a, &mut b, &inputs, 7);
Self::key_schedule(&mut inputs);
Self::pass(&mut b, &mut c, &mut a, &inputs, 9);
state[0] ^= a;
state[1] = b.wrapping_sub(state[1]);
state[2] = c.wrapping_add(state[2]);
}
#[inline]
fn pass(a: &mut u64, b: &mut u64, c: &mut u64, x: &[u64; 8], mul: u8) {
Self::round(a, b, c, &x[0], mul);
Self::round(b, c, a, &x[1], mul);
Self::round(c, a, b, &x[2], mul);
Self::round(a, b, c, &x[3], mul);
Self::round(b, c, a, &x[4], mul);
Self::round(c, a, b, &x[5], mul);
Self::round(a, b, c, &x[6], mul);
Self::round(b, c, a, &x[7], mul);
}
#[inline]
fn round(a: &mut u64, b: &mut u64, c: &mut u64, x: &u64, mul: u8) {
*c ^= *x;
let mut c_: [u8; 8] = Default::default();
LE::write_u64(&mut c_, *c);
*a = a.wrapping_sub(
T1[c_[0] as usize] ^ T2[c_[2] as usize] ^ T3[c_[4] as usize] ^ T4[c_[6] as usize],
);
*b = b.wrapping_add(
T4[c_[1] as usize] ^ T3[c_[3] as usize] ^ T2[c_[5] as usize] ^ T1[c_[7] as usize],
);
*b = b.wrapping_mul(u64::from(mul));
}
#[inline]
fn key_schedule(x: &mut [u64; 8]) {
x[0] = x[0].wrapping_sub(x[7] ^ 0xA5A5_A5A5_A5A5_A5A5);
x[1] ^= x[0];
x[2] = x[2].wrapping_add(x[1]);
x[3] = x[3].wrapping_sub(x[2] ^ ((!x[1]) << 19));
x[4] ^= x[3];
x[5] = x[5].wrapping_add(x[4]);
x[6] = x[6].wrapping_sub(x[5] ^ ((!x[4]) >> 23));
x[7] ^= x[6];
x[0] = x[0].wrapping_add(x[7]);
x[1] = x[1].wrapping_sub(x[0] ^ ((!x[7]) << 19));
x[2] ^= x[1];
x[3] = x[3].wrapping_add(x[2]);
x[4] = x[4].wrapping_sub(x[3] ^ ((!x[2]) >> 23));
x[5] ^= x[4];
x[6] = x[6].wrapping_add(x[5]);
x[7] = x[7].wrapping_sub(x[6] ^ 0x0123_4567_89AB_CDEF);
}
}
impl digest::BlockInput for Tiger {
type BlockSize = U64;
}
impl digest::Reset for Tiger {
fn reset(&mut self) {
self.buffer.reset();
self.length_bytes = 0;
self.state = H0;
}
}
impl digest::Update for Tiger {
#[inline]
fn update(&mut self, data: impl AsRef<[u8]>) {
self.consume(data.as_ref());
}
}
impl digest::FixedOutputDirty for Tiger {
type OutputSize = U24;
fn finalize_into_dirty(&mut self, out: &mut GenericArray<u8, Self::OutputSize>) {
LE::write_u64_into(&self.finalize(), &mut out.as_mut_slice());
}
}
#[cfg(test)]
mod test {
use super::Tiger;
use digest::Digest;
use hex_literal::hex;
#[test]
fn test_vectors() {
let examples = [
("", hex!("3293ac630c13f0245f92bbb1766e16167a4e58492dde73f3")),
("abc", hex!("2aab1484e8c158f2bfb8c5ff41b57a525129131c957b5f93")),
("Tiger", hex!("dd00230799f5009fec6debc838bb6a27df2b9d6f110c7937")),
(
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-",
hex!("f71c8583902afb879edfe610f82c0d4786a3a534504486b5"),
),
(
"ABCDEFGHIJKLMNOPQRSTUVWXYZ=abcdefghijklmnopqrstuvwxyz+0123456789",
hex!("48ceeb6308b87d46e95d656112cdf18d97915f9765658957"),
),
(
"Tiger - A Fast New Hash Function, by Ross Anderson and Eli Biham",
hex!("8a866829040a410c729ad23f5ada711603b3cdd357e4c15e"),
),
(
"Tiger - A Fast New Hash Function, by Ross Anderson and Eli Biham, proceedings of Fast Software Encryption 3, Cambridge.",
hex!("ce55a6afd591f5ebac547ff84f89227f9331dab0b611c889"),
),
(
"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
hex!("0f7bf9a19b9c58f2b7610df7e84f0ac3a71c631e7b53f78e"),
),
(
"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
hex!("08c8dcb467e4c7f910966c399fdc9b164be15b792d432224"),
),
];
for &(input, answer) in examples.iter() {
let result = Tiger::digest(input.as_bytes());
assert_eq!(*result, answer);
}
}
}
static T1: [u64; 256] = [
0x02AA_B17C_F7E9_0C5E,
0xAC42_4B03_E243_A8EC,
0x72CD_5BE3_0DD5_FCD3,
0x6D01_9B93_F6F9_7F3A,
0xCD99_78FF_D21F_9193,
0x7573_A1C9_7080_29E2,
0xB164_326B_922A_83C3,
0x4688_3EEE_0491_5870,
0xEAAC_E305_7103_ECE6,
0xC541_69B8_08A3_535C,
0x4CE7_5491_8DDE_C47C,
0x0AA2_F4DF_DC0D_F40C,
0x10B7_6F18_A74D_BEFA,
0xC6CC_B623_5AD1_AB6A,
0x1372_6121_572F_E2FF,
0x1A48_8C6F_199D_921E,
0x4BC9_F9F4_DA00_07CA,
0x26F5_E6F6_E852_41C7,
0x8590_79DB_EA59_47B6,
0x4F18_85C5_C99E_8C92,
0xD78E_761E_A96F_864B,
0x8E36_428C_52B5_C17D,
0x69CF_6827_3730_63C1,
0xB607_C93D_9BB4_C56E,
0x7D82_0E76_0E76_B5EA,
0x645C_9CC6_F07F_DC42,
0xBF38_A078_2433_42E0,
0x5F6B_343C_9D2E_7D04,
0xF2C2_8AEB_600B_0EC6,
0x6C0E_D85F_7254_BCAC,
0x7159_2281_A4DB_4FE5,
0x1967_FA69_CE0F_ED9F,
0xFD52_93F8_B965_45DB,
0xC879_E9D7_F2A7_600B,
0x8602_4892_0193_194E,
0xA4F9_533B_2D9C_C0B3,
0x9053_836C_1595_7613,
0xDB6D_CF8A_FC35_7BF1,
0x18BE_EA7A_7A37_0F57,
0x0371_17CA_50B9_9066,
0x6AB3_0A97_7442_4A35,
0xF4E9_2F02_E325_249B,
0x7739_DB07_061C_CAE1,
0xD8F3_B49C_ECA4_2A05,
0xBD56_BE3F_5138_2F73,
0x45FA_ED58_43B0_BB28,
0x1C81_3D5C_11BF_1F83,
0x8AF0_E4B6_D75F_A169,
0x33EE_18A4_87AD_9999,
0x3C26_E8EA_B1C9_4410,
0xB510_102B_C0A8_22F9,
0x141E_EF31_0CE6_123B,
0xFC65_B900_59DD_B154,
0xE015_8640_C5E0_E607,
0x884E_0798_26C3_A3CF,
0x930D_0D95_23C5_35FD,
0x3563_8D75_4E9A_2B00,
0x4085_FCCF_4046_9DD5,
0xC4B1_7AD2_8BE2_3A4C,
0xCAB2_F0FC_6A3E_6A2E,
0x2860_971A_6B94_3FCD,
0x3DDE_6EE2_12E3_0446,
0x6222_F32A_E017_65AE,
0x5D55_0BB5_4783_08FE,
0xA9EF_A98D_A0ED_A22A,
0xC351_A716_86C4_0DA7,
0x1105_586D_9C86_7C84,
0xDCFF_EE85_FDA2_2853,
0xCCFB_D026_2C5E_EF76,
0xBAF2_94CB_8990_D201,
0xE694_64F5_2AFA_D975,
0x94B0_13AF_DF13_3E14,
0x06A7_D1A3_2823_C958,
0x6F95_FE51_30F6_1119,
0xD92A_B34E_462C_06C0,
0xED7B_DE33_887C_71D2,
0x7974_6D6E_6518_393E,
0x5BA4_1938_5D71_3329,
0x7C1B_A6B9_48A9_7564,
0x3198_7C19_7BFD_AC67,
0xDE6C_23C4_4B05_3D02,
0x581C_49FE_D002_D64D,
0xDD47_4D63_3826_1571,
0xAA45_46C3_E473_D062,
0x928F_CE34_9455_F860,
0x4816_1BBA_CAAB_94D9,
0x6391_2430_770E_6F68,
0x6EC8_A5E6_02C6_641C,
0x8728_2515_337D_DD2B,
0x2CDA_6B42_034B_701B,
0xB03D_37C1_81CB_096D,
0xE108_4382_66C7_1C6F,
0x2B31_80C7_EB51_B255,
0xDF92_B82F_96C0_8BBC,
0x5C68_C8C0_A632_F3BA,
0x5504_CC86_1C3D_0556,
0xABBF_A4E5_5FB2_6B8F,
0x4184_8B0A_B3BA_CEB4,
0xB334_A273_AA44_5D32,
0xBCA6_96F0_A85A_D881,
0x24F6_EC65_B528_D56C,
0x0CE1_512E_90F4_524A,
0x4E9D_D79D_5506_D35A,
0x2589_05FA_C6CE_9779,
0x2019_295B_3E10_9B33,
0xF8A9_478B_73A0_54CC,
0x2924_F2F9_3441_7EB0,
0x3993_357D_536D_1BC4,
0x38A8_1AC2_1DB6_FF8B,
0x47C4_FBF1_7D60_16BF,
0x1E0F_AADD_7667_E3F5,
0x7ABC_FF62_938B_EB96,
0xA78D_AD94_8FC1_79C9,
0x8F1F_98B7_2911_E50D,
0x61E4_8EAE_2712_1A91,
0x4D62_F7AD_3185_9808,
0xECEB_A345_EF5C_EAEB,
0xF5CE_B25E_BC96_84CE,
0xF633_E20C_B7F7_6221,
0xA32C_DF06_AB82_93E4,
0x985A_202C_A5EE_2CA4,
0xCF0B_8447_CC8A_8FB1,
0x9F76_5244_9798_59A3,
0xA8D5_16B1_A124_0017,
0x0BD7_BA3E_BB5D_C726,
0xE54B_CA55_B86A_DB39,
0x1D7A_3AFD_6C47_8063,
0x519E_C608_E766_9EDD,
0x0E57_15A2_D149_AA23,
0x177D_4571_848F_F194,
0xEEB5_5F32_4101_4C22,
0x0F5E_5CA1_3A6E_2EC2,
0x8029_927B_75F5_C361,
0xAD13_9FAB_C3D6_E436,
0x0D5D_F1A9_4CCF_402F,
0x3E8B_D948_BEA5_DFC8,
0xA5A0_D357_BD3F_F77E,
0xA2D1_2E25_1F74_F645,
0x66FD_9E52_5E81_A082,
0x2E0C_90CE_7F68_7A49,
0xC2E8_BCBE_BA97_3BC5,
0x0000_01BC_E509_745F,
0x4237_77BB_E6DA_B3D6,
0xD166_1C7E_AEF0_6EB5,
0xA178_1F35_4DAA_CFD8,
0x2D11_284A_2B16_AFFC,
0xF1FC_4F67_FA89_1D1F,
0x73EC_C25D_CB92_0ADA,
0xAE61_0C22_C2A1_2651,
0x96E0_A810_D356_B78A,
0x5A9A_381F_2FE7_870F,
0xD5AD_62ED_E94E_5530,
0xD225_E5E8_368D_1427,
0x6597_7B70_C7AF_4631,
0x99F8_89B2_DE39_D74F,
0x233F_30BF_54E1_D143,
0x9A96_75D3_D9A6_3C97,
0x5470_554F_F334_F9A8,
0x166A_CB74_4A4F_5688,
0x70C7_4CAA_B2E4_AEAD,
0xF0D0_9164_6F29_4D12,
0x57B8_2A89_6840_31D1,
0xEFD9_5A5A_61BE_0B6B,
0x2FBD_12E9_69F2_F29A,
0x9BD3_7013_FEFF_9FE8,
0x3F9B_0404_D608_5A06,
0x4940_C1F3_166C_FE15,
0x0954_2C4D_CDF3_DEFB,
0xB4C5_2183_85CD_5CE3,
0xC935_B7DC_4462_A641,
0x3417_F8A6_8ED3_B63F,
0xB809_5929_5B21_5B40,
0xF99C_DAEF_3B8C_8572,
0x018C_0614_F8FC_B95D,
0x1B14_ACCD_1A3A_CDF3,
0x84D4_71F2_00BB_732D,
0xC1A3_110E_95E8_DA16,
0x430A_7220_BF1A_82B8,
0xB77E_090D_39DF_210E,
0x5EF4_BD9F_3CD0_5E9D,
0x9D4F_F6DA_7E57_A444,
0xDA1D_60E1_83D4_A5F8,
0xB287_C384_1799_8E47,
0xFE3E_DC12_1BB3_1886,
0xC7FE_3CCC_980C_CBEF,
0xE46F_B590_189B_FD03,
0x3732_FD46_9A4C_57DC,
0x7EF7_00A0_7CF1_AD65,
0x59C6_4468_A31D_8859,
0x762F_B0B4_D45B_61F6,
0x155B_AED0_9904_7718,
0x6875_5E4C_3D50_BAA6,
0xE921_4E7F_22D8_B4DF,
0x2ADD_BF53_2EAC_95F4,
0x32AE_3909_B4BD_0109,
0x834D_F537_B08E_3450,
0xFA20_9DA8_4220_728D,
0x9E69_1D9B_9EFE_23F7,
0x0446_D288_C4AE_8D7F,
0x7B4C_C524_E169_785B,
0x21D8_7F01_35CA_1385,
0xCEBB_400F_137B_8AA5,
0x272E_2B66_5807_96BE,
0x3612_2641_25C2_B0DE,
0x0577_02BD_AD1E_FBB2,
0xD4BA_BB8E_ACF8_4BE9,
0x9158_3139_641B_C67B,
0x8BDC_2DE0_8036_E024,
0x603C_8156_F49F_68ED,
0xF7D2_36F7_DBEF_5111,
0x9727_C459_8AD2_1E80,
0xA08A_0896_670A_5FD7,
0xCB4A_8F43_09EB_A9CB,
0x81AF_564B_0F70_36A1,
0xC0B9_9AA7_7819_9ABD,
0x959F_1EC8_3FC8_E952,
0x8C50_5077_794A_81B9,
0x3ACA_AF8F_0563_38F0,
0x07B4_3F50_627A_6778,
0x4A44_AB49_F5EC_CC77,
0x3BC3_D6E4_B679_EE98,
0x9CC0_D4D1_CF14_108C,
0x4406_C00B_206B_C8A0,
0x82A1_8854_C8D7_2D89,
0x67E3_66B3_5C3C_432C,
0xB923_DD61_102B_37F2,
0x56AB_2779_D884_271D,
0xBE83_E1B0_FF15_25AF,
0xFB7C_65D4_217E_49A9,
0x6BDB_E0E7_6D48_E7D4,
0x08DF_8287_45D9_179E,
0x22EA_6A9A_DD53_BD34,
0xE36E_141C_5622_200A,
0x7F80_5D1B_8CB7_50EE,
0xAFE5_C7A5_9F58_E837,
0xE27F_996A_4FB1_C23C,
0xD386_7DFB_0775_F0D0,
0xD0E6_73DE_6E88_891A,
0x123A_EB9E_AFB8_6C25,
0x30F1_D5D5_C145_B895,
0xBB43_4A2D_EE72_69E7,
0x78CB_67EC_F931_FA38,
0xF33B_0372_323B_BF9C,
0x52D6_6336_FB27_9C74,
0x505F_33AC_0AFB_4EAA,
0xE8A5_CD99_A2CC_E187,
0x5349_7480_1E2D_30BB,
0x8D2D_5711_D587_6D90,
0x1F1A_4128_91BC_038E,
0xD6E2_E71D_82E5_6648,
0x7403_6C3A_4977_32B7,
0x89B6_7ED9_6361_F5AB,
0xFFED_95D8_F1EA_02A2,
0xE72B_3BD6_1464_D43D,
0xA630_0F17_0BDC_4820,
0xEBC1_8760_ED78_A77A,
];
static T2: [u64; 256] = [
0xE6A6_BE5A_05A1_2138,
0xB5A1_22A5_B4F8_7C98,
0x563C_6089_140B_6990,
0x4C46_CB2E_391F_5DD5,
0xD932_ADDB_C9B7_9434,
0x08EA_70E4_2015_AFF5,
0xD765_A667_3E47_8CF1,
0xC4FB_757E_AB27_8D99,
0xDF11_C686_2D6E_0692,
0xDDEB_84F1_0D7F_3B16,
0x6F2E_F604_A665_EA04,
0x4A8E_0F0F_F0E0_DFB3,
0xA5ED_EEF8_3DBC_BA51,
0xFC4F_0A2A_0EA4_371E,
0xE83E_1DA8_5CB3_8429,
0xDC8F_F882_BA1B_1CE2,
0xCD45_505E_8353_E80D,
0x18D1_9A00_D4DB_0717,
0x34A0_CFED_A5F3_8101,
0x0BE7_7E51_8887_CAF2,
0x1E34_1438_B3C4_5136,
0xE057_97F4_9089_CCF9,
0xFFD2_3F9D_F259_1D14,
0x543D_DA22_8595_C5CD,
0x661F_81FD_9905_2A33,
0x8736_E641_DB0F_7B76,
0x1522_7725_418E_5307,
0xE25F_7F46_162E_B2FA,
0x48A8_B212_6C13_D9FE,
0xAFDC_5417_92E7_6EEA,
0x03D9_12BF_C6D1_898F,
0x31B1_AAFA_1B83_F51B,
0xF1AC_2796_E42A_B7D9,
0x40A3_A7D7_FCD2_EBAC,
0x1056_136D_0AFB_BCC5,
0x7889_E1DD_9A6D_0C85,
0xD335_2578_2A79_74AA,
0xA7E2_5D09_078A_C09B,
0xBD41_38B3_EAC6_EDD0,
0x920A_BFBE_71EB_9E70,
0xA2A5_D0F5_4FC2_625C,
0xC054_E36B_0B12_90A3,
0xF6DD_59FF_62FE_932B,
0x3537_3545_11A8_AC7D,
0xCA84_5E91_72FA_DCD4,
0x84F8_2B60_329D_20DC,
0x79C6_2CE1_CD67_2F18,
0x8B09_A2AD_D124_642C,
0xD0C1_E96A_19D9_E726,
0x5A78_6A9B_4BA9_500C,
0x0E02_0336_634C_43F3,
0xC17B_474A_EB66_D822,
0x6A73_1AE3_EC9B_AAC2,
0x8226_667A_E084_0258,
0x67D4_5676_91CA_ECA5,
0x1D94_155C_4875_ADB5,
0x6D00_FD98_5B81_3FDF,
0x5128_6EFC_B774_CD06,
0x5E88_3447_1FA7_44AF,
0xF72C_A0AE_E761_AE2E,
0xBE40_E4CD_AEE8_E09A,
0xE997_0BBB_5118_F665,
0x726E_4BEB_33DF_1964,
0x703B_0007_2919_9762,
0x4631_D816_F5EF_30A7,
0xB880_B5B5_1504_A6BE,
0x6417_93C3_7ED8_4B6C,
0x7B21_ED77_F6E9_7D96,
0x7763_0631_2EF9_6B73,
0xAE52_8948_E86F_F3F4,
0x53DB_D7F2_86A3_F8F8,
0x16CA_DCE7_4CFC_1063,
0x005C_19BD_FA52_C6DD,
0x6886_8F5D_64D4_6AD3,
0x3A9D_512C_CF1E_186A,
0x367E_62C2_3856_60AE,
0xE359_E7EA_77DC_B1D7,
0x526C_0773_749A_BE6E,
0x735A_E5F9_D09F_734B,
0x493F_C7CC_8A55_8BA8,
0xB0B9_C153_3041_AB45,
0x3219_58BA_470A_59BD,
0x852D_B00B_5F46_C393,
0x9120_9B2B_D336_B0E5,
0x6E60_4F7D_659E_F19F,
0xB99A_8AE2_782C_CB24,
0xCCF5_2AB6_C814_C4C7,
0x4727_D9AF_BE11_727B,
0x7E95_0D0C_0121_B34D,
0x756F_4356_70AD_471F,
0xF5AD_D442_615A_6849,
0x4E87_E099_80B9_957A,
0x2ACF_A1DF_50AE_E355,
0xD898_263A_FD2F_D556,
0xC8F4_924D_D80C_8FD6,
0xCF99_CA3D_754A_173A,
0xFE47_7BAC_AF91_BF3C,
0xED53_71F6_D690_C12D,
0x831A_5C28_5E68_7094,
0xC5D3_C90A_3708_A0A4,
0x0F7F_9037_17D0_6580,
0x19F9_BB13_B8FD_F27F,
0xB1BD_6F1B_4D50_2843,
0x1C76_1BA3_8FFF_4012,
0x0D15_30C4_E2E2_1F3B,
0x8943_CE69_A737_2C8A,
0xE518_4E11_FEB5_CE66,
0x618B_DB80_BD73_6621,
0x7D29_BAD6_8B57_4D0B,
0x81BB_613E_25E6_FE5B,
0x071C_9C10_BC07_913F,
0xC7BE_EB79_09AC_2D97,
0xC3E5_8D35_3BC5_D757,
0xEB01_7892_F38F_61E8,
0xD4EF_FB9C_9B1C_C21A,
0x9972_7D26_F494_F7AB,
0xA3E0_63A2_956B_3E03,
0x9D4A_8B9A_4AA0_9C30,
0x3F6A_B7D5_0009_0FB4,
0x9CC0_F2A0_5726_8AC0,
0x3DEE_9D2D_EDBF_42D1,
0x330F_49C8_7960_A972,
0xC6B2_7202_8742_1B41,
0x0AC5_9EC0_7C00_369C,
0xEF4E_AC49_CB35_3425,
0xF450_244E_EF01_29D8,
0x8ACC_46E5_CAF4_DEB6,
0x2FFE_AB63_9892_63F7,
0x8F7C_B9FE_5D7A_4578,
0x5BD8_F764_4E63_4635,
0x427A_7315_BF2D_C900,
0x17D0_C4AA_2125_261C,
0x3992_486C_9351_8E50,
0xB4CB_FEE0_A2D7_D4C3,
0x7C75_D620_2C5D_DD8D,
0xDBC2_95D8_E35B_6C61,
0x60B3_69D3_0203_2B19,
0xCE42_685F_DCE4_4132,
0x06F3_DDB9_DDF6_5610,
0x8EA4_D21D_B5E1_48F0,
0x20B0_FCE6_2FCD_496F,
0x2C1B_9123_58B0_EE31,
0xB283_17B8_18F5_A308,
0xA89C_1E18_9CA6_D2CF,
0x0C6B_1857_6AAA_DBC8,
0xB65D_EAA9_1299_FAE3,
0xFB2B_794B_7F10_27E7,
0x04E4_317F_443B_5BEB,
0x4B85_2D32_5939_D0A6,
0xD5AE_6BEE_FB20_7FFC,
0x3096_82B2_81C7_D374,
0xBAE3_09A1_94C3_B475,
0x8CC3_F97B_13B4_9F05,
0x98A9_422F_F829_3967,
0x244B_16B0_1076_FF7C,
0xF8BF_571C_663D_67EE,
0x1F0D_6758_EEE3_0DA1,
0xC9B6_11D9_7ADE_B9B7,
0xB7AF_D588_7B6C_57A2,
0x6290_AE84_6B98_4FE1,
0x94DF_4CDE_ACC1_A5FD,
0x058A_5BD1_C548_3AFF,
0x6316_6CC1_42BA_3C37,
0x8DB8_526E_B2F7_6F40,
0xE108_8003_6F0D_6D4E,
0x9E05_23C9_971D_311D,
0x45EC_2824_CC7C_D691,
0x575B_8359_E623_82C9,
0xFA9E_400D_C488_9995,
0xD182_3ECB_4572_1568,
0xDAFD_983B_8206_082F,
0xAA7D_2908_2386_A8CB,
0x269F_CD44_03B8_7588,
0x1B91_F5F7_28BD_D1E0,
0xE466_9F39_0402_01F6,
0x7A1D_7C21_8CF0_4ADE,
0x6562_3C29_D79C_E5CE,
0x2368_4490_96C0_0BB1,
0xAB9B_F187_9DA5_03BA,
0xBC23_ECB1_A458_058E,
0x9A58_DF01_BB40_1ECC,
0xA070_E868_A85F_143D,
0x4FF1_8830_7DF2_239E,
0x14D5_65B4_1A64_1183,
0xEE13_3374_5270_1602,
0x950E_3DCF_3F28_5E09,
0x5993_0254_B9C8_0953,
0x3BF2_9940_8930_DA6D,
0xA955_943F_5369_1387,
0xA15E_DECA_A9CB_8784,
0x2914_2127_352B_E9A0,
0x76F0_371F_FF4E_7AFB,
0x0239_F450_274F_2228,
0xBB07_3AF0_1D5E_868B,
0xBFC8_0571_C10E_96C1,
0xD267_0885_6822_2E23,
0x9671_A3D4_8E80_B5B0,
0x55B5_D38A_E193_BB81,
0x693A_E2D0_A18B_04B8,
0x5C48_B4EC_ADD5_335F,
0xFD74_3B19_4916_A1CA,
0x2577_0181_34BE_98C4,
0xE779_87E8_3C54_A4AD,
0x28E1_1014_DA33_E1B9,
0x270C_C59E_226A_A213,
0x7149_5F75_6D1A_5F60,
0x9BE8_53FB_60AF_EF77,
0xADC7_86A7_F744_3DBF,
0x0904_4561_73B2_9A82,
0x58BC_7A66_C232_BD5E,
0xF306_558C_673A_C8B2,
0x41F6_39C6_B6C9_772A,
0x216D_EFE9_9FDA_35DA,
0x1164_0CC7_1C7B_E615,
0x93C4_3694_565C_5527,
0xEA03_8E62_4677_7839,
0xF9AB_F3CE_5A3E_2469,
0x741E_768D_0FD3_12D2,
0x0144_B883_CED6_52C6,
0xC20B_5A5B_A33F_8552,
0x1AE6_9633_C343_5A9D,
0x97A2_8CA4_088C_FDEC,
0x8824_A43C_1E96_F420,
0x3761_2FA6_6EEE_A746,
0x6B4C_B165_F9CF_0E5A,
0x43AA_1C06_A0AB_FB4A,
0x7F4D_C26F_F162_796B,
0x6CBA_CC8E_54ED_9B0F,
0xA6B7_FFEF_D2BB_253E,
0x2E25_BC95_B0A2_9D4F,
0x86D6_A58B_DEF1_388C,
0xDED7_4AC5_76B6_F054,
0x8030_BDBC_2B45_805D,
0x3C81_AF70_E94D_9289,
0x3EFF_6DDA_9E31_00DB,
0xB38D_C39F_DFCC_8847,
0x1238_8552_8D17_B87E,
0xF2DA_0ED2_40B1_B642,
0x44CE_FADC_D54B_F9A9,
0x1312_200E_433C_7EE6,
0x9FFC_C84F_3A78_C748,
0xF0CD_1F72_2485_76BB,
0xEC69_7405_3638_CFE4,
0x2BA7_B67C_0CEC_4E4C,
0xAC2F_4DF3_E5CE_32ED,
0xCB33_D143_26EA_4C11,
0xA4E9_044C_C77E_58BC,
0x5F51_3293_D934_FCEF,
0x5DC9_6455_06E5_5444,
0x50DE_418F_317D_E40A,
0x388C_B31A_69DD_E259,
0x2DB4_A834_5582_0A86,
0x9010_A91E_8471_1AE9,
0x4DF7_F0B7_B149_8371,
0xD62A_2EAB_C097_7179,
0x22FA_C097_AA8D_5C0E,
];
static T3: [u64; 256] = [
0xF49F_CC2F_F1DA_F39B,
0x487F_D5C6_6FF2_9281,
0xE8A3_0667_FCDC_A83F,
0x2C9B_4BE3_D2FC_CE63,
0xDA3F_F74B_93FB_BBC2,
0x2FA1_65D2_FE70_BA66,
0xA103_E279_970E_93D4,
0xBECD_EC77_B0E4_5E71,
0xCFB4_1E72_3985_E497,
0xB70A_AA02_5EF7_5017,
0xD423_09F0_3840_B8E0,
0x8EFC_1AD0_3589_8579,
0x96C6_920B_E2B2_ABC5,
0x66AF_4163_375A_9172,
0x2174_ABDC_CA71_27FB,
0xB33C_CEA6_4A72_FF41,
0xF04A_4933_0830_66A5,
0x8D97_0ACD_D728_9AF5,
0x8F96_E8E0_31C8_C25E,
0xF3FE_C022_7687_5D47,
0xEC7B_F310_0561_90DD,
0xF5AD_B0AE_BB0F_1491,
0x9B50_F885_0FD5_8892,
0x4975_4883_58B7_4DE8,
0xA335_4FF6_9153_1C61,
0x0702_BBE4_81D2_C6EE,
0x89FB_2405_7DED_ED98,
0xAC30_7513_8596_E902,
0x1D2D_3580_1727_72ED,
0xEB73_8FC2_8E6B_C30D,
0x5854_EF8F_6304_4326,
0x9E5C_5232_5ADD_3BBE,
0x90AA_53CF_325C_4623,
0xC1D2_4D51_349D_D067,
0x2051_CFEE_A69E_A624,
0x1322_0F0A_862E_7E4F,
0xCE39_3994_04E0_4864,
0xD9C4_2CA4_7086_FCB7,
0x685A_D223_8A03_E7CC,
0x0664_84B2_AB2F_F1DB,
0xFE9D_5D70_EFBF_79EC,
0x5B13_B9DD_9C48_1854,
0x15F0_D475_ED15_09AD,
0x0BEB_CD06_0EC7_9851,
0xD58C_6791_183A_B7F8,
0xD118_7C50_52F3_EEE4,
0xC95D_1192_E54E_82FF,
0x86EE_A14C_B9AC_6CA2,
0x3485_BEB1_5367_7D5D,
0xDD19_1D78_1F8C_492A,
0xF608_66BA_A784_EBF9,
0x518F_643B_A2D0_8C74,
0x8852_E956_E108_7C22,
0xA768_CB8D_C410_AE8D,
0x3804_7726_BFEC_8E1A,
0xA677_38B4_CD3B_45AA,
0xAD16_691C_EC0D_DE19,
0xC6D4_3193_8046_2E07,
0xC5A5_876D_0BA6_1938,
0x16B9_FA1F_A58F_D840,
0x188A_B117_3CA7_4F18,
0xABDA_2F98_C99C_021F,
0x3E05_80AB_134A_E816,
0x5F3B_05B7_7364_5ABB,
0x2501_A2BE_5575_F2F6,
0x1B2F_7400_4E7E_8BA9,
0x1CD7_5803_71E8_D953,
0x7F6E_D895_6276_4E30,
0xB159_26FF_596F_003D,
0x9F65_293D_A8C5_D6B9,
0x6ECE_F04D_D690_F84C,
0x4782_275F_FF33_AF88,
0xE414_3308_3F82_0801,
0xFD0D_FE40_9A1A_F9B5,
0x4325_A334_2CDB_396B,
0x8AE7_7E62_B301_B252,
0xC36F_9E9F_6655_615A,
0x8545_5A2D_92D3_2C09,
0xF2C7_DEA9_4947_7485,
0x63CF_B4C1_33A3_9EBA,
0x83B0_40CC_6EBC_5462,
0x3B94_54C8_FDB3_26B0,
0x56F5_6A9E_87FF_D78C,
0x2DC2_940D_99F4_2BC6,
0x98F7_DF09_6B09_6E2D,
0x19A6_E01E_3AD8_52BF,
0x42A9_9CCB_DBD4_B40B,
0xA599_98AF_45E9_C559,
0x3662_95E8_07D9_3186,
0x6B48_181B_FAA1_F773,
0x1FEC_57E2_157A_0A1D,
0x4667_446A_F620_1AD5,
0xE615_EBCA_CFB0_F075,
0xB8F3_1F4F_6829_0778,
0x2271_3ED6_CE22_D11E,
0x3057_C1A7_2EC3_C93B,
0xCB46_ACC3_7C3F_1F2F,
0xDBB8_93FD_02AA_F50E,
0x331F_D92E_600B_9FCF,
0xA498_F961_48EA_3AD6,
0xA8D8_426E_8B6A_83EA,
0xA089_B274_B773_5CDC,
0x87F6_B373_1E52_4A11,
0x1188_08E5_CBC9_6749,
0x9906_E4C7_B19B_D394,
0xAFED_7F7E_9B24_A20C,
0x6509_EADE_EB36_44A7,
0x6C1E_F1D3_E8EF_0EDE,
0xB9C9_7D43_E979_8FB4,
0xA2F2_D784_740C_28A3,
0x7B84_9647_6197_566F,
0x7A5B_E3E6_B65F_069D,
0xF963_30ED_78BE_6F10,
0xEEE6_0DE7_7A07_6A15,
0x2B4B_EE4A_A08B_9BD0,
0x6A56_A63E_C7B8_894E,
0x0212_1359_BA34_FEF4,
0x4CBF_99F8_2837_03FC,
0x3980_7135_0CAF_30C8,
0xD0A7_7A89_F017_687A,
0xF1C1_A9EB_9E42_3569,
0x8C79_7628_2DEE_8199,
0x5D17_37A5_DD1F_7ABD,
0x4F53_433C_09A9_FA80,
0xFA8B_0C53_DF7C_A1D9,
0x3FD9_DCBC_886C_CB77,
0xC040_917C_A91B_4720,
0x7DD0_0142_F9D1_DCDF,
0x8476_FC1D_4F38_7B58,
0x23F8_E7C5_F331_6503,
0x032A_2244_E7E3_7339,
0x5C87_A5D7_50F5_A74B,
0x082B_4CC4_3698_992E,
0xDF91_7BEC_B858_F63C,
0x3270_B8FC_5BF8_6DDA,
0x10AE_72BB_29B5_DD76,
0x576A_C94E_7700_362B,
0x1AD1_12DA_C61E_FB8F,
0x691B_C30E_C5FA_A427,
0xFF24_6311_CC32_7143,
0x3142_368E_30E5_3206,
0x7138_0E31_E02C_A396,
0x958D_5C96_0AAD_76F1,
0xF8D6_F430_C16D_A536,
0xC8FF_D13F_1BE7_E1D2,
0x7578_AE66_004D_DBE1,
0x0583_3F01_067B_E646,
0xBB34_B5AD_3BFE_586D,
0x095F_34C9_A12B_97F0,
0x247A_B645_25D6_0CA8,
0xDCDB_C6F3_0174_77D1,
0x4A2E_14D4_DECA_D24D,
0xBDB5_E6D9_BE0A_1EEB,
0x2A7E_70F7_7943_01AB,
0xDEF4_2D8A_2705_40FD,
0x0107_8EC0_A34C_22C1,
0xE5DE_511A_F4C1_6387,
0x7EBB_3A52_BD9A_330A,
0x7769_7857_AA7D_6435,
0x004E_8316_03AE_4C32,
0xE7A2_1020_AD78_E312,
0x9D41_A70C_6AB4_20F2,
0x28E0_6C18_EA11_41E6,
0xD2B2_8CBD_984F_6B28,
0x26B7_5F6C_446E_9D83,
0xBA47_568C_4D41_8D7F,
0xD80B_ADBF_E618_3D8E,
0x0E20_6D7F_5F16_6044,
0xE258_A439_11CB_CA3E,
0x723A_1746_B21D_C0BC,
0xC7CA_A854_F5D7_CDD3,
0x7CAC_3288_3D26_1D9C,
0x7690_C264_23BA_942C,
0x17E5_5524_4780_42B8,
0xE0BE_4776_56A2_389F,
0x4D28_9B5E_67AB_2DA0,
0x4486_2B9C_8FBB_FD31,
0xB47C_C804_9D14_1365,
0x822C_1B36_2B91_C793,
0x4EB1_4655_FB13_DFD8,
0x1ECB_BA07_14E2_A97B,
0x6143_459D_5CDE_5F14,
0x53A8_FBF1_D5F0_AC89,
0x97EA_04D8_1C5E_5B00,
0x6221_81A8_D4FD_B3F3,
0xE9BC_D341_572A_1208,
0x1411_2586_43CC_E58A,
0x9144_C5FE_A4C6_E0A4,
0x0D33_D065_65CF_620F,
0x54A4_8D48_9F21_9CA1,
0xC43E_5EAC_6D63_C821,
0xA972_8B3A_7277_0DAF,
0xD793_4E7B_20DF_87EF,
0xE355_03B6_1A3E_86E5,
0xCAE3_21FB_C819_D504,
0x129A_50B3_AC60_BFA6,
0xCD5E_68EA_7E9F_B6C3,
0xB01C_9019_9483_B1C7,
0x3DE9_3CD5_C295_376C,
0xAED5_2EDF_2AB9_AD13,
0x2E60_F512_C0A0_7884,
0xBC3D_86A3_E362_10C9,
0x3526_9D9B_1639_51CE,
0x0C7D_6E2A_D0CD_B5FA,
0x59E8_6297_D87F_5733,
0x298E_F221_898D_B0E7,
0x5500_0029_D1A5_AA7E,
0x8BC0_8AE1_B506_1B45,
0xC2C3_1C2B_6C92_703A,
0x94CC_596B_AF25_EF42,
0x0A1D_73DB_2254_0456,
0x04B6_A0F9_D9C4_179A,
0xEFFD_AFA2_AE3D_3C60,
0xF7C8_075B_B494_96C4,
0x9CC5_C714_1D1C_D4E3,
0x78BD_1638_218E_5534,
0xB2F1_1568_F850_246A,
0xEDFA_BCFA_9502_BC29,
0x796C_E5F2_DA23_051B,
0xAAE1_28B0_DC93_537C,
0x3A49_3DA0_EE4B_29AE,
0xB5DF_6B2C_4168_95D7,
0xFCAB_BD25_122D_7F37,
0x7081_0B58_105D_C4B1,
0xE10F_DD37_F788_2A90,
0x524D_CAB5_518A_3F5C,
0x3C9E_8587_8451_255B,
0x4029_8281_19BD_34E2,
0x74A0_5B6F_5D3C_ECCB,
0xB610_0215_42E1_3ECA,
0x0FF9_79D1_2F59_E2AC,
0x6037_DA27_E4F9_CC50,
0x5E92_975A_0DF1_847D,
0xD66D_E190_D3E6_23FE,
0x5032_D6B8_7B56_8048,
0x9A36_B7CE_8235_216E,
0x8027_2A7A_24F6_4B4A,
0x93EF_ED8B_8C69_16F7,
0x37DD_BFF4_4CCE_1555,
0x4B95_DB5D_4B99_BD25,
0x92D3_FDA1_6981_2FC0,
0xFB1A_4A9A_9066_0BB6,
0x730C_1969_46A4_B9B2,
0x81E2_89AA_7F49_DA68,
0x6466_9A0F_83B1_A05F,
0x27B3_FF7D_9644_F48B,
0xCC6B_615C_8DB6_75B3,
0x674F_20B9_BCEB_BE95,
0x6F31_2382_7565_5982,
0x5AE4_8871_3E45_CF05,
0xBF61_9F99_54C2_1157,
0xEABA_C460_40A8_EAE9,
0x454C_6FE9_F2C0_C1CD,
0x419C_F649_6412_691C,
0xD3DC_3BEF_265B_0F70,
0x6D0E_60F5_C357_8A9E,
];
static T4: [u64; 256] = [
0x5B0E_6085_2632_3C55,
0x1A46_C1A9_FA1B_59F5,
0xA9E2_45A1_7C4C_8FFA,
0x65CA_5159_DB29_55D7,
0x05DB_0A76_CE35_AFC2,
0x81EA_C77E_A911_3D45,
0x528E_F88A_B6AC_0A0D,
0xA09E_A253_597B_E3FF,
0x430D_DFB3_AC48_CD56,
0xC4B3_A67A_F45C_E46F,
0x4ECE_CFD8_FBE2_D05E,
0x3EF5_6F10_B399_35F0,
0x0B22_D682_9CD6_19C6,
0x17FD_460A_74DF_2069,
0x6CF8_CC8E_8510_ED40,
0xD6C8_24BF_3A6E_CAA7,
0x6124_3D58_1A81_7049,
0x048B_ACB6_BBC1_63A2,
0xD9A3_8AC2_7D44_CC32,
0x7FDD_FF5B_AAF4_10AB,
0xAD6D_495A_A804_824B,
0xE1A6_A74F_2D8C_9F94,
0xD4F7_8512_35DE_E8E3,
0xFD4B_7F88_6540_D893,
0x247C_2004_2AA4_BFDA,
0x096E_A1C5_17D1_327C,
0xD569_66B4_361A_6685,
0x277D_A5C3_1221_057D,
0x94D5_9893_A43A_CFF7,
0x64F0_C51C_CDC0_2281,
0x3D33_BCC4_FF61_89DB,
0xE005_CB18_4CE6_6AF1,
0xFF5C_CD1D_1DB9_9BEA,
0xB0B8_54A7_FE42_980F,
0x7BD4_6A6A_718D_4B9F,
0xD10F_A8CC_22A5_FD8C,
0xD314_8495_2BE4_BD31,
0xC7FA_975F_CB24_3847,
0x4886_ED1E_5846_C407,
0x28CD_DB79_1EB7_0B04,
0xC2B0_0BE2_F573_417F,
0x5C95_9045_2180_F877,
0x7A6B_DDFF_F370_EB00,
0xCE50_9E38_D6D9_D6A4,
0xEBEB_0F00_647F_A702,
0x1DCC_06CF_7660_6F06,
0xE4D9_F28B_A286_FF0A,
0xD85A_305D_C918_C262,
0x475B_1D87_3222_5F54,
0x2D4F_B516_68CC_B5FE,
0xA679_B9D9_D72B_BA20,
0x5384_1C0D_912D_43A5,
0x3B7E_AA48_BF12_A4E8,
0x781E_0E47_F22F_1DDF,
0xEFF2_0CE6_0AB5_0973,
0x20D2_61D1_9DFF_B742,
0x16A1_2B03_062A_2E39,
0x1960_EB22_3965_0495,
0x251C_16FE_D50E_B8B8,
0x9AC0_C330_F826_016E,
0xED15_2665_953E_7671,
0x02D6_3194_A636_9570,
0x5074_F083_94B1_C987,
0x70BA_598C_90B2_5CE1,
0x794A_1581_0B97_42F6,
0x0D59_25E9_FCAF_8C6C,
0x3067_716C_D868_744E,
0x910A_B077_E8D7_731B,
0x6A61_BBDB_5AC4_2F61,
0x9351_3EFB_F085_1567,
0xF494_724B_9E83_E9D5,
0xE887_E198_5C09_648D,
0x34B1_D3C6_7537_0CFD,
0xDC35_E433_BC0D_255D,
0xD0AA_B842_3413_1BE0,
0x0804_2A50_B48B_7EAF,
0x9997_C4EE_44A3_AB35,
0x829A_7B49_2017_99D0,
0x263B_8307_B7C5_4441,
0x752F_95F4_FD6A_6CA6,
0x9272_1740_2C08_C6E5,
0x2A8A_B754_A795_D9EE,
0xA442_F755_2F72_943D,
0x2C31_334E_1978_1208,
0x4FA9_8D7C_EAEE_6291,
0x55C3_862F_665D_B309,
0xBD06_1017_5D53_B1F3,
0x46FE_6CB8_4041_3F27,
0x3FE0_3792_DF0C_FA59,
0xCFE7_0037_2EB8_5E8F,
0xA7BE_29E7_ADBC_E118,
0xE544_EE5C_DE84_31DD,
0x8A78_1B1B_41F1_873E,
0xA5C9_4C78_A0D2_F0E7,
0x3941_2E28_77B6_0728,
0xA126_5EF3_AFC9_A62C,
0xBCC2_770C_6A25_06C5,
0x3AB6_6DD5_DCE1_CE12,
0xE654_99D0_4A67_5B37,
0x7D8F_5234_81BF_D216,
0x0F6F_64FC_EC15_F389,
0x74EF_BE61_8B5B_13C8,
0xACDC_82B7_1427_3E1D,
0xDD40_BFE0_0319_9D17,
0x37E9_9257_E7E0_61F8,
0xFA52_6269_0477_5AAA,
0x8BBB_F63A_463D_56F9,
0xF001_3F15_43A2_6E64,
0xA830_7E9F_879E_C898,
0xCC4C_27A4_1501_77CC,
0x1B43_2F2C_CA1D_3348,
0xDE1D_1F8F_9F6F_A013,
0x6066_02A0_47A7_DDD6,
0xD237_AB64_CC1C_B2C7,
0x9B93_8E72_25FC_D1D3,
0xEC4E_0370_8E0F_F476,
0xFEB2_FBDA_3D03_C12D,
0xAE0B_CED2_EE43_889A,
0x22CB_8923_EBFB_4F43,
0x6936_0D01_3CF7_396D,
0x855E_3602_D2D4_E022,
0x0738_05BA_D01F_784C,
0x33E1_7A13_3852_F546,
0xDF48_7405_8AC7_B638,
0xBA92_B29C_678A_A14A,
0x0CE8_9FC7_6CFA_ADCD,
0x5F9D_4E09_0833_9E34,
0xF1AF_E929_1F59_23B9,
0x6E34_80F6_0F4A_265F,
0xEEBF_3A2A_B29B_841C,
0xE219_38A8_8F91_B4AD,
0x57DF_EFF8_45C6_D3C3,
0x2F00_6B0B_F62C_AAF2,
0x62F4_79EF_6F75_EE78,
0x11A5_5AD4_1C89_16A9,
0xF229_D290_84FE_D453,
0x42F1_C27B_16B0_00E6,
0x2B1F_7674_9823_C074,
0x4B76_ECA3_C274_5360,
0x8C98_F463_B916_91BD,
0x14BC_C93C_F1AD_E66A,
0x8885_213E_6D45_8397,
0x8E17_7DF0_274D_4711,
0xB49B_73B5_503F_2951,
0x1016_8168_C3F9_6B6B,
0x0E3D_963B_63CA_B0AE,
0x8DFC_4B56_55A1_DB14,
0xF789_F135_6E14_DE5C,
0x683E_68AF_4E51_DAC1,
0xC9A8_4F9D_8D4B_0FD9,
0x3691_E03F_52A0_F9D1,
0x5ED8_6E46_E187_8E80,
0x3C71_1A0E_99D0_7150,
0x5A08_65B2_0C4E_9310,
0x56FB_FC1F_E4F0_682E,
0xEA8D_5DE3_105E_DF9B,
0x71AB_FDB1_2379_187A,
0x2EB9_9DE1_BEE7_7B9C,
0x21EC_C0EA_33CF_4523,
0x59A4_D752_1805_C7A1,
0x3896_F5EB_56AE_7C72,
0xAA63_8F3D_B18F_75DC,
0x9F39_358D_ABE9_808E,
0xB7DE_FA91_C00B_72AC,
0x6B55_41FD_6249_2D92,
0x6DC6_DEE8_F92E_4D5B,
0x353F_57AB_C4BE_EA7E,
0x7357_69D6_DA56_90CE,
0x0A23_4AA6_4239_1484,
0xF6F9_5080_28F8_0D9D,
0xB8E3_19A2_7AB3_F215,
0x31AD_9C11_5134_1A4D,
0x773C_22A5_7BEF_5805,
0x45C7_561A_0796_8633,
0xF913_DA9E_249D_BE36,
0xDA65_2D9B_78A6_4C68,
0x4C27_A97F_3BC3_34EF,
0x7662_1220_E66B_17F4,
0x9677_4389_9ACD_7D0B,
0xF3EE_5BCA_E0ED_6782,
0x409F_7536_00C8_79FC,
0x06D0_9A39_B592_6DB6,
0x6F83_AEB0_317A_C588,
0x01E6_CA4A_8638_1F21,
0x66FF_3462_D19F_3025,
0x7220_7C24_DDFD_3BFB,
0x4AF6_B6D3_E2EC_E2EB,
0x9C99_4DBE_C7EA_08DE,
0x49AC_E597_B09A_8BC4,
0xB38C_4766_CF07_97BA,
0x131B_9373_C57C_2A75,
0xB182_2CCE_6193_1E58,
0x9D75_55B9_09BA_1C0C,
0x127F_AFDD_937D_11D2,
0x29DA_3BAD_C66D_92E4,
0xA2C1_D571_54C2_ECBC,
0x58C5_134D_82F6_FE24,
0x1C3A_E351_5B62_274F,
0xE907_C82E_01CB_8126,
0xF8ED_0919_13E3_7FCB,
0x3249_D8F9_C800_46C9,
0x80CF_9BED_E388_FB63,
0x1881_539A_116C_F19E,
0x5103_F3F7_6BD5_2457,
0x15B7_E6F5_AE47_F7A8,
0xDBD7_C6DE_D47E_9CCF,
0x44E5_5C41_0228_BB1A,
0xB647_D425_5EDB_4E99,
0x5D11_882B_B8AA_FC30,
0xF509_8BBB_29D3_212A,
0x8FB5_EA14_E902_96B3,
0x677B_9421_57DD_025A,
0xFB58_E7C0_A390_ACB5,
0x89D3_674C_83BD_4A01,
0x9E2D_A4DF_4BF3_B93B,
0xFCC4_1E32_8CAB_4829,
0x03F3_8C96_BA58_2C52,
0xCAD1_BDBD_7FD8_5DB2,
0xBBB4_42C1_6082_AE83,
0xB95F_E86B_A5DA_9AB0,
0xB22E_0467_3771_A93F,
0x8453_58C9_4931_52D8,
0xBE2A_4886_97B4_541E,
0x95A2_DC2D_D38E_6966,
0xC02C_11AC_923C_852B,
0x2388_B199_0DF2_A87B,
0x7C80_08FA_1B4F_37BE,
0x1F70_D0C8_4D54_E503,
0x5490_ADEC_7ECE_57D4,
0x002B_3C27_D906_3A3A,
0x7EAE_A384_8030_A2BF,
0xC602_326D_ED20_03C0,
0x83A7_287D_69A9_4086,
0xC57A_5FCB_30F5_7A8A,
0xB568_44E4_79EB_E779,
0xA373_B40F_05DC_BCE9,
0xD71A_786E_8857_0EE2,
0x879C_BACD_BDE8_F6A0,
0x976A_D1BC_C164_A32F,
0xAB21_E25E_9666_D78B,
0x9010_63AA_E5E5_C33C,
0x9818_B344_4869_8D90,
0xE364_87AE_3E1E_8ABB,
0xAFBD_F931_893B_DCB4,
0x6345_A0DC_5FBB_D519,
0x8628_FE26_9B94_65CA,
0x1E5D_0160_3F9C_51EC,
0x4DE4_4006_A150_49B7,
0xBF6C_70E5_F776_CBB1,
0x4112_18F2_EF55_2BED,
0xCB0C_0708_705A_36A3,
0xE74D_1475_4F98_6044,
0xCD56_D943_0EA8_280E,
0xC125_91D7_535F_5065,
0xC832_23F1_720A_EF96,
0xC3A0_396F_7363_A51F,
];