Skip to main content

cryptocol/random/
random.rs

1// Copyright 2024, 2025, 2026 PARK Youngho.
2//
3// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
4// https://www.apache.org/licenses/LICENSE-2.0> or the MIT license
5// <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
6// This file may not be copied, modified, or distributed
7// except according to those terms.
8
9//! The module that contains a random number generator struct
10
11#![allow(missing_docs)]
12// #![allow(rustdoc::missing_doc_code_examples)]
13
14
15use std::ptr::copy_nonoverlapping;
16use std::time::{ SystemTime, UNIX_EPOCH };
17use std::collections::hash_map::RandomState;
18use std::collections::VecDeque;
19use std::hash::{ BuildHasher, Hasher };
20use std::sync::atomic::{ AtomicBool, Ordering };
21use std::sync::Mutex;
22use std::thread::{ available_parallelism, scope };
23
24#[cfg(not(target_family = "windows"))] use std::fs::File;
25#[cfg(not(target_family = "windows"))] use std::io::Read;
26
27use crate::number::{ SmallUInt, LongUnion, LongerUnion, BigUInt, BigUInt_Prime, A_LIST };
28use crate::random::{ Random, Random_Engine };
29
30
31pub(super) const SECURE_COUNT: u128 = u16::MAX as u128;
32
33/// RandGen is the Random_Generic with the generic parameter u16::MAX which is 65535.
34pub type RandGen = Random_Generic<SECURE_COUNT>;
35
36/// AnyGen is the Random_Generic with the default generic parameter.
37pub type AnyGen = Random_Generic;
38
39/// SlapdashGen is the Random_Generic with the default generic parameter.
40pub type SlapdashGen = Random_Generic<{u64::MAX as u128}>;
41
42
43pub(crate) const COLUMN: usize = 100;
44pub(crate) const ROW: usize = 5;
45pub(crate) const NUM_STR: [[&str; COLUMN]; ROW] = [
46    [
47        "FA71AC66ED4F39F11EC5D0FF716AB2F64E0D54C44552BA9B100AC0914AEA5B5C2471720D2FE2EB4BF008C9C9DD9D282ED8E84306DF0B973B1573E624C0D412C49498D7AE8506DA0AC8B06031C73379E6E56437D8E467F84F8920A1323C58F1CD62D7424E2C1A962FD087112743E956359C8141BD138E5104B9208A773D429A82653AA78BB9C25455F2323E56C1A8CECB271B15D7ECE6BB9F64CED6E32C29825B35453F80015D04CEF31164A4FDE34202363CD911AABE37ACDBFBF6B4BBDC16C96B0E3D6C2AFD8A500D428606BC8430CD6483FFD5DD18F979628D9E797958898819F7349B9935F9DCEA76F5AD087EFD8E43016075E4C4493EBFC40E9DC0157CCD93E77F67112BCD2A7F2DFFDC1D87A2F70B2AADA80147F9983E60D9928C2C21F9C845AB0F6B623F53BC73978EC98580D9B940C8F2BD4A6DEF79267752862C40CFE07C560DD87984E5F880D4BA1B44E3DD7FA620FEC2AF40D1965AC14D2135CFD8B44BB35BE9FC0A41CAF0586389E766175E71FCCDC4E1050A478371D371E174885DA3EA15A1047B30422543988C8581B1A5251CE7425998B5646159FF840FAE1A76F9E8D87923F6E4CA2295B0C189BF5A867438C7EF890FF9EE0BAC82477D7BB7488A7562B93AF2B9DE02BA17BBF0608BBBA4EA189C1CB7E19AF2D260D9EC4E065BC3583EE53BEE5B47ADD05DBFF67A1052CCE1D862757156178680F796F4F1F7",
48        "97071A413C42764BF47F4A4D04092A10F64A46821BAFAD36D5FDB79FD1C87DCFC4CA7ED5E7D051E724E8C37F0C8E8DD1B7206CF29290BE4BDB28999153F8579154207BD0C6004F8F896052F1FAA4AEF5DDB2FE9E726452A4ABF4C3EE5B60E1136BC6944F1E8780C36E1EDF3229656E117676C7C43B959EB8D02718154B25018859FD59640B50802AF2137A531701793679DEC360873A23ADB36987EC642EFB709F06BABBFC8FF3308B51B3AB4BB76210D199EA02EC26931DB326183231C456D665B6B84A5556C8532B2ACAC0A8B9EFE5CDEBC668F6312F11A7943660078E5304EA47A5E69C1942D723A50079713C4E9ABB328C80772C1C93C68E2088F8731BA6FBC43CCABFA2345988F9B0B780E1FB1EEF08AC855605D5A7D25FDC6622BEE24703975DB68881962C15C84FCCD7E9B2500F72E6E585CB94820B690A4D7D8AC991EBC51D5E3C2C5B1B4FC731AB952176EEF81C84FB9F988DC813A4D2E6C4BFD6D6012E8A870B35EC0B79F725A5691B79CBF934D6178F0A36995C4E5FCBC45B502DD05B422192EABBC4325ED62F7DC54727142D901DF34E688A0D4B09B63C2592B0AE218905FE84DCDE4AD2A2FDB87B825B3898A39AD3BD8925FF8965FA60703862DEBF78B07824A3946B489C489685B8B05D76BB555B4A6C4F02EEDF8493475F9619C873CE66EED5621C84B15A59B2455720068540C560BCC58F036CEA26A9D271",
49        "D7335B8D7DE41AFA271594EE5B19E64DEFBC3E23E94822E0A4662603559B1766D741A610101883D22031F1B65EFE6DECF29F4F2C2A203CF61203CFEFC4D9EED04BC7056115F27F326BF592CB68E848CDB3426C82321FC63645D65E3DB0D7911969BE61540978B3FAE913B17990B10DB5141C75BAE10425710E0D4A42E074F19A59986B42BBF6E03B7621AFEA89E42C011AFE0A525E8EC3FA49B5A9F489E6B61565FE1106829E03A423ABC4073E930B280587E359C63BF103CDE6F319D0F0BEB87B2331944CF4BCB4405BF576C26A9803FFEA5392D92BBAC53CF2AAC14D11C4CFB9B9A68256F31714C777751B7351B14E87C89FE6F9508778EBF0E0D2126B9FEC5235543A723EDD8858579D94C6BF84485554CEDCC9531854791C189935537E9052D694731D19B4096F82F0BE143BF1D6C1298EBD80B4EFFD7B166CF580F2AA2BF68B116E7E915CE06647AF4A562827FBF6F2AA7D4BDDC5C9143A565DDBA0E776E05A6B681629624B503CB3CA45FCA5CBF7EBF3828F0E8F16A90BC2384A443D6B27F2540542A6CF9C6CB09E390C404E00665DB0491ACC961B3CB2710BE4E00FA9DF070C2CAD0F6214425EE6305301673213D2D61DCEAF093544BBB727F5783578BECFF8EB5FFE618A54CBA66A9A18E3002449F3576CDFFF1A12B3688B8281DBB8ED1396A1BE07DFD527B9189D85EA8F436BF5AC5F400CA52C0FBF27449540DAAD",
50        "B777B3FB884E4662B915061424403F02E12E302A495A75A0C366B458441B2ED9AC3243323557AD4A05EF6D5CC22DC195EB1C7A1AD9B166DB69BCF3F27506107ED6F56F40081024FD56FA9EF8AAF0842261223B11AC79C52B5A04CA718EA2A2C7529F795709CE3BC2063E1B79CCDD488E380E9098C86D536DD1FB24E205B37B92291E450D9AED6BE389B998C643FAE1F2C9536D2789B4DED00489E3894F799A1E1E0B82461130AC90A431CA73C1A17D779B8793FA31DEC475FEFB556BFC10A9F31A6E1AF281049A1E835431CA86C96CCB3771A0346310257BA7F08A131F08A8D3F6ABEBC51333964C7399CA0C70528693C0A9CC871FCE12D80466F8FA621026D5E08EFE7221095EDC22C85C9F893E3AA64F50DA2A30A3281FA3938A21D4AC700DD0A7BCDC08F2D9189F5094410A099FC561C55B6E74B3CED53D4220F30E447769DF7752DF18770B930710E6CF48F7AD2BDD1F052A42400966A9E1EF3527FAF7D61F5B6DE5A481B4E57D7ADFBD20B45EAF4F2B2B95A7BE2BF426FE1F848CBDE1EBC995BCCD1281D52646482BD86B74F67DA92D3E092CB6D91371BE394F550D292E015235A2A532A71C8C567CA519294B03E19C8442CFF64D35D9FEDC38DA3F71B9943CE8A72A01EC40112A249457E967F66CBDBADAA24897D682F7C2BC2BE32FA833F4D7A8647E9510D61B4ABCFBC231C8C1DF4B38A86502ABB8AF84FF50F5349B",
51        "95D58615D1AD3AF5AF38DFF7DF148229C9688885B7465594B2142794AF0E108B88076506FC5CD0C3A92ABD576366F0880E7E4CBED0294A0F5FBD3C5CE1C1FA6901EF6260393A42AB45C4B571AB29AD615996C6B33F795FAEE04448D4011CE52168B716FA8C0B62ED38A8C7EF57B9AABE57987AEB81CDB446D7C0ED8F0125CDCA54F81D137C08DFD7707F531AABEC9B2F396F29E8B94504C60930BEBAF23091AA2E651A202FDCBC9925CC08D7C0379F38300AD443A25767BFA94F58D6608C09D7077E40A8E4A80ABEFEA59FCF47DA90E7CA2F127CBFBAE544F0999437340F6A814B06B07C2ED6FF517E18D59113D92D697716A5295A49979F2ABFAA93EF82C8C71B63A47270970B5F25D581BB6696AA1520BA3CE1927E7FE041FEB1657256F2E9AD2F55385300263BF8F4C1F50C1C69D44C54B9BFE57EF8F13AE41F1F6383B4A49F437D997B0DF76EADFC5655532DE12389B4FF8ACFD29DFD41FF91E95836D1D2D184AF65D90DC8B045430E8D4DBE463F99DE24A84382CDC0AC9A5F1A3E53FA52503474C1FC4FBB03854CD4B57E9ED0478B5E657626BA6A9B93BF206A89F323F425E61160FFAB17DAE0EBA3A95994A0828887DF276B7F58D58C0CBE2875E760DCF716845D0E9B05CDD3A8BA42F9DA2D9A19602BE3F868025314A55F8EE6E63FCCCBCDF6C51E407995308DF62DF211B96654F27F61C9DC2E1FD771D9C10CC11BEF",
52        "B7256BA2BFB83434F9543D8A45969AE0E400E8427009A982E80389285611754D650582AACAA65F82782BF7F9356F20922B094E4B759E41706E19CB72AE90FFD150EF80432B6F57BFD7BEFA129C50CCE7C72DA75730993E55BB0239FB2AAC562C9BE272C0121C347B039B37338AF942865F4B2DFEECD119C41FD4C3C8A2C2D2FEB4555143A88875EB0150E7F8BBB431850DB128733683A0212E66931F0FF4EE90772CB21831838095066DD8399D23698633228C5C4B9C1CD81AB569F39AED85F904050161FC033D6632A6D21BD086C94635870071B4267A81B52D62E778EBBC1A967595BF77F63AEFD0F9640433B5581EC0E7EF58722DFACBE9DF60FBFF8B32CCC466FDC9F880817726C0D1E8061E7D532EA23650ABB923CF74D6BB28743BD9D4C5BE0F41BC4E0C1EBF3DEF3F2939281B439C361C0FB4D94431D828FEE2D8E570F1CA2FD35B57B7809D99D67AE2364CA26C6599D6217A1805E4E24895B9A4CD3DD42F5B8EEC41923187E4685D60D62162E75C262E86EE7925E59D8C5FF682A2414E9D85923515641F2BA1A2BC5D710FE78364F7BB3ABCF63DC10FB1C799904A11292F02DE4184E8D624E0C1708469ABE78047A1DF78138E757002060D64E7BB2A713C6DF00878330524A94201FD2E8D444B00C148CDD6DC7CB941B94C1047C64795FBE25FF101EE5484837879A4F5D95EFD8B577C0F01E494B4E968342BD303F3",
53        "D9015D7192C3664843CEF574743949B0D475FC85250C8C20F2BE6BF54FF203B67878D0B97178317C4CA230F685D4AD2CF9DF2B78349E170BBF26E466608E65DF17F1DEC11E86BD88213F5423DDB99BA21B960262BA93F721E6B8E244A3AFFCF17B12AB2E89E50D856120A5CECDBAB0525B43EFD01D3B1610DB60154723A9EBA2014B1759AB69B2EBAD3CD2D167775A6B59E4BB099EDB5FC85EB507E2718DD745CED20011761D80CB08468C3C4DB6D91DA6FDBF831D4484C0116C90DC3F65B4C6FEC4DA9A2AA6FCA6B2B318D183F105F7519271B577502C5D22AD28724CAD076DF02B1C6C0EF068104A2F5FBAA7252AC98B06271C11A1E8C52F43522DBF8528EC50891237B99CBB7FA9A8FF66056E10F7A27AD3E94BE3E42B2B0F15DAE33744E51842A02D0D9A529159EAF786424BBA7433AB207090EF364EF2576E6DDB276592F9E64E3614E6D4B67385AA6C53BEE0BCE5004B93107845F733822F44AC6BBD9B6AE033C6ACA25104380FAE02502045BBCC267F3F4755C3CDA522DE005E36592452797D84F7CC5C87CCF2214353C8437D0830A497F741DA29AC0B124E271873A94E098EE97CCC5CB236C9F743A17D26E188AA177D54D8254ABF26C46526F8D897EF3C1CE00C1BE207FA488AD2075B9D759953574F9F833C1D92F11576C3360C142A191217C69856691ED6F68BE9B9DEFF24111C422FB938221DB80B11EA2EE667",
54        "9CE12F96897403C6607B19370104FFED317FBF66367BDB5D6FBF8309562F5D7D03D882752BDF735A6F7783A769E869B164D889B0FF0CE84EC1254B1F25F87CC152E717C02C211E33641CC231A89A4C7956B2216936D963A59D1732DFFB80C093460DB0F40799612624A84952C96D6E3FC370DDD8BB97111DA2EBC6209175A0EBCE737EC76A4DCDA7E5F660C177D69245E3222496F85D6DA8D4F5A5BCBA46A4899120B7CA32092D2ED223D88754EDCA98CDDC8B2A878330796ACE8981E0F5D49209E41C5D26CD70D81B16054465F4F1B38B1CA622A7297A87D6B8A02273679BE528FAFD30C2A6AE5F474167B8706DD7380B5277BB6B5A3DBD6E5747D218C915A09B6FDB341531AA93BAD2E3B70EE97D7FA0775DDDA2DD2D927B7F7FDCCD52E3D23C71D22A3441D1D7A40CC30656E89C00883B116CF5EB6A0CB6B49E6535241526F77EF27E482D9F40130F5DA956CDDBD922344DA2224E293C644353DE814F6DEF13E84586D3C6BE8E00E63699B6D7940FB6E41E1E2746B328BFDD7F6495A6B41EEFFE11BCB1C77A730D7F09C6FD1A5C470DF9EF1B5F6032B09D0CB8D1CBE4ADFAFA0EFC8D51A90905DF9CB60DDDC5EF8C4FE4DDE044E6323791F743A4153254E786D67C4191CBAF25F4C27A12DD65DED23D6D10224DF15A9539D898195E50FEB623D3C9E6AFE7D0734EA9C873CF351C9D76AE452414833F9DCA32FCF0F4263DA9",
55        "CD237C42911EB5975BDA15ABB962EEEDC78A7AB6362BA00ABB7B2CC56A967E69463873E089E22E8DA2094BF4212B8D3EBB685D570F1B2D1E992037320D9B6CD461589B7C68A99A94DFD09FB67F16D61215A9E2D7A8D6B4BDA03905E809B42DB83425890E786D60B85BCA784324E0B3D283BBC92081856DE126D8507CB5ED2E37AACE57319AFF4515F3AB1F3BB3E45460667D5D8DFE64559AC2F25DB1E17B510F66C749D83838481AD8E40390B37292B50C83DA390A3EC76BE145744DCEF3EE3FBFF2E828CA970E8BA8C79534D0AC30C1C7D1782A9CDBCB6CE829BDF7E08C60DE81E3B0EE09D774C7689F3AD283ED3FFFFDFE46DF5C7BBD1D7F745262DF3538C5E0196A449E78FCACB6642DB2CF234CA9BA86014EA561BF3342B8E6CFEF01B0D6B04575C5CBAF4609D8EBA29A494C0ED95FF7D782EE66FAB63A91E49643BE66D2095F47477374DB804E5E815ADD7F1253D2F684EC70B4F233125151ABC4B29822407BD24F335C1D452DD4755F87A6AABF260C4BA8D76D51244031D4E80CC235008B18B116D6FBBF05A91274B9C9480B26BE6D465F74CFBFC271D2D5B5D79C32827B5F74648A4B09284DC8924F3FA4C59AFAF12E0D7713939F095BC2DDCCE22206CF5F66F2C07F508F1F88D941C2C707B00E56EC764DFF8AA937A51D6ADC3AF706F72E003CFD86BBED2923DAA7E48F35CF7A0E6B2639E41B8F88B3E33F617D6D9F",
56        "A39B925F21F79BA72DAACC534D31927F8D216C888BD42B2351F0FD1093B5F6D83E4CB6B24C2CA6C52835F68966F969698E0D56AEB5CFD53E8D8579669F9A2CE37B662664CC2FD222281CA02FBF20B0ED321FAB0DF51870F414B7CC2337B028524F9C2B9D5604BB0E9B9CFD656C3B56E41BFCE3967633CC105CA6072695ABAC1AA3D942804949753E0BA439873847D0D2EED909ADD91FDCF7531F494FE82E3A602D31731C403109A8E21478E4ED89DD51E154E5C6FB3DE333BB2A0CC78FBB137410BE3A7A23F7A9CF6311383DDCBCF9F1C418C2A71DE7A24A59B740A92C191D0113987D219F1F94F574F017CAF6C12BC6406585F401065E94926956C11E4AA394B482AAD97C2A807C6CADF66A0FD571A3D23095ABAA2678FADF3511E0FBEC8F0DD261F032F95ACD62FB3EE662B3347D8D5998D5893DF5AC8F5E4C1BAAB37D6327944056B55789C6987DEF7C96EC5D616FB838ACA9FE9DA73B084614EC3A856BE0D65000EC4371EC3651F223BE50FA792B9CFB72F86CAB92067D8CADB47D76E8386EAF153045CBC7BA24371291A78DB1F8B23804E4466C7C2DF5BC022536AE4F1F5DDCC758584F0A9A06DC3719D427A16FCC2519904F77C39DF04CFD5351E1D13C26E95B904E9526CEA68341579E72C82E3ABFF7487FB5A3413394E715E20A6FA5D12E2F913545FB36A0BDD90A8A8DB8EAD14528941D4E5841B59E38D81699E969",
57        "B98EDD562A16C0118136B8B769D94623C3C1FF8FDE0724205F538E0596515E44BAEDE2E9025392162DC28AF268437D9719CB66447021E3F07359B0018DB8CFD3FC964E6C727274905820E3FCF2EDF6C4141A70C01D7FBB1A9E414997D5AC345033F78E3D6B6E80092CE0B369400B5A3495FC356F9A3EF2CBDE814B06A2BF2070B25C1EDFCCB9B0B0BAAA7603138936DD7BE6F60FEE60AFE2507C68EA0C491BF6B7381853D414795E235CBF6F030DF861B82C35F0C24B1FEB2A62AADA878914E74529578146D57BAB11720797CF62725C15D0B30299A8337E84C61D230A0C64810BBEF930FD14C17BCB5C5AE3D54689D21E81BB9A42046C0394A179FA0B6F473E71EBFD1EA2373871647A3854FC6BD3CA916C9EACA9C9B11AC9A2D07A6AC50E63230A899D9DC71C3D477A939A845AA0A9EAD667FB89D9AB63965BF14A5D6B3F480056033888D9A588A179181141B89CF2A7847DB97F665B8E35BEBEC601C90E45561368B4B1682516805291518469FC1C3C3E84D7C7FC4CD821980951485001ECFB5FC3246ABEA3EDF12A486B335F95A46BDD4DBF43CEC0952020C14DFC7EA6DA1B71713FF983256AA06928E623CD4B9617A3086E660C05175369767EDE5C820C7E9C08DAAC9CDF1E462B7123C69197D8B4F4A7599E305C4C047697B2D05DDE63764822CB3BF356887857AE89FD92BA7EBC5FC7676D4245AEE39E01F2AF285B47",
58        "AFE1CD084A6637E164D187D4DC263CFB97A2420550BA29DF8F3DFB87DDEF0C95DF62C7D2DFCD181FEB877C8F8D3E0CE13F808B50BFE5DA7066D76269727D9F027E47639297966236EFA51AC0066D99E5A736FF13C7F8189C22A09D984927B7620727EF666D26F8918A2577D83315B840A22BCEEE20AE1C8E8C8F1A1D924A539A288FF8EA66F109B24174A5E9C5F96C79A9D67261C99C4E63D09BCA8EBC559E8D814EA73437A516254BD243CF09000CA299C1F23D5FF063A3EF5F69B368640B6E3C5D7B72F8B95A939AB6C3BFFE3BA8A1B035A53693F03EC503BDB426FFDF6BB2B307ADC4190B8906F541ED5A485FD3728308D932B8199F822BDD373C8949CD9F66E3E766D53109944B904B0CE9ACA1DC27655B8C64A4274638093D6AB602C39E9C9C9F52F9A68361DB0D4958AB681D2FCFA772EC6019E8455BBCFB441A6FB6F0992EF0D261DCC838136C0C7E926AF22A9239B75B74C3ABF6AA286E1D9EB9C4F562D87B1BD381DB1AA5A53133CB1E371E302726E6F84E872C74BA745C7B529736C97198357C1FB52A89ED1070C48547CCF79F75B9929252E540CDD80F7E987ED68FD64846325591316AAEBC06BCF22E2A90A1FC61BA55B9C5D926175315EF3423925ACB3D7B8F48133AFFCD6805CD202C5CA55578647285070ADC8DFABFD8DDBEC8A52C87A15ABF345BD2C695BF19364CFFE33AABF09C385F2D2CA9E971E30221",
59        "8452DFC919BE6F676E5B68D11C96C31F153E2822082918C0C3208D8843B0EA1D10E6949221796B64C5D5E02331752D87799D435F60EBE2DE84AF24748A39F0E2E111D5EC70FDAAA10BA8F5C1F8C67EC1125F6F44FEDEF8274A224E078409EB32BC5C1406D43963191D6A5FB52A92FC44A38F90E23199AD867267F0406EBD27B5E2927269476F455FC08BDEB2C481BC3ACD06AE0D53A3B8990F230E90BD6BE69AD67DB8882F37F681EE6026FC863B9EE58E5A5724A4167127C0D40EAA04DE4C533A2A8B5A4A295EFC7BAF6D810E03B6A55C0E233E79981B67E38AFD550A43CD1AF4F0C62D4D7D858D6EC8246DAC59D217D0ACC63351656FB9F87A7B5FABA8FA1920EF6D99BE605D3B7DDC7ED77D2597E666AAF1D7C45CAFA69EDA80FE8F5C24512F1597C4761897C56AEB7C0B218BD9E0B8D917CC8DF35155F4BE11D7BA20B52E8FC64BAB81C8B259B01CABD52897A01DF51095110B0AEED508CD4B7B27813A3DDF510FC05B6F71AB03B363919903DBCFDB17E1C14B728C0E3BFBADA4E4F0D1AA22D80CCEAD09EFBE8524A53A133AA1E846ACD35B1A76DB3A76AC854D12E27F6B4F78FC4DB052A325CD62A9B27F912F08ED54C31DABFC68F95E24D010D20E0E50BE894D590DF29D160DBB4DAA7B8F86026FA36B012F507F328C73D2F823A5CAB94BE6FE5E887117CFE1E7F6255C3BDE6A3EF99C3C77E2714348EB9848820B6F77",
60        "D44E3729C99B109790BF9230676B9C13CA0A838B4C1D1701B07893C3241E100AC02B59EF2F48A52E4833DEA5BEF27EF0015C84774E15F5ABE38F39903F9044D0740CB6BFE145D1DFBBB5107FC17C6459820094D907C1002239C31192F0F79B4BB0CE24AD54A6A4E0BC8CE468C90850CA09FEB427412846248C766C1042A130CC0ECFCA6BB93F888BBA48CF53BD250E16EDE60FA187404FF6402A9A3281494C8CC46C48791A8B7925B47545DF481E80C68514ADEE1E898FCAA273178F143A3EE4792B5C39582D85C76588C1D5A570A5FE74303764124FAA02FD3B1B70FBF48731C7EA6AA9B32CB64AF1C9D22C308A6E00C890E434B9448C446A87FB0320BF192C503FFA61BDFD08779CDB3797F9F7266E94491846068E6C7790C5FD31989BC0E848AFCFB51C9F254D5D0AD123E14CF217BCF182D1F0A052AD2336C4AF72206E9532021E7E0662276AA1EAFF207E5FC07E5FFCE95B924071E86495A21E2E2F5F87A100AEC15E333FDB5C349156280BE817E300A803051020685FF55B0AA2B68F805F08A8112647F5F0403DF951EF23B0C6EE1D90495F9D400094E2E35C0217B018E7543CAAD4487865610E1A456D3C0BF4D015F8D4BE7E3172347F3C2D3A4BE604C4B7D37F693CB4E20CCBA3279B97CEAC11F1095019487AC2D45D8508707C2E8A176FD647B9510630B4DD979FA33C16F5D7441E5743A7CA7A237100E733320A0D",
61        "C8580C611B906167C89EB9E6F254C47A7D7DC80551A7E4EC8DAD5CCFB933E9657FC261CA86650D822A3063D8B2B571930728CF4D94992A9131B813F5BED075DCDBEBDAA34D0F9943AF3BC6B097354F18B9B542D0F0F2DA703BFE537CD5CCFDE53EEBF4D781415346F40E0C0665F28D4A44296975A884F209AD3F1CC902B269995D281571554B3A445E93B9FFCD5F9834C805930085E1E7EA78BAF99DF5085AD0E8E755C0B70FDC9DC262744B76F08D537AE6E6EE403E4E8BB8D069B7D05E4A5A839B45B27005DB58993E1C6F2DE534D5660F71BFB39E769D43941BCEA1C3568B54962AB9C5DFDFA946ED7ECD7A9D102A8CA64420EB5200FA371C0F8048081397E0011AF4A063C288FD6CCB88BE918A23B11DCBEE265A4F4A50C681C685A67FF1ADAF2916AFFA5C466BC02976EC2EB3B7475DA835E007FD180E49F394DBB9A76F268647F64D7D0941426B8B48B436CE47181E365ABA6D1C4BE78929D2FE53FD742269ED36F07B04E2A58D9FC312F050C92449A0A2B72105947D552D25A5E54CC7CA938B0B9C5723E440C9D5891CF2793D5317C31EB23B21D641B08C87A4D781E88B5C53AC38EEF6F56C520CDC12616B6BFC0B5B045688003705F194078D437AD85FE76A10D74641C61FFA6BAA8CC3B9E0BB7DFB4364BD8ED3D21C1E71CE46FA08BB68FC3E1DF6FE716B890E39C6D1A148425EF7B753144E467EFF8E77F46AB7C5",
62        "A8ED6ACF9C2E68BF99262DEC5EBC89CFC288396DC8FAFC8CDC5877314943DE8E72C7A4342185CEDE86C1DD9E838DBD087FADCB3BB9AEA777448964F43B633DE1E7B1CED2CE140284477BFB9ED5159290A08FF02D962B0507C79ADEFB4231A90FE3F130DCCBC2E8ADF8936C3FDE61F2CD71F1151A532E9D27F1C8B1F22EB6788F2CB1F3C1AE81D57A19CE8FEAC45BCA47B82AAD4504D6C060DEFA6ED6ED6C5DC9849B2C630F75AC87D3437F7CD3F5AF20BA0C9CB411876A5441C2D90ED3D93F67B1705302062C4F3FB5F68C9AFB9325D0C167BB51ECE6A160611153C3AAE79C79AD86A2E1746F5D1676565318CCEFF8375D41DC1C5C9F9A765A4DD4678695FCB0AC07531E820C84DA0F7BFA6D07189687793403786B94D53B692D154CF015316884015FDCEFF4F0AAF1CF03D6258739F3B50110E5DAF1BFE2648313188E43F492732562E0517FF181C0E3AA395C6EED5AB85B9E5FCC2D80662B0CCDCF8E57F5484603B379A48262A804B69173366EA745D941D6A4C1B0071B97C794F114756A234FF6257390916699287DF4D2C3585C24436C9F0886BE249D6E4C2D2DCF8AA244946451F19A51BA6C540054811D3C6A5ED505CC9DE024CBAD5263E29F5F191F7A3FE393DFBF87E22EC3B78BE32013C008781DBC6BBE19A3563B0063F551E2BBFE62FBFAAF98ACD1A18BC862FF906E85C4356D58585DD4E8B891823550F13393F9",
63        "F2363BB31057614B8FA31114B1DEB9CB4FB0B3D59E4F2B27CEE220847E4CFA28B2FE3A74B729F513D4E50F820665F3015F84953231658F7E1E00A23E12B79CFE7C542A08E1C52F4D06F24D7E72E030DCF9A6BFD1A223BC7BF2916532D970222C429FD9A3495C4382D9AD6F6B48428C8337AE0551FADE554EABCE6769910D2AA8065C43BCC0F70DB8D0FF8FB48601A1A8620EC8323CD9CE4618D6A9C916DBD12EE0813749B9102E7EAB6B5E82CF093C8634D7599343EB4C52741E4FFFEFFB47F3129A70E1B5D6D68B1BFF1F60AF82A7E1AA44E0788DA1D4B31D27CF467A5469CFABDB4719478B4E4913BA58A4DE19A252B80597B2C4479A437E8C6C47FEDCAF95C985A278A1CD851DC0B367B75B76B63D3F6B7710A31FB12345205AF48096F5877575F031D87266DCF12404D9D4CBD4CF7114E4D96FAA499F66F98F3858609427D2B381294670C0CC6BF5BE000BF35759A5987D52106034B3AE3458B5CEB3A6217519D16DA0C7D816E8E44065DE808910FA624AFC61B8854120394F63B26F7FE5C4E321992433E50DF08A0ADB5A450CAAA60787649807CF418B096CEF39D45A83CCCD75509FBED7F9DBA258C220CDE5D957906C4F1F555F3B87FC92FD2E6F58DBFC5A01938665B0FDAF3667D611A220F75E3C003E8CC654AAFCF978E5E20B6160DEA59C20117FCD0C3ED7160E60EDC3712DB26511FD94BBFAA4A1D4C9D5C61B19",
64        "939A63798501A904ED38D33C7E06F58FE7BA2349CA8D31C96D49BC835ED55724F4A9FB7774A7751892B3A52D94B7E6D6A94813799733AA428E7055B46D539DE0F30099C4E98A4C0B2B2C0C0220BD064C0968D202CBF4F537C069EDB2F35681680C4421C8B87B4903971C36DB5576DA6B4BEE4A37FB267603D7916E792673693B13E270A1C37808514382A4B480BB6B2C27925413202D2728131B5B9EB3EFC64DB32EDE7B83D2220852AA68532491E7A78D497C2EB0E0743C6DD295106F51E9FBC8CB45F4477EA3C024F3D271C7324A8B5BACAC5BCA070C9EE0553A0B9FDD72761793116A28725DEA7F009C065714E0DBEAA7D234E403C046BDC54EA425DC2FB58210510F6D444517B5F2B7D048B1B240A5C5810F13F9CC3394B937426A8D6E1B9DF27048F244D833531A6619E3DE4B750D4C031028740CD63E18F390F6769F106145135AC9BB789340CA79E0193BB99B8BAAFB796EB285B5218738ABC5EBF79734DD33F3D0682981CCC02FCEC6513B73B37B75449CAC7832ABC6E519F297646BCD08F9048ADF53ECE87DE9BABFE24B54392FC97C4C3569565FA03B5636478E9D7A8D787DF171A89C12404CD73E9F9DBC9472ACDD0B6A04BC0D298BF1629889EE0102EB99326EBE6B1AFA485CF123A9086CFFC66324BD039C5F84587AFBDA06449569B5D0A969196DA4C154A2174F9DF3F6A8FEF110058DBE11590DBD19ED86A3",
65        "8155F248FCBFF73C0313774015F540CFD9D3A1E365A7C2A082E537E074B7F198153CD6C12CA56A895E98B73A8EE9DFC20032F33D72FA25D164AEACCEC438845D36E195A7129F53C043A6FB8EEE39F502B90BCF55E1EEAF9D0433A9B3944207531023D3EFC9DF2C76C925847A46C51B0B221A645943C74EBC8A58EA9218B3B4B78CA5BA30ED6B645248B2C88DAAF8AB6AD1453362E47ABF9C4EDEBEFD3D1C3ACCA88F689C75094F089D4A4F183183E4643C385D09D8A9DA8891A3AB8AED7382DFD5AD274D6E8CD5B350545A3695F958890E3BB743BC9DF14DB11AD80492FCF0C4BFE43B82C1C9ECDE1EC6F9B9F331C477F558AA797AA632C8802E27CEAF5A75736070DC7F5E92FCAF650B003395B27B81017914D3514BEF1C86B652D5F7412F3E9D318991119AE59D6E37E01D451FCBBA0CD9B8794B1C3B4077D12345CFCDF07ADC8ECC6017717AFE683E9166F74CE0FF2B934CD2B10CB379F018B6BE4551C4E4C3FAB7765E75964C584C833D383BCAA898E02E7BEB3C543A10C0241FE527E907F15D5EDAFB9DF06B281C00114E77AE7F54C30462EEE386C90F3B41B5D8BE98A17B05512768705F7AACAA2CEA60AC942E17F988ADA757E1887255A3A8F5DCCFC1FEEF89735DF31A5D30EF76B4F2D0860FF897689F7E4A525D060DCEE05E86AEE68AF4CF5B98EF40141707BB7F776EDA7B35F84746B2AD6D6326E170AC933D4F21",
66        "AA9BA51C23F0CE9E8B5BC456CA1CBADE056B15C10080C196DCF9F754CFB57C3AE4C9378651A500D134D80642316595EAC37F07897D25CCA84574E6275A146A6FF8E6A1727623C3149978A8B618D2E3C7DC686FF229C86D837C521437BA156083215D4DD3E21F813281A2642D16D0D152109AF00AA83ADDDC621EAEA6AF75430C07FA81B787041BDAE2CC56D5CD071454C28B2C0BE45F636D9A6B55319721FF96BF24B0DB863337428AE50A74840F82D27FD209980110E8B065E925CF81A3BC9B180F6003B98AF24A890E43832CAC6E05B587045381B9E90F676B9D6CDDE3AF707C183833EC99A43A89FC7DA6B5E54DC72A7A677D36AB43ABBE527311D4651B9754F9B3051BB4F7B7231AD7575D7A8263959DC5ACB93B7FA3FE0D98E1BEBBAA4F1B14C7BB5608A29FE3E49D2BEFB634AEDDEF4F8D13D8B256DCBF81E03594E30337D587DAB450E9C43552EC1107BB842FEBB3448777D5047DCCD284C5FFCC902C287867C4E67B420DD76644C00C503EE49D7EC5AD57E47F2787CFEEC7E4C1000AAFBC662E514D3C343D92450995A79677DEA8A9F72E3D7859F620BA591EA7267C0CE28E53BF0133D94518CCA8C51D44556E695F44AC0BE24542EB20B6EEBFC0D510B47BE15B95E8A7D45BFD681480F682A1F361001D54D59A7880BC9ED83EEE3B613EB912E776641E2538F9E0499EF1B9CF4EA680A41F09BEA396999EB2E0E7BD",
67        "F156A3B1E37235E2B55E33902934779161AB776DAF25242E10145529F5C5974BB7A52ADAE4AD5003F84E17909A4936149EE896DBB14B5AC5893E9DC41EF7279C3B9DA48BF9A0C0B59C38AB70BFBF8AFDD8DCD1E81AA8FD1DC86934031E7BBE50A163EEB2D22841A0D11F7DC61962A88D1450A09DEEA5E9B53636D1B98965473F9DED22F6A435D4285F715E06836D84FBEFD6A599BAF1F716F5F20E57F70502289243AD447268DF74739D6ABFFE8C373D12435EA6D72FD49EA45E726373C3F16DD0F8FA18968836AC011319714CB8ADCB85F0D63EDDEA48FEAA4F4AD64957D9C09E51A0F8A709831301061587AE248E64C7A953A49055C5F0139091375EFD1D002361017061868A6C0EAB90505959E85E87148035F88D8DB51E10840CA41ADD7D410886B94438118F8CB830FFB4D1A9C1D1BAF06085E74E87E4BF41842CF46A0E0B4BAAD3D9BEDCA6E5389873327A6CE725BC67C07B6557167424EFF111FECC0F97C433A53B6373120228832B2B596246A5413F9860D69624F7CD29C181D9665538CB033847CF55A1BDC09ABB5D3772A082E54B14FF0ABA4A6230C7F2A224B61CD3605A1D1970DF3A6102FD7C25ED14FFED57E0ACEBA31F8AAFFA9139AD36274B8E010A8000290552A116FB5C5C08FC0D2F9F1F31CEC1765317BDF54A6CE8128E35C40B14977FBAB2E1670BC7F5BCB6AE4DA655C355514EA432AB431661566929",
68        "932A21BAE69292218B1B8C7AC878A8331478160453367D8391EB72E90F219A17DA6E35259E2B20412ACC11B095EF7BA50A9A95979D228077DFB98BE9B77C715D168B5CBA2C9F21B6F0BCD6DC0B88EFAFC7CAC48083B011EC5CC0DD77CC2A7B332CF2AED430790455CC30234383549FD52B963D988AD1FBB38E9C179674DE218B24C3FCC24B7D76FE35EF9A46D0C0E1207C83656F8F8607AC6CCC8E3168606C6419A9BBD752452724371BD1912FAAC8EED94B187C3531A6D7FB8E215CFF2EB5FF971825452B02D0158B80074E07E700480DF313E7DCD3324C5D8C4B4B721B803A95BAB5AB52E70F77C9AA769A68596DD990B7C31CC5AADF8E4F61838FC5047007DCD19CD50301076BB41E082EA4F9D5D16F413A7823A0D794BB3B8B3C85E877A9AFCCE2878A41F527B7CC4E184318E735DFAC74C7BC76BE25E6A3BEE14C32604047057875740165AAB03718A11A3B013F21BCF412174F48EBD91E70536211294B024A1066687C2381615BED6FECEF4E5F2DF3AEAE4A90988D4C719C638A1C0949B95E9A9675A451C8A8B12A79C853004DCD38410536742C7CCE00C1E09AA09430717AE435D6C214E41044A7E2005865AEA5E0251C74487B00CBB8E49C7E6325958D604B38C1A3914FD84C6381959007D65A855B0E8AA96721B8607EF1E77041DD27388B72AB2F5470092031D8B67AE9CE8E225669E25DEAC77BD51DF05D976727",
69        "AD892905FF0DAC731C8E91B36819945928D712511310782E1B0DCE4C3057FA20760E1DFD33417AECB2E4071C5CC4E48B1AEFC695B2CEB02F676F167184E71301EB0D7DD81F5BA37423B7BF6B865E2166EE3C726401FAE4B9541046E1982E6836CC7D2A61D8E6B9889A5CCC9138D0E330D72F9A013D16BC6427ED9A29C38723C168BCC8215EEAF168ABDB18459A3D2959795F581FA4797F8D63873023902E4B173808916A5BD66110E9E9C1ABBDBC4D3AE782DF1657C44AAB64DF1C53E45E2B116D29DD1FFB350FEC76C0FA1E6B75F753BF7DED0DA187A4A137D6E50481C272306D6BD6CABEA2E927F21BA1DDB3474365FAAB635961F79C7A37655FFE766A9E30EF04873C6605FC9B5425EB4401CA3B2A2F865DF9CA4245F9A693F3527F973190B3E9D0595256AC54BC849FB4342D5BE3551CF3246A8003C181D21D83306E736DC7F7C89FA0DC417643BDCC7A0BC2C631173ADAD1820DB0114B7569DA5274C778CDAED89809ACA8B9533FD42F8B9D8D8CC4B44B85298A5A8A7B49061819AC868B88B0418F41507BCA9678BEFA65B576F908A5021157DEA294CAA9C4F8C766CA047D77255835B81F5BA492F42DD726F2C7960D87B8C63809DE923EA1D2C7CABD1DCFD8757C29EE6D9F621F9840B180872B4F61257A60563BF5DE9D9D0F9DC565129795536A6A7DC67AAD8FAADA71FA4D60905DECF0B70CE14BB353CC3961474F09",
70        "DB236D53B08A7558B897FBB1FBC1B03B37D65AE30B2BB5A705D80498C3B8C709EBF5E61F24E40D509476720CD74C9F9C671DB7A226A2B62069509FF7DD0A7D78D2C7B797FDC1EF4CC72C341B3FF65C7533502143517DFD352A2D93C1BBAB3D792EF802F60839D7231EC5D7F3A7DF0E8292ED593533B96744BAF037508EB78490CFAB017163A9A7D59DC5DACAE0DC56ADE815993E9EED567320E4417A5C4C10C187EE7445E7CD054FD39D6F26F827CF4DE39C01648DB4BB3A3EAF7907DBA6098E52C079440FCFDBE67DE7BA8079E1EAD22EE8A291AEE988F5B3CD8887E0C2B8B2D67FEA4DE1AFBDA0F6EE84F98944A1CCEC5CF21D6821F30614CACD7D0462104168C2C5DE51208069B12975D38EA34AF99F13A61B5B52532FC7C9C2441BB93BAC44CDB14831BD3B921A861E892C572665355EC571E80754CA3330750B44EEB229D05E325B150198E6F380D8D321C3071CF48545BD3C3CB8797DE68CE852DA4EC58C2806C05EDDA6783359ADD385610A1CCF1E0ECEF024A61CCCF01E87747893422EA5DDBD0D11F5E46EF0DD00F18ADCA1169CC1F41BD63C24B3AD1E086F2F96771649A1777E33A32D8780D5A8B4D787B4A5E15A34AF66E6B8916A26979304D31E23C129F7106DC1F99B015711E8977760975A5DBBE1A4E64BE94C200A5DDB411A6A87BA25F836C025DEEB6668A9E820020912E106F8E1528DDDFD47DBA2ED2C1B",
71        "B6063BB720159C88B67F1ECE2E07B651121E4EA9FDDB083B7E3C1CD7999667F33650A5BE7326DD56C8CF1BF1AAA55D07FADD63A592BD074F1455EE94F23FE9AD1891F8E69C9BE8681D153446EA77CA0F6C416528E9705099E4A58A4A7C5EC086226B2903E069E96B64032EA70FC97BFD81D15A73FA08C375CFEC2A0F07AC18CCEE47FFDA8D5953837E268D4174C3027434B999D0C200CFDFF108A16F99722EEA7A870579C1E7DE015C741059E105A60F033C78953E09E97D404880FB9CF205D00C17D5C2F4367519E3BADD41057FD6FEB211AD1C81B68D95FC45AA7C8D644FBB3D0D4AA00358624119A975A7B31C4827144540251FA220B802278F478C5836BE32E126230CA5B582080BA9CDB9F341BDAE8B5DDD249E5AF6F90C6CBC4D956E4885368B3DF7AB002627F89CD9CEF6C564420B94B2A1F60C5D64E5F8053D26A574328D8AE8E371F7D3F7E785071039BEFB6C93EBCDACB279B070BEB74B0643CDCFF5324F870E8F96F528246BE99FB229E3CAF2C91B2A947528D5244451B4041ABB7B388C0013ED5CDE6D461EB15ADBDF3B6BCBECE51C6AC468AD82D1956699612A0F03CBCDBB798B9A922E8061F2F0557F1563C3B139968D2E651F41293DE5E1AF58AACE89EEB1233DDCB3D7FC93242BBC75BBAADFB3F4C4941E0055CE9BA38ADCC9019EB0B02AD83178EEB7E5BEEE4D3952FA26882306A483846EBB0205E5FEBD",
72        "94F06EF564AAA877C278C0089EA17AB09065A7C46AFA1277FFDEEA18A3175B0D7376DF6A6BC6B8E758B14AFB5C24BF0C808CC27212A2FC2DB0FF90787A2E0F050D0A6491821E29E3E70726C44DDE2298AA237477642AD28F0C81416F7BE53F97E37F4569D1B724F63FD893A400FEC179AB4BEA2C10EF3C0655CC3204A8E7CB289335F8EF640F0E814E5A5742F69A3853EF7FDBF4D975136A870650849C99A18B9A7D4C4843C6261EED569A6CA785110B2FAD8A7F77E87DC6B7856F8C2B55E5D7CAE77F046C3333B1AEF885335BD8E3D9FA7EFCAA8D0E592759B293422C44FB2FCFA8F3AD9EAB10C01830F55AF3969BF7DDC92CD49078708458BF015C4C8F0E52B4D34EED4EF4AC48912A9841AD9D2E2EE486F08355DD9878896F8375EE8A97953AAB18203D15E8B973D58BFBD11C2FC09BFA3A5DFAC4A56AE773BE98C34151C2F1D92763344A8A081AEEACCFA7FCE5356DD9FC3B9674753488B375A67F1D34D0288A812BD0BC73F2AFFB14E8D50EDE0266B1E9492EC88E9CC453C4BE062C3BAAA30E569EC1E8E4091C9F4BC448854B71271CAE91D93FD9E99106CFBF91EE70D1ADD14693648FB68C439878B8BAF179E52BE2C5BC11B5807B4CA14E270B5E32B74C1E8E633492DFC6672165358BC62983C232A72C4F1213BFCCB92D059A3B7E28DA65139BC4100619D24FACBCEB8BADF4261236E02F01905AF0BD3816B6744A55",
73        "E0D3DDE825FCA89B4213AFC4EAD53C0250AF5217479228D63B8D591992F7C4B7882E43D401761E90ECE3E60BD4C70D1A1D0DD233DBFDD2185A7DFC1DE17A0FFDFB55C29C14E959384B9E378C4B9357112FC5A0CA5179E6322392126AF31192F0D5EB6E775386078D90200E772EEE5C42630124DBC9469223BEFD3BB0FBFF55D1B0699F79B76135EDB2FECCDB53B75616FCD3064AAEB9D376C7D98EFBC2B1FAD32CF58DCC06FA5005C202EA7826CD79349A302F6CB9CE6671BEE2A5F7A67C07791E129B1CA21915D949EBB94A59E6F1C2B9D09F8FF68B07057AA669C31791ADEAAA6A4F45AD7F4E5E87913D49771CC93F1A5B866E99ACC21F84316CF388E8C43F0A2D3439DD00C9DE853BAF0AE677B2BD174FE075FE93A1C283ED1FB2E24C02A68579C77210D3F5198EC928EF5D0F5AA4FB14BAB1AC015A45657AF92B774B27EDCD59A714B3F27D531BF93000E75AFABF373963241961230797134BD85814F0A5BBA673CA9808A0C578B5807F354147C16EF72B0B64C776BCBEE373CBE6F8E5053F8E20A3DF0A7DF3724561B78BF7CC21A602DADA0ACFAEC431AE4277D14A8D8C90B13A6A8C6EB3982414699A4601BED350EA76889AF0A18F96C1831D70FE1116C958AB5262E9BB651302D015F61CE8F33258810E8105EFC2B6EED5DA81CF29EAC84AF492954C77E3C67A60A3F512E5041B4BC25075ACF5573822E96A8B68BCB3",
74        "B2F11D0E66AC59A10F57AF07317F2B66737FA46AB1449E07D4196932D7BE453C45AAE4FF4ADB3E4B7CCC6EF76FC4B27FB2E00FA0C973FCB2AAB70CACC716C4A7800209AB133A5EE25EAB0C24B7FD4A570567C5A3CE54C8608E0EFF55EE639735DF00437718D927E000E4C071F57F249FEF4FCEB066FA74E884B235751E233EA57F55D5E4C12AA3B58F3DF40B54295C4A7A93B501D3E146BC8D1BC875B58478DD9A55DC8D0BC7CCA6B11582790D8E52A2CDDE702ABE0127D1BA2893BBAAB05AEFE0DA86C0E1B5786B84D5ECDD2637B939BDFA0AF5A47FB4A0889D04ABC38B6237D8C4790A024FF45F9EB664B95666C9A22DB02FF7BDCEF5BE05D0A2CA975A0E2C24705ED6366FAF8BAD1F383E1DAF676264E13AA876AAE22F4551DB2E2DD51746C28289005E0C1C37A05F7BDD7352405F7A2BB7A29A868533C6DC90FED5FDDB3A104F3CD02329B7176915E56D9B8B4D81597C13D596E415E01ADA7DE6FCEE76CE76C75C7CE531B7CFD9539368EA8EA83A4C11CD9E7F9D4B8362D0ED30EC7BF5AE89681D7C3AA92138EAB519126CBBCFA192464C6E7A0626F4470A467C13AD0502811CE874E0465213B70B66ADF410A17581762A54885CC3D26F99FBEA5BECEEACC23AB5A12BE92CF6D2A7CF110AC0D2550C27970CD84B41D3AF92F7BBA2D120E39C99475B8A5FAFC4EB7962FC1716B3334B1895E13DB1FA514831BA88703A1BE3",
75        "FFBBD7ECE0DCD5724B7E2B6D9209AF1FE36541F2795CF4991E93F5E52D68CCD4F7689B8F3772ECD4654E64CB631E89500DEF42CAC68753847971E6BB03C0BCBF767621A36D9B7AAD55404317E6EE71D5003925FDB5D6C4ABF978662C76EB6A345E7672F238A66A67FC6B5849C181A828B8456CFA9B9AED7855B40F37BADBC5CC8C288EEDAE38C2CE6DD1847CB2E92EDEF90F19C8BC1218B8B46B7CF85E655236CA0BC7D3CB446814BE842BFE0EA7932189F67F3E0B2744285F89305F7140A585FCB7B902C5573C608B4D506790F49D608C01863FAA2E50AD60349E4F7073A8DDB19295BFAEE65CA7D84DB46B5A14A7248CEB094A47C09F97379DCEE718329E79D88C0E068C67618EF259D409E4132A2FEA1AF60F13A959C71CB8602A09B9C52472968F920B6F09DA7173D78AE749D4BAC800DC2331E901AC6C1E4AE4AE8885DA98BF71469A2EFE85905A404A64CE9E92D1D55E4D24892938A162AE5EFC933550783C6121991C87B3B5E03AA304666D624417C99B5B0C9B58828B49697D02CFE610631756FD269755902B411A67FC0C953840E04E476F5743CD060B89DC7FC069F67C2F4E194CB984A351C2E31933B8D2987BA39BE0F9FD5DA88F9B82FAC782941F860C1DCF1F6841E942F4A985A45CA42894F800F76EA427DBF5F4BB13A8978E59B01D1741DA0979B4542B3C4165C7B618888F8A54EFB14DB833FE97FBB8B76B",
76        "F9145B7DA5637BC06D774F0BBEFF21B71328576C927CC81147FE55BFA16738C111F3491B08AE73337500B1C466486B4F31C04237094E4B123D9C3976683210F20016B937AB2FFBD92AAC2CA546FFF275E5950583634D3118BFD9476285D775E05F12F2512F13E0E028F574011A32C24D4ABC0C158FAC227FD597F9EA80283D3CA2D65FD6030EC8781A572B584485080F4433C98601052D9235D673BB2331430EF398D028F3DABA87822A4C846F650078B5B343B205265E95235A74CFDBA5AC86AC7AA3211E0BC79040ED33764F26C51B594014C46170C02CEEFB2552D09A8BA435B93A5C20D18A5CF603DB19F2DE6F3948DF4C32767D306F9C2E428CBA180037D967070BC29AA0B21B2A92EAF5BC0ECE6EF63DDC59596EDB985497901EAD07314C082534926E77A9939A52485612B7D7CCF350F59BFDEF788112B24DAFE0AD1606EDB52B7DC92B91F28055452AAE8C83119491FDAEF45A2C0CA246F42EA9C650665EEE44DF39077AE59CA0306BE94CE4018243BD290D687745EC3D1209C08BE7BF8C43B5ECFB2374C6230970F41330A4CBDF49F1E0C13C181AC245FD85DE746D7C9F81FF14C49BCA60014FB12698FADB7F2C8856EA3C079BD7985E9DE1C5F277E2213232CCA3EA9D39C9827537162B54FBEEDEB48CED7CD0143A5CC7C1923DBD00FC2AFE424D34E798444439930EFA8CB25BB6CBA6E1CB11079D7D028BB27BDD",
77        "D761D68424263FD17A1575359F073D1130EFDF85A210A4BCE7AF248A04EA4DEC58667F272385DE2185EDDADD9CFE6CB2EDBD41FED34BD6F814704549F3A693372309A06B3B2182857CF4836F96BDAA847F0122519CE708E87960376CB50A9E686DD538B48C4376B8351E5B94DAA7028463A3FABA6D81C2758C296A8164FA6962A3F0F832871120103BFF9DACAFB96E22AD261D8E642A1CF8ADC364DD4A3F58B954552EC7B803E30326F27AFD9D4D01FD8B0C0DF3F1F30F81E66AB3EB4CB7475BC0FD2C8D725AB9748A2F3B0B6CA4D7640F68C562AEDAC9DA1F29E11608327CDC10C0051DA5FED1E7B5AFB62C082BC449909FF2CDDAB4C9E2603FCDA202A813BBF563BC8F4DE7938E5E9721912E845D56769EF40115E77697E46DBBCA76856B8307CB6CEC4B5016A496C01F86CA95F247AEB5007681EE0FC4E7913FF908E9187621B6DA9662341347E8B4ED60DE285395CCC9490402CF14A87A73A4BEBE722FFE6E8F563154690D8D4E268E91D6BCB099A48475D8D5053F1542DBBD7C0AA7085E002611811E5F70AAB4D1350E7D1BAC7E1C00686830967547CCB3BBE27ECD4A00AE2E83B64F5D44F5B32C94C9F2AC5EB7AEC27EC07B9ED864E3761D6577ABC57B3F2E098D88CD1D71F3C99AFF4C9815A3C9F0D8CD4945F56B505574EAEAD4B99221318D7D336EDB87CEE98D2EFE1EE14B2D34C740751784708BB761CD835934F7",
78        "BDC2A077185C494AFC08BD5EA3CDB151DCECD8E3A5432649A91D393176053B3D1BE68CC7429D433EC489968D3DC9A95394455DBF9DDA127C6224C52D86C02D3E9996A35696F21830139469CEFC1EB732070A6F7EF10B34CF013E86686329790E359F6820458A172C5199555BDD5195591F91A0348A47BD991BBE970FFD41D5F6DA7FE63865060743DA937DC282AB6B8F90D073B2E4778F2F5CF98466D7B88FDE5B9955B9695B5E643CF62FA1DB5FECF616F071F9D6CD72E8C4AEA634C6A477C4EF313EC4F9CB788FAD8A0AFB191A3CB06781A8EF7D3FF0A8AAD42F107DE282248CC1A2A2967E3E5A79703796229D9B99AF1F9EB546F909970DF0D2B1167A17AF0A29B6BD9081FB7E7FC897DE1FA2881B445944EA67F2E8469E825DC12DD7DDD1750894CFA8436BCFA9D552A877F063300F7CCB348B6337E72A55C7524265F42F0D54AACE4099A6889A9B3E63F36DAEDFD65AD97A3E5478EE644AE3096AAD3464E1C7682ABF5A93B140AFEF4779D9779B3262D11DD34F553A996041462E391B37C6864A4F1E0BCEC55E68E72BD19B17AD3AD3A37C0EC03C6C439CBE87288C40A9E168CD0AE6E4D4C323883B3A0C2EA1260C5E0719AD82355FB649634B7A4CB3598F9B3208871BCBC65F80301FEA2125211566D2F269937D52058F5616C60DE7D40E8A78F586FD4BD6313F6F1294478E4E8516AC9225B03F0EC70940465A64FD5F",
79        "E6ACEAF511ECE6AF74D6A1B77D35B1A979A0748997E540B8617BE6023BC81EF529977E49262D72B94392E2EFBFA59DC8CA0F921A7AE345159A1C56955C4C4890BE24BD7FC00D071A9C963809041AC51D265B4C2C25CD7DD279311B80C2436F76054240571BDFAD20697C31B96C4841B14B01C0EE010B6D96E899488157AE00097D0A1EF03BD726E02C56D0FD340AA5BB264D68F77B7C4008A8102FCE923349AFDD7B1DFA59B53FC0E9F01991325DD5BE23D8B3616981FD2E1AAFDE0BA4BF46E0D7CA195118FCD97C063D25B93565749E260A568F72B0DE241F455717F73BAFAA20911E8C3AE69CE8FE4DB946350E7097E70355D5C917B97D7A1B1AA8F8A9601C9765ACDB7F41D965455C36310B23E3CCA3720B81973EC65A68D261CBB508A4C6AB4735327E917B25C83953FF60CB33F3DF3E93977E81081865F8A135D3F62FBDE35FDEB35BE79A63855B83BBF3AA3763FAB095FCE19F001D52E84329651ACC1795E8444C3AA4B24EDA7E638DF77E525B5A3E878EEDE37B9FDE962F5DFDA51179B2AB1617E263D529B0C48902F2443F1745296EBB5EB071DF1739556ED2DC219A53E3D6C7E2423FF0753CDAFEA685EA159A7B017773BA9EC6C0EF6047FDDB428FB6A332903CCC01AF50628515E97D4070411C30820986BE08555C29D1767CAA48252BC497667B37B6336A67CE812B6C924C4C1ADD2BF7D6642551881119F71E79",
80        "F7466D9469DF253F6230FC96E283E1D9FB710D2E2F30980D5ACA4A52BFFD8F3E620A2ED9895C297548649E1DE2755D370DABB5927FEA0AA0569B146EC3A726080F0D6C34285E32E488821425CEE7BBB33705718631F91321CA0CB02C0245C635F0B518B97B081E3C48E7D3E2D20F1A477FB212D82EEAE543D3FC98DA676B9C483F36EE860D508FC4C9D6DD11679642647DD2774DAA3743F0578A12CA0769294FD132F0AB4EAB8BB738C6DB955B962BFAA4EA7540F3AAAF81ED5982ED3493D475D9BBDAC6BE62B9C30065F29DCAB9A69C485BF29F1D629AF71CCEDB8EAB7128CBEAA4CF4EAC096D39C22246279656DC28BC808A5C8CA5EE3D22D6630CAF7C37449F78F50F21FBE096B9A701B3DACE3C5153D8B3A7FC84207715FB02DAA7331A366AA5321386287C23DA0DCE47B3FD8BC92FBE583675E5EFD64D8E8F9C6B34B84525BAF6A9E9B7395B98F7BB3B6B0ABE97C53E6B54CFFDE79468AA1F0BAB03CEC14ED25B792B9B7CFAC002F81864F331B6608727A54CDF23B141428DE25636ABA7789E7D3205D5AB42CEDEA36177D76F3519E934948EA2B15451E817BC976F7BC39D3108BEE8EC5710B5AA101E000F7BB7B160C24151028607ACCFC5A88903949446C2790A7B85C754FEDA58A4164AA1489A9C42751C8357C85D7254F9F610D5173DB1BBC39C8F8A4C9605C6DEA41A0DFA8EF5D613AE901A4B5B210BD263806997",
81        "8665C11E1392603BAC282C14971D77131315620C8FA21A8161227C2A6E9822EFF48704AB1567D538B600A8FFCD562CED5932C7D15888FD54F1E32AB4135DB0B6AACD51C4EBA3A763CD888F8AF9E9AF9BD5EAA0C3A82BB6D26C2A667FA3AD7E652BE7DFF6FCB7E680480B516286ACE534296B62B7DFC5FB9B2F065E41DD5EE6FCF94B502F6846848EF0188639D728A7580C6C72982ABBFA9D28687393C27D000F812562FE178558421711E4755A6CF191DF7C8BA129567DD7D9417217AC5B2742933301403DB06678244B8AA0D11306C6402224BFC10A6E3E2BE3BFBE031FD788EE56D3ADB8F175BB88B3C5AFAB368F22FC89E56947F49FB0ADD9E6BF2F0B2025C953FCE5B3CF5492599CD108B9779ABAD735EDFB5BB8C40C0F283A23EE3E84C8E3E9A6765EFBDFE3915C62641291DAAD11BF099D3B5CC26C648E4AAC82107306D437103D37EDEDEC75C968671790AB0C55FBCA5DBBD81E2FE920E7B1B4DBD8DD5D5A87CF21B05FB1769495352F9EBED9707D7D6EFDA99ED1C8F97B324BD9A5B99CE58D840769946058F0A7005C35A66A6E64E001C8352D42D73A52B3927131BD872487F640729FD023FBF44BF56027BFE289B639619ADE8DB67E83C8F35D800E0AFC2871189163783991BF2E166D917017983B8209B8991A1843AB07127373A573BB2773C60D57708DDE3491B5BC149C553C4DACF2524CA27855F7EFAB012101",
82        "ECAB50FE358424A53B9768B0D394A668A0294C843D132F9AD06E389377D1821391F5A9E0AC645DB9CA6FDD20556F64A94BAC4648708126FCD73581934DE173348467B52CB93C381CE9348A64554E66FFDEC95A3E7C7D0DD3ABDB6F02BBEF7333B88C18CE405338D2866214E29B7CF5F0D156DFE71021039AD240792D2ABC38C24A5C50B9ADAE9A5BED6356273311569F0AD58B457EE591906ACA102BBFEF671A59A647D51AA83640AA21107097531B0918A4F5431A3481552F3095584064E0BE820FC01FEADFA144077B5AD55DA261CAE232BC3CE157D9867F24489717FD64D631C87CA3A9E9A0B515059DF28575E66E592847396418271C3E044D857D1EA610B0FA7B33FFFD332209E21271D5FBF5C02BF8FA618FDBAE96D3AEDC36DBD539B2543E0893F30F87B3712B8CAFC85D479E5B76DE0DC116BE8D33EDC67DFCEA821EFAC7451C8E0C3BB42D40849E9D51F985887C04BEEC94EB625EEF85DA841E66D502E6FC33AB419490C0E5CD1F5B3B465630C3D0F158EA6F987DE852A4985056AD2DB9F1A69B3C7F3D95B96E0143CA0AE8756A21F62D227FC5987D61F1F525F2EB9115D2C43A850A58C39293920C5A3897D68469F0EFC342946A24C66448730100FC477F9E6A2310A4124B0653C8DCD8B0EC696F3A096CF57FDE58A667A880F8796AE43071295880EEF6600172177849FD5E69FCBC8F4BE25933282ABAFD773207",
83        "91EA32CE0AFA97EB396B02520743AF65BB7E663D6FF6C2854E4961C8E05C98AA95D82CAC0927BFE8EBC7EA67A46F0E90DDBF6452AE22CCAF28259A88C19BF419242F1902CB33E16B7181E5CB35A19D3331208DE299D3A2E5C3A1AD6427B8CE86F330D4421113B8776FA9CE8101F2BEA86BA2593C43EAADA7525C4CA32C6F70601AD5484522B99C15374B0206F86DE2FD0A2EF94139F4AAEC49EB607BCDF68537302CC69C1BB8EBCE14563637D8B5B8982B37C029DF91360DD969B8D597C01C9F11609431E22BB77564541576DEC62A987F5DD1850CCD8E3DC03B94804056D40897E9FE341AFC4A146EE4D613C037EFCE4055514C1E1B02BB3CAB7DACD9FE51CEF7AA5AE8F25CCBB2317CB882A8038A3756055B14554D9A8F5B31C82D0331F1E47A7421E1114736C7014176E0CB4B43A2C95171128273BA72C17EE088B29A09547D42CF96624016E9F7DDDB3E8DB4B4B72D9A2305980C37C51D53EBD2E7E0700FE972C67BD89F24FE8F7BB36D7E3AE78B39631401AFBAD09B0DA98DEC442616847CDF4CE4CC28E2473A6FF23973C3FB0175B81918D1B7EFF5793D1B4C5D082C51565B865C0F8FFF1B46FD7FDB2C49F2E43E1682A934519CB6EC224BBF489E6B35F9315E38ECCE8703058D26179D245DA80B1096FAEF959DDCC7B095A6F65053FDE428EC90FAE16673AA842487958DEF44AD2E25EC94A91848851CC81BA6C05E4F",
84        "BE5DAAFA5DBE17E7F02D4E45BE7234325BB91889BA46DD966BAC19B646A466702EA1259EA78A408177374BCDD4454DE14E492895C30CFCCF84664635412D0447224BC02AA13CEA21DDF918922A0332423A1737DCD93FD6520025BE362272009916D51B5C1DC03FED5B7738F958316F2ED2BA11406C2E7767F2E0005A2E3F332805594736EBA024DD9CD2FD02D5C8658CD530F63679DD964E2DF147151A9099EC46133BF9B82531E06B22CF942BA31A238BAC6F85CF9304FB42E12C195FBD7D26E4E00E78D8024E78B8D465B4F9A64DF9C9552CDE234B67F0E9DB89D357A63339913D80D238B65C094BC7DC7E732F413B221FC68064B5267307452D793991CBCCF8217DF165CEA50EE1343DEEC4E9136AAEE1713CC09539DD55C352C97A8A194F7C2A4A9A54AF542A4D369711E2F2281CA01F6DF64F88702206F0CB199B5995B6F3850C5651E6B231A68E5188BEACD43B8D079C77F603F1165BFABB79E0FEF2B44BF8EFC97111E89D97A0C35C66A769C862929696E0363699B18E10F5BFFE8F8752DC3E472259E9AD9483DF087C035BB9349FA3A3C98F1CCF6CD7D90044F9EFC97C657112CCBBD89FD44F7243B5061E81639AF2B0BDC0EBA75A2CBAACFDD817AF024AEBDA32F5AE5058AF60D1929354B03A86FA0CEE85082B9856C438549AFF72388ABD4E4C4C5BA4868E60109A11BAC583F652480D3EE20EB397DAD771FE0B0D",
85        "8CB074296E282470713032C80F7190FA398014CF7F5C36BF3D2A58B2EB992313EBF2F74BB5E2E7DBB3FAFECBBD51DB70CB01F2C4F693D426A3CB5FED4551873A375F754A61C47B2D3A8059482C92938F288B5B6BCD0175A0C3277A69291182B232FA4760333DCC8CE5FB881EB3414469ED6836BD6396CA713E3B4E0ACDC88A7C14466255E76014A0EA496A205100A77A967E6A47533FC73E04BD866EACB60E0B3B243018F093326E751A66829A4D77A6C972E3ADA0DE55A34DDDF8B72E66F54D8931F205CD7FB40EF4DADB887DE36B4DB0A41E71492181D95F827759CF9907076F60B2D235F2AC8837F61CC0ECB9818DDAD0998B5619C6E020F247320E29F1247FDF6950FBDA3F834BA2E12DA250061DC1DF8BF52026F0689C07C586E5AFE6AF689A4D3D24CC109CCDD76A8B0701545196FBFF2B567C7147BC116E98DD9DEC9FFA08DBE400EC9478D69181C9C5F246ADD69F996FA38D604ECA0AD52A8587E8CCB63C5D4A92A2310CDDEF1E4784DE2173437246485074402E20FC159E9528949F0EDFDEAC0C2674DD175BBB54B13532BCA078D577656E6737E76083A48B4A853AD930EE7079FB5E82C1B1AE41EE27D78E3D8987CBE1DE57273EED9BC848B211E2CC01043F6367F8BBE8AE909D15C2FFA6EB69490910BBF4E880BB933948409B27344E4A84FAA2D86C8C5C4E0112856D9B3CEA3DC6042B19ED73FBB8F8A98F7AE7",
86        "8F4C2EB9E77545D2702FF11E43EB029EC493337ECBEBF7FC8EE4CCB21DC0BA308398F59ACA2D1BF589DEF95063DE0F57EF2C1FAEF304312CCDB8DC999296A28CAF463D51CDBE3A82C16C7774355A6AD582CF96430A3FA1B1EF10CAD6E3190421A75E38FC0CD754BFFCC08810AF82F649298186F734FA45F1F4C9CB0EEFBF2FA3E9DE3872E801A6CC439D2A448D596F712135FB56396356B255DAAEFCD86D0080F6C380C082BC2522DB5B48F71C67CAC94E764D0CA56A480DFE7E860D98A51463AAEB4D207B74EFD14D385B2086EB2B195E02178494845EB53D6E395412C1A00E3828A948BF3F40038863D9488D2152587684171ACF0749B381FD0817C58C71680FA0D6C381D43A3C74145D1A6612059F39C830154FB3859FB4CCF224B81AA181C1BD38DE5E74728C91EC169FA952202AAB7224A060F8EC05B196AE853A42E718AD73ADFA4AFF882A7C72C4856022B01EC4A7D5ECCD2A98ECE0011EE9521867A4811FC2928A2E4AE5E324B5BEC2DFEF37D97EEC9675E0DC443D3A9C8B402F6CF0346A222891285D64AE989362E63D76011FE595376B7F48433E720145A07B4D8C8D3B1EBB661BD12878AFBD845B8AD669A68DE1527B03DCE5A94D8E92DEF0127868848CD444B9885DE339F15E839EDCE594A17A52011653A36A9598CA25E1D2764CDE583A3A1C759D895AC2010BE663BFB813E506F868D78CE0551D856CB6BD33",
87        "E7373FEFC3E4698C7C23EE1067F666D2C82DF310B1EF0AD1448D0EAA7D3F5A4D8B48CBAD799C9D8D72B46FBEC41ADFE8035DD79DF14E283D6A07F7980EA5E9A0AC134C28BE759F77D433F1EA2FB2F9E5FE1AB1FCD7C12A89E3015ACF63941E28355E5F6223B3348AD25778808B3E8F9C6CCA25A6735E0749DC0E905ADB95218933399F76233B2C54456C104BE83B197BE6E0BB94A0B2E6E1CB6DC37CA054F12936B902009488E6F3F9AE26A2A112BD54E2DCF582855D7F87A6B5E8E7B4A85ABF00C5BE2FB5D32C55941CEFAA648900ACAC765AD2CCAA6F499E20EFC4507BF4844C3C5833A910D18DE2B0E5C819320F3B5CE499339E2476C4DB01F09807854BB5D03912D23FB8795D66AAE2C43A60607A8FB46785D9EC2ACF895C7EEC459113A5D7E038815574868939CCB1F6571AC806CAE5ABE74AB5F58E567FA1826FA85CB128449771B75D9C318896D380B6BADFD027B531A8D09D0B04FD1119E99124D3FD2B1A675038A0B9609CD7FF5B812E157C99A5C8F186C0BBB0093C8BBE61F0F0A1FE8FEDBEA194F8088D4D492C395B260BD3001A51D3C01A38D385CCEE238D4F7087ED6643D33776F0480A7D66923AF741819D3E3E7064212EFD20551D970EBD69CD1DBE97FCFFAE19C56908B46820E98C93A79F6ACFB007E404A091BCB82DAB9F736F80C88F168932C4EFA57D8DD6B86D54D2029348F15E52DAF4D769681874DD",
88        "F4FBCAFCEF291273CC00AA351F5D4F08F9255A709F4E07CF866C2546BC40548CE4ED6124490576EB98A26CD0149C62BCD28248BACC366EA5EFF19C70FC90292AC7B0C73729B22161FAC6146978B8CFA60356884E4221F27FD9FAD1D0EFEC8FF3C499A7807D48DE5F6722BDEFBBEBFB3FE0F404D8718181FA43C0E4DC2E5F0F11E5BA8D04A67D11FC2B020DCE57543420698BBEFF6195F0B04C0CA1DDB6108CAD581F62A357DD5CD8135429623C131F83239B4764B062F86AF84F95DD35649C8CF4CCD5971AA0F25198F4D0F7948E3B8C2CFF08CD04878DCCA955E74C53BAC3EFCABE627188CA37FEFAA567D3BCE528A464F3AE9AE7CA457063E2FF21261011BB83BB9C56AACBD48551E392ABCD750B466F42589DA85DF861255F722A37E26FEF3A249F4B0BC75468FF859034BD681AAC9641FC7D94C51D01357F6C64CAB5B275D694AE398EAC69CB841F61E0D5805161F605CDE661EE6395A9666E5761B00D76756133E24C71D21C829FE0F8245676B5C869A6E33EE5F961A49EB99EA110E5D4BC2C92E90CB8B2BA51379889B3263EBB081B7B7649D54830F5AC16F6876970B3932407EDE87F906D79EC6BF718CDCF89799D7DB364B7D6A984F207BF1439AF7B4FDCE14590F4280FE6B8122ED0CAA0275775F95AE39F94B3907AC8E44C1512010061D76488A8910D3EBE70FABDAABE733A44A0B68E8CFFC4E79079C7E6D6AAA7",
89        "B1928CF594C2625DF8FC2F67F6B36F2C4E71633CEAB868462A3566397D2FAAFEEAEDA638B7DAD472429C120D22B96ED9A367D68B2DF56F6708B1BA7C8C006402E85BA5376CC6F0A8357FF2D84D12F102CEB6261E7B3DF185B387A185D0D07825CD246DDC22A608CBB5BBB0C80A2D8935753E837D4D1FD7FC278AEBA793B9D4F07D6DA84794B96DDD8EA11FD50C04BD7D0411C8E50E146982093DEC01149BFD4FF3DEE70132E98CCB90C01AB4FB0CA2834EDB74C4C7C728FF7A33E11D0EA8B20A72B15C4519C5BA4BB0F999E73802E108A3116F003CCBCD0F9F9FB03E34CF97136D04244F0E32F57BAE07ED3FB2382BAC1497BDC792E833A846AD08F93B7921951BCCD66F93CD3F79C6B831E609FC479D350D9D04028A069619E95930B8D93D39C3548C14DA32E8EEC5FB98F8C387D63A1CE382939C74BF70B3C49C8185F99CF90FE434659193A0C866E435C2F3041345FD51C06CE167621A2FD191BEA8D78E7424EEA69200ED7E809AB5DEB86D3F71F171485C0CAE32CB365724DDC810ED3E63BACC1BEF1D52BFFEA54B8C5D0B7B9FA106D2901AE29B3513DCA151AF53CC7A87BC1557F0B7964DB16DBB2FDD3862950BFFE4A43022F5EFC5D28145C004F3C7A50463F9E9024F31A230AC383008E0B770F132131F0EA9060C9244E7A234509C440589DE9C0FAECEA9D1F7F5C6AAF761B61375EBA08E1F151BB15D34CC9CBE00AD",
90        "C092A32E10D7FABB239B808894045204B90BA402286E631DF8038E914676532E05B5BE6864914D42F0D3FB536497A813EFA635C108B4C2CF294AF057EEF1944D36E73B3F7C5392FD65BA1CE00B5DB41E4BE52195C1F063472444041D6AF4DE56E8D024DEC3447AB4139754F7B1CBB4F4268CD5BAB2DE72490B9EC3F1868B14C2EEFB2FAAD09682755EF4147E8EFC2733BA3C5A9731C248DBBC0E32158D4E1E6F9192D2151412F97242993BB73B6FD73DB8888BCB439E3B72F7ACCCC8E08955FE17EC7DB6F2E3CD43E733CC211EFDFF3CB256941AF1E2848ADBDD40E4CE26784B0C256D80DA8775B31722CD5181127B1C02CFA198BB420D193CA4BA47C1D3E99133384B8A70888D25270772929D4071006317D83E6D2ECE234DD56B18C224DAE8274174EF81F2808641E81193346DE852F19E83DB2F54D73AB6E52AB6C09E070B132C696E75534B6BF36CAC5D6C20E09599FA559A7434276602073ECF935ECE48CB5F40606C847303196653376525307BCE518999D01104AEAB2C71F62BDF2A41C7571D5673001966CB673C4782FFCEB64CF874EE725369C7FE9ACD4B07FCDDFD6A5B7F296B4FAED67E2BF84D87896C6D179C9EAD97B4E1C13ADA09945D7BDD0FF6FB62437290A8AC545F1698B092664876B3FBC161E1798C6255F62AD50DD4B9E3FB86408B651C9366FFFFF5F1AFEB628784A347F512CE1842FB54384969097D",
91        "B839BF282131F0AF45E765C9B021CCD0CCF4FF51E35FA4702B29F2EB0620CD7C35C2672BB6CF65D13AAB91989D414DF3E638F14A7EBAF6A308B52350B4EE4A1C27D2D637497495F8B382ED6BB49C992166A9C26F21FE3A6D45CE6A257099E25D767E229DD610D4BFFAB60E4648495FC12ABC13596891003FECD44C7CA0D647A77F9374784E536AA924BAAF0023D48E3E98A4A556F023C72F7547D95B01ED41978492A402F25D1CFB08E9F99728FC09FA632624FABA2CC333318297906BC5E1BB38BBDE24D633F12BA07150FDF2DA8C006A64A1D9719ED67222494DDBFA36C0071071C8979083E9A5BD014BC49815A9807808E5F831005C86DF015FAE3E5291E4B06E88BCDCF63928C2AD38E745A3F79ED1A192DF2ED5C34BA1DCD2D364BC2CD8A1546657CE90A31D8425B429DE3936A9DA35961D8437A50825E7BA17FEFCC2C02D843AF268501AA2CB36CF0FBB23420121BF768DB3F327EB9251015FA60BB29FE0FCC6AF720B37F54F50C56E13729951DFDB0B9C265ADC411603D822D70A005407C71EE382D30B477A48C568046DE5B84BB1AC31B5181FD2177E1DFEF0A088E68E5E6DE51F19391CF01A105EBD0523ECD809EB30AFA5BA6A407DDA505480B71A5B6C41A47BDBF9AC2DF8C7E45A4C8AE440B2EFA4184A1FF16E943D25D886863D7CABDA9230843EBF978E421A22CDC1DC19DBAF8C40F14416EED89A723B1F9C43",
92        "86F31B3B70787CB9C55308B38FF88850689CFB52263E5EBF4BA9D94A17F9117124CE07F11B8E3DA4AE1CE2962ADAA2769F1672EEB1B33B7B232F18FC64B54F04293C19D94E037194749EA145F7CB72382DB268B6759252C37C646F1527C5702F16764B599B3F20A9CF85360F6C360794A356AF9DC9E8D4C8FE4E55E4907A8F81142CFCD5AB56D05E97B6AA5F3606AF6579024894FE579DC8CCC50BBEEC3D16ACB178DBAF763CA85B30CAB8B907A7F96D386545CE6FAE39A17AF45D88E313A7B5FAD468BDB79BDAFED879E8C843341F446275BB6E328206D82337E500D9B3D96A639CC0185373B4781AE41A79E04A96E44F81F00115B848A41E769E65E4EC1F711004A99E8BDFCDD4FB4CDA21568E99B10690B0050AE775C59218B8FBE4DAF197633945D4C066CE9F47F2C24C7AB676A8684A778B4F6B62AF5576C79642380A32D8A286E0A2E4E0D6C9FED0AC58E15D15DE2F8F5C51269DEADDDBA931DC380284517196C0E41B1BA2ED6C591FC82F65B005B611FF181EB6BA0D865C0D7954AB4161BC8C92F49D82B80188642A6158E3836C74232A4A95D45ACCCF02E5043058BD5EC811EC81099452F13E61C76BCC76F15056F3C5E5C01FABDB94DFE54801749401605A4595E3278FEAF29F6648996AE702962F8B599DDE7C5F2EAF6104F1A0EEB9ABB262FCC8B4ACD222659566F85AE8F1FF076631E9AD8D66DCD4903E42E8AF",
93        "C41B514D0DF77AB2F36EFACEA456DA9170127D1B249C00B8FC71A29C4504E64F07EC62698FBFCA4AE81F6E7EAD33082FCE65E79C6C22B1CE87C4FFBD02863ED1102F5E5E3B149DD1A7163D575690EA0B9A5AADAE901DF2C2072FAFFEA0B6DD1C6242FCF76FD23578542DF868804B55A2BD43A7D3CE40BEE157E9B02100F2E7E0F355AAB9804BE52BDA6AB1BDC7E4781AA3AC1F1D11AFF595E0AF0052689AE263A11BAA612E44BBBA473B81B0B836C5A7B702E8AC960E1EB801805188DD5FD1F8942EA490C42FC4990DB195724414DA533B3C08F0FA69BF0AE252E71C467995C800C60725E0277C57D5AD0AE8BA0DD96DA5C53ABA6A9BEF39944DD182E11C701EFF8F370C9182E895396B515DB5A996798B5C798ACE925D7FA6DBAB4900F7590863968685455B2C77C4688AF941452D198DC89309474D32F8F54C13CC24CB2A0E198584CACE3309D5E49FE11F578005325D2791BA8F6D9D10BBF1F9204673AC1508E32185C3B42ABBF52EE5E017D5C3B10A67193C82398AFB8E81D363B70158F60B0E4A65C0A6FABAB2BCA27096CC997EBA34A824C963550A37DD5D9F940837D45783ADC51356E8EF99F2769F09673346D4233EB161DD6F8940AC7BA2D14B7ACE5B7598FD34BA0E8EF4A42A7A6FFF43AC5831E2A8C59B345B63C1051278D31FA21D644290D60118E220402880FDD21CDDF8F21FA4C130CB1023A1F2C9DE549095",
94        "9F4138374CFE1D861DC8C18AEB82131C79817C273E94048D001A718D6DAD451EA2230D8B88F844ADABF2536A3AF8F4A9A64B646FB07E7BC491042B083C8EB8E400C3B1A185C7570D5E297BEF91926286646B81FC3DBD172288DF1C7E4FE72C3ADB62710F9542D760C274B243A3848455C9929AC6B50D3D059035814F113D9CCC7BA85A7D4AA67FEDA19A6C82D772C484B6682B54F5F86021D636BA654760D3975C6A2962246AC14A12C9F514D9AB7B3F0214314A70D7A101F1B51255F52F5BC76AD3B4AB69136780708350C0C014DE71BA4DFD603BA20E542F2E897348B23696E33CFFDD7E1C3B93262FB4F4DD791DDDF247CD9E16E30DE11925E09B03F1DC4246B41BF3238C8993B5C4C079CF8F0092C09225580C3FD634B03391AC802700B887A82DAA77F55E571A0C7DAAC7EE4EB9341152217BB7017422B22CBC20CB8565C3D55B4D32879909C55204FAD100D2CD1AFA9FCFC14FA7326AB6696D5F550C171A04EB4F748D0EDE6AFF64FE74B760200D2D7B68B6E0F7B978AA0CCE2101DB613168FC9AB809924C4CB4688293FC31F40B51B8EAF388A399B3A33240152A3F50DCB3D9B4F503BA0BB106FD6A51307766C4AEF28474EB5E52DF5CFF2EDC52E91C5FF475DB27F4AC6CB0A84B7D48612CD50FD530798D9B4416BE7693F5AA794A648CD3E5579D22CE228F7D6581EA4407EBEA07202DC69F272FE1B37426930D1D47",
95        "82361A3BE57C6AD51044FD986A0E204717B54C0BE8279BB6F004D5FD0FDC2D00013DA264D841B9F59094243DC0386C6CFA8AA0C975AB0541D8BC80E1C18934CD8C9BD0713D2BDE4CBD3346916BCB2E80AF08EC015B52CDCF4311B2C13EE4CCBC677E5A6347F738567DE50C275A02ED072AA385A432032B279FD79C67BAFFEF69499DB0CE99FCAB1389E6790331C989A142C58590773FC62E975E59342B299B5A66119DEBDA0969699CDFE94B927C8D87A722AAD5FAA73CC4ADB4B0D5E197171214FA60C6B03417BE7E4420ADDE6EE777E24F9AD02FFBD7C9D25AE6BA1A92AA8957B795A8CACB555A32659A1941A8BA22C067ACFC72111F2E4C4E46538C93FE068435A243435CE23C955266F76F841AE8686A92608984B81F06477F50679245842272E371CB8F331F5309B664D8AC5B4280531C68F94C2C24348A901D0B6EB6FF730B6BDD3CEF8008EC961369B5958F85C2A1B2692DD9DED7BA0075F31A831107F51DEAD20AE7F5DD5B51454EC95AB875670B0326F868EE85D5BDAB4305C820B514714816782B02759C378D49E7ED706F2DA96ECF304B1FAF47DFC7D4AD5E14093AADE7C36A1C136149228F4FBFA7EC01518601039EF1651F3139C3FBDF7CC2A0C6F6C034311695CC4A79F03BE829CE7D95FD1E8C9B434A20CDEE42DBB5E9E5044033F25A0FE072AD5A1A19BC5790A47288570E6340D83A56F1D8383DABC65341",
96        "997172AAE96EE74F89E6C57A486561AEF6C46B2BCC2A367E176C6297EFC912489A1476AFC2C3711AE9DB57A9CBE2D5959F8C8FEE67DAB367868504A2FAF4CC742A306FDDE9CB0C4F6E6626DCE8B416458A4EBEC3102897FC5CA09AA3F52D1C7A548C87139C47AB03320CE609EF9662153B8EF70F2C5041059688BDE90E301366F43EC9E3F3D210BE624FCA77879142E5A2279B52BA771564A77CD8D9687E6263723FB67989BBB08003582166A27A63AA5324AA0F93180A156E9DB544A05EEE851677209BC0AF69163B9B019DA047AEE5C7B8480812E0A9B178B87D1E28A88A40CBB645766FA5DFCEB7F2BF584FFC0F76622605A0E311C17816A54E4B188B76B2B2B1B5A32725D75118F6E179FD84DC12DD90CC84559219AE01C6F7D0921057AEFCA04CFCE47B900279412B5936FD9B6C3CF9DD109F3D7A9359AB37A53F35B6951E1D9B0E581101621F4C9181EEE1768EED0A8322357C66E50E85C734543046AAA9E6FAE3A5C021913CC6D896B2E296A3F44B597D709268E503CCDA7F1B471E7D221C5ECF9B357FBE75D71553D11A0DD96A463DA46D82AA8540F6F9474FFE9C53EDD3C17D6B7320511912B33A91DD1D80C392BAF8A317DC66FF1D6340730105EBA22E74181F470DCC722E7BECC1D083D5CC23FB03C76ADBDD27BE9F43266B1EE87CF694FCAA92FD6035C1F9AD4F433B52A0A270975C99799E6ACDD13B92526703",
97        "A1E363D155FE52E5EFFE4E807EE57B96273E5B82E566EB8300BA86EE3394073D597A00BAE13C51B6C377CE5C794A1FFF19558D5451274B4700F9B36F7B314A1AFBE09F1C0B7BB41523F39786B5B4E5C0C5A16D74696067FBC90CA1FBEEAD6AB0A8A95AE4506C1BAFACFC7806424B410EB3E71902B00A1AA769925E4E44FC48D6DE638BDBF66D00A532B01A4D4FC12421282271DECDBB9AE0729E39AC1E9D89CC1E6AC41C048FCCEE205A0D68439081DA4BDE7B2FD1711592B64AA1569A4F53FB3BEDFDA9717106F30EA8AAC4B2CBC06C22FC263770CC196F85D830D2D69B11E4787E3FFCAC9F230477A10A44E33159B9BD0CAC51B6FF3DA52DD3A24BCE601FE51A4742B92F6BE6DB4B466F87D3AA7112D3AE26A39A1B1753B52E4BA8CBC3E57D51BDB1BAD9A5F6871DCF1AFD571C467045D824E7B0C594BF194E28C01744AAAFD6061E568F282FFF62BFF51EF1E8D3FD6703580408A6DBAF3C10013C5809143B11E98896CEB1F6F18A5983877C5150D20E237C35859FCAF181D5E403A3C3A5ED43DFB350F841C7B37D677D2FF8FF85BC9045AD06EEF51934D787233FD1697755FFEE7CB3DAF82EC32070EF4884636406BD0443E84725BE3D1A71A2BB24E378FEC97E0117589E676D478008395ECE71628178D2F45A9D44CE25C241DB6247D93CB1512A5F7D5820C155062E9BE3B6EB9DFCD3E63A9D4247732BCDE4BDCD18DEC5",
98        "F0FF3758D706654D70381FAFFFF01F988501262925D0E1CA9274E9D6F3E5BFD7EA914C07A67EB5A8E1195EF43122554DCFC0CCC001D02000083E281AA2523CB56178AEE7065014E1ED8E7C4FBB214171E57B09AF63D4E505168E24638A7C982E2AEB9768D5FEA24495EEA4FBFA9179A66D02E9B7DD4ED3ED4FAC5F0B8DD9662F37041E95C8A6FC76ECA89B0EE421F6816C5DD66CDD880CB1BB37514BDE3236DF6C0033BC972925B898DC1FCA9D1E86EFD29F65B8F17BA42A48F1DB05E693DF5B516454039D3205CC415FA48B541A0F47EB9A10EAD959BBD2EABE39B7E42A406AC19C5AA71F57B06822BA2DDBD6287BE630900B5EFAD1762809B2B58F2D1343DE33B1473B0775D012A9FAD37BDBDD04721FD74435B98880843C39881B03CCB10B0E0F4DB3474404A6D0D49FC2610180134DC1063F425A67AC29EAE93D10FDAC44185922A155BCF6ABED3FB035EA705CFA381BFE96C875788976BB5CE007E3BF06FD409B9DDA9CC003960D123D4AC83A3953F9D26C9BAB7E6142C276B88F8BC977E5E7645EA12BBE080441DF49A702E066FEA3FD1549AEB1DCCEC999F8D1366045975BF297383C1002F7294CA40B7970600D2337D4A8A838C918F033105E2A45ECEDDA35BCA7C87D49FCADBF083A6453EB6521844D7F398B38F62B8306D1C840EF0220EC12F52D4AF1E9D148FA1DB259B331EA391F8F874E1D3BB8F4828933ED65",
99        "CB43F09378B4DF3202362589B63715241CAEED28975D6F77140F425D221FF037E8B47C46F55B8E3BC0D8D1D5A99741D2C2A4CC3C6ABE41F9D9D1E654DF6CC67DA9DE18673774A8AB7A52EBD120A2ADA28B14F76B7A06C214F2263C917DE4B8F15193AA05C4D9E39CD3F5CF8F68324D0491CCCB49AB9481CB73FFA8F9484948088380705496F6BBDD609D727E95CD726E035DCEF574BE54A3A885C9B76ACB2DC60D0508F5F47A871FAD6A3095724E5F4D127C72985676F0BA0BF52E64682F0C1E51A079A555DF8349EE83D3AD13D35A3467F06F3D4FBF5122B293480B40B6310D6BE27A6216DB95BE7207D68859F3F97BCFB03AE98CB42751290CAE221A687BADF84FE4C846F9A7A247F31BC4E1858E8EAF497FC1966852E1A6EB00C51E022DB92C891976C19092ECB7EB12CAB2E83B4DB9DFB3B9B6F5DB3ECFC9E7C786B306627E117800F91A4A488D1ACDDD10FE7F1316BEF6301F23F51BC245C4CA23D83E3FDA06D3B1F2B97CDE4F7634356FF5B7F2CAAB6D74F2CB8F8A6CF02B9B1C59BD46A9A608C1DF20C3307B0573EFCA0310E8E601CBA7AC0FF7DE8D4D467E465CD5FC1CB3D62F0EB5E2E248BCE991039696986F1B6981779035D6D9F9254460BE80F7FB5FEF98FC683941DF092B90B90B3DC938450B58994E7F1D632ABA63A3FB09E6197530B54FEB4D16CD2AD17B91FE31699CB096A3E9184DD956D95DD216605719",
100        "E18233E78C61CE175BE7C5DD081C78C45AFE39C361DCA146CED3ACB347FBEEBE79F9DC6C89F5D6D2EA216C18E449585BA52D58E31B47F989D670480BACAD5290BC448A6C831EA5CFF5BAC8A06A4EE419CD336E99DA2543EE7F61F6F25AB10D82F25F6470ED55D9E14F58605225AA324BD5CEF3D62AD76B71D81040B4D28D03C5AB464934A5E6D6EC3D440C4152903F59BFC411F0041611DD3AB1164AD516DDD728ACFC9296DBBDA9EC2E2531C15AB3FFF19899C9CBB7B84002F7AAAA8926E52339DA34C6A4482D27DB224E68CAC6FF7600D590F609808A1269DBEF7EEB75850B8BB5FE3B5ED8282A58EE914E0E07A80820B90E3C1CE7F8B6FFD20D847780FF257C8399EDC8A738C04E13487A03EB7E34377F0ED2B968A96AB6495F35C48336433D2E795300BF385962D28C1B0081E8CF3AF7699EE4DDF3320B1D08C254DE6092FDBF5EC600D4F52DFC50E07458943ADBFE12616A8E1B380A56356EC839E530A10235B13AFA6890C9AF0A113BCFF4CBE501F6DFE417E065BBE00341FC7C89A2433633CCD09794CA8116F64BDA8F9157B0EC980DB79456E652419081770A8F29754AC398E616CD40B9E7B8E35717CF279BD2B378EFC77E3664FBDBA8558CFCE4F2B6A5D2BB65A08F9FD4910A1730D844FB212F04EBEFC5D80EA340B03AC96C6E936B15F83B05C29A9AA1FDAF43B3FED5E214F9D7037F3E221C7874A8D5C7F2257F",
101        "987BEE20AFA6943D6E1B9ED01EC345EA96EFF9B1B856FA2DDC4A2E2DA714E70D404BBF944CBD4922396E269843DCD06A4BECFA239010C686D65A0186D617BE56304223B347D8A09CD5A7D76E34CFDBA9923F62DFA9D6F73F8C75DE7222FE353A71460B796FCAA011D705501464FA58255816E8C495F005E1EA81DCB859C6E941B97E72B8423C65AF659286CB283C3834C073E1BC03F07F56C3794B07547B9A356549BB0BA7F75AB4FB6F5845B32475650A9313F050F99AA8D091FA909AF3D880A29F31B4A86ACE3633F378D1435762288603771B98E82ACF80AA16F7D238B60D5922363760D007B011B963DF6147383E380C083C62780A144D3141212C84DBF86AA374D810A0DFEAD1259E2696C38CAF8B492F9E2C4C99A326C9C36851B6D85ECDE84D6F3368AC03138BC62CF7EF5167E3FDA23D92A24816D15058869D1968CE422528007600F8FA6EB4EBC9D3BCF55FDB0B84077F9AF930FB4AF086DB5B618D39818A0D209F8EF8AECF7D70080FF3F3E59F867444D72112B12F15FC1567EE1035D22CE36AE2256FC81377304E6F973FAB11770DB28C2F291795E07538DFCAB771BF79273B44593CE3DBE22AD7ECEC9F936109891ACA188856B618E8CDA84CB439890E76B515470F319F8BC63F035F216DA6A018D6A9C12ECF3A610C04696DAFA7C5236780C2DC4669C40CBC5084A80CB76BBE86FA9EDC54C886702DDC804DD7",
102        "D8733F89DAFBF7F7ADD99837CDB7E93B00722B94AD1F642B30F5E09C22D9D99ECA2AA506463337B6FB778DE50C317878908C7DAB13B69751D9CF1D6005A286470CE457D8AEF3E2BB7EC0FC4896D0FD26BFF5620C5B3F958099A2F88EA7AB324DC23F3A0B61BB575F17B1C82D198ABB1CB475B48271903DF0FC2EA12745797B5572DC1A8C9A0A213AFE6A02E1271C196A6D720BB649752DE19F00959E47407586A58DB4148C8D4ABD7246246C4F415B172540D4246248EE769AE3E4DFA0EB8C5A2A96978207AD742042CC9F39E37CE8B658C3E309938F1888D0D6081FBCD6923E5B9FC11B2A49DCDC7A979F3C6BD4320A430A6C2D78649F8D3D244091A7B5A277943B15FF1F29E8A556AD6D0C5F1494A237571DDE7405A77DB1F63DB4B4F16D05DA69D272AAEBCFBFB27D043FF338FDA32D3BB62026B4863D03BA5F6CDA03A10D29BD1261168BF057634A928CC4F4ACA4AA44765157F6271C1FECA932D862A4734C881D4F9BC8B40B53E96B667CBE88F17335367EC705328DE642511A90A2C632C5D0A09E6A1A37ADE61320D45A5704FA3038DA4D8F8169541CB89801440F9129D1DC203CCA94BF2FFB7329744DF13D404B1E5855D98DE9B0F8A09C3513031239EBEFE8ABED13C860CFD7BC5B8091B65E7F5AE720B86427CD816ABC57985E9C7B7C76456BA0258BC0021FE3DC0860BC9BD0F039A39754EA2013BFE5E5C4489A7D",
103        "EB599AB1E43D31C584EA7AF72E3206790802B7EC9CCFE00F92EF8D33E243C3BAE8A6DD34068731B0221AEA0ECD2007D59209645B0A2D56B9E5281B3AA801111254DA4BA574D380A6A874A67DDFDEB0E16706F4E5267867E8A9F7DDA0C10F8D116B8C91938AC91C3D8A568448EB45F1DA87AA5247BF6A92CFBB363F55620BB2C260810F2B61F03A9FE0072858D0E717AC9125DC64070A049A3FCFBDADE78EC671B6765CD5ED7525A2A564732A77058620CF40A93E875E18E664D9B7FE765BF5928010448B0D4BB8234DECF65D1413A49B933B7A09CC4FD574AFD528A349550DBCA63CDB6166F7862BD4129F41BB9D07E9516CA6AFD17A6E8015AD3CEC80146D1ADDDD1D575AC0A3FCDF493603FFCCA95C2691359E4548E6A7A0F2845DAEE6C543DCD649F8FAE2DC2121CCB97CFE88C9A7E9584E68D6F307BEA0B3F4B5342319D421615E5B092C1E46EC764C2256BAB102F32D6B98F182D059420FCB9A894FBDD2F8E56440703D8ADAAE6944D3471BA5A6D788C9C7F53223CDA3C203DD8CF7BCFEF9FCED0D9E57F33F659365489A42C5FB86CCC663031DF839E9C873D028D2173042A3684EAC5B324F8BE9E3184ECADC0C7CAA453A872FF4CF77F29DCCA5F5093E7BE8D81FD2566B5584934E73722A7F168433F8FCA38058A80E88B49630A40481C0ED2B1416C43D9CA8A9677061B090974D0D2960307147C2811F7EF14968FB4B",
104        "F9BD1B32FB7150FFC6D91D999C55777E5CE2D0FA1CB03F86AC14AE5DD6D32D92061A6929CD04500472694F323C4DFD52466856693C14461629F116D169E2C5A58CFBDEE0831CB1942FCD38B63D27C27A8AAF0F2D7818429F36FFA1A339DCF2DECEF6D29733FA2892FA9921E38656279CC3A2822D409A4FFB459CED64FAA4151517DB63CF1D9D185B97DCA09900FE960504A37EA1CCDACC0729CD7573C75C96A615523C7EC9562BC23380CB208668B23402160657D72C0D3AAAF254F7F1A6C7D5AD445E3D0E7CA44EBE1C774E530368CC39831BD9B46C343C624825DB1879B450C126382F339688C345378788D724AA523C3A6661A73097B31272B6B80251EBBA7F4BAB83834F00321F4F40CEB8680C08B0B70A8D3B14FED1A7A3B215B66345AFDD3D36817B023F6763C6D77A443028F05CD44544A5B2745B0E417341274C6AFC7EAD2AC4CB72BB81D222EF4D2176D599B825B1F7395D38E3F65F332CC3C83E0CC7882B804CC08A331A711A4D2E1EAA53BBECBD8228E30DD590735821CF32B2813685D0FE005BBC3597350097B109038BA628EC8E39F4B11A3700E7963A309080E8907B72238D43129791EB502DB32A6EECC7341E243F35D7099A5B7F86BB12FDA51878B70CBEB43D8D588CE5682FB0D95A2B596EE7E8A8C94F128F7BA938641C0DA34AF143F87F39B7EFB77480EC27003DEB2A981A6E995C762BFF67220C8C23",
105        "B01B236CBA1C68FFDC06BE3478FBBDA4057794D48298B6CD2F81E7F07998BD1EEB9E451911E7B0D307F77929B2EAD65CDBC21728E22837FFD5D76B62F974A141B2EBCFDE3D9471E66500AFF955AAAE59488FE394ECE2C407B5E3423ABB5C36EB958C2D8CF0517B66BCBA885D74E4A9204C7A183AB719BD605FD546F5513711AD5C705C643C60E4E76425CEB1FB1EF8F902EBC239461BC3F9FC73CC863093A24068C20B1BEF7C4F29939EE5D877FBE63876E31B78B182D0C7A3B13F28F9F9916CE17BAA16F311D2919CD818C59DC2C8EF1160FBE46E91DA30FAE76F1D1B92DCCD58FB9EC5E49B92B4A4884E2CC385375FF8406E0E498EBD048CC017E58F688D6178B6D3311797D96CA36AAB45B332D3496609735B2B73F4F6DA84307931727B204F7E747CAC1B6D19FC2D1FC588F64345D5AEA941B4A605D3D1C91F0F2DB871ED6067A90055E79BB30096762D475DB35066AE8845D089FB46EEFC0D0137A352234ED4E006EDD51265FF9D940E539F1AE93C469B101B0D8462194C7B98918000AB9A791D37EB7D7F95285169E2844A33AB5DFB942475D79218B2AB7B2C6C5DFDBFA4E99023604382181407697794F1F9D1C1CF4147FA18B572D090796E5EAA75F191A7769CD38A7DB2CF14C1136C8C6E99C52607639A7B343DB99F1B9E0AD46EFC165ECF0C34256541EC4926273E16B44CE6E3B550F79B4D385A7CD5193ACFAF9D",
106        "ABDA4D61DF089AEA2708EED753EBFBEBF93E4187C648AFBB6CF94496615696C87CD8EFBD4C152D37F1CCC20FD10B0CB6B7A78B2E209F395A4FB61EE8D5E6173ED1885E2C1B1F2FCD436DDB29F15555ECE7C2CF3096B3D44C7CC3810248A77C05ED0CCB067E9E3B0D198EF93A7BE3F81BC98CE61A9D36AF235A7CD0B38B91168EF2D349546A8BF720F459C6DE5CBD3D58491C573CFCF18F1AACF79384D32DD550BFD3BB498511E634D9FCE278082AEBCB7A21947F6EFA8592EBC4D9E395C308EBEFAAD3A886033E96CD818EE57B1A6EAD4DDADEC298DA792823D23C7143D1722F6E4CEF47C65C7BCCAD993826181429A9BE380EE16A7170F976CC5F01E11E76245CBB53C895515D9B3B6A7406E654AE4E08DFBE0AA58F7554CB9A62FF7B8123BF3FB76D49E52C7911EB3939230CC6E6AD24A421944C0EF92E17979246CAF2E718943F9CBF08C5D30D16BFD6A473B6D92CEB4E5E398ECF772DC77221D87107B71EFF96696360BDEE2C6B48DD65BDFFCE15019314E872C885F8D36A026A43CABB2F68EE17AF14ED6A5C6548ED63712975A42C610C24AEF5713CF4FCAFCFBF6CCE7789E4AED8011C343F99B096C75477B1C7F19E80FC085457D000B42394E0294CB944F8EF8E16708C84D7B553B000C5F00D1BC70B89B0CD984BD795948A80054355168F6AFB44E3F11290627D92A8CCFB8A65C62A2B8E53B9F349604FFF91280D45",
107        "B69C5C63A930AF7BCEC5D112D94FA1079543B5F267764D6FE88C11FDAB9EFD7ADC610881528F23B9FA591138645262EACC121B3C1DAF4F6496AB76ADCA2F71E886AC8E64FD35E0BDD0248134D37CDB305F6C7A802564813DEE339A71B590E668A96B98A9A52BEFDA3EB7E010461CA946D295EA241191327A339511E84D62F2B70A12D1E95CC3B24CC9BA1CDFE057F6650495C3D0242D43876ABCAAAA24ACC8DF79FD27CE866DDF6BA4BC854BE232760F4953075ACD588C591F519EC174E43447CE3706C1C4F1F863D53C1949C7139000E4E4CC039A7F9370AFA20FF6710C2FF09204F2ECD51A5BFF57651092045280E1DF98A3AD30664F82FF4CAA065A7632A6BAF77F28DC7F1E1368E4957A14890B7EAE715A316B4EB2618142ED15CBBFB40653E483F17844A9CA5DC7783501B001D1003256BCA2F24E00C6557859EB443C0398005A37074F538810413864DD5D105B9966DDF98633C51ADDE5A669ECA3823F3A23A120A3110D54949C67FC0E9120F70A37C978953904E859BB678F639A918B6285051E89BC5470EC1DE263D23C59F0AF500E4075C114D3E84525BFC4F21F5090A9161B7348404218148787580417317D917EEEB51F23A93BE024BDF75CA93718079E3CB6A9B124F7F89BBEA22AB0DC2DBAD8C0E32A7A61021D8AE1858C29C3D827FBE59836E09759263EFDBF475571EDEF8E9EB1F380BC238AF35178E80525",
108        "9864DE85172EC41AB032EF3495986CFA6930B953DF97D3516A7755CDF4D4CCDF887F18345AC3C0B189698B349498048DE85E01D3032890F3997D0E8F27897C2DFB9696E6D7DFF1736BE7F8D6DFC20B0A155A1875589043B0046AEBBA644F68691CA3BFF54AE1EEFEEDFC9AB64531CD39AA19D89A9F28E38E4BCDCC7F136EE9724757FEEF1E4A0F4296070A7074EA67DE15637F4AC28F43AD58EF21054191BAB1B60CA75C0B60087E4DA7B8F01A750E26E2D81134716F04F505790546019387701C7668A101160387CB0B25E034052C7E5153551507CB3ACC651851EC65FFE5ECDD338A51563691DD2E5EC329DC2330B041B5AFF3FD3D24A454D4D9F94A48B6FDE67D633F209B88DDEB661333FC656FF50DC9EE82B58F9BCC73A4D971B2A11464A558E31038E9835BF17842ED0BB0D32FAB039D3481197771D766749CC4548BCE1A749E32670B9229C0C284536D70BC4027F018B6F5B9F7FF16FDB9EC5F18756D9EAB69D054A85B2A587C1EC9852BEA5EE8F676E664251EE17FBE15248D79798D950DAC2DFDF164ECE394AD27AE82975DA95FC8CA109260466BDE3A70355C19F941D68993A74192E9CB679804CDF8F5A814A6A3886ABB12E28173696BBDD36977DCC0FB5739614F13B6C4A2AA8F9400A01F0A72C92EA488652A2359C543F70AC861697371B417811389C8AFD893705E7494A8D711FAD0F4B91B83DCFF98DC0BBB",
109        "B15EB1BE44EF23FEB3C7612BF9E7E341D43DEFF14217CB1075EC4806BD7713CE1882384B3EF263B31300D5AF5ABFB64960D8580AEB45C75C34B22490C88EEE7A449AD1C5F1A2B9FB7AAF5F09A74DC69C5BD4678C6A817BEC556AC8C54D6AB711407D45BD34A3CD767CAEA1618BC916A97EC4EB4DD5A26EAB87FD57180F0577018DB80C95C0D8171CA6B3F5D466F6070AB6DA7D513B11E8CE2F9F113AB98724296D0FEB8EE6D96BDBF9A4A658F9FB07BAE7DC1D76CF9D0096985F4410E0265E74D6D195971D7B8BEFD2225866264F5440A81E722C1086071B43EED13E3840C058706FC3166DDA43B9D6FB79953C19844662E9950866CF8AB9C5CC38F38410CDCD1A26BA89E2C930CFF70550A3271635F1D2199C6E1A10DA6642151ADBE737BBD19EEF9A031FC944FD1E7E8DBAF5FF40F4A7855FF0AC4959CBF95D21C13D783484B290028EB041CC1709978EAD22017DD6A212D15E5270FCFF18FFB3396A55F55B293BEB482410F172261D41FDD38547A4D9B14DE813324E9FB1443447A5745B1481FA32722AE899F1D5BC56FD271AF24B0BFD34ED414FB3BEC07428F844BAB271DA1FC7C7BE0B87230BD6EEF272D0CBC6B47C24BC9AD62285E353941410CBB569F00A206C1D5ECBC02265107C484CAB37EDBBA5D6DE48507D6FD49D731DF7AC5AD492D8E060446F4CBB86E1011C58B969DF63E5A37BB6D22C3FBA828D8ECF5A33",
110        "B736EB97552E66FC9EF743D665815E675553C793EB058BE07BE5EE174AF3CCD35C7B2C2BD8976C80DBF13AE6E5CB184F9A8753E1D61425512D4CD4FEC5EF26EFAD797CD9DBC1AABEC8FAFD2E6C3B35691413708003F85A5FD2212AE4C200D699D2926EFA0DF79C63DEED246C8615350BCA283CFA85566DB5B7D0F82D6649D594AE6F976BEB9216B1ECA11032AE1F81476DFE9750647A491C52A643E546A5C266DD489C1566464AB2E40A6C990E22E91230F623DEF17AB9E2785B50050EDC3777A9264CE9FB175D45541028E181ED2ADCF4C26D38C68B5A93F6BE82E033CBD5F95D88C4EDA3EE89A66848761740E38B376E066F25E444AB1AA64E237633A178716B18D115A44F3BB658361B14FE94FEA6AEDB44364FB74627CAC72186E871D57DC32661FACC0802D8C53B78F913F0C3C2E2FAD80D6E196B7F4E3B4D823F5C1750BD2DEFD427CD9B06053B7F31658F8DA2FF27C4CAD242577BEFFA678707A4E417096AC3EB2780D1A492A379B0204B83D4B0B9E874A2D96FBE913740DA3155006760B6193DDFCFFD713926C2B7903D7317D5C959D59EA97BEF3F795DA7281CA1C5B1E5BEBBC691DB7D4ED0DE978BEAD0D4E2791C9568287EC4A2AA07AFF73B9643224B0258EC1C9927D79FBE950E68DF57DB205DE24CCAA0C16182927BAE1BBAF4582368F2A3F1D5A6104B56A7664801C29D3A4B67ECCF7601814C5D2C3F75DEA3",
111        "9CA287EF5F442BC9EA77B9C444BFD8F93DD3FDFD366D3F73845BFAE5DFE0A04A7A12B20E4993FD6726BFCE12EED33D841BD6C31478D76565F5E8BC452284929399EF49347DAFBFEAA3FC3C78A878DD1761D64F12C7C353510C0046B072DB5FA7F0A47EC9CBF5387F20E353E5CCD37A8E13320288E3BF900CCD5989659FD107295F0444DD46D3FA8829059D90ED77563C415E9C8F918887C5148FA7D17F2E38A4BF485B16F5901176DD27547725326EBDADD97861D42A89740FC50DD3A101F57A43A2E28CE63200AF2ED01A63CC6FF3B82A627D6A6DBFDF735413A93704EF2AED2B98C711FB447A6AAA7E8811363B628706DFDCFFD729B1AD87981E4C6EE5C1EB6A72F8E6DB0C33489B3FB15380F2010DDD1E34391629007DBDAA85753F7C4B92C0302216C4F97D77A90796D2CCF9E2A2ACCFD4AC2EA07C9C28DE83CD8DB0A7366EB1044A271ADEA1D6390A95AAB7CCBCC043D2D4EE43F768C374ACBD9BDD1098A4B9ED70D4B56321E54BA8DDA8EF844A87FECFCEBBD847377EE0BC92EF090BBD18D841C0DEFB490FC6A66BCCE17B96351B8D468A89587C8FD03F026B1843253599F1DA03EAC64ACEB66645AF68DFFE5D1086D9E33A8A28CEFF73192BE75D8F1AF4037024AF8C7D596EC645E5E2F6E2CA45B89F3C309DDEF58223445C492CF1790C348A9FDFA186BBF367311CA8A2975DD938F9B66F43FF2E7279D6EE1E16C339",
112        "AD8001D3EAB9184BEF37549281D1FF95D848EE5CF493AFEE2B93CF56CEEE1D572083429E2E4C296B3DD200EF63A3F8CA94713040729120B76A7C3AE51CBE08FC8931D297B37AB3B0D103CF1CAE2DE2F030F1881C955A8094DE963F6B7F057810650CD97C9F1943D0345432C21CF5E65DC9D451FE37A3A5A53DA7832D30FC672693D2B58BD45E63CDC4FAAAEE5F2D5FDF1E5FF96B6961A60A92DC313ECAC8E2E3898987EB60A2F7239482E83FB0762ACC45962BD60ADA207C946927D14C93AFE4A90E5ABC99F894CDC42E213F43FF6C953351D06D7A8A02DBA87D13E3F41037A5D50084ED2F0CE91D89EA4E445852C6928525014BBE92312BD91E8E422B364693D074163EA5AD356319EF12619C6CF456F8475130F6B28F9A90B096EB3E5FC5B16658B3E5A82399BE0F1C007AEA28306AFECBC7EBE2235AA4CDC0C589F6228F497A325EB742AC5099E6AE67D8A623C7FAEC07115E7097EDE9ACB44FC971DA29E466C26B92EA3EF2E1FCD74479F7864FB8C5876F5F28F40C8AAA234618D06BE23CE31DB6629B0935F82DFF537B8A0CD1B15B1FF440A3032D4FCD813AC2B5F9A4CE2627E30179EAD77715B0F2106E50AE72D9E2A8CE347519E87FBB65AEE37904D2BFB834AA8A48B25DE46E8A32FFA48F2A12E4134EF1A2A11352E571EB6CD43F26109BDDD7592AF6F9660A69AA59489F63500B56457299CEE7BD08E8C1AF7C7F79",
113        "B0EAB7E1B8F52F6DFEF5C43B0416709BE7979042D0785A53208B6A491B6F076A45CB3EB5A8F9714DE8566D45601674EF6E1C120D3E91BF5DADAF88AB0EFF4714B74AB1BF2D70B8AFC5C7CB196132A00CCC00678E9B133F61361321402428AAEFCBF114E6D268A7BD26CAE9413FF72AAEAC645FF5353BFCCE476D39E9AD2CB19CA768144D37ECBD370F6AAD7D58FECD9F67B1BA83C02894454E437BF65006C14835666699C1416E523CFE2E19B29A4D2F171B6283770C5149120D288351C38F9AC5B8DD30F9715495A3AD6F3C5843A8D07F6BE3409A63EF7FF779415460B27D5EEC7B52B9B8919984E1992B535912A2EA0837FB7AF56EC95FE6E781A5B158D6F8F4D4EC609C46126AC3F866526577FBC0B748F86316AC896A258D4B9D9BEA5B3378AEB96477EEF6B6BEF67900267607AC093EDF661EF2E2E783103976E4113C1EF0B7E085022BF7A31549F0F562C3DBEEB35F454D9C709BE8A41AB782D22F103F93C95CD6D68CC9E81207D96F10D3B324488F29F72331E51CFBF0A5790E4978A5BE5A1DE751ABA0195B1C4182541883DE1433B1A4F9A65FCC28C12631A29A4A1B55D23A7B10620ADCAFE56E1393A5A1F220432A17D5F7DFF87B4E7F1847DABAA75BA6262B77188E4D7404300181B8CB4D2AB0E0CAE7072ABB23FDBC8DBAF0DAC74B01840E68635BE94D939D40DB7933B48CCB253E4256FF733BA800F5916E542D",
114        "C1109EDB4A863E562B4345B600869FB4C91CFB114F433F5B13F1F7E421C05696592E5B12EA4152839CDBC913EB3C6421F13A12245C2DBA217AFC497BC81FDF1FE72EF243F85E59237313274F7E60AF0EB2481779872DAAF0FB3606E9303E427FF566CD95E7A95DCB6C8192A5E86C1CAC79121F1332A65B84939626C75A852BD7CE87B04243A11BA3E67BEA69B997724FD49E70A4F5C26E565E7EE9CCF8D5021A233C2C55589783160203CBCB9042FC7120187D8F6BCFFDFD606046B9FE84BF36DCAA134AA354F94F85F8CB8C2E9B0229C213C3ADC9FBA2A6738D9534216A2D63C2B6D158ADA3E0336C8C0C1D64B6E480492BD735120572A95A585B3D2FF4C9379F4C7E0A9FCB6010EF301FD9EEFBFB74688FA90D1032BC656FD79077354605A91C11AFA5AEE5104DF580CE3A9E1250C9361AE99323AD4FEB6EC85617FC9DF2D0DED6B0B1308DF2727DDF582C51E9963864CCF81C0EAC58CEE25A94F50E8B1C121AC7929A73237DC89E88C6C9DCDA5BA886435A8E329A32D7586F9A21FFF1589FB7AEB99DC24E3DDCB0F9A46C7E973002EAFB637F1E7E44FDD7D750773686BF4350BA6CA39F6242D457E0523C84D724E44344071EFDE990BAA3D5E0310C4EEBA2C56FE2D8AD296C066EA4AD7F03F27E12ACEACA94AC9516C7884B4216FFFE9EC4D2CD89D76B073C81A6517A192AD70CCF861DC35144432F45C5B37DF06480DE77",
115        "8CAF89D8F5F40D66C95F6EF7DE055E89B6E0BDCB502B0D3FD006006D8C91FD6637CDD89FE23B7431661717DC95C5283E5D6EEAD8967F3912F7ABC4E8CC99D9B00D973E1EE23133F2722065644EB671E2E5F671DCD0DE165C8FC3009D543EE081E43D0F05CBC0EDEBD358B40F1BA8AF439F46075ED49618A539F3082908C5EDB123C670F261C214160158F998F2030D57514993FDC27CEA5CFA2E7D245557D3D893424D35AD1E8C073DBD2D6CDDB886AC53F0B317F88173886E4F726B3889A9BC446DEE14401727144E1EB7A0AE5F917CC7B062EA20B953CB915C0447C0CF9E8DF1913771E7655E834505B287D3DF2B47A645BAB977D981FD338C83293995CE68F0EB802E9526366FDA1BB554858DC3E8B57B3E7666EC6019C131AED87C15A69F0B2DE563B05A25EBE2229D792FD4C8383CCD3F09FC477539B91520172A2EB5C22A86629395291042AC2208C90BB980D3D6D054B90F9FCD48FA5D27B60644A01D412D033CCDEEF14B549DF7CE473B80DCAB843F0779CFE2BBA09C7D027BD0D2E6EEFA30CD1F29E1A19293F82E047CDAA5569508A82C1E92DA9E24FD8BCE83CEE6C32752AEF86D2DFEE943951D9AB6C907CAFAB76C75DF0E193D3945410A45D69B502A0D2ACE9E451EEDE3CE77962653E949219D0BA42004F3E5CCE9F84BEA5D9B34C2378608F4A443AF4EB50CE7B16298FCE082998E011293798DD34F8CDEF44D",
116        "C85A40D4BBB08E3832B6B289513D039ECD7DB9A0CF936C6132A1E39BDCC2B57C14A20B6C14690C73ACA46A0A782AA7110EDE594AFACFE44A1FF22FABF9341475A4D87B67E269978A64D2C77F436CAE737D421C9822288F41F210FAC2C25B95E1E86558E4D62E6790536E1E3B5E0F12CEC1749FD2D50B55388BB063A1225990FA07E67F257C84A200CB258C3F8990E6DD10AF8795606508C2CA0AF88D3ED65D3A70689E070E7CD861D8351EF1DB75D588CDC2F7906B30ABBF2A179A5EC0AC43582417959D8320F8A1038CD2392764DF4C405DE56F89415499A7BE0C60CB8327C07EC4B57D122AF0C8ACADF07039F0803D9A0D2490B96F380CB9F68BB4AA1343ABD05554A46534FEC9C532D29FE98999069A9550700644935845B8AB31D03A02235A0A31AFB601AFDA4A9C6E9FD121B5B0D346C48079718E0DFF98DFF2D6801FEFA0E840E81BEC802C5040525028206F140FBE2C48094A0820BC0824F77EA6F112DA302610ADE83EC0E0151635C7151FAB66763935951C4129E513FE2F4711D10E05F4B6E54BC1A4777382EEA03A81E1C78366B5A18BB19A45DC3CE1B12389F27A359B75C57AA8688492F07F39B33C9E78801845424AFF76A7BCF631590DBC6B9BD63A2B1F7D9B5E4BA52038A2C3FCD9E2F27A2D070DC4AA7B9A005ABF9E5EE3DBD222351D06AEA89C8246D975FED243FF57EA659D2DBF4364A26CE215E9CE9EC1",
117        "DA2A12824C47DDD6979FE6FE3278D4793033F1676E489B6A1E6E12345C6DC8D5DF880937A5BD4F42701654B0507E5B5DD4F12CE924A2AB4ED1B485F998AC8914DC03CE5618A74143476992EA5AB6E09C72413511515ED0A4E10612DCC8704DAD74F19826E7EFDB2F3AE0C50E9BBB90A0423F8CBFACE5BFC196B1BC63522E6122DCA094B55D5C947A2FCBD7F8B20085A3DC1B5020755580234D27939B78B04702F821E66509B54D4C49871058096347A64BAF3E8CADFE4F2459D9259744BFE546BCE7FC77D2E47B234DB7D9AA133BA0A80F1DA9FFAA2ABEBCFA1A64D1D6EB0B21335B6B85FCE0F5F6A2219A24D7A1F700525C0D8445606AEBFB6C67A2046CAD07F49C98F07FB73DD0A89069D433933130B1DC125921E8A50A76EB3D1470039FD1103E0BA7D76FC146C5BB7233A423DEFE721FDE811EB174484A54B2418D7A2950CB53FDEA3F858E2457596D52DE67F075E1C64915A3534AB7300E72948F635D2F29DD5BB5BC2CEA378396B0DC7BC274150D5D62CEB6DBA3D2D4E85D9FC82748C648263E4734B4DC2803CC9125E45AA858930158861872BE6265A0969D2F4595C2895C26B1E6C79F5E750D976563D4B556BAC29E1AD9F6FF1A8011A461DFF48964DD73E9CEB8785E1D32041752DAD4BC403C05ABD94D5B2E3E1D7ED0389E1A654AA031976E5A0DD6E3ED0206D51FEBE083B38FF14E51A7C8988BA88D9907D4B787",
118        "AB929DB673DCD3C56C1251538EA783059384BF389881687892C8195BD359BC6845B077E3B123DDF8944D113EA39CEAF6D307206B64DF9D06FC7731B605659CFF7B67D3682E7E25E8BE73647B312B238C69033C244EBC93C4CB3546CBC56C106A6133DAAC9C38478DB53672B12FFAF0F739B40B85C3FCED295DD9C4DE075D595971A8A642430CF24F20DC4D07923096DBA7436354DCC74F1D077A48554BB1A7560E801FEDD6D2149C767FC97754813B058FC93121E7657A535530D8D5192FEF119DB4616435F531BF5AFB83E7AECDCC18C7F0BF94FB12B35B674292361E5DDA80C027483931B5561B83ACB63E36BBD9A32CC51499FD7115C938342B58DA9F47090569FFEF99EE87404C1F63177BAD41573120C468E034037E12E068A2647715EBB1BAA52360C23EDB1A224E7F4B4A5359D40B6C92D7E285D2E8D80075559B82F486ED19AF923957431D356457CB92286225DA073E60E2C158001E61DDEF52C2C6F690F9E389C76AC103DD3B0F4B7A74C28502806B892A57E11BA5CB7B8EC001086BE0780249E2890D7234E26280F1931B5965E244ACDF0BA5B853C7809769C691F7127F5634B2683752FD1BF5FE99DA580278555051C17ADC28F25CCD2AA312444767058E6D3692F81CAE9F66F533139588ED9DCEBBB61DFC41B580CCA215E60F200866F5B3A6053958FCD1DE76DF92BAB81DC2E8B0FA78A26C0C85C23CDB74CD",
119        "E97C1B6F978D0681440D09C129C9AFAE7F675EF06FDC3BD0FAA6F7A42FA1380AA792EA9797E0F73C5D181B004B64CCBB0FAAB8ADA9E3452C46BA70E40CF99EF238AC81A845BD905CAE1926C84927666146B740C407B24944551D03E692DD3B6E25A2721DBA0E11B9E2F0FA088C144332392AC5142554C16859AF640715AEC34A0927A8F35E4A789CF34C9C2058EF1DBE06195B81FC8E8A2BDB10257B0C5C931EF16E5E5DE6E46C2C782D88DC42D25CFE168B4AE56BC647D1D7CD327979E10366E879712DEDD50E9BE68510ECF6B78C5C5E49AB1F1011E6B1A3CEF2346BED5D5311315C17EA6D67066CD5F2B2BB101B87757107006195FE447363108DDDCF48303078E9BDB5915627D72F645C6CAC9E53CD98BE34064DC41AFADAC0AC7294350AFAD3C7F71A387D4319E3E094495174EB0AE43EDC73EC2B982020E4BD4FD4E3E893040F855DFB7DD5EA03703B9327977B0BF347DD4DCA74E74CCFF13108897EE3CB1D01DCB686D674C2927EFF185082B610BF332D07857D18722410A49A10D73DEDDC2E7CA9F74AFE08814499C47181FC2E7DA0B4209376D1CD585AA8E56810F63CA5F0DAC080B1A6B0E561C2C5F4711C5778E89298F38473E1B497D1078C262512201054A442E4ED60BF2D302E50B47BC13CE9DBEF7D68D2F285671A62A9BC1E681A18666EDA1C5660B05FE014C74E54AAFC87EF8F44B6AAE0DE0CCA9458CE0D",
120        "D24536A04530F9719BB5A522F28A2543113C7B8DF1A013DD6A1BD80C9172E44B795F35E8E622C43F791B4D1F83F23A53DCA67ADAD458EE0A97E747FDD2B6AC648D7B2972237CCBEC72C3156D4CC6ED071F47FD1465A6D0D927EEB60C1495AE739BD13C0A034C4E3C9C12B8AA74928778BC16BFE5F440C8034007EA6DAA89B808F97C02ADF0C7858D6A4CCA695209DD66C005445E4B5E10DDDAD373B0E4D4F6F1EC7F838F9D84AEFF7E3E64ABD0E5272EDF0EEA4C9B7ADB3AFA55B5558A8C61C6BBD6A1BA335EB752B717EA09B42B20297C6F3AD120857A74CD82DAA415A6DE946C28D2D04F104C523FB65958C6FB3B925BFD97673FA5B7C1F8DAE06A71C1FE2213EC1F1A7DF0B792BE59502A665B6DA922EDA753A100BBE19CC6EFEBF775F3B02EE5EE18BD1736DFABDBD21DB128CF39A6AC4D6195F5F1E95DAA1D25A1AD2F776FF7B4795E9A7C905D323D31959A4336A378BD34D9B08180D4C7603EEA95DA7D948AE6C854C48165E15243FD690D4D2E4946284A9FC8047EE2EED95E84F6C7309C59891BB87BCB9BAA4DB6E4B76474A2ECEA77416A28006C75CA6E4EA4334F15691FB043D307603A18D1F907F3C50517501511EEA6BCD6B165AA29836E39F1987AC1FCF9E5EAF16DACB30C4143498F7F0A3B12A5560BA1106D271BAC45DF9AF556C585678F9CDEB51196404FC0A00AFDBBAA0A064A81975D444B85D65388F7FD",
121        "E87321AF7BCF4FD5D9E3135E17188EF957B71821A63650DF718CEB9F3E3AA964CC2A6BD686ACE77F964264DAFC1962AB7EE8FC28FF81B1056A7E0D0B3292BC2D4B4304FDA26FC9480CB8DA21208FBC44E1BBA86664CD456FE70DCCC5962A04876B16AB7579E860360B93EA09FAA7809B8E97D949CFDE878E341EA70210808A52E2799BC9767BA6F1F8283B547B0B0A9C72C1AD321E3E23937F870D1C57CC7CE08D38522A7AADE71EA073F0D2D0CD878A0CB0C7BBD5E04BCB5EAD788948FCF32E483BAAE0A4036B4B85310328DC69BFFD74B5F7C34BA9892A0A52A25E8E4C288A3E21AA249FFB799C64C3D3ED4B135C2CD6B9C387BAC4A36C93DCEC222986B263326DCC50BD2D01B35C55B593E64E6B9A9C881781CBCC0B0867961E1086F125CB5DE7BF7AF1E4F7C98EF9C8A7F553D3AD8D31B200E367F9FD55D95AA2B3299267D23954C8E856289F88FFBAAD48A671DF41CA2D46953AEE88493D6A12214E264B94DDFA650BAF95015D6E6E0311431B5C7688383BEDC41A729A86F59E41B3B0D0CFF5FB8FA822930246520D1BA9A394C7D862504D46461FC90145E4B824EDEBE79AFE3C7B79E01B9F5C360C271812165DC9A7A7C3450F21732ED0BB2C05533737A3CA0C53F2C46691ADC17E79DBF90241A1D0DEE8A7CB2F10410038AC66E60E02DAD37B406E954E034991FE635CAAF675714804D7274B9C44A004502B3E7247CF",
122        "8371CAC0EF1C829841491583A493B098CF857E60AF39AE00C26F542A00AE94CCD10FF12CE3FC0FC384A9101F06CA90EAFE48218B9F714D6262C88D970762FB4A0635AD4E44D29DBBC94184CC7393C6717E37466DDFCD8B5A0BC3FC87C91C8292F333640BB68DD28BB01794B5E857E4EAA00F0C7A51F51AC925E9D7834F8CFD38B56B6FAD57C3DAA1BB139ABB0C72DA62A96653F7FF92BE4E341DE36EECD7E3ADEB053AC41813D2E2D4D1CD1D196AD4B9D577D4E4953C86C48FEAF28409F50A14336D7284AFDA40739A087417C92AB6A40A9597E6498086AE4B6F428FE724BDD1C3AB989D0BF438781F471D5B5606D3CDC62067CB026A70F058535C0A30B31ED49C6DD0A25882B4606E910C0B1135CAA0F9B0091C31243506CD168A5561E43D7D8F3C488DC5AC5EDD0750E2CF1D68FA59F35B5FF58968BF8DEF4E7E7261B18C7A270D57C7C9BEBE3DB3CCF843EF680948CC5F06CCE03794AEE25ACE3EDE93A501D92D2AAE63CDD6EF68BCC5F4A1A6920FB7D9D3B03D4320936606A445F855ED24E5E814EA766D8D12D16D289B9436BB61A967D70174FBDA85B5934B02E60D6B54CF9C4633099D7AC05050CCC64D7B7D17B0B73ABE610F48289E464C9A7BE5C356113A4E022F30FAB4F9FC5607675D1D2FDCE67234751A24246FC8D29C822DF1D878B871A738185A1FA8519739467722902DA7ABA955DABA3576E6EC9752D74F8B",
123        "FE6CDB9E1E0266D520C7E977FEF56ACEA8B78331599F3C21E337B0E673EB66E6E8316B2E55C114025425FCB7132AB04CC0D17B8714E3C37165D38619EC2EF3319B7FCAE7F67892734C10FB46CC0238A8B38876A6552471E54D2A73E99EBCEA0607E3365D6F3746B8E15605742E3D9DF5A13145107674D0712B98627B0930DED818444A06F186673971B9A2220C54E83FEEFD8BC54433CCBD4EDFBDF4B102EF21A2C0A927EFE62092A7D51C4FD700E23F1E88B530E8C69AB41F79BFAB26B95465EFCE6A9F764205B42068AE1430A57BE224C9C7A93E7BB4B56956B1C96B3BCAE93F896412CBFE16CAC453038CE495521079BB0A48895481C95E08EC36AB5E087EE380034E09C266659110EBEDC1B6E5547072D35F1F8C48FEF1EBF4DD00BBEE71870B4FE99A1BFB460F3FD66BB4E6DFF2DFEACE6F632DE8206515224C2C1C87E7CCD93D8E98B6B1DC9E3F9CDEB66400E143384029FA5E9015590422D2A6C07ECA2E37A2B3D474BFA99D162D570931A6FD77C95D0F07AEFA4AFB7937289941C6EF3EFBC5F4B41803FB90F576D8B407D2DA810C95C623E2FA67C2970FC77A88E066C076857E864B9A85BF7E9B542FA4132B7AFDD5FEF25ECCCC488E7035C02A5A831EB8B484A87C05DBE9CF77D7E82E88607894CC2E3C78B040FC2C374E880119D3A3883377C5276A5480519DB3A397CB93D2FADE934ED57A724D45712886EC61CB",
124        "D00DB0EB8F475723FF1E3DD740E76C30EB004121E77388C48839ACEB681257F50E9237EEA76CAD71FC0F3125E60FB09860E100B6B3967B99DC538FCE1E2ADB3E60D229BEB3C2ED67412F2CBF78B9BE46700FC7AE90A652C06F6491ABE14E169031061B1557F28835F211B09B452F04851EC8B8038C48F30E69B6A9C5C344D9072192A8EFB9F44B4A22D7D9AA1B3779ABBCD9893BDCCCD7A26D5EB1C0BE86481C0E749D9CBA19FA1764D45B2033C1137B43D0D003A5437C6AF7119036435E846EC317A40A15ED5B0B64A2A39F2F05BE9C7F99D473B9E2DE1CD009AFC28A22028227613EAB80D33C116E065014C1E2F20A7F166905757FC400F67B2C4DABA06AB345325354BC079294682167BBDA804FFB4F485B0276A77EAAD5255F10F11C2A8D44A5BA110429C62C3FC804EAC1FF77D8822AA6D41F807AB233B1E19D4246FA5018189ACE8C5EF3AD3F598C25D2A2156E693C2B725692011D2DBD1A0B96D7D8E53EFA1DDF2D60E7219C5539FF21F17E0BE6E3AEAD1710B514A518986EEEEA099EBD177257FA8FAC79AEB93B0C3B30213098915EFA429410D971E7AAB5F7359C194B1A0A6DF1019A85A9B9C6DB79944BE34B608518C4265DFE521168439156089BABAB5E76BF87ADDC7B35C678D3EC93A6B99785D7166B3BB744B5CAB61B8D5B67AE7D0F7282F8E52E6EAD15F8FAC8575BB0BA90455058BEF7169716E39590A5E3",
125        "938ED9AC0F23366E5E426EA20F0434E621EF6AE155049702F728A3F45E7DF80FDB2452577E2B937399B0158592BE28F851F6D345F98698B6B113B1DFA4408CA9C479F52DB48B6D8CECF2A2D2A385D57DE99BCC8A64283CF1F413C56D12FA94EC318BBF7D7633650738B7CDAD2FCD20D04B79D06059E4E86EDF0556872B073A0BF28FFF71C7275F444368CAB814D15BD60E396720F9168952E9320A7253EC2FF0B031BB20AA2A155D08CC55F44DC5D8F3B101CDB3B2AA0AC363D395941F663CD0BB0AE0EA1F78CAF35FE0BF1C0BEEF8B8E24F4F2864F79BC5C277B8E886D1376946A46AB06A72AA8DA77AF21301F416905F6D91607D0E5725ED5A92D609A2B9490696560980069D70E88EA4317D0E04D22965BE153D9573C07B62FE458E586C9C6DAF5874D35E2FE028F4CD078976B6441B4E454812CCD05700ED48986ABEFEB4ACB6ED1A063126A52071AFB34CD92CD24BF80CCEA6E97E39C792CCA1A47023C08E32643C2A147A6265471AFFE3FC7201E59B5BBEA894B3FC06E778E4E0CFD8A969AD9F665BDB396B79EC09EADC4F2EE2DD5E2298CD6C419600A72DF0EEBF13461643FE67DAC9CB25AF56D2ED02BADBB68ADF6A032A0571EE423B37E9C8DAADEB75FF526187ADC75C815451528701F3CC5E2A6C4E48739672B97A677371D8F8AFB712B9639EEE86E43A1AA4D16D38DE81A248D88DE638E70CCD2BD6F98007FAF7",
126        "BB5CE752F8E7E7A68B8BE89BC8A19D04E71BEBD789CFDDE7DE4841077F1BF494393EBD56FAC9940B7D9D4B85300225F1B391E23DB6F16127FBE2F3BD92B187CC2CE9D4BA313773D269B87714C756D16355CA73C621B98020351A492B3F0A6BF79716B7956482C57442B6F93A7E97C273F2B1B9C95623040D0F33F37F9E93396C56A3D0CDE4E025792B24A91F8418CDF70001CB910D2AC9EEFEE56BCCEF6FB977618542ACFA0413AA92C34BD5359E9B06B1BD862205051F7A7505A382E6E6AA1A8C027405A75F2A5E4C64BDDF635E55918D6F2A70EFCF1120C8C281F42163EA702F4780C2DDCA80B4E7496A01FEE7D81C9373B84D4041BD6DB735E11411F03E8D858FC44AE1C7FE476C212C9AFCCF570F8F6060084CF29316A1E2EA53554DB8308361BE1677B5C534F6A57ACFE49757C7B51E4C7A14DF399391D732CEC6E5E6396C6320618BB5B60E6B921090FC5483E877892CDC7775108DDC0C5EB148B69C28DFE28A02B73EF98EE1D8890BB57448018F6ED6626795952DEC9C9A84FF760BB7CC01650FB2740FE9B52B7F9C248851886CCE7E7781CAF6EB8FAFEC1F7A646A2BA4611D69FAE06D953CD5CA99CF4C462D868CF8BCDF4AD82A2E315FC0526250B9F1260651116E28B4C198C068CD076B9262ADE90A4C519F6B3CF4CC3466213723BB332D173E3B6A63D5CBF221DDBCEB5DE1DBC3EDB2E853EB5E594E1F810B9755",
127        "9A275B0EA24CFC22B6B10850A4AD4265B0E1B2171759D12516F303BAECBA4C93DCD383B92A2518B549435916026F3B3EC2DA68CE447BB5504F3BDE80455E5D8697075253B7A663E5A7C3214E3A825D05C390A8E2E7C6ACA2A5CD0D81DF81D768C5FD4EC0998BA50C704863FAABFDD05B14B24643122EE6AC018CEC5BF58F2A65D9AC51E817467C8E751B6CB788892B3DE1DC14F658BCF8FCAB4F44EFB40A400B3AC3D47361444A8FD21D1FBA8170C5EFF69C0580F78F457AB52434FAB55883DA99FAD45A4C0E93396332616B0F72A93701B2603E924708C7D925C2D3D8B003DE1E153B6D5032BFA87616919D40B0DC68913B713A9F2EFFAAD1212A6A5D697897C59A69CE075C05E1DB832A81DABC3E94AC6D27918A2EED4E5764FDA33E99D11F453C5CE396012917814A6B24D327D7F12E342D57FC96AB845004F8E9998A2D32186D6611F273146B8ADE36FB697A686E650CAA40BB12407540031C4746E54FEEFE381102373B07AEA8849D43EFDABD7B2E4B5FD74AB48688B5B88F92477000C06E0A24A00C663A24AB9F9EDDFC910D1EF714052720516ED8678BFB3B69C053F2760BB9D2EC06FB54D4A755786799C7A332BF90DA1C102AD6774B52FDCBD8515D6E209562F3F03909B62E7A7F6E4F8AD4B3E0DF3A30C28AB2F2867B993FCC79180E0E5DC4E3CD67D26CF6EDB58E480011AE8A2DD6A2F0DA4DEF4FDE679D2B102B",
128        "B35DF305B57CC20FF581A37AF4AB93B9EAB5AE17390BFF5B87617DC88BD32F947BC9128C673D4CDC054D9FF1C671418C121CA12A92374E24C76DB2C449B0054DE2E2551E8163A522DD771D1CB436149F4129AB29EA1766AB7EC1B70DC4AD9405B5ED4BEE04F3A4120FE05062B268FFDC2D5D5D98B8997276F69551411FDF01CE7E696DEF494F6E6F049FCB376AFA2B496C7D14177E7DD4E849E3AA8C536246A04F18BA4F515229FD0D021FF6D26C27913317BEFE1E4F344D261FC5028C2EAFC80A6BDCC2F18165172D79B23F2D4108A35D5BC98AA69D768E859F86E08FB71A08825B8821335A31113872DBC6BDB4D050CA9FAE16C1A188F076A88C1E3CB0DEFFA7151582E43D102C65C5223B5179251863C9AAB34DCD917E4F9F1B5D6F0BD65B5CFFB4013AFD2C2EC729CDAAE3FD8CEAC0E99688A5A08DAFD0BC2FCA8186ECAA9B9757197C418A8F347395160585022D05DC5CBBBB93A23493B02FC77B8AB4AE2D3C211B0B38083005A0033DD33CE17B04A73EA305DBA7BAC3E652A453B5A5B22BAFBFC4A8AC46342DCA0F479BF1CA429521390DBA604348E5C70F7B2DD9E671CC011CE7F5648799EBA8AE0533B30FA11F396C88FAF230AC2ECF3BFD82A5C46DFFC3280E8A7B12BCA90491AF7676FBC939BD2CD0F3A36D9B4231E3BC44ABE43540D364DF6FD03E326C9FF448A512713624453B2EA26CAA6A3F12567EDD0A7D8B",
129        "A48C9F258321497E5F58792B417F30D3268DE5F5AED7964DF81EC8BAACD839C7561EC6E7732A7C38421C9E8175DD0941789F684D152020D69CCAF7E034B79502FC2F51DF462A942208AC34E7416681A3A9D01781DC87A7DF710759C3524AA05FD5F3D93ACB659AD6831C944E86D5DA04F1FA50477C5253CD576914C5D308DDC54F20A60026DFF027B4236FE1F7BEE17F22C68EF16377AFBD570860B762E05E897675A1296A7CE78E9369A8A4A915455A4092B30DF5C84374112BA7CD5B00946C82CB9F59CE7191F4BED24D6792CDB08B9C3D6029C753F117689A02FE7B98FC509F9FD20CB1175BEC03D27606509DF79CC3392B255D37886B05C2EE8225A960ABE6FDF614AD7C17B6D617B99591D58C7227492CB6C6A924DD842A363B478B090BF2C8FB08F7D0A7AAE2CE17E377355BB15CE51E624AB85E5C1FAAAC7A7DC9D29F8CA60E3D2BEBDD430C99F70F93C919E1791FC217EFBB25C0D4A3E8F276B40BE40ABB8B284478CC0EC3CBF4579EA17F1C6E2B1A8D9036095B8C407832190500BC3AE5005259512DB72477D4D414954D425CAC19595E0213997B4FB8243F932B3A12DA6C1532DA4D5E649C3A617317B7A4B71A724D7A8D4C54C287B58DE1CB5B27421B58BD6F415568753C2DE5A87176E76D796798D643ADDA713BAB148D9073C19F0E4AECB2D457AB2EE555252E5E66967C381250D9C1C71E8754D5C8B82A29F1",
130        "A08C1470BD961D93F21784094A94195EE9B088FDC2CC489FCEC22FC34014A479BF459A98B0F5D465F6448398C2CDC7215A8983BE1B2DE48B7D47164AE53D309FE0D47D81BAF5B993307007497FE0CE481B824C7854E5B9542975012EF35DEFC66333575E5DFA6493CD6DD5438C69B9183957DB91A2092AD134ABD56E308449F46381AF62185AADED01629D45F556EC2D9B0DAAA1637AF9F6944004AD38FB9BED84D67418AFB4EA525FC4AD244484DE8B7CE26C48C70939CF0E4A4D80BD5FE3B90D25D8B134AC8E087AE5A7138DF43C58E5A518C9F5AA821651B6049E2BF3A840A5D53892A02FCEE80C697969BF8E4E21EB127BCC30BAD95EDFF37B964AC6860BC17B8B7A0693633BBAA4E9496C255F848A4849662FC577D1D68315A48FE3C52DCDEF0A46E5AEFD9AB26AB4E073357180266041810A4DEA4F389224C4BDB1D1FD14F00BB99BD12AB022656A1C25BA3FD5300F2380D813E0C0C799E5DFD600F762B06BDC44CE574A3CF8CCFA3EB758BFAC037B52F11FBD0D17BF20901FBB28ACB577774923068B9B9926742A0EFAE16E9318C4F5FEFE5CD83E92D4629B7C8DBC8440877427D3C3F914BC3456BB39057AA149B4C08AFA8ACC104234F9795A57596B53A274A363191995BE1974DB124260751593E665B5EC1EB728F22ED911D5D61DF496CDFFF85EC1598EB19BBD432D1F3BB1FAB8BA0D8869BB4E09B7A8D0BDAA45",
131        "9C1E6A10933ADF8A028241C745C8E2937B243E43D686692FDBA68DC82E9F4F31E717806F3F649D97FDE377684C4886BDE12FEFF9E180DEC24793DB22CAD687E2ED1DD09764E24E28B753625D86E5311C027C88DC5529C1A8933BDFB38A6EDEA5376758CAE22F57A2D6E18967AA47ED35EE2CCD44F024D5DBEF15DE5C57820B55A620B5509918A8A9300BBCAE7D939266D4B403A7B5D5AF7E8CADBAD1554CE0F40EBC386D4329626FC80D79A86C078B5461A24BE4C66200DA717D43DBE451F4FE17BAEA8EC0279CAA2F776DC64B32D1BAFD5DE07FDD80B485AFBDA0A070F267139053F4DDF69619CB6B4EA46AE9E85E7EE885F2A58BFBF08131E868BFA004D17F746BBA9CD0AD63F2D39BE809B72CF6BA7E71364D0D7CE212592AFE3B1766AED3CD72F9907CAA823E96827C0A0D5A5BCFA158AB90F9A5ACFC81FE9DB38166F819D5DAF8D81B9BD5921AC14E3D24F45479A3DF289705EBB7F011A464C8F75A3B098126EA9F1CC31AF888F9833D7589D6E365F302085C0E948D115174C13A63E5C9C4097561B190088D714E16FF89AD84EA1E0A3A63C6CB06FBD350939E9FB763132ECDF9CE5617F4EEEC3ECAD133649E55F1100D75B1E65A1467DB73B68EC9A16065DC9FAF72B39DF3C0F57BBE0C550809083BCFCFC7ACF0B4F05E70D619A4953F7635F965A6A1F173C26E76D09C17333D264C8725C69E45315517BE23CC1E4ECD",
132        "D4FF96A55AA32C20EDBB8CD3C0E19B5552E6D5993453DBAB59A5A3991E0956E1849FEFEFB386A2450F50A2B5F20DCE8E5AE1508D6FEDE4672C619CEB1D833DE2824B6AC77D64A8766FEB0F5DFF110AD5762CABE732E67B556E32F8F8C7654F14ACD43D498D7F97F8D0FBE9E06BB0743DA53BC7AB3FD06266FF1E4B806563115ECB13FE635541C691806EBAF674EBE5CA18FE2A6F4ABBF62E00BB8ADF25E2BCF14C1BF0C862A4CE0CCDDC728D7487C61D41A998AB76CF78A9749F5E844495B8A02186C8CAD38F1D6DBD6FE5D45044F0526BC346B0D4E49AA1F6237D1FCE8C307E7791CD7416687D03CBD007AA236C1DCE5E5FAE505550F8234429CCE7E6528491BDA5685CE913D753C26794BAC3BB6BDD9FFD4795FABBE51225DE8E1FF14D8A6000E0A315805D11DC2D699DEB9368611B547D60183536614F1120643DD57CF58036A62070081F74BF225912194593A401E8DB5051AFD156C09D15D15CB61F186B2F4771ECDCF60BABA3113DCEC2C06BDB1F6587ECF5DBE7D2155C177439A7C43DF360F6E83C75C29BE4C165495B4109B48C6E88E5D3A0AB57DC1E48657D664DBFB469D5FF8B088203424DBA77D02B89FFB00CEE13A030094B9E8CE96D705A16F3B3EA448CBBFDE26767729811559C815826ECBF847A06D105BC4378B3CA611091B4837301756BDDFCE4B684C1A8402C9EF4AC83059FB132B8848DDDD1824E8B0D",
133        "DE8718E33041BF08AE61A39DFBBA308B07CE8B7C0FA173BED20F094A6CC8C500E04ED9B5244D16E5407FCCC2748312F34E50DD704A0117BAF94DB080B1178746A3854F4955B505369A4D1DB5AE5C711C1EEB4CE9FC12EB7F7419E357C7263B10AB8B6205A940C73876F5FB6062AC1416F42EBEF54558664988D773F28F3D7F7EC76000B743E27E53156F92FAF28D33010E16FB95FEAD2DE1756F3DDB04FD3C65DC95869BC83B494DDBF72AC58D023AD867789797D4C357B4EDE876824C3ABB3C8BC6C677C2ED6FAFF657C4472AC0C18DF85C7A0F6BE310DFA42CBEF170E308FEA786F0842BE3512B2D371F3985E8ABE737D0E724DF155E1A4BA529D5465CC6959AF46B5DAF7CBB4723AC7FD5644077D56C7A6B90F7C2626959F998966E17553EA9FC989C7333020F9ED75E924D411B799EA61F26578ABFA1C9B9C01B547838F6C9D1AA92EDC031AF828C6D2D32C2F7E29EE45ABA8398EC7CD74D041BFB88385D0EC7C061523DFC6367C4FC6A6EF6F8A2419FD68047C79E650D0978C843F46F3154F76642DC851EA313BBFF8CEDB7609CC403D210C9E7355F6E0644121C4DDC40F5734B44FC49963045516D13B83A5C713E85CCC5EA2E958A7A68B728F6892AD8E093F45241915C4870572DFE51B70E5BB465FAB47F87136A4F7B7681399ABA436EB026EA4AFE90361920FF9CE8471276F1C016D33C03B8632FE2E96891C47937",
134        "93AFA034A002BE96E23D36A278517FE07F463F20CECD46909AAF02101555F38B0217F6624DC92DD0A6D85BDC50AE3C8CF9EEF0639F2777FD745357829DAEAEBA2D7DD65952B696E8EB4E487FC16061D17C67205358FB42738827770375786EC0A458FD5165C4AA3699E6F4DDB6189EA11D1DFB140AEB29B95524AA15972DB68CE83DDCB44EEEB6F267808C2E757256692F6E932DA13E2726E65E78E7DE6F5056F1DC1706853E619164B7FDED86B1A9AFAC7A781983044749BF96E28DEC0937501472C4A6DDD3DA5CB7C4851B2F6D03B56CE5B6A25DF37C7DF0935F0E6639381BA51A3203A6088BAE24E06F14E79B4F2D7BB6C3AB18EC838F2D07DB26A730452090998F75F6217AE4DBB1D45389397B65DB7D7BBE86B2B84515A79D87725A9054E8B15DEA3088F75E4CFBDF3AE54BA27A84DF94ACAAE7CC3FCBCD08DC732E068CA56B59499C7FD4E6032B674676106D7AB2EBE35F3E2A1ED59C1A27065EE4509810C61314D02D1D52A34E2CC1520A5ACD05EA10D3B398FE2EFEE7AAC196F1F67A7992B5AA81210841F3D4F33620934924384AF941F7CCF4E8FB42B75AC0F9B558C23131DD0F2778E810C58415BF1E3884500A141FFECAAF04E2BEC4ED77834B09E83F22BDA01EBD9A927CF66E9E487C79E1D6E33F7467CE19DCF4F54391BB06786206F699BD40135BA16FD23D5C9395807363A9DF86F0DCFBF6636121FB882965",
135        "BC6B10B9B076A4D12C912A6A6196466EF8931A5DF71E07C410825003AEC5E9C9FDFB2F17E756DA4364DA3EE9DBFDD15292506999949CC5D76389D280F76C15194142B665A2E6A5A2952176F6864B003F6798EC6314A5BFE42FF9A2D3333797BA2216E6182577B35059A1F7E2F7C8B4318117A134779E0009C1B61F13339BA825D90483805B325C67746DE93F80AA087682C2C52B55D4F211D1D3FD8A9C6BC0717775D8AF5BA044B3E57311B7754941D028D8A169CB98D5934115553B2AC5B9D009C1B41E7AFB4CF5E3DAEB2A419D84D55B6618FB4289C91CBDB9FBD7C5A1F7F34CC61B406CBDDE363D2442E2EF9C0D0D523609072818E2316E3154A47BA93C06282CA09CBBD9498034EDE818426000D76708C8E1871ED7D3DCF2C2C1399F60D0C13068C4A596F2A3175FFAD1C59BEC22FB4E6EE532A07B426E1D5A295B711CE75E1DC4BA56C7E041326DC31B02A70AF1ABEBF6FDCE1E3CC6E778BE814786EE6B72BBF5C655A290EC46D147FE9DABD324688C7B23C9480F508B1218E87F0C20CB8201C5DAF2F209CDE87F354C0EB3A928C65A79E5EF855E9306CACB7D8FDFAEE16AFC14D668EC675E42266965BF53BB4C1A4849D09F09C634D419502D303F76F942A9D0CF2534A3A03CEA10BDA3383550FAF8B165D8340FB6B5C8DE0B6C4B87A69BE04D94B3864057A10F4B5EBE8C5B3BAD7AC469C439770A137E8F6313BAF3D9",
136        "8089E592C7CA50101E057534338C1EA981C995BEBD7BE132DD7522ED38CEDE5B23EABD4F986890A7FB6E46B6B396C82F777E5E3ACD743C5838D9CF7C6D408AA5629F7B9C97FFF95663B09326345F3490EEFFF41AAB71FDDB5465AF511F4D441D75A798D3F86F2226BC5F005C2938B4781B9959466E13AA2BCE745D7ED221BE4408E35BA4CCB7D42637D756F1EDCB6FF7D1CF4C1C0AB520EBCAC76B807C95B1D95728E38825292D808CDF9BFF76E5CF0D17A9B63FC94396C5A3CD6708508929E321EBED088F56A610E659ACB52966173A57CDD5638BACEE211CA83D820B821A2507942F723514DACCFE3D4E6FA1E0B047CF098B9FA7F484FED73C9ECBE25420FDF75FD0B4533B9576AFA46D91EB83621E0D2E5613D4A558D83F58F4F7DE4F6CDD9D03D67D3B5B98A5D78C2204C3CC8D91D4783D58792F7729EF1C3AE36D62BC655257B11BA177B5D7FF1963CA4BA4FCDBFC9FB87AB4EB8F6BCC8E0F46F5C6076EC7CA6301787B5F2712CBD93346232A901452872DE987F37BCFCFC6F96F36DFCB8C0F692052CF87ACF95DAFC19C4203462BA2B4F3ABDAD9FB62AD1024DCCF97F5364870B1AF71F7525C3C695451E0F350A6F01B85C271E362D44A58EEA1988F0993DEE1E414D2AB210D8E795F660B52109632F9B3BA913B5F6C7BB8142E4EB6D6098218F00D0F2E27CA2E437FD60645FEFC9E3675C2D5C635DC5DFF6637C1DAD1",
137        "DCBAA39B59F57CF5B83209E10AEE12CFA92F8D5CD8DDC3831EAF7B912C1908E9A2BD9F0177B5D41A914861F571E84B22AF62424D7562FA53AE43EAB7BC6149296B23C5F119A797E263910F083F852366AA33E2DF389633B2CF8BAFC25D5FE32751F256DA91DDF104537810C581823CD7C944C55889DF80266A1FB00AED8E8F0BB6C6392CB747C46280C12D90D71E90A383A1408C36234776A64FDC6F6138AFC1178A233096544640EFF41D8D2C36E7950F3DE08DF8B3E9AA04ED05A849D528E927E8752017286CAEB4DAE7D0926E81C05999177997CFDD783B112F7F6AB5117606EC0F4DDB61FD13DFB0087425034F862CFE22FA6B194B16DD3C2058113B9540D91836DA095605B765D53D22EFFC494519450247B759DE750D329118B9A359548352DD4769EBC8C3AE616C8DA63E0B3FE7BC761D9D375331267C6E08985CF1717D2198302584834205D191E6B518866CF1444DB0947D31299525C19EDB2193F357BA08378BAA440225D91E8F556E86F5F5063DAF2620B74E89F8279ABA11BAA8BF225AAFE58C1B5804D35519A5CD1E337F30A157ADD9662BD0EB31E36F841EA17312B6B912A1078BFEC843A66A0809CC067CFD8226F51BA7536BAE45D4B7C2A6025F9BE3917F290CFBEBB7E59EF60111833BE8916CC1A7EF15DF7DEB431D30636E8C0C6116AD125DEA1045E0CE34E15E945A0483EC6258B3DD7075713A310475",
138        "A551E5EAA8879B031E18F2B7FB3D4788E6196E0061531FD884D6765099C3100F43B27013B0F11DFC69F1A7B87443A4644C3E420BD52E9DA14C74D71FCE37FD62868E6650B283E36478D893E19C64FC43AB2BD238DF1C6A44423478A5599D17434B455D182EB8E49C123E3CCF0B7ACEEB2480A0F6C165368652B10BFCE6B2565426AF53DD9F50E3F26121A70CC7EDDAC8A6A8CFEA4EAE70D48395045B8F65F7FCB96216E212EF9CAF3E305830E2305D18F37C234E07BA91E826B7E1841B92923B70E672302BC1A6D3878EC47422EBCA85D149A45F0E0A39B81C16C0936088CE7C96E8B12BA3915EA2CC1BBB84281DED1883E3766C0564F161BBEE9E92C390582213211DC58AFD986F41602BA56D06BF1ABE66740B48E1F16BCAF2CB5406B389FF7E40B93CD46A582FB8F3925F9EBDC8933DC05F24119C627A06663CDA80945F1A9FD09EE4C64EEA2D9682481E9FFE97B5D3A24224F97699CD7EADD45ACA2EDE5F02907DB75B1BFEB7D7F5147EC3B754FE833F7731AAE589FBBFD5B6E24F1572CFBE68B1ECE80FDFA62D8AA376E69A52C44EE5FC0A71698E3F102F32F568159A6B3B013934B2DB338DAAE5EAC60C06518BBF50696B89475B9CC9914A638E3110E4BB6C9131BEE5264E80466454204471AF94AC8BC9E2D7AA4359DC88C1F08A2690AB5832D91FC89EDFEB7F7E503262C2B1BBB41BA76D781F5C36A6D834BFA6BA63",
139        "A20AA987A67B592D58CAFEF8DEB912604E9DD4430D7651FBBE9A46F985B5FB1F4A6D56B34E6E4EB63B5C4ACBBFC2E479353AA1FF9B47F2309BDD67EC4BB5CC6290CE40FB6AE454CD339F89AA949DD085DF3A3FD2E0CE12C2A673AAB3B9E098882D1F068F8051D3C21493EA33ED4E13CE28178727E9BF0094E45CC36082130F173D885868DFFF1CFBAE4C7B8A75E98A7C80EAD4E52C0399D8D096169027C9042BC2D1DD3CED68C5305F4FAABFB6D3C073ACCEAFBD21C7297A8F30973B1C7175EFFF4BB20FEEFB19A02CA0F378981D7AF1312FCF3A4A866C6BA308CD577D2AC22B441AFBDEF0CED39388F3FA65FBD73EACB171A01FD1F886AE15E3DF5575EC78BCBDD04A96727E2C796A0ED3030C5721D8C9DCC49CC5A33BA61E4BB5BDF2841C9426C82C77F1D85245517DD124D669C7E78E4CB710607CCA9E12058F99C7B0B9AEFA3A05AF6E511B0A7576014F8327EAA72C37A2D68486DB055FCDFFC0FC8ABBDE93AF3968AC843C2D4D5B78E54460F5B3A931DDF312A49F6F877914163340958EDB0329ED5BF45DB85661414908DBFA3EAE3053B518F58D96849335DD5C25CA4CD43CA24B7BAB8D94316FE8D59EFB22FD6DA856D601B3FBE4C65FF0692B86B7091E3297BD148F2BED75D334D994E60E0F36644855E8DBB977626BA42C55882508D1D0CE7318180C55888DFBB41E7699DD85E21725FEBB98E0F39591B06D347E11",
140        "D850F58FF44F2CF77F99D2CBAE6FF9DD11A4AA3D3AAF814981BB07DFB9387731AEA5FA54AAC3AD423CF269B50CCCA601051FA55605194538D958276A7E56FB12FE18E2D7593DABCA607780E7DE1247F1B9AAD4401E8F09EFF4F99D5CB1C379C59EDF52385FF7AF9D8CA6E41C41021238EB6D9658580C38E5945E9EA5D5A2784B8453ED6CE2C5C004BDCF66980B30479E2BFFE8945AFFE0D38D6E2991E008CC27170A5539397CDC5278692065EAEFDBBFAD26F4B20920B64B84E2C74AF3F428286AADF16F3A0CE9CC5A18733EF68C70BA86BADFD24967DA98E8F2C54DB2FB8C2505A05987262073F2C3D9CF72B176EBFC5B938DC535FE1B335B14AF9FF9E96E09F7C45279703C9A7C280CB5C25298BB7FA3C5CDE789C9C2FA7882DEEDE9AFD886F13CB5F13315C40F09C5A98EB521EDA48387AC7D5EFAF534BAE0F2C8EBE61B799486A447828F81473DDBE0E287BFEA2CA3E0B27D6FF370419845F16F59E0C3B068A5BE8C3878BF19F599202BF64BCCDA91B2658446D22740E35AA12065770D89CB8354F5A536A0A52844B0D24E7313848BB605B039CE4619A20C1C8FAAA0026391AD0A08A18015946A3527A883E30396EB74749B3B727288D080248614D43348DB516FD32BB7A73E999F55C962E91CF7927B741A7A94D1BBDAE978012529306C4C132BE1A56E950157EE05D1A9D4403882155CAE02C2037E1339134BD79625C1",
141        "D0B11F9AAF3B2D5E4D450500411A3A7981F9977C9F0A083E9773FA58FBF8758BAB262C5036415E025C204B0862ADAFB1E9DEFC83CD2C62908B171ABD4ED364426466C9DA764E1D3B54E47750118784BDED6DA50E4910D52AE25CA956C18769630E7DE8FA963322B0E5C88199F5927123EE229CA05EAE3178A4356A0CC0C4597A652367632AC0334E89C4E09426D8D90EF81BA9FA656939F74CA64BB6E84CAF9644E3E40712A6FCBA69A2CD6908D7B110D28671B8A8EB526CF39E0CEF15B07D72ABCFB10862ADAB5DC7D66781EA6DF01A70EA5A005B00D7E33CDB5E281C71F32C223E6C84E55FD54D6F35B83F4F6AC2B9D3CB0B57ABED7844BC541450A124087F36254612DDAC69385E9CEDC0C0972251828AB1C9DFF5EAD7AD19D7D1FBB6D8AA17611A016F32832A7A5568E724E27A59CF070AA6278BB589F18A89715D3696DCE63C2270F45FB1F3068B61831C1928B3FC68D2AAB435469B2869B456A6C89287D277FF5F6F896AB31856A9F3DB62955A9AFE32524AA7DF80F838ABCAD9BE492C3E943E374A57FC31B54896B40BDA102A8A77B13744FA5CAD80D9F7B3930149611D912DED382F6DA0328D38ED880EF322C08A982EAD4D05CB746DE95EB548CBFC14D86FEC2B4208BBA2183AD5E45B4E551BD7CE6CD82337E39E3AD45EF4799E93A7935671986C8483C960A3522AB42F8957A34184C522281B7F63F871CD70773B",
142        "C912B97BA92F000C68F4C43BDDD1EB593974043471ED6312B9A3AE54D287ED88CAAF4842033A8403E676E5AAE31567C5984C3C39E3854BFAD3605349D68D1FF3908D11FCB3804B0E16BC3883BDCD40B0497676748F4A714A19A7B7EE898092B0238AE528D811A4F9CE42B82F758E3286D78F586BCD53842EB253CCA260DBEE9508BDD2F48CACBDE884E07A2AF7A7637D6A833D1CE30C70499CA4476DF54EBBD0A515D027398A1D9331EE4206221AD81FB8DDB2DC22045604F2D9957B31B13504D45020E4BF77CDCFAFC7DA8A2B73212B429F6DBD782CD68E3ACED4E5D85358E30079333DBF5C11BD473904D64216A9D8DD89C98640B0373833A5AB2E3BA674EA1834D07A742946B157107853945BE307EFA31088BF8922A7E9BA131D4684E9300AC570A55C79CBE065ADC090DED53CA6DA37F4B4F77651883B5607940B63A4CDEDF95C4CD14C22474417E6282BA4C476266F6705ECA91E47CEC4C04E83095FADB2492DED64157F2E421CECAE2922784F191AEBE4AC80E761C7C4D04D1933BFA673C1C21E2E9A30A41FCB1FE32A6F717B91EE5E937599E40C04BBE08007B5B77C399B6A6BA4FF4A3BF46B220995DEBF13FDF2AD7E2B6FE92797C1E167F3CC2420C18A128C9157036B5BEFE83DF35A0D6D11F9358257E2A1EC077C5240FC3E3816032E7228B9AD60236B3F70AE96221F930615DF129EC16D856E15AF32D916AF5B",
143        "A2804F301350EBB5F6E514CEC88C9C2FFD5BFC2463781C8FD4F8EC2A3ECC41A9E1E4D0D09752643A4E9D92D6B3CF2CA267CE3CA834892AB07AE4C97F23BE47BFBF924C0B07714F75F8E63FF2561E6B533BFEF37D12D616431B8FC8EF4D787F11CE34AAB7011E82DF472027E250682B57CD71DA55706E2E09D38A420E9296F3C57713183D6B6B319205E3E6D67680FE61A9F1E3EF770861C51052A0F668312317AFBDB568AFCDD4BA5087310D9B00EA6E6D1347BD39D5247D51CBC6190E174812B7126D1D909A992096354867645352D2160376EFE7F32F499B94353565785DFEF30A31EBE5DE332CA4D65A252D7704561154D8FF56436FFA93F3E0F3BF20FAB14E6609BA365F0D93EE451BAE6F33F708CAD9C82453491745DE5BD32A0EF60CB73ECD32B27C4A30585391550AEC5380EC0C66EB686FA2271F882CF8A715B2DCD53A3D00257E9BDCCC1A14715F6C83850C4C6370ECE04C07662AA86C5FAE5F170DB0B63431A99107D68648661D1FCC8198A1279C6777CD2BAE28075E114E5153B31DD7DBE2AC36EEF87D09E0EBF789358905A49FAFE2750C3A728F1C6B3BA8DA4D093D0240267F571D70270CAF31359E04827B4AE9D51132D4F4D8E34226D0B5CFEAB58770C02AC45888243BAB88F13A05A916A148B98EE5F228A3FFC755D862FF18A75874D48F60B80A61E33FDB05270844A3586ED0F0CF73F3E06482584F6577",
144        "B296E6BD21F24257B1ACCE1D6160A7A4CA4E424E1A45D937B0B04F3734A97DB7B2D7F85D30B922CCF50DD65275C0A9244F28EC3D848B58236EB1CFBB79B90BF6F58276ECC66DF8B0CBC8378321043605A257016D557B0F2284F7609090C3814E14EBEDD5BD19E8F48786DC9043830E35F12F91DDC285BC8CBEEDE947EEFE17E8FDBE67333E876E0789E2F7EE0032F9CF13C90513422E606662E4E4D38DC0E22D5D1DAC1FAECCDDA4E570683BD557890344824AB9E3339193A657E3D7331DCDE1E8E49070C4E6809707642E8F4DCA3B14D1BF914923797EAFD153EC4FB6B4AB564C24FD1C3C03FDEC09ECC71D2811E746230F4B4865B1E65C9C909FF964076F5576034EAA938348F13C68652073E4D596B21E63473A35E1439919DD67F1FE290066F70EB6309543B2D1B69DAF793465DC63BD5CDC7E21699908C7AC44C27DBE2FE237772DF8C2CDE2C697B34C76B2524572E2D724C8832DAACF60AA46479C4BA1805DC7EB034B6DB991A2563D30BE85341D89D55433ED0FB5BFF83D3D83ECFC708126CBCF5141436149CC6628D52D3AF58005A9BC0E4F82D240662B14337C5C7DC43407C56579348A556C68557BF7A6DBB54CE37303CF954E42B208B2ADA9A1CB359DC1C9EA1C14503C079A0AC727F31AA9C68B9C97A6901F4E2C38A7640CB6937C3DD4DE53AC45D20126E2FE9CC685B24E14463095AF5EABDB2380F31E062783",
145        "A863F44EE4A4BEE1F66C6426EBF3F8498A867E1689035D977184A7CEA73B7A3D5EBF3A315BA3418482B65BD2714028A1E8BCD277B5B86AD9F878435CE8890EE4823141759CC7E59883619347B0C168C9E97C3689CEE340119026623B7FAAA5C4FADAA0CC33E5A4B8446E041887C43BACA71B5BCD852983123A7292F42D3F924F038BA645C1B99E59F7BCB068226827BD27BE78F7FA0FF7D000088E531D7639C0657D816B9D6546688DE945B5396C22C91044270548C2ADEB393EDD33ABA559C8F09892FDD0916F6A97E68F401E685D6C1E5DB7BA2C0AABC68AF5A586F4CD3D3A88062A25A5F28E31886FDD2FE74096EEC4460A31D9DC48D9211406FD3D2AD091A8EAE8E886D2D9DB329D7F0205534A56C433061F734022C5C75A6D3ABE24FA5C2D05F354A1E47642DE2F1EA09AB195BA972FD305096986269F90E8F2547E2ECA262EC6BF38C89D5B3D8532FBD7F345BEA0D45DD72CE54C72EAA50367DCCFDAB1639B6EB461C675E22F5BB2793F8DE9EBA198AF1CD92E969106283596B76295B137A69B5234A14DB34DE7A6510C0F369E459B18C9B3CDED528C7E0DD16523EB9A7128183153B709BBF6AE1442BFD2046D756050E2B0869F3ACAB528D8525D2E53D89B2D06D4388F12725DA0F3E9DB8E6D047B5C76F331CFA4F30337510816DB58E2783EA9564D9432895E5D4AAAC66E2E30344D367A8A94A9295C2CC05665E2CD",
146        "C79CBB91EA089F5B0D0BC89F9E0B49B49A27CAA91A330B069160AE7DBFE5E0A0A8DE9ACD08CBDCD7E23534A1116348CB04F18884B31A031384B4DC23EDA655B75BFDCAB18A17F15C57112704E73490AC662C41186939BE5B5A2F71A3E7314EDC0D529CEE42FF9981424F6000A97A7E5370103B614B7F7443522A8DDDE5ECC27B8C2FF8A9358C22D0979877DE965B559108AB3260660E0D6F465CB67292401FD028A4820F3501CD12E3AE72DF7D6F677E481FBE95B62C4421E5D4D055AF6A47F9E41D84FF50853AB62CA3C1DF278E97D1CDF055D57A1CB3FEF228DDC984BBAA11A70649CF74075FB16AC45D8BFF17B9C94DA90C496546CDBE6D300CC9A98AADED4E13A30C34B6BD8815CE5227FC24E901D0C6FA6D3159FE083B4D30CB57686A1A8B07FBF16FD08D984F3D9721FE603D513D9CB79DEE5E490AED6FA09197D707FCC63856615C44F3EE92A21970C911819265BC28A3D6B1901163AB2F744F2AD886EB621C967712041C630A002FBDC31C3D9673425922A68F3517CA8091B4EE110894C3379B58886AC2F1A249C82899E706B8092C9BA839D46201F0A49CA4A8BC9ECCDCC2002FA7A5570DE82C683EC9629EFA538F737AC8EB4CAEEC88DBA017FF92C3D2AF71AE195792DA6E855065627BAA109A0419DC89BAA5B6F986C923B9E01C0675272D72950EDE0EE27EC298C78C4B72252D5D7060A1FCA243033918FA1F63"
147    ],
148    [
149        "B3D3B8CE3AD2E203F9B5EB37762D92C1D17A61CA4FD39458BA7823B40BE28F22CF3BC3A545017BDEE3867A9B506A91DFF9F1CC8EB495ACB85919D1A3FF55C3B9B9ED2086231B109F992CD22F8E0999B82CDAB3626135D5D74341CDF09D14D9C28147CDDEF61DB58E6AD236F80F315AA2647CBBEFEA6A4C8B2C4DAC5CFB93CABDE3A4F7A633378DB856044FDBC17EA642B91FA9E5470F477060C36E72316C6CAEE8D6F973066DD5AF7C889C4B57FEB9F1B84AD5020DCD508D7404D6BA1FDA7C2FC7CE4C0C21421FEEFD08F221E90022ACFC8019096FD8119911F899ACDB7AC87BE5D322983D9F9146EF2752A9BA79ACA86506F57D6E16F40CCBE09800391607C7",
150        "E491D9D372BFA8CAB5E623E6AA59779B6FA76A23EE5EF0367AE8B6EDAF00E7A600C50B1EFFCC0942D462B6812C76AD1762F97B26FBE27AE059D5900DA75CBCC9C2D829E80738AB16217C27BD533368C5C0E00C2316B3224DD735FF51AB745E63C8FF9D3FB9BA3C0940AEE6F14DBE61E6B8142818015D812E72B26C1D4CDD0DEA7A10D9D7FAF9AAA3985C07D2DFE555451FB229DC5B2899065F19CF00264D73A4568EBDC2CB48D0B24B1F2B330FB4708C752E172128D074139A1312B3D098C0FB76801B69E83D68FEC544E3535EE35FD237A2C2748F04E5E207D6E85CA826B634DE9634F47161791F5BF96A3126F6C7CD5153E7FE2E5EF3D668085BD79551A55D",
151        "DE6B8998DA5CEF42072C96DA97C220B75ACF2726C894065DC92E042B20A8A2B8BF9F6AB5105E47560B3D45942B5A78D75F7103E9CD739D01A2057F90749B2E571FBD79A57AE7AA49E8F43B77249924835629AA8640911FA3215B99A8B4B386234E1B21633B465DE4DAE924EA157A499F84E65ED022F5374431BCAECE8398CC6306DEAFB0AF02D3FE1524C103817520585C3D60E17E6880BA879F893AB5F97F43B5237C2ECFE48F20E1428B48705F5288A909F7E4C34894EFBA8757CDEA6D948B451FC9A64F593F887782E29E3897A44DF636ABB640C3ED24ABD94C4BEC97122B95A41520D2B943CFC6BADB5731BA018278C0EDB7D5DB9D424D42D30997B1AE49",
152        "DB568D9C2422534FC4EDE9D0DBE1ECB40C4B3A024AE9D0DD1413A375A6B413AD92E060F29450373BD363439469D8ED2D334EF3D34A7AFF70201DC6B01CFBE069B50D8671B6FF292AE8F5E6F78C6F0195FCC7FE15E35F87BF40EE4EE0E24F90B002B1E50BD44CEC7CFF64A26B06FB1C8F746A1754E013CAD431E0507FE0F4600B3F4A6148C0A530616F6840E6AF37A23F99539BF39F2B868B02F41AD9481259E66674961E7ABC7B17A5A46FF66834F199E3660FC0EBBCEB5353DA64824996A8F978ABB3512BE2EB2221558B5E62633361F2B4CB1ACDB12CE07C812B80CEEA5D1A133C2196C074CE21DFF3766DAD512107152DA7736EBFB807FF094C689610406B",
153        "AEA217C671086686A6F627DBE1C782548EEABED2203A647B52D6D777EDCEE2A18EF91E7F7C55DC31951D6CFC3E11D8116C7360A1229B0D330CC6888221159AE74F5FE5D526DEAEC21DED6906E483E0D7AE4B3ACBA952BA2375C24B4C3F19E02EB75B76A67B761791BA96F712C3DB69B7CC7AA24ECE44C2780B64328B46F7DFEF72A281B351F1463CE674618FAED7B211073A3D531D32D76D085B57BE4497BB0775E0BB80C42D7D3BC19A0AE0D31FF0F39586880F6297AA8F6EFA385FB29E697CF3BDDBE8CC2D51C2DD4FB9B9FCE430E9895AE688AEE93559706C5CC6D6004B1CAD2E4F4B8E672C42285FDB464D5CDEAE5C726A657D2EB2520727542F1417FCA1",
154        "CF34393CE2353A5C46D6787B1ED30F0F42543036722D0582266D3243A2F273DE5A490B74CF694A592B772E4965071344FFC49728684FD6EDE8F70B4EA526F4A9D61363FDEFC6D31E930BCE8EB2B6B50C7BFC99D994E49A98010B218C39507E69CE178BB3B862726BE6C96A31115EC48E9AE4E1842D2A9383A88C0D3C985F151476E780F42F52873B597D00F7D642664365196EEBD9B6609E58842B06D9ACE57A55EA0E9B88F155D68ADBC086096B06D117B9CF871FAFC503C05596078A7CC824FB0C1D56A82E6D056CCE3F0E3D20853717EC823FA8E5C2F3A13927E3C170D8A90C86B7C56D8B2A3BDA6835F6EA6F35FFFC6050EE6A25326447D6573D9A41E26B",
155        "8C0A44E6D6926E6B907012BA1448C445D169A827142DAED748FBAE845B5F3FFC3B2629F862DD58D7B5CECCF4F85B9080BD8DE2F2BFD5776292FB3238C09621B81917D9D731C0801EFFCFF61F1D5DE3C83B9339243DFD52052239FCC1A4C9D271DD6ECF0F5D05B6E3328DFFF8C715DF12D3B0AA997A5ECC00BC71A264FE6CECDE444033DB7F515C5D6331A73D2C80A8A4C35F13C2EDD67A89EBE64DF0A9DE8597C5E5009A9901C78DDD9BFA36FBED75D0A0FD88C652BD0D035B3F2B0E2A1CF7D8E33B71E51EBCC94793D090860379A0E2A26783D0108770CA6CDAA3CBF5C8D006F164547CAEE4BFFC8953D4E30D439FB48076BCE2CA06BF3C1A564EAE570E694F",
156        "F08EF17817F639118B3BAB650A2D329B99CD3D5F002279C572652ECA06756E1D574C5BF219DE654E2293B5627F4144E1A2CF09A2A244DF14722CF3CA4781BFD4736B270BF64277510CB69565B797FB8FA9AE2688F2A656232CAF8F342265CC4BA48B77CAB75AA9EA77AE25D61D4C13FF5F3EE37AEFC4CAD4EFF0EA552D9DBE61823C0DDE947114FD7D6AFC379BBD21541071CC1DD52D58AF205A04915BEC74D616C2F21658BDAD19929DA4BCFBC7EE186FE3ABFEF82AFDEBB480511975CAE97A567D5B7FCA80063129A55A1F7618CFC395A856068BFA0D3577D4552503181277141C54E3E3276960AD35A1D82AB0754F18EDD6360107DFF4B598EF61C5DB37D3",
157        "974D4EBB1C1FFA7EC7DF4AE44335CEC5A991C610C808757DFC2586A620BCEE95A66B1FC9AEC3043C849ABAD52F85CE1CAA300E06C871DD7729548E2FD33E6FFF86EEDAC3E90F9B6D24B6BE50A1F6CC105F15593D33A15FEF209B1DF9C6B75C56BC720777EEEC1085CFB0C87DFF643F72B7955D6E773EDFD0B6BD33BDA945C7ECF34F6AE8D69AE734B8D83C37D5B7593F9E479E1F63D4DD7531D0507B6CC7ABF5DF15C7EBE730F04C3688F5AF8087942D9E53CAAC6F50F88D94114630BA68F40E06C576411D7A54559920DD09A0AF2DDCE6CD05941FB7EDB3AEE20C9E549079FFF66CAAC98ECE49DAC1C965B3FA088985C29137A08056F09D807CA984AAB4A611",
158        "D3B6FA5929547925119168D7F6EE0B63563D990977AA0A053ABA9AABEFD4BB32A59852D8C0EC32043B62A30717F824EBAA2D2549F24BA6E18B7B456FE7783F04019DD61A8C50BE6BAAFA3D5AABDB76BA4AAC9F6037CE9B26931647F44EF540E2F6BC0B5B7CBB3FB183C5BDC3236AD7F77F4F75765905CF173E843E89336263FFEC997F3E049F8D977129239A89D1D99FC47151F0F2FF4BA222A2F163DFAE72965B6CD91FCBFE64E83639B1D3A4A8E8460B7A941255C906841DEAC7013DD2A92ADCE90C8047FE21F4AADBCD54D4A00154B37B1B5E0C919A3B0FF1939A144E49755E1402968CB117353D1CC6F3D44DCDAE9126129DFEAC83930A115837F29B22A3",
159        "AC9B4168720DE7A632957ED43F7C58B516D9D7358BAB3E4C0A533B4B5EECD0B4445CBAD095B39DD6B81FA00D357D3A69007808A950D7DE583CADABC8B6F636CF9781B57254A599D004C9DAB21B674F09906545BEACF5AE6485668BA076644301F655E2036102B11CEDB9C5D71287E7C61EAC5F7E1D038880C749BA12EA9C11A42CCEF794CDFD1776B6C6F7FEE19CEF87CE3E309BC740EB5DDFBE3C8F552813064BD761AF5303F8B7F218FCA2A5BC70135B8AF5CEAE4CE53FE5523CEAD2811728452467F17F7A41E6F6ED2BC24A328866F846CB1EA3C3DD09630E7DEDA74EB33A584E18E92A3E33A6131C9BC4A026F9CC474994E8B1EF0D09FCFBF14BF6E6B043",
160        "BED0A25AFAA0AFA00782EFA6CFFA20CE0F93F45E7C88CA78989631760B8FEEC30536A3C4FB68690A55CA7DF3B940EB30310AA601A75C679376E2501D7E7F5D22BACFEE857D8BD522B15728415BE72E951BA67DCC35BD08369244492D35A53301296FBF0B298CB3FD22A6992D2FDB6769C9C1D323F458CA78105DCB7CE4BF4BE7E9541BAF945002C1F362421569F9B475FB61A60E2C370770B8392BF791E334CBEEE99F491A6DB297E3CBC5F7023B8CA0BE4D5170286BA230DB8888D050A9046B8C9C939F2D37541DF85CE184F02AADAE16BA9F57322BE8F838A6BCE89F578AAF3121B90286942B19BB468D76EB46DAF5769D13985D8FF51A0A073B1E845A04CF",
161        "AB562AB3A7C5545BE8C66051B3FF986B25109EE5C1508A02B27486495EB8EEACA869A366AB1D8D92C78FD2044DA2B925CE481A70B26E7CA98EA9BD05EE4D2A106939E87E4E9F5E54E4525FC2C82780E004A090BAB141ECF66CC0B9220CBC46B9F305B348DA5D59FA9FC3BFF7663C04C9B118BBF83D142B7E41AA3BFBC3D4E55804C383810910B575FE45D4FF8C2BC054E96FABD1B01371BB536A759F3FDD28680A8073BAECF9AB7CADAB1F1DA8BB21B50485CB103AD695B66157A02FA0E04A5EA41F72A4F93A827925C5E0E4B758CD436F1103F232EBBCDC7789D34FB0563520F3732AAE28E25BC93BDAB9473173DF98E032EFE5A76033039A09E8679010602D",
162        "F0B4D973BF5EC3D43DE622DE956EB8FDB1BFCBF3894041B800E0CA1BAD41EAAD0E59F9A123BE0C367074FCCD535E9C80D6D54E7F5AB846BA3C0201D89A42757E8F167AD18CF9AC132E12445D24F9447BAC9EC625CBE4C51445C5BD72F93FDB71C02512A2B2288AE7B90AA1FA96D278A1BAD8BBAB9AD30128FC94DF631283156B0049DA137869F8ECC6A368816DADA8E7D9589D9F0450B1659E9FA76D21491941751A5456C3BB3D557112BC92FA77D09020F1071E407989925094465DF02BD876C7E7D9893EDE33D4380641534CEB3F5062B2A90334105FDBCCC853AC49EB9BAC2471D569DEC96DA800A689EA8395AC76FB4431F2F161C117BCB9C6F4A164D5CD",
163        "C6E5E03F83B1BC0FFBB15D1E7055AFFB7EC070671E890256473212FB590B064904874B8DC241845AAF43CC86E2E96967D168284AA948BDDC68784BF9A7DE64E3057B1D3C017240B2C4A0379C5C8505FF0A06B1D9F6DFDDF18059782F2C1CC1ABE3487357C51CCBADFA44FFE14ED6D7B778C63EFC840CCD17AEDBF879DEADCDA1D7CA297C3023C5C9C895F57169BA9AB524FE9806C843EA1EE6FA9DEB0BD81B27E490BCAADCB2F74ACFBB3149837C2F0171B57C1FD5667B05DED017414467DD4FE3265A252336F92B6F901C44C82F21253CA0A4FC13C14ABBDA5ED0666D97AB76412E19F7ED84AACE793D1B7D91A16CF3B89391AE5DF613F44357AFDE8AC0C6DB",
164        "C8417D5A407663336BF45C3F0847F6B050E166C824010EEB58A9849D399D0D8048A3B5368C037937A8114B7FD03411C11396738BBE0AB8374083CE7116D465483150AFA7F149B347D6E10777C84D9C934B5B7E660C21B05E0E0464D824C0570042070F68A216DDA5298D3BF37CEAA27DC380CD32D2AADD1EA82A61EA18EF437F37EE574906ECDC0DFA8500E80CD100FB554AF7E48C8428ACFEE22EEB5855CE24735AFC4DCD39777DE72280366825D00C596705C06FA873682923F7A834C3A69CE7F4322EE05EFFF484AF2A188081F984BE61413EE3B19A9E37EE7785A8754C8BEFCAA7031E4C998F30DFB6764B67A218C5F14D9478DC8FFF317C4F1E6BD68525",
165        "A635FB5AAA8C6BE4CFB4F44754798E70ED9BEB140A2CB25876990C8E5DFE71F4746EE72AD71923B85A5E0488AB9FBB7DFAC714A37AA04679F3C78AEB8E100F67ADEBE5CE0563D076F18F62B649E1F42825DCA5F8E68D95457DC5E37C9C7408A597A3466CA95DEC8A02D18057AEC264701150F48EA262D388D2516F8426AD5A729611A9269FA1017B7F8942EAD8BFF7DCF941D06D1DDDB01B0CF022678870036EF22AF5CCB7911E81A0F857363390C11375E38A9FF83980CB5780EEF88113A304D8800D739ECA10B51BAD757358E4496844F378BA6710E1F1CDCCDB5AA94C86EE39C6AFD80267BB1BAD049990B5C76F2D770752C420B0930E13F921E73DD1CD79",
166        "B5C5829C348930642F56935774EA990B90FA5C202E0B4AFF2FB49E3D4ECC33C62571ABBFE3E0B2D2D32DCB14A6AA6E9DBF6F42027887F109172BC0514B2C16B112411A233F064F69E0F172F45A491BD94E18A4F2981F983C560D8C008BFF2E81C55C99FF89AFB7B44B9D66AC5627E4F5822AFCBF169B62ACBF0CDCD25CFF42E87E45B830ED5F22CD410FF6AA00336E47B67F259BC68E49626E14E25CDC5B92260C87052F6EE9E5FA28E5EDD22500F7B51B44074D869B11FD70F3728D5EFCF254E6FCEB63EE481FA341D121C26B34D7C37F05DAA8FB8148E64F414178E40EF8909C553F92386ABE1D006C66AFD9A4136BFBAAB1365694078DBEFC165D11DF312F",
167        "95042AFECC2BD22CBF49814F6A34D5BB73B780707BE5C4262716C7C89712ACFC2979569C5BEC9C4664EA3665315E86694693E2A173D8213C3E9193DE3AE1E5944D9E76BC26FEC86C1FA736EFCC264F9C7565F5AE16F04898234F8D87714A411D234E41A108FD6AC841BA53E2D96AEAC823BB4400B7E5D9EC4524A513FEB79D5A5E4A8F32E21BD320368BDA0B3B541BFC835A853257BE2B7D0219EC286A5DB9B226523693DAEA1595032BE62020607003783B4A922ED11A85EB4F6F8C3147185696E740911105B829EDB61B09E87CB6122E476DE886DC706474709BEFAE5D5E241FB6CB89C16E12B831542BFC43E63795A3793322B432095CD4D12C6349865FD7",
168        "B138AFAE53EB03F07BC1229ED99DFD45AA14EE51362C7CD06F05134CBC2844BFA468E2789F7BFFAAFA0A09FFFC3DCA8FAA99B0CA030C3B168B4E0D92FB2BA01AF886F4E3051E993B3D18850053165C82287DA3D7ACB1EAE7AD7A0CFBB3FE75AE5795A739395B3B670A09B673045544A8036503F73E594BF09926BA221D052396C525716B7339A7835EF08A83F9AE193239C279754A4EFB4CBD54DA73E14BBCF042DEE81FF1EC43D7769E3B07AD36DF42028B0CD6C7A1E9BE04CFAC14B74B6C7C54955435D784BE1D8738E725EB2A89D8F5F3070CF7B20889B5B7B54E32D2954CC24E0765A5B707F0613D38AD7EA01B657B8E4AD096219FE3C5CE1E8F33E7F82F",
169        "DFAEA7335485DFC9FD65EADAF9A61C86F3AE19C91FF2AC0713095FBFA750FDBCDC5CB2D5CB838782D76713943A52E0378D6C0E1E1821FA713C5EA2C404B928BD75D2A9EB626E8307C77E524FE97B43DCA1D927ACC2ABDC4D23DF7B719A8E251E6BE0579EB87E894D5D4611C5E62C87D387F99562B0EF8F7A5DE59E0D266193C8E7C4AF1AC0E3CCAD2431882C83365F03F770D25030ACC2321D366B3422AAE7F7A28BA6B2B45D3DDBB7BB2FB34DB0DD1F300DD51E16BDDC9E7A89844A29BC86EA19B86AF3BDFF634C25C5987ADE659C695454C667F11818D1E573A77D398789628681917169D4873120168FFC99D9D05E3987DE14C4B3265DDEAD6A760841DF29",
170        "BC374F61EECAE3E4DC421E5D6CA8198A50DA166C9D09BDA6D45D41C2B9CEAC4B54D7E3D515B2C2731CE8AB934AD162FFD5B411787F7291B30E318F57910D25B18443E8278BDA09A64CC8945629350FF6A83E5ED9594EA1571B90CA3132063EC75793969194AC0866CCF692793FF7B53AB512E2BA67619826D19FB8528D15FF991E5C29015FC445B7FE9AF95D9161FD4E5A4A92EC077A175D5484FE5EAD1AAB2F43FB16A91ED0B190B7F1743FDA412B1CC47A30DFF78A1D4EFC1EDA3C8FEB4EE34AD82D60B940E21140494085CC79C21CB1AC79B188AB60FC15D34E70FD8AE127A9A23E1FA8A7458183485040B887838233391AAD0B64E279FD8459C9CACD0C6F",
171        "ACCE10D19FB57E50767E001534818039C572D761AEF5CEB3D22DAA08D76BE5125DF1E36D780A316C3460FAF2A953F3EDB074B6F71906349943741D0E992F842E5F019E54119BAB7AE12A317C7CB15AA82D1086475C0C29C97E9ED703CC364692DAE0875FB8DF06084D3DFD95F393B49CA776A2873B62AD9EE276E248B169ACD700141BE7CA7A5B6332B2D8327DF8E23E3C65485666EAD4855A33E3B38A6F15A50C2EA86A14857BB7D17F19D5A9AADCED879107C8FA2F3E7386EEF05D2FA1D85DE5394C40C87E23CE388ED82ED291DA73E3D994C1276A3EDE189E79BE2AC869E9AB6D2A5E4C76E1A512F85C489277BEE4B30F4D381D78A2BBE0B4F61EC8C6F8D7",
172        "A5A206B756B0DB025E3635B16141716BF4B63F1A20BBC207A89E12A3553F40E16C6AB28861C188E90A6E9CF1734B372C545CED4F455A073544EF3B9421E95D75FC2B7547C0A0E4793D2886F2B478E06B5707CC2192ACCE2516E0B2CEA8AEBC5B15A32A0BF20DC1CFD5571B7E13381F02519871AB2DA45179EB1B701054873768FCC3B1C0697BC5CA8AB1B67A820A5B799276B2E1F13816184878FBB9FAD5F8381CCF678791F51727E99D3E5B6C3FD82C3E6DC3FA4C49CA41F6C91CA96222C937BCE8AE9546F235772637FE9ED7A6813250169719F47CC6844F784C0FB657ED74552FAA91D63C4BCABD6E1AB06EC8C38487D3C610A14EED8E53EA1B6C6ABF9895",
173        "E9E9C1A57050AA2B9997F823E35DC7EC66B37AEB353ACA38C1E54E449514BE532D66DEC42CCD4BF59ECAD67277A8A296B434B7E8A831727076381417AF0BA8C1FEEB140FAB09A86B3313AB1B6D23807EC4564ECB746D230829AD24D1406AE8B479810BFB2CB6781B4E32FEBDC48D1A13C36B512553C738FAB73CEE24E075BB25A236F62E6EF316866E12B63ED76B2459F351326DB3CB7142304F429F54D6FDE8EF39F437DEDA29EE307FDCD013EE9E7CB90F49019974AD4CE314459F8CD05FCFF0D10F82E469651268AD9001C021C395067542FCBA8E6CDB244C7E12583B0FE037132341F11805034E3CE6319DA182D5F5A8AD20C68E01571470A320B57F523F",
174        "B51E45E4BB660E720F8707E23DBB7DE61C62A63C310D8666BFF84DE3FCC15CC8302C737470EB03F1ADB8524CC2D0B8CAD8FE3442DB9D1DBD91C76C584E413EE6BE370C36D0580918DBC070CE734F363B8FD806F1526D1F306DA254B5CD60F01CD791B95680450733C610B51D4784CF922DF98BF4622A80AB57807DCCEC04EC90E5D993DF128077C29542704845FAD8ABB4715B3FF20120C302B3A9A6F3CCAE100F1A32696BD26B11EABD06C13EB9E3146C23689B2F725C448FA31206E0076EAC9D5D1D91AB050F3AD97CDF19AE33B90226565350303743999032975061B16DB693149AE512F2D4169F8F3FF21D59DA680B934DD1CF32DD22E4959C6381540937",
175        "BECE1B7872161FA45EC63FCF8BD736C9C53FB19FD912D19845D9A535C613B81CE91F145A3D668E0F306775F4FCC26D3A5641BF696B7FA48AE2338FD2A8566637A2F29C8E71E9CFC70748B8D140B28504280926B24A0C835822DE7349A2D0ADAB54700D4C5D01570132F3177E163D17F6601E4D63ABBD51348689E04D2D2E94B3D7872F0208811AA88DF12B262742FBDCBAD9AA12864B8659F2CFB03ED7899543D001A22E651D440A95E50FD2F5AE1A5184438B8512A81E62C5A9836D87C33141A61423C834566EDF27C5EFAEE5BDFC2AD936A3FF48701801A7974D334FE72ADACA7F2F34115DC906588A2BEE89604090E4449F6B8BB8A4F7B71DFA9A9ED1FCCD",
176        "B955A8667F97DAECC44A362C2AD61173056ABC825AB7DBE5AB893DBC3441155E511B0DD31AF3925B84BFF5CA2EA675D5B042C06759B62CEEA2CC13F6928A3B5D3DFC422A417D343F6CB905DA17CCE1A4CDFF0554389BFC8BDEC921114FD154AF6EA0B2B6734CCD905CCE96A43547ADCC98DF7B8870881C873AE339C94A1FF272ACF73CEFBF675F6DA21740EDABC5B998179CC5A64316B95D0E028D6EAB5DE17D21FEBF65A7F32E6E236B26C8750255768A790FE61F5549846ECA56C91EC1139E90F22E5792BABA1B7EDFA22E7B7F5A124032A5DF6B5D5466FB2A27237742A2EB9E28934A798C631146811E0702F585CA595689A7B7D0B354AC1698F8FD28A9C7",
177        "CB945CA29EFD40F97549CB480727875B761944721D318012B3DDF1ABC156312687B626C38656162A2602DF57DFCFB0B3F941FC57AFD5FDE6AA06466662BE12806385477343264E80E7D7F4BCD9B186E07C4D86FE9847620F40188AAC7FA081E6D1161C81CD07413351BDDE462DA4DD8B62B75A97413F05838D7F78F1C92CC8E3FF393C6B9E66AF9E4D4D432DDA4E3A2749608C6A8B8FEAEE60204F8E14AA604D719F85E4AF2A1161579319733A06707E39F8942C330888ED6B6D47E2BE2F88DACB1496FEC102F3BE6019826EA1B22EB8A5601357ABBB3F2DFD8DC563CA577D56CBE6392DFB573C0240A32EE106700F6EB87A571CAF7AB703E300B9F2ED13357F",
178        "B0DFA8F26E407EFC742AACF595865D946E89E40F74935D86E8308A212CE0F2446FAF3B4B3EEA3F8618899A1060310613341EEB6181A040D56B16A493035313CEFAE1AC3D19E1C18DD0D203B1A22430F7B9E3B4C4EE962CA30EC2DE0509578F2233BA6B3210B1B0AC76FD0C6C39939D3C8E9758D18A5C57C3AF55F627AA1B652F5D7DC121DCD59FB1E53E7F234093EF4711509CF6F72FE54D29AA37F5628A438D9C0ED99C2ADFD027B6555F34009FEBA34C7D84FD5F53243CFCDECD0317B37EC4A733DF4A1EA313858E5C177DC5669D03D2327306370DB5ECB5227AC854A6CF3C4C403EF7C991AE810AC8E4374E0D58DE6AD7B2864EF9DFBBA4D7BC8D2DB7B5B3",
179        "AB15EAFC1E075C0EC29D7D3250653C624622AF20D76084D53E2454FB8F6D924D240FCC1F179A7889FD68FCB436203359B9B3D64835D772E2D84F55368A8AFB6FE2DE67B6F5819F5AA6444066247EC2B75B4E7F3303BF3A7DC3409191F75A77D7698B65218DB1A82315307C0A8ADA6F024BD58E177451776B77C3F6A9A0389EFC802037BE7EF087E5466BC350B9DB9117774196D83178B5E7ECDA24F7D5ED9B32970E137D68A1687D7895340892A4E18971AD8A2C71CF3D94A1D1FFDB02042D2D72C3C094BEBFF022F9A7532FC09FD8D745F5D73DC190CE18CA317333F17481D8C66B7A814FB3BB7AC36880FF06989F004BE0F358BC4F603F89BC41DB559C23FD",
180        "9346E9B07DD2E203D0C3ECC9A5465938176A3A010F7848E21BF0372C3DFF51113869BC3F58814E1BC965F32ED64750E46EF503D31B80F9721654A6A8F122CB0F82AFDBB9721257D101DBED12E5F36E8D881F75B1867B9F95E9ECE79E374386FEF76157ECCE23A4F3D24D7FCED68060BBF302B455BAB004BB22BAE0FF4AB32B4BE7C845D5A786C66B7BDD54A8F7364D89BF57EA66928B33B074A1055BC7CE5628DEC312E640B5EEF5511D372E9F8D87E220FBFFA5E2C6E0C4975ED7EBF3C7680431E5ADAB30B66840EB507B22C73530755096FA12A8DD58D12DCA54029B339BD6392DF44EA28162C63A1BEDDEE7DB702A2F4FF6AF15D02FBD27950055838DAFCB",
181        "BF26E5AC455955FA475748D65C21D7BA0C49587CCAFDE22B4E3E0D1410C0A38FB798C8B5662AE0403A071F9968119EE29E765A0E138E11861DFA1C43863DCA42CFB5E5B4C0A1EE1D356F89BDA68F13AADF78F287BBA07AB0971BE43D042037FC10CC1D4119367D5229878DC992FDCBA892880660A8211B8652CDE5CE047D7C0D4E7402266642E45CF318D304FEFAE885956C211B2D389EDB8764173188A4C71A67834BF887987E96A6660373C3AF25B22D19937A6144DEDF33F9E77823C2E36F625C7419F0376FB3022563FC8C4833AFB9F54A7D307194C9EDB535BDE1AD915B9C7B7C55F09BF2726A214FB76A8CD98B9F2B5C9F92405EEC1A0B9F27FE36722B",
182        "BEC46606B6F419D069BF07E43EE2D8D591B2C7643779770933D830D7303A12A990575B758296059B9963C10B08A2409DE1E98FBEEF9F95EB20883A45628BD95CF4488C15BC9478BED604D87EC2FA9578EC80B687262587ADD8A47890C249C4FC3E262BC49472E5D12E7C3912B9E79A697C93DE4D7621CC3E3FEEAF1C14DC676041E2CC95A5BC949CC7D2C4DDEA434AF673B3C88D591C22EB7FC2FF41B4C6FC5CF54EF25ECF6B01CD0ECA8C75A76836D756C9EEF743E2C984269BE3724970FF4220217A8532D405876D8E9DC77C5B40D3169E84ACBE9716F04725D0492F4BC95E80F720DC1B0E755495BF6BECDF50C7AE7BEC0F94A30F9383DA6A34FE1DEB95C3",
183        "B5BF7EF6A05E709BF0B6E643AA8738FF0A7BF6C67A4DE013DE5F3AB967073FEDBC6BA86801C9FBE0EBEA3F28322FD1CC14AD2003B5545B430A332DB17FEB503EB31A805677EEDBAFFD4A61ACA1BF658F9299B1EE9AB3228C55D4C35086C0AB55A6C5698F423F8B3BB8BD75A73DB43BEE68E3C43FE3295589BE7A305880BD1FB9F1909215A9EF0784F04982F9BBEC23F91D7A0BF71AFAD3E5FE00BC394ED2273D21EBD96CCB8AF46FB9B1E47A250E4424FB5EACA733C190C5D08692960331A910A410F1AC5D10F1723F24DCC6F616B14C57269F7C6A3924B281DE99B86F272CCB7BD8A71AA63359F3EAA4DE1A27F19D47116F1EE953854D531192C4475D8E0377",
184        "A128120408EE7E0D6BC66B7D00C739DD21A167DF097724259D11104457021D137B32A6D878B0C3360E928A1337EDE982E33DBF8057339D69CEDF65AFAFE6B6F67237AE013AEFAB3DE3B62C1B1654A42FB948387B8D4861BC2EA274AAA362E2C446C62E5CD8EA877DDFF82B822518DF51D96D67528E55C4E53DEBFD8D04FA303B1B268D23946B466DF435521AE3D3D0AEF2A4F8B9337A0B570117A16AFD7B50913588EBAA962476251F3F1A1B83BC42F7094CCB87BD5A6113A6539EAD25BCF44346B7DD078B198D4CA964305ECD1AEBCF774218BB1D42C73ABEC3B59B8E31941EE3A8FE63E97B372B963B9B9462C0169A3BD6C8F6204EFD6F3B6B766CAE0EF3D3",
185        "F1A2E8FBA51D17C4C9A81DB9B29AC6D356C5D2FFB52E598C87EA89F8DF3F823E89FD415F9AE6573A8D216907237C29B6D430700804D92947D7CE200E16F83B9743F9A0BC773202405EC9315727DC75BAC9F77FF8F1E53EDCCA9437400183F0D53E0AFF95978C0F0CFC098B1A5E41E8B61055268CC06F4E7C5809281B2DFD794D4FAE550F82CAF4E27BDC2A535E9ECAB4981D140800413409EFD3FBBE45F6BD96FBC83F434466615AB4FE207006E3DC6B3B381178E74BBF1C93BE1C35532039205B5B2BE131F31EC48C8DEFD0ECB8A1D742717DC82BB2345FEFF635039F0B0AEFC866AB804C6168E4297803B2E79C1939C85EEDF166740A44D5A2B75E45022469",
186        "C338B22D0D8AFE11160396DD52FDE59D1A89C699DC02573D9FAFCBCF14FC0F974647AE9840009CA4673BA61E6BD0700F8B9F4647836299097844626CF4FC663E9112E1A189633FCCB5299430361003743CC5C3BAEC72C53BDCD551D5891159EC264096B102AC582899138EB01B84B1398E82852A0E7E9F6E4BCFD2E94F4C4BBE09B39DE563B9ECFCC7039DE2139E8375730A8E680CDD18EA141EAF806EC98C3D848D14CCE1791024AFA733D5A0EAB0718110EA4AEF6230387C69E4C1FE1EEE356746EAC0F383950F3DECFED1AC60E5D96519F80F066859B2AA6B97E87E5E07DD8B2B1158EA04C2F1AC23D5CB2778820BF42C0D3DA77AABEA1F0B256AB6AEAADB",
187        "9A5B9AFC7BB5DD5E4CB0FD4B3938EE0BA7CA0990BB3A9B9EE23492710382536E6EB75EBA2740A15F7C6DCF61A3C0D18A6BA0E025F402624CCEFC7C471D9624B69BF534F72F6E79BBB024C460147DF09B01E7216EEC7EDB5E7FA53CAC87FF94086BC1FCBD609BB76F523AD73D758A7B8FA737DC0BCB6FDC1FA345184B6BCA552051882094E72D53B10FE85DA13114D6A3FC71C1750C46CA42D0385DBEF9E061CF38C54D4405244AFEE0BD38ADD9204C0A0428115DB389974F19332C276DC500B427F3D11AE215D465D5FE369AAE375995763F44FEF11354B550B24BC65E0DF2366D253507E2CD59C55EFF3C9D6B7C116C979913656AC5D4E8A9B76D554BBFF415",
188        "EA7789318E1DC62F2E4E3B49D2A9917B4ED36D58C36D51D4B329E686FF90D4CBBD45B954F37E3653DD26CC9A8E912EE292BA14F95DB43D474DB7B0BEF7C588EF09C37506D2F4A51A34F40DB37CFE741C5FDE69168B8939968765C5ED88E8777353F8CD5B59DDB32E152AA8A2FF08BDBF3A7581530E2EA78D2F0529807D89D5F0F65F7C6D5A4235F796E12AD9F8F3FFD3C4BCE315A372EB7AD793E93B36B940D32054309D5EEF01AD81B0436B3EED1C21BF110EE3E353B95ED9C18D3DE401D519775C58D77C31DAD9D47E0D32A0DA19BF57F6B62CF2E0FDDFF84DA6FBB3239758CBCD70512651A76944BBD4BC61EAF11DADC2EF63C9DE7065B27254DD498CCA7D",
189        "DC5418F2AA070FF73A9BAA9D1D57FF6A649926C4129C750005D2AF89E444229EC235D6BFA8607021C5F3F4E8F610691D00DE556C8184758AEF14592B5263FB72FE9905CD17594AC1C13F6D8393E9DC0E8AD5C25EF3CB932813EDA86C05F9304175ED120586C28D06087A2657F35FC7DA7EF808A098B413AC4A3DC44375A44C2B70ED6D849F376B37D466CC5B09240FEAF8AF318E2DB4C5EB6F5BC751A9A40A6F47E77E26B66250095339ED2B3F3A7A47B0B62B48AA22C2BC6A8EB43220E11C1DCAECDF463D5AB9D49B38748FE071B19F0197B65B0408955CC2E49C1761316046B3290C4434F8BA0BC8501366E8F51FFC1309860DAF4D56BC0FE85541B3464BDF",
190        "A69C416532DB9B532872BCC5CF533AFBB01D55A6223E30E932C423DA7B050D2F8A98DE584F379CECF7CF2ED9668A7CE3D8825A072A5A8405C30F7AD467DA0762FEB6E967918F8E36135A259F89575D9AAE57BE18BC88EEC3A1C977CF57764F92DEB1A1987784BFE19F9518F5C5A3225337637CE75F2197407E0ECDC81DE7CD0D148924C0EC7D5EEBCFF063BACE2778FDB6BD24090659B173887BC98392C0DC87521BEE56E894202A222622880EF6A7A8CC581378997F025176B2FD8065E586F535182092FAF277141D1D89A2F335124580AF2FD496107D51E6609A333A26992CEA7C36366CA80E4DECF8CED54BA014079D9CE014606FB3C1A1EBA5F638F4240F",
191        "F36B5B5A98016914FBF21C35E66D3ED35BDD65548880893CD1F87B687C22D8926272EB74A785E66E2EAA9FFF5F8BFBBDA563EAF6DBC2CAC178D19C107E597CE92E6FC32C3E8ACC535C3785513257231F7F6A225DDB2A2E1221C69973BCFBF23200BB15C9ADE4B4ACF7AD26639DE02AFE9BFED595F84C5D5F3160880F597BAD2011788FDAA55429CEF7DE3B47F10D75B76FD16A6AE9AA8F9994D26C31F7CE3C824A1F0B9068AC87DC2B6253873417BB696525ED598D9CED367A4B8377C695F5B9DAD49840D21B767DF88ABCF719959A85B6CBED98781BFDEAE2FF03A560DB43DDE2E9D5EEFC36F577492BD2CC753510AE99340FBAD2D27075D472F07D1CF5153D",
192        "9A5F8ECDB3FB539A0602182DEAF559E72F4C0791625448A64CA455A94247936A024F4B3A017033B9996D21F6C21DB6005F04DF58AB48D93DEECBE796A5F410D9F26C15034F7987F8DB989472F770989B09A1BEBEF1DE25BEE69B0209AB67F37961586064E3034B2B91C1256E1F4BC9306EB0DAD0B3B1EB03CC4181CEEF3ED71A6ED76D6BBBC2504F30A9259D377CA3478E082426100C6F92D2C669E165A6D78D9935453E9256ED4ECAEA65952368933569851A81EFC76E9BA3AE8592FC0CE2E06C266238889617DDF02F927D030E4773756D2FDF5FB548B10A7EFE194076D564987A02F87E859B266309C79404482608BC79A806B4A06F7379BE4E12BD236541",
193        "9AC5BB83537D2F6224F8E9523650C775B312537D33E907DE3B8629F849A5BC15A025DD2C8C622A58D84A597EDA987DF848CB8CB2E467451609167428E247964C2CAF9F8E17E55BBAABB840E54CF6CA97A892198D7010A098CBD04346E720BCAC4D431A815D9C41C9C66F632392DB18C9D5CB78F48239335F90D47E3DB0E492A6B428201D74F2C8EEB4173DA115CC7971491AA1C754239C9801EF072519037A49D0B9EF6FB5F52B328EDFC96A626425ACECB5DBA4FA4EA09B5A701E9042ED1B832204C90F36E8A2219E858F674657971ACA961F5A5CA1E65AE36C5551462C466E27090D58399F30B3A127808B6729497352498C0648760342A07D95BAE64861F1",
194        "D5D306107041F2964FADFF48CA03B4E6717500704AD43EFD1DC3AA835DC0C6C7A92CE93B28021BF1CF6F96FD957C3289ECB2DCB8602B346DEF1D422B1478849CBF56EDD562E21562E71356C21252CCEAF5494BF0C83489EAC4DA80819F64F6F40F851A4F31222E54AE8775F927ACE3F3D62263AD627A1B70D0E6E4154286E65F55A6DBCF564EA0CE774BABBD894DEA9643D1FBF24C94DF58C5D3A51083C6C0A99194CBCFF16E731A3A44224396AB57A58D30590105E727ACC1BCF3380025C8C1C6A1F470CB11D1DE50B7EF3D9B41FF7B6D52301E0D84C81E92690E9D2B65C54FC937835A701A8E814B3AD1D2C1A0BB274AFB4DF1BEDE1804607B65765A91AB1B",
195        "840674160E07A620A4FA5015E9CC1A0D136F2B2507540D8B7E9B20F8553850D9B42E87164A6F73304784E1A5320DB742DFAA246757B9EE2877239DFC4CCF39D731165811730AFEE068579B8B326C97D024CD86AA4D23D0AE27F27DA5163F28D9CF52B24D2D8E09DB6C740F19795AA63D11326113041A23210501C034D3BB3B110A960EB8356034E0CFBF35A3D5BF25437E2B6C8C64E6E9C7614EB8EFD23E985416FEFD2D75B2FD312AEFDFF04B38A58BDD7BC6CB4486587E3FCB26D6E7C36F73A4D90F29DAC0DA703E6B69EE467C0030C5F5F9B91E73150AA77DA288B53C376C6710B317593E06C6166AC3D80164926E4BF41A379C7C43A31A57F55D5CD486CF",
196        "C8827EBEBD75CE4292124BEE3C12137A67FBD43AB603EC4370AF505CAEF56C014766189DB74563C78BFF1C66B59B79A8CF0AF0C109039A1254EE1CE4EF1A2EE24A72C1F99670CDE65C6CC65A059F9BE6368027C8D6491DA46FD97DADE127ECDBF7FC309891711DE876472217BCC7B6D86E2A2827A708FD7CDC55FAC0174F5E89E36ED0D187D14301C191FFD87250A20F002145E6D68C5014AF6C33F843D16DB64F0985834C9F5A5EDDF8785B54964DC54FC605E734E1F2C76DE6FF779BC4AF90AB9F81E9A124C352164CA70465B9A97DCCA46B7CAC5658680437E5F1A1F3171D63C1BD273F3883155D390084E64C1605A45593B04BB35BF9836E52A473E636CF",
197        "D378E1FCB01AC17832436C74C634FBB2DE3007AED99CB0DDB365963D892C8224AFD1FC4C7FE32AA3A8F28BA46056326CBD73D2C532FE5F6A9934CA4EE385FD92A5AF0E9E9D10A1A078CA9AC14601FE522C03D9E8E892025AC66EA4A0A04D9D2664C07D08F8AAA7392A50DBB0A9CE1DB8088EFFDCDCE56DD7EC351734A85B2273650DFD2D823DAA986E63DEC340F0032745AD2F8D16EC1043E647E896B927B2467714D34B2DBEB40635C82C83B429C32D33643E68063D89C643036003989093188D3B8F8D0925CFBD188D2AA6058D2F80D94389340A01B5122020AF393EDFFD110D627BA0D182C3445A5257A59EF3EF531CDDAA7DA2433B6A0A199B86BF26AE3B",
198        "DFC9CE0ED3DB08F88A39922A0BCDBA08CECD2BF2FA30235C60C43CC35CD39E8DF0A9E7999282DAE5CACBF38319C1EFD0629903B6F6F7A57B51C0762438102C553B8746ED65927E92A81AB98BF9982CCD2F51A7615B73EA16183D1A36A592BC42BADC176BF9AEF7DCF729A6A16DD0CACCDDC45837B43F5DB691D0C4C33F5671595969A073BDC8B96B63242A9403FF494259617957621501F05322AEE33EF3DC2CF269E53B4EE2F6D3D023E422F0BE3E58A051E587391B3A7623BC062319153CD7AC1C2F8C7128217492D28AB24716FD27351CE757D291B610C7CED6F32D9705C55C7B509E5E3005723656F7C535EC097DAE243A43925EABA01A9AF0D258FE7531",
199        "B80071514BCD9EC31298DE83FAE63F04341C64421D035D34474FF677E614E44146E4224FEE2E1EA27C779552C61A18F9B838BD2317380728019754B1174C3873952D6CE8AC5465B8C5DE5B667A53B7CAB75560378EB1E510AF02732868D24D26435A655648F0265AD89AB7643005EED18F5B0DE14CBBF7AF97878023A24435E72063F25CF1FAEC295A47400B9DD5F5DC8BDC05C6285FDC77F4A070D97492DDD67EC51E2AD987EF630E6BB83F2CE8FEBFF012FE37139A1D20B83FC85DAA9310CBAEFE597561C5F2693C2FA781D43074C2E0F02A3A4E2CEAE163409D98DE3CB16980C77AABCAADB05DB4A659953C76F09CE3A79F69E755CFEF1A69E210C0CACF09",
200        "E2E252C0FB5172C4CF7252FF7686CB137C94BFD6CF5B0CF0E0458162FA770DECCC57D9CA23D82FC0755E5B36F0B6C2D84650404DC655959A210ADBC7CFFE2F7CECEFAC3332603344A696A240A57747348DB3F8C51320029753DE7BF3CAF2AB211F1ED8B850D12A807408B979FA64B2DE58D028FAAC6DB64E41245355F6CAEC057938916F5F6CC178EEBACB4837FD5812CE2F7E9D3DCCCBE24F01BF3A764CB346E2A24D78805889784A4561B6518192E99AB212174F43FFC3709046C3C81DE135FCD4A7FE9FB273BBFE9DFE13B6CED89B48E6CFB1191228F398556CF2D27CD4EEE4F898EE746F174DCE21A554DB05F6A03DA81034E3EBC84683FFA34B9CAA37FB",
201        "9E9FEE6B26682032EFF83C30165D71A5E46C2B74FF755F15FCE3D4F321D2B3E00710061BE625F365CEB98F70D8A1C157CB24C11F243BBC375901B05156C59892F7FB649443B7B49B8DB05B057BAF5EEB750E2A385AA8006F3BC7653698E5136F15996563A922E0F02F3B6CB1FE57755D0F9C74B65BB46167FF44EC5A045C1B69356B89995558B13EB92C3663AE75135772B638ED9A9B69DCB86EF48072935E91CB0367EE43C7E851D300A8A2201B798CB026471AB47586BAEE3E373CEB6B45743AA24548FE77901654758804EBC7E0892EAFD3A9648A789FF90C0DC0A55B802081261C5FF03F96C37C711405108A89E9A49EB2F071FB03FBC8A49E4DA0C6B13D",
202        "E696EC1A4637D21D434E24189C6870ED1C6B465E9E82CAE9C209185D211AE9D729709C5F5DEC191AE0AC46325A1877C4F4E81B4CE4A20BC2F5D22FFB048056CCBB1DE995006CD8CC8BEB4C4E92CF0F55091B04AB5745B0AD4D7208739E45D747314F5C3AC80F45F3FE7C0971F3B69B4E063C72C4B89F1EF77606AA6362CE41435D85362A1CF8EE81EC6231B6222E21F7AFA8C96F460AE86612B71EE5E7D29BF2E6ECF0FDDEF995D8BB838794DE75CEC8EFF50E5F675D05A95D07A1F462AEBA11556DDBE65C9A67794C6612048344CC936ADFA6D4FF966AE8D63DE8D5A57A32641F8D405F3116755BB1E30920DA31A2CEDB11BCDA46A35F38F8B5763009F300CD",
203        "F62379BE71D814689453ACE706168047B942DAB7DA3B4D955C0A3B3EF804A2445D75C6E791F9FCC746952A64955A8FDF29D3D0CC6603B6157B1911C6E5A7FB9E0FB9AEB756A372E8A65B01881134075B0C16AA3E7A2D13FCC93800438B91903FB9CDB6770BA4E29BB12201C183FCB336E9F73C8E59D0461FEBA25FB56BDA84ED8081D842F67E465100EE9D1E4B4D651BE5C341D0381205CCDE6EC0EADFD032BA16B1DF23F806878AFD7D6E378C8691410B6A76BD6C7E6CADCAB0851521A7A2F3D7E8641BF49018681CC4C8A9FC8C1E4FAAD9233EB0E18F662908702A44410ACE79205E70D86FBAF99812A02944F187E6F7882BE8D38BCC551542BF488BE9C989",
204        "ABABAEE2586ED860E2884C1AE2AA61C99A74D2F4C27F9D669C3A47664CE385CC56D4C5C108A4861AFE15C1E90FA2F26AB2B69F7D49CFFAA5FD55448585BFBF9AAA90E0BFD664B00D23466A107B950AE640D001CFF95D4545D437B0B74716A83B167E11042547B24A185825A52C46C022B7F112C18F296AEEB50A99A18FD2F61768F8CA1DE864FF42CA330E4C4E14264127B8BD8B84E798C1CA12854D87F2CB329C4F0CCA46B7E3D88067D134BA3B95E47A4C80A995C1F680B6372CA14927B0000F8D7193D1A5316E8E1267958F0D7A0E99F94614FE8610658D46CBBD1CFE5C33F9B8D60640CEB4A7E8E92857B5506E3FB6F281F853E66372791BE135F847A543",
205        "9B5799AAD98946E0463B7733E985145E9BEAA7109F5641EA33E83C97FB01E7BE09B2120735E8632F973AA90F709F8C86E9E2370F077CA9EDB375771A24C95D52B6CFF4B6C189E07016E95952504B42690A6A1D58B9C159E7A67CCEE1D74D5C47CA097E37FEEFBFFC4B49786B1923ADF8F3333FDB9D1000F9B4763273D4B59F91B2DAD177A997FC1C9C9544B3AF62D72C256DF2DB79A5AC86C74CC2B926EC57B0FCEA29749ADD46939F6969549A458977647C2DA07FD753A285EF1F69B3394B815EED1CAC43FD0086BAD7AFC25142E2DFD9E315409FF9D31FADE4BD23630EC5556F48E463F60EF24243A481A6296DFE05A4C149FDF7A952847D1B9D38E5E6200F",
206        "9150D1E3994D06869F4FD649C0444CE34760585D715D5591A6B57EC817CFEB5EA395D5BFE5D5A9F10A6B0A568A009A5AA20904408E78FD70D64ACDDD35A18E02F2A63D635D6B456E9B99B4AAD5B47DC9407BB04CBE0047FE7BFA146907F018C205773632FC4FE51267A31BAF77D856989D9F7697ECF8A85C1768951D16ABC778147D2D663649368209D5EDBC3160E627FE9D51EAC83385012FD86D7B830A18B17D6D55C2634A6988024AE9C42A88C9A7807ECFA53D1530E3D17FC1F033092A83CE087F35A2F5F279A17E28E038E6E266D98CB90782E8B1BBDADAF84EFFD0E9EFABBFF0D57791D3D0C637947580A4ED578DC5ACE82AF9A331FE6BCBE0DA248297",
207        "E7CACC45CF9CC6617FC22316FB60533F0F30CEA83C3D60786CD20E689BAB3FF0E04A7772834069CB162E4EC8D6CA5C7AD5D8539470113B83295F68D415C08A87F20290791B182D5B011CF7E820A9598E4BE797DC0530D6868A284F814FBA6F03F05D88DC0BC4B4A3965AAFF6385F463C4DAC7A7945C22A3503BAB79327C09537E69DC34211CB9462D65A6CF745C7C1C89B4BA4EB65DCFF9E68A5A5D895B53B90E5CE08DBD76AE00AB09CDDF4EA28346BB3D943B1E653E3E66F35A9038D779AE2FF16B2FCEA6FE383358EEB6CDB7B7245DA5E848799EBD7EDC479D3613DF5FB2806242595B68756BB030A9DBB7F4128F5C57B619702CB82589BF1AE04C5860A4D",
208        "CF146F5628505AE86CA2A934C8F4346A55DCAEFA152785D48C70F2FB421EFED0BD2F5A8CBDD06DEBD6A3924CF48A02AB3E298C098901BDE55E355FDAA209A66C0670631E0C7CDC4B988DB6F329F979711B829E5A0C8BEA54CFA346768537DE0CB94540C03BBD4277E412430A07D6726ECB94CBC2E690F16CE6F74B43A2E6F320290B85BB5B4C8C4CB8CD66E6640F7DC7EA6BA0ACA2B1457CB4D72E4158BA207A9F66399DBBACB58E6D0669A9F83322978E6AD0BE471D0BD2FF0546DB2BDC2F35E9A06AD779CE81CFD2D16A258B7D560284CA5CF1120ED9D7FE3F77BE0EF80AFB8B9A43A9BCA34B7FA07AE9A15E570B6B33BF33D476CF3DAC5268E9DC61DEBC41",
209        "99CEE48002A4821AFAA4BFF945E58E451D343E5EAE1979AF21905E539992852E6FEBABD2AE133AC8633FCBABEC96ACDEC96617038A090B9295744D45FFB7F5DB2E09578C9B9D3F6D2F0D5AE63539CCAD2CBE8B3D3C1E417B3B297D35CA67308E638C5A0951DCA3AD1BF859251B7068B9535F50783B3C3FA80E584D1C17E96DED8E68CF5090FD812AEE226CE75A4FE1EBAC8701D13DB8AA38914C7B4FBC0730880243C4E6C39D763874DCC8935A6855BF6B0201ACB7017D352CE5A98EB67D635D150038B00C80D1F58555A89463484B4C5A11291619546C59A4FBE8DB78C68AB9388FC751726FC57B825F3B3F287889EBEE825E541B64822947AB8D746B178AA1",
210        "D5EDFDF97925713E29E9446AFCEA18B16D562F3379CCF34BDC64DACB7A2A518A65FA27A1B7AC26B6A8C5A9A9C7B793C6AAF030AD351D6D91022970907351B06B0B8BAAB8654E8824F2642747EB2FF5FF6AB196F8FBFEF37668F357EBA48F756E3587426B2E46E5E059FA5B5ED35A076CCA7BC8CA72678F93A2ED3F8F91EA92BEE2B83612E26ECFB3D6D3553A6BDD4D0755DA409ABFBCEE31051CF3A1705750682FE899E88E982193ACD84C022B4F5CE747F3C6C5164E2EFA0352894D082D4751912514B4CB7045E9655B07D4C4E58D9BCBB17A762B5BDCA41EAB8C4E5E696B6C6660BCD0704E21C2E9237D096D5421AE62B2656E2D2AACAAEF9F67033E40D895",
211        "D3A560064367419F0B83DEC978E7C0FA0422C0C6FDA15CD8486F3CCD5D02F4B31B13A50D3681E8BF7B39C4D7BAC5F5160CAA5FFB8566684B03D0954A3DEE843B021AA7A741A89F04AF46E5E4AE5D0F75DE2A72F162CABC856A3C79A563D7E3F6A7C45E150B70B192B20DE1BBB83EA114B81166BFC2D7921FF1FA931AD189872037E0B2BB5A2275ACFB5BA7413D98BB77A60A47801E43FFAC16E5773CDDEAA2F78A5C641BD3AD038DDA209EADB0A1251260E4DC0A15FFFF8D39F3F871B7AAF4AB687D2A6368B44E31B95CA0366841772862EBBD365189A5274C6372E8AC863AC735345F2C2ACD063564A162D1577EE3D3127A3245D5B09ADF0EA9FDEB32C50627",
212        "B107DF0C2E58D122D0369FF4A0FCFCA948A86D2AAE437A4C39F2271533286E0FEBE29D2514AD28BDC8501D378D958B0A03E01FE42D3EF629FAEC82360167EDD6FD413F04A7EA540E64A82D2EAE7BC3912EB1B7F7AD43458A83159311CE4E1D1000B9047E75BBC3C66BBA2A94F1AE4C68E0656CC139C64A448D0D889EF6B8983FA8A38FEF4068BE9CEB7342E36B1F4E84C5BB2DE1AC8DFE2B1D1FF703209A8DA127677766BF6C71C994AD2AD47547BD900AF979FD460BD94F30937D5F7AE1570CF82678705F9E049ACC64BC9AF891E7CD2D7ED1A70136CA9D11EF578AFE9FD8E217DC6F96BA1891A7377A9FB6BF73AA88C3B2035E2152B32697E7716E5D4A8DC5",
213        "943C316C5155DD28A24B3005EC4D846321C48A69928A9ED668747383B865368C27628392E0009F22E10F1E5BD826505C6B19887EB83483DBF216D0163E5C6E6DBB3999E1E5EF8BAC1D57BAF1CCBAC0E7B05844C3E3997D7B022CF73082AF2DD71F7535A7FBC7EF2CE02E55C2B8BD697FB8C75A818A64F95F21DE7ADC7439BA0B47F16D0B9B7D089741338A4747F4E9A966591A7A3C23CAEBB66CAEBAEDAD5159F059CE82332F4B7348F99828A21D76A684820DEFA0CBFACB86D295785CC5ADB1FC6831629680F464D4CFA4EA9E565ECF238468B3893F06CCCC3B01177C7923C8D8DF4BC6EC66F10567EC7EC2DC45875041AD1993EC313B0F847243100B6861B3",
214        "C17DC7D8449152679DB95356E490F0452B4444EBF4CD60F1AD1E52A729EB6D6DE6BFBFEAA46EEA9901BF1668B7A5191CB138D85C1D54507B370A224F22813DE2569C4BF5685B189B904E365D040437E55D399A5E1A137F9A79FCAAAF9597832372E922334631D78333EBB0F401B0AFD528074F5676DEB5439E4DD8B5CF9A531951E8977AA4F9808323F65B737DB373AFF2BDD54E774E06E9C54507ADAE3634E36489B89AB9B44B6A50FE8AB8D2EF938C74FF97002FB96EBF585EE3E56BED108CA5477D21F0EB73D2C1A55C17BCEBC569BE0AB4723AAB77FF9A835369CC914ADC6B712BB918A7EC3DFA198D81A8DCA18EA3DF4A21F8669D2312DBA5E2E608268D",
215        "9778A38DC7864A18D7EB5698DC3057028BE443C12FDA64AF0876DC3724B4297C91FC1D03522F630E90E182066DE73482E62466EA1FE8D66DE7679BD90FDEF0081A8851F204BF819150B56B99E1D2BF27542DB6ED59C0F1A348A6C6CF59614FCFE22902422631729BAC7026AC4AD15A798A0F3A90C901C4B1F1C1DB172A63944A90AE61626B8F99CB68DDC915E01A3A62CE11707FFCDC68281EAB834DECCA04C3F5E885E6D08CFAAFE8B9ED3CCA6297BD7A7170793073C23D48592798D155F07CB18FD3A8813F62D52DB9C381B0C076107DEEA3607458C60D4B138B9715BEE31004B91DFB01997567F9FF6220A117C6D76D4E7F4DACECAD56ED42204E31FFEE1D",
216        "FBCC3A5743699FE903556417D6EEEA3F776E5EA124254721BA7414D8752255896E9B081DF2207FBB82512C320DA5558BDFB1EB9A4CF5657A43EE641F32E2492BD559675C9DCDB7F5AEFB9201876693E6F17497CDACA0339EBA464A81F7626EAE25D78D3F9F39FF0A2DF4BD0CB6CD4C72E425F36DAA90144E52ECC877F67C5293BC284EB2E261A0CF85F8FAEA3CEFC54D09F9AA0DF29F5FA0A3167FA241EB8A0A9DC57E6E1A72A09E1F3016964797DFC36078ECC43B966E46240C173D583B4A5BD3DA4747789B8A840A71CBCCE0DD1C9801DBEA48DED86D956E372C85FFD6BA1BE492CE186DF0D845292299CB671DB2AE7AEB8988A675643B1EC17C3FBD9C5457",
217        "8ABE91D0EBAE9AC821CE5D214FAB642B2F2CA6F3EBC9293CF1DDEC5B216BDCC2513A22E63D8343348FA454132F32A39887D340B2F70BC441FDF061EE3DDADA55EE7117876BADCCD879CB0A833C7FA6D87A7C77DC2D0DE4AB0CBE21C69D54745C7B6FCFD7605B2A49AAE273362F29D0FE4146DD00FD85669B2960DF848A8D7CEEEDA5A4AD3521FE99CC32B46DAB02F7084ACCA936DD0A6638D9E856E0E051E1CA049D9B7680654DF67A52DE2554A3D1EB3F24AC88B908868CE574CEB17EBC3A02B254B2F7A9DC6DE97B8EC58B7C7C230B764EB7D44A1826C14601EE8C2D22BDAB332F2B772AC9CC383EADA379C9B1AB35CA58CE67D8627F989A80740EFA68774D",
218        "C83A91D45ED1C39458D8067BE87C916576506446D5FC58FB21E3145110C1F5AE314AF9B49855628DBCCC8E33DE6E7B274410854A2A0E17B31DE89C57452B1B2A6E032D47696F5FBE2C1879458AD3C1F19C56689F9C465BC3DC09FCBE62E8D81964021E67C53A3D70CEAEAB9E5D73CC6B24C824C4535491CFD4734ADC77B2C930D9A9DDE7DCA2FA8E6172DC7C6765ADC41B98B62549E10253527F6EBFE5729046E4C7B25EBA4303E28787428CE2381BBDA3DBA11F6D6FBEFCCA9DF29483C4FF580CFE61F3DB4470758A5385164E984B471DC97734416C924E8BD9DE02440399B462B65C1AC35993A39FC1AB70F1C09DCA4B9221A3A2C9D84CC405FFC000BB9A2D",
219        "850C221682545C450ADD6977F88C26AABC01AEB0B606DF0029AC435DBF6BB9D6C8AFD310C9270B7E23CAC57304AD78AC2795A226977BA366E01BC713493023713F191B62CADBA4D38C3A1A015BDAFE501FBC8E2E8DA2521CBE52E58058992C3D3F92A7123A03349AB3E544D960853C82FBED066AFCEB939752DF39C20BC258478B38F8169EBCC91BA74F1FA0B66C740B51D3D50B4DACA5AAFC30F8AA4763EE05618648B49B37E32AFEFEB80F7664C903E37D447E002D185B29F503DB63A14692ACFA0C737D8D08E76B50622CB18E5AF306477BFC16F10740529E322F1EFA1440DE7BE6A28C3895A73623FB0A64D8CBDBB5AD96C7B6226EF07CB1A781F9BC5F2F",
220        "C19D85E7F75A3DC9A0AA1C72EE4CB5540AB1BD95CE816619B691B38D5CFC5F3720E0D375F1E935578A828EAB418860D7CFE7B249935D1C907C4261D7B111C9450F55E87EFD07D299EF069DDBC0549FDE8F39FCBBA74A2F500DC5851F66D56634955D64FAE98E961A9A779456AEFC645DB7DA764AC45381C2C8E889083A2480A1654CA50D40D42DD1C28CEAA48017FAA6AF9B8407ABB59ED8F0298B394CDD6835E3026B0315347D720206D6B4B557463ED5F0C6E276C4B23519D76E82C0B47C24BBE2BCAE9C067699E4F2AA3319EB86096AEE1A416FECD2488B9473CF14C29CE968453CE489609674C4B1442F2E9736CC23696C4547E8B1B6FAAFC481A2890D77",
221        "B8B8ABB926B621CB9FC6AFD933A5D46FBA42EAE46E6C5DF9E02C4FF1BF7A6CE9E17AFE662DF6053B2314BBFF951F4AA18DECA88076F20269F863CEDC34D69EF48B96485224737830D5DE43AAC1864FED4C38EF938B62E3DCE8ECF75BC32E4F57AC212202C7343D621D17841295EA10C63AFC0B4ABC61E39815C41139252C4667F31D3BE09651861A2C3A2C8212CE1827FF9EAF66CDEA8ED3FDDD7F43232D7ED9107B2166E85AB19D845CC55DA1C71BD158A8EB21E200CA66AD591E47B6F5A6953EEC47F3EE159CAAA5309332A7FE9E6053FC1561D995ABB53AD6B4AC4EFC229FAA22EEF754A951DDAC6F073D7EB2C5D2F64D5C56EB155BB95B88FD230326CCC3",
222        "F9674CA549123B690F296B429445F381B78E606071BEC080729F93484626658A44BAFE5C8BCA3582C1C2415DA86B01DA915185E0F1731328C800BFB48AD6237B6D4E208A7925FB0CA97A4FC00F36C1400564C95F9CED7575979EF49E6099F9F324927611BC95CA8CD750247D389974C813CAA12224FEA283C0BD1BCBF8A778FEEE44E78D336184D127E97F02703C2C7C6EE5A00ACB6BAE7BF441FDAEC7437FA76CA89C42CBE9B2739732C8E06DB4CE527051ED9328A0DD9F45C344EFBE8D054CB2FD25AEAAC95B7C2EC87987CEEDF6B83021EE7C3D48049201C0F84613AD82DF9765D3C54B666919E10944FD056DDC91D462E8C65CC5DD924D95F9C4A896F645",
223        "822C77E8F2A5E05F39442C25414531B81BFA4510FB50C93CA078FFDB136C4C4BA7E7D2EB881B61EF6B69224673536FF9D858BF908D7B4D886C30D4754CB8092BB1C449E0AC0AD9F7F91DA6D52599F67B9DD015D0C592800C2D9975EA322617B3597004F929F809907D502A2708DB1785A1A3F16543DB3FF4532350FAC0D37D408861B1AA1603D8D1973DB980A7BE1DD4EFEECE4F9EA3BD487735A19151790CADF7E6A0AF688300C942BDE0EB69FAA77032F3FEAEAB0B171AA59FB08B89D7FE47AB124111F17AC3A916107407C0DC74F23A795A508A95938224F89AF72B08CFC022D71640633C9FCD1A8D09E4D9BABB991457DCDB471EAD94123CAA84D50E4B03",
224        "A21269BF090BD7CE90871CD82E0FA09DCADC1A6347B58C1E5E81A2259A65F07D61F1633B0A1A27FEF139AE95540D66259D276290507B73CDFE2407B83AD242476DA9577B245387C932707BCD8676DD501569EFC03B4E588EF0DD92738A9963FF7C3C2D45DAF6C3B2E3527D895FED6E62149CE794E1D069F5D58AE6176F52A986D5781AAB9C5098FC296AB348A562F7D9AB9F86FADEF059183F9293923BDDAC3F13657DEC3D9ED4A8692465A471DCB29D702507B3F50B16404AB156AFB81B1622C934903EF14E478AFA73404D74D332C15B636D2C8287E9A7DEDDEFB899379AE2AF6AC65EE8DBF48FFD30678EC11B0217FEAB1441A365EF7BA1A1A75C5936A3B1",
225        "F08A6773DE4B3C8D2D6C260A9E6F913B7964E29593E4D1202AC5E9034E7D4F316D9309D62ACDE4BAA8684ED235EF85F08692AC6844FFBB772E0EAFA7EF8868356309F6C11CD89B1EDECBC2718901FC94E4E42F8F0C547F943BEABC771C64B37DAEEE519F97F9085A0FE063DA82C486B12529C8BB595EFE152B36080E6E6774BD98CE74FAAA3DC5EED27994F5542982FC6FFD053EC9FE0723F1B11A073AF3FAE09CFFC7F0B8689614235F63CEBA1869114CC1A19EAEAD2C74F916536EF4679C08DB64C4345BE9F6ECA933CBF1139B1E17ED0682D3CBC5A6CFF491E91ECA1741BF9E9BA52ED519BEAE9B8AA09AA7414952379F4C049D0B5D0AC08415DD1FD73EB7",
226        "FF58F45C85BFE34141F2BC291FC5518625811383B413ADC77A0408B966DBCF05F326EEDFC96AD057C28ABD22E6DD673BBF856B71D0E9EB018DAEAC48025F87F3E2148C231AB87FB7F571DD62774B213357AF7843E98D312A5523879F7C733EEE28F3895442AE1C4387B8C32BAB47870F1152F19C0B7DE48C8A56ED026F521656D8CAB3202C636FE3815E43B0D02044A8C99BCA16F720EED023D316CBD79AF2D2539F8B8A4F53C3225B2C93256D303E159242FCF3B74D8F7FB3F933085533AAF556052F3CB9F86AE7C4F4D8D51D3538B657605B447DCFA7C4D8463F9D062AA7BDA8F85507EEF30D7C316D94E246592D2D13E92BC50DE9DD2CC90854DBF112EACF",
227        "B5A151BABDF59BF3A3470E00ECE05A916DEE056EC920115BC5D807662A1BD584060957A9CDF62D108A0C810227D7BED3127BD63BE92F473CD96D445CEC8C7A2C23EF05D7C33C652A1136829A5CC431A37A7D2671A56BD45FC99C9C477AFDF1D866F2D1C7979DAD40DE0805F6D476024D783ADCFC17110CFE310A30688A295D3ABCC27EE4FFCC64850C5548193EEE47C383AFF0C47E85AAB37A53B6B29E0530D76E5BD1ACF497324454961F86F54911B9CFB8E218D8E00AF7EBA0D1178E0960B75DE2A73801FB50EF90AF4BDF919BFF27FD8D5B1F7449C1BD649186A0F44EA0A4CFEC4935E06A0E02567E0FCD7C8E533656D1DB89D31AFBA61E76BD82B83008F9",
228        "B1A93CB9E2FA134C040B3D032A4F4A26421AEEC8F8BECBFD5B5E1221F024DBBEB7B2C0845AC378CE6C90A2B5826DC1495731D579A39467CF2978581C3C3B7266A85ABBBDED47017628C4B957EE0213836C8CFDBD7E4A07082A217797E7090865BCCEB3B4434BA7CBAA469531D73638AFF933128C2F1BF728C7F36157C425B2073DA0FDCAFF6BCAED1DCD8ABEAD99DF25A3C86B8E55D24125F61DCD89E08DF6E97A40C50280C0D4D751C27A4998B36734DD6F89CCE5E2FC891C839CAFAE0CC30B27DF1BEC985A2C246BBB6314FD699B592FB401F180B0B0EDC1FDC4ABA01B2EBC807509A30EFD1A9D213B3E16EFBA9277F2562C00BEF0EEFB4715D393555671C3",
229        "9F0CC457F1236DDDDD011D501D36C06F522B2E3C9FD46E2EA2D2D98450B33733EA475F2824A0B1FB3750748049A834AB8C24B6D36D51D397CA612E9E2D6D5B3EF13DDE1392C74BCC50DA48E052467FBDBDF5B3422528EACC8E0BD786159C570A2E3DE2360DBD27182FA3CD054B2B75661E4A9AAF2CE39787508F12D3B9949066B9BF2CB91F6227E52F75372B11911C8889710E3EE7C19DC013E5E1DADAFC473BD03A9149DA10C5A6A7618475A7E981CA8054646CD2EB8B1AD9D5E8C32DCCB74B5E6EB386BB8EFEC2E8CCCEC184C627A162C6C974C7DC4E745A97CA7CCE019188D05534BBA3CFEAD28F2025E393FB7A46AA0FC6BB0A5DEABB571C370AE54FF093",
230        "E284FAFFA887BFF3E6F5D4189CCBD5C23890BCF8F6580C844B41A66CF5725615EC5D0235C3ED1CB8109833139E2B6BF46B39D11E7B735CEF9C8DB6E26614A8A8C21D9517319DF458D23DBCB1A3186BF044AD68ED64E9EFE5A5F36873DAC1EE0CBCD0FA688C819B6C58B8DD21171EF9EFFCFA93E2B2E029614C8BDD73309D40A00815E4FEAC36B2180FBBA3C3A0B1C91B8DC8FDAD258A021C6F132B1C2CB9D1A10B66D14C3AC85E2A674D8DC14C5CAF0A1C134BE72F59B0BEB9A6158CC5876A8638CE3E0E38EB2F0F2C05B5B3BE52CFEAD5991BB498FBA2A53403EE60C2642CCF4F43D1FE6858A380886AC0AD5A10C229DE5016BBBFAE7644FD9BC5F2952DCA9B",
231        "8D025B044F033954F42D3CFDD6047EF7297E8E74C0636C881ECB9E2210C547DFA10A8AFE6BFF7D064FACDC1B32EC594E5A255DEF55AA2A027A4B854F12C87AB199C656FC4860A1AF068974B051DF3D1A02A2746D9B2534BAE0606C9D8DE5DF553EE6590D4BE2BB3F06F9DC2E5C66093FCF06331EADA1BACB61AF0B45EADDAFDD711058F5D1B8B6DF60502D801DA9F14FFA6B763C8ED7DE3574BD5DB1021F25633DC2D074F65BA6779301A65D4060FD5BC61E0242605138F1AF5B6BD616191FBE973ED4CC9DDA5A3EC568B20FEC0132124A61164FF8DCACB77DE12589D4486465892CFAFBDEB2C8762BDE34F7ED2B6DE5AC5433E42E7D2C8C92041BEA9674E449",
232        "A3AB318AD344AD5D7760D944109D48E39E9EF52324E84A62C0B6DB1F177559532AE2ABE15CA0D349D4DFC0844EC651BA140377B768C6AFAD1B9ABE7AA28A3AE4AC5E7598AAD33B1A4AC9C5B13BED4FF95E8DA20A4413E475D1DCF9019E7F731A483F904072A29E06F0CF5D60606BEEE5FF6F8AF6F9F665E1957CE17E084176E53C3D7BD85EBA8AC06A8C284E9A1C0E2A50FB3279F25C3D63E303AABA15DD7447CD29779B34D87B54A081F33408558EBD29D7C8F132B184D497E7CC351B00590F332C89BEB892B0114C74A731784E5A314CA90CD91A59332F6661AAE277B214536AAC188E7C85F05A2EF334F554DADD719136B97C4DFAF68AFD90F9D80F703C77",
233        "B3DE009EDC3A31BA056414FFBDB5BE309898802EA665C3A3FE761965BFAA6F05B2D53542782AEAFADF8770F2EBE15E097A61E784C92CE41284037364712429081617DEFD86FF1750B935068D03173533186D257A9325C1347DFAA972E4117212136C687A12FB00FAE79B59E3700D769E8FA7949947C18C1DB071924033F27A280113C8960BB82542458DDF751100D220054F428AABC13BB79DD7900DF4F78E9695E9AD334F34E76B3912D8669C97CEFDACD4F4E3726E8BE64B47E3C90416934676BFAE94C3BDD49C3DFA7A9DE5C5EEE93DAEFB2743820033AC94D81B2106E983EABB33F930091E25227BF8B1D61CE0E2516EB9F2F9E20370C338692A883280A5",
234        "DEEBCAFDC41F90B5C7F02893D0133C3D8A65AD330583E244F8C9D2A8ED4DC7D428EDC69C031CEAF3BFE663CFAE1AABB4A5F15A10AD5522C0F0D72AC2DF5166DB25E8C41E5AFF367FD02FAB03529806439D385F9469CE1F679E452537349D0B29729B06FEB9E06268DF641B365975779D8A2B7FB49A00A14BCFB03A61EF2216FCB6EA64AA32C73492CF820269A22F2BC2520D08D56F43D5CDC677EF818A161C5CC25C97E8D28E218DF86A586EEBA46B2F277201548595316280A6A2188166C8C448FE5D84B39C80BD80CB80B798BB39AE874117088EB8B8D0F44711CC29D0E34C569A3663B769C9E0CFA9A1627526FC303DA8C8C24975E35554258EEBAB16C7AB",
235        "8EBDDC7FB6B31F2931ADEB9A13F0BB400E6B527C8711CB7E31941E97C8F9D8B58DA8916EEAA0319FE730BAC60B6A9D64722485BDAEB42659328E63EF3F315B7A1A2368CB820E9AF1C9669E7A3112A2B218CB50954EA89E159AC102CF100B19CE2F8158D6EBE8FF50EACAD3BAAD6ECA5628ABAEC74AFC4729CA1303F954D3AF0C53DF5931E284568C447E1A826FB5724AB66EAF9749B768D44C2D3B4D213B33313DB54875D87A0739C482EA9D3D128B509D5E9C332B40CFB8DA1EFA6B2678B97C02DD7C9EF9DD174AB5C2A88ACEED3905FB2160BEC1B0DE59FB8FAB6E0FD686702BED86256B7AD1882B321958291978476998C5AD2A1A25282BC6742FEA3CBD3F",
236        "F5870E8255AD9D262E23E1A52627AA974E85607FF7E10EDB23CCB2DAEDAAF3BB7A9BA43D3EE1019A5E6E44DE2399F68E016A6B6082700C4BAB4AA27FCD077F9F671281BAF8A3FAEFE6037F323A6EF18F2FD9E1ECAACAB1564EB783B9619EA68BE1F72FC7E4F93689FD42703122F04415516CA01811BE4907DCA6E09DA5F55807514B89758756B372C92D7F4FE0EA2D6650EFFB6073CFC8CA921188B1C623081862B6D2221C19342F0DC9CE3C39148676F1CD20E65E675C5C05C5D985DFB1E34F1C4BFAB96A5825CB13F0C4987C706E2E7CB4F2710CF2BCBA40BD5BAB02B2F639DFD706D4749A0A8AC04950996D2686B6AF17FD6511602C8FADA51027EC94C0C1",
237        "8483BED7318CA11CF165469143AC832B558CA268C2E2ABE43F71394F876CD5D300517DF9822E1261C13F538FFB20A95CE2FAAF8F7D29243F490771B8D2C59D595141D6DD6E5FD2A69FBA66410A4926CEB2F97645827DF7E93FFA250E895599EC65B700178793E28403D9AC391C3810F1F983B9076437081ECEFAA2B7F6730F0733EA7A5F716522392A2D8FEA52D6BD1E2E3FB7E885988F72A4F632AC3FD89BA358DB57DB65FEDA6936DDF3463C67B60916B7A4628AEFA10174D9A758FE534064171A1199F61CF85D4E7001DE2A2EE2AEA7804C2D36129417D48ABE3FD5F0008CC35DADC6C9DBC2497B9F1B078DB5F8910076FE251ADD7FE1FF895A423277F7AB",
238        "DACAC342A5AB3965337AA65AF3A0AD114FCCFD909591E02B405AE23B11B34456D2A25984D40FF665EC662F293C24EF10186879517752B4E6F35B5EF43F4D7CAC80342F703594A7374D839947C20C39FC453F5C9C715850A40C8302FC2886174909280A64ED9C40A275F44776EDB677E4960AA7A2A70EB852ECD13A92B78DE292011C87D2BB46D38DC40F1FE4CC146354F8D4B54E29704AF43D74906B3138EB128628A009057D46F418E5C22541E036C735E7C9E10EF307BBF606EA52CCAB044E736C2A0C501381B731396F59ADD190A387EAEECFC91E05A773865696C34DB688C6CE35E10FB6E8ED755464A7B4E01DE436D614C7F097129E5659745E3FDF2C27",
239        "BB1228D1DD084192AD42DAC4851F5429215013DF71C5E264BF4A3ACA21FA610EC0FB085AF14420BBA7E299B407738D928CDCB3EA55C5F75546F94921D9187D16084C1703D93F20C097CDABF3EC950BECAC7D5602084616E7BA9204D448444C403732457A76FED0E9D09E253EAB906D455E83D6F25AB704CB148E51F34182702D2191EC45795E22CD91060E1AB1227756C2D7194D54008D95C1F9D0658F9C05BFDF4396741646F7B5A19F4387DFD4EEF0B891AFCDFB3AF907E1B0960AC3700E46BA59556D5C0EF02CD5EF36B86E88A2D6C32065CF7BB156EEF6070DB3AB7EC14192A33DB0710998B17DC3E550FE239DBBBDBEC3F0610B5A8668BA301B21947475",
240        "9803B552F56396BA3F02F332E520E951EDBF03BB8804C034A84A5DC0164BF4EA1A26532356CB2233438F9B774FDBAAF85634EF191878DBB9128F521E5B01E766B7D2E64FFC69636F1D35E8C782F795E1DC2DD184C69AD56C45DE05FEE445557A895053E5EDB99D694A093EAA40DD7B524F6B57C17BEDA76971B3B4C792AAD609579AACEA5BE35CDBE6361CBF9A06F05D91289ABB189D7A617E572DFCA259136DC55AC0316FC2B54D48F6F8814DC6DC3035DDA0D5CFFDB045CB6FF2C142EE81B4B1887D6B90D4F791267BE664AC18AFC4FEDCF0CB6B4C7225DCEA7666A3549053BD5157289116325DAE612F219257F3C512BAAE2C7DCF67EF0C14219FE49FDE0F",
241        "A14A735C54D7097D133373D08D1E44315B3D566C4A55A03D6CFA6F3142795ACC237EC73D50E8A51415133A0644B11CFDBE5051B659F0D41D9F5174FE01770F50178C84DE5ACAC509D2BA53B4490EF6814AE8CAC3079C43311B5811BE3E69831740F2C0F0ADFF23BEF140A406A99B7D5F3D265E7FAD7105DB4098B79D1E86B050310DA97F022AE506736B96BA6DCB2D6F63BF5CE340570DF64FB47F74ED2863F74C5B0CD3C39E779E776DD193F784FD8D86F4066B5E68291715550022E1787A5DAB4EFBA829497007C8F611071D8C6447A7E6272A9B45C705983CA2E1E87AEBDA0D5D3488D89ABD58FBB03FE3F246CDDC766698CF3B162D140ED3DDB57E9A2259",
242        "F9BF7A7D1C0259103E65F8B69F0AD5A0E266C5694A3AE029211BA0C95B57650DC0FAEE129C00C22156F5FF9B5D97E5626EFDC3380E2A5F1F73A01C11BF03D8FCC4A1B28848F9794A6FF2586D84D8596ABD0BCE4EFF701D128C02D97AC3D0B8B85C00341CE70D8CC1B500376627CAF64FFD430788E3F659F7B9406D83DBD1F63EBA1B5595F00B974BD05EADFF6743BD57637881FE871DB9DD59CA6BBFBD6058F79B04E472E4474AE6C42758BF25243179D612059DA486FC9C8D3F83D2126BA22640DE35A6AF5E2AC57D890321216C136E4BC433C27CB0B6698ADDA8BD83485EE041FDC9B0FBBC886DCB901E52A3CAEBCF2108EDEC2D9157072B9B8A39F53F6FCB",
243        "B8A89789AFB172FD833BEE32380929DAE471A4378E755B040E0B3A917DCBE3CF8A066A8390175C4923992D94AFE767B8107E335900B4B7E9973093B1A0C642728B29A807E38CD825D35C09CB281E5C8DBA9046339D9D27C34BAD7E49748FDA73987CF21240853613A7254594A404F6B2E12A0CF1D74A09D6542C7131CE7A3F9288B9B035E846EC8F3A704BB705D0321268DA5F4937BBE06C6930E0BA73CDDBEB9C483CE8015835257EB634BF7CD3DA820BE8171DBB8AE964541538E315CE3E62EB9C3085A1C701561B5E88733B34E0C76666B8ECDA9B5B755E6DC1172B74D8B0B4DAF1F3D58681197BA820A69C002C949A66684999EF8E4D9788EEF950118ECF",
244        "F467D68570BAA9C141D89923294A460D8CD9E3DA6748E35922BE5F12AB02AA953DE509B32229576F11F4C1A80DB4C8DDE55BCB7DAFB360C027DF6BB158DFBB34A4C7C86D5A983082DF6B6762EB9A03B1AC5634ED80B7B012EB11C5CD5B6E9F4832696745D2361874BE80D6C18926090488E49880162C2EFBA9AB3D31BE594830373A107609BFC005A6BE2BF7A6BDA7514584D78E54790B5FA345D391869D59D7EE25ACF2EBE81C638D5C966EF9598E26B6DA887BFC89D261A021BCC4A7162E03C0211B2E01FDA33B3ED8538663B6DE2C59E15BD629B42DB0E5D5C8B6F7782C8DA8586D504FA2116037C4BE9511C47F367F5D43C919DB877858C5428E67217B51",
245        "DF63CEF4D31C27F55295C92F1F737AEE7EB4D65C789D71EACE1E5EE5984E637080F092A80651750E2646733F7ED124CFA0493446541A8D2DFFDAAE92288006C1DC6B83A516EDE12D5E9A1B77943F7D9C017F69097DA94667B47CA0F65CF99A89201F8BA9BA8FAD3217855887BDEB8663D1788EF20F9AC50C0248E41C0A1A447CC720F443C203413C905DEFD7BDAD180E4C418FB728DC2F60A6AE14B5CBDBF20FA1E685F0A9B5F9A2B2E6BF47925A035B6EC06A476A54388C588A4A32B367733D62F0C94E4A5FB406D90E440FFEE122657E2AD5FA09B146459C9B745C9C1823F8EA750946EE80F77ED2BF4371C02C4DBD4E5801164156A985EF54985F309EEFB9",
246        "E42AF014E22ED921E87E4E90CC2D9AC1FCE20251828923F88F55BBC07A3D425A73175B0AF3E3464CFABAA6E7D89C9479AD9FC3908A2F4259973F2C3B797B98C7338ACE27593F2788C5B609B9BB562DD3C5AD7CBD4D17DBFFB15AA37D9D444C12F8C071105B21879258751D8DE3C129CD5A195C4D0FE9FC02E2B4437AD9387760B9412A123B8D912973E756AA6AE4501BE4E36442764AE8A8F55316485204FAC8F6CF1C799CD268C2B60607CD7D4EE35B63B3D04CF14EC266AD2947879BD29867AE814F1AF1FF8FC84E7FA1F765FB9379ADF4D11F66496409DE875ED074BA2C606DF636C30D041A67D4E97D5CA97D1F781ECAF25A809A7AEF12B622F351AE94B5",
247        "8D154804D75277BD822A502C6F234F33BB72A76BBAB14C3351EC88923266920E156092FACC6617C142B78392F6204BF115095CD7A448548E30DA181144FFEACFCEAA2A199EBC4F798F23664DC55FF62DBEBCF88142763565E24D7D951AA6F593213570230AB4670621B6727E3DDFE3E447D9300C03B0C68B4743C36CBB3BB7C9F427653CED9D249AD28BAFEC9AA6FE6840820024DF5DF545B56C4826CE6B26D1AA29C26340781DD3792779F0D8A58A8868DE46BF39A94F082A8575AA9BCE9034436D77F710BCFC5C0289E9C93745999360C974AA0B6BCA3D0E9F07E4B6D7DD2ECB1C1E4E34A2F8FD13A5670B529ED567CEE3EF5B8A68DBF78C84EB47119E82EF",
248        "CB0ED7B5C3C985414645D15AA503FD3832D5B966FC11FDA226002B8BD9A50DE7A6431155D8F6283BF1BD263A14829E1C6E51B90630A538B94654A9E0FDA7607B29B9513EEC3FA9FCA8BB0496861AD2385E0ABB8CFDBC4B8EBC6121BE43E345A1BB7958A187F8108A9A2741F396C42A10BF7164982E4E45FDF606C09B8CCBA71953F531CDCC665408DEC00B91BFBC5A73EE1BD926A7350D53F7296E80CFA7CDA1DAFE63EDB87895F4ACCD2F1B51F7EBCA8C32A0CE5E72CC7EF62C9CB3403D1BDB0E32AB4EEC1890C6B88028DD55B2103BBFE599406632FE3A787BB23CA9D883C8008D5D350F27E9603893BACF8DDA03BBDD3FE2927C9E7C1E439590BDFC92DF07"
249    ],
250    [
251        "C397332C22F3EAD66C384C6E146473414EE1A1653611056B01C49BFA01F76C443828C84D94C7D7B10DA8461D6F9B4D33D17A08038630F3D47235911DC0505F75D658E7BB8EF84B47ACCA8B2E3F70AA063C280020AB89A9ECD0525EFBCEDBC87E4554E5BCE3AC36DE6E0558BD07BE45C36678A40BB362D49A773E94D806F57915",
252        "E6E3E5B002462F97E4B9F4D5C2D5121AC73EFFF82FFC58D9B85DE1AA4FF40CB78F09FDACB38D6F489AA419869CC3B9160E3A4543B7AEB9B0AB28D5301BD7C8461E0EFA08ACBB0518C9190986C0B87CB57490FD438E1FEAB80134E80F1C868802A3F7EC13F9FAA589ED455524B913B6C8DE9B3F3945897B4C445BBDA6AE462617",
253        "FFC47E0889655FB50BF6FDE688B32B1415F2184831613D39E679C5321FCA8B39A45D1368C05FF92BAB4E56C288F0748C0A489C9B1C6937B58B49F8D6593D72A14B1498C8A734386269EC16F37A18340253B954A5D7AA755F07582295C5F588B11466948E269D63A01149712D52832FDDF457C39EF746E8A5BEA4D3B2CA7B8EBD",
254        "9FCBE0B9C9C97D148AF3DBB1E06A74D798E8B3042D43238E6D42CF2C54B710B59AAE2DD4B9F03B6428899C10061C8D1F70E72C45B372B8BC3E5DBBD47B57A865F2BD3FA417E671696675B64D9F35EFEAE0EDFC36BDA3B7CDBDA02A159846F0ADE9493DE618BAC47C47414D5518702DAC68070A70DA35FCA82BF362697DA3895F",
255        "B2958B62F8B403149D522FBEC113CC6A3547DAC22DF5DEB3F36E6EA0548FD022CC9B52C96C28B81464000CA51A9B4880550AA1F15F6A7550DDF1E09D4B8BB7212AE65D8B1CA5BC496305431B1FA877E0CEE29196CCE65E3A5F8FE605D76B9F64A6E342BEB8603BE3A11479930913C4C2C762AB8B71C4F355D299365E043E6007",
256        "BC8009FF0BA0A5E8B8D937AE434904AA5D96DB2B8236B582314DA2A2675E190C1A982AA641383FF1DB3F0AEA18883DAAF579F2113D004C2AEC55A418215C6B5312414BB2FAFFD17DD8E04A1B1938186051FC1F98FCC4D5672BDCB64A45D9826B431AC4C9F5EA8E560403D7B3E8FB26A0A9EE04B6A1EE12F1CC67A70322643347",
257        "9BF6DCF23E83F44C5C0799D85F8EC177E9A5629861380219A15456320D84656B6D70EE7243E3C4948F53ECA8C3060D92A907B0183F899755664BBBD2C3077D57F184E4A6D5AD7292A42A2EF46E6E1669EAB684950558C8B3EC759717B92645E3C0F33B249BF0C180BB893B74FB292F8D15E8B44A64DC451B7CEBC439FDC229B7",
258        "9FA6A74E3E93895460B03D2D5CA09EAF49675C951DBEE057995666532CC1B912E82508F3248B499A9C0F753BB542C54027B4DE8C249A745F380597C181E4FA20539D11940421C9DACCE4304DDF761F89BAB8AB730FD147329E16F2A8E4FC324676E905CC882AA59B6C0428F85FE6A9F1B950A85DA715E4978970E7BB91ACE2DF",
259        "8FDC5EC2C88F1C020492C3BA79C454177BBF49D9F0885CDAFEBD5364D1D8ED1A8A00C4303AF1CE8C83ABF01ECEC1598CA27DD27C40E4F1E06F7107346465EF284D3F29EA468A1B946335560290D55E33C91C854D83E26A2D4B26B2ECD2B8D1006A10305C9157944F6D2DB0801BECAF322C7855A9D97CE557D79D8332871342FD",
260        "A37E343F7A410C94DEC1BE535BEB666B80A05587739326F9079D91C7DF4134DBDEDAA6B84EE5C250ADEED1982CAC0CE8F38CCA8A1101C46843F330EFFE68B1122CB602B78DAE9BAFA11D19A5934361DE10323F7CC090B8B314BA22883A9C3DD7420CC7BCE6E3777F1CDAD4CBB4CBEFF8374CD69A1CBB5B481A5E3CAABCED3EDB",
261        "ACFE6D3393273EDF90283F2FC561EB01F56AB5C601C6FDCC5CF6DA1E2499069EF2535396F190B89636AE2A093680DD65400EDD792D3EF515DFA245CA0F0754EB7C2A1A777767BF486E9D1875340FFE2F3834A3CFBCB38ADE887C30791AD557C1374EF76A60914F9BC42D831C24F2C28D249EBFDF2CDE22BF640162861085C565",
262        "9EBC69B41A7FE226C812D6EB0518ECCBCCBFFD00CE15D6241D66EF1AF7206201F2D752132B1D75B4D1550EB937E5CC364E5933725EC15E842D897645BBD9F6C35CB46FC3E3EA9CA665E5CAD8C93560735A8BA4C02BFE5CEC2AB625FB62447A2111BE3E634564464A944D998EA8D44F72D75C3CBD2FEC7920C49E4FF30034EB91",
263        "DB795DACD8F092AAA4A9FBE915ED2BACC382AAE9D63162F7FF6397D969C5D98497D22E75C2F6B8B3CD7EAAC42AF24133DB4626F3B89B57421879CDDD761515EB086E67B31F42B05D904B3BA3C23DFBA1127B2CDB1347B9A3C6D16089DCCBAE35338F4198E4E64972056EE7705056719A5CA25A5F118D21B007AFEC78B82556C3",
264        "B68EBD150E46E27474872696E40C45F5CC18ABA50659CF1C97E21F67FB21E8D3E84A96CA202C55DA4AAB952572D1A2BA20ABB8B087353231FDBA6AD14B0E8BED9E9918335FA5A5D63BA1417A8645872715564EF8D24A82E7BFE1B5EFBD500B76D31B3A29EEA52D19A814AE6484890FEB45258D80D1DA304A97C3DE28DCB5D783",
265        "F8796A2950E818E6B050999BEC3B6EE11D29981D357421AB67E99198159A05AC7BC4EC56AEE8C8FE9D3FF9CBC00EC04382854261122AD8DB20C697C6961D231F3766ED3DB3A474328081615304A7A911E3723B608A9F2D1871F532781AA5DFEB2B5686EB4ABB2611BCB4F84C073F570F3D684DFE7FA528B477FEAF78404AF62D",
266        "EB9AFA0DADAEBE7E97F388EFDEE706C73D09406BA7497288842B36A7CD5401F38FB8BC01F0EBFCB781D2AB13450A6847E9CFCF60546A3E210AF03024096561A6D8986CAF2821772087984F1623F1417B1EFD1E679D2DB9AC02F5C832630B305BA2B756EAB5957FF133AA680A9828ECC4AD659FD511663C3EED0AE3E90D0EF843",
267        "9D89EE4F6ABA21C6D85DD10B28899004009D916BCBA917F658C7A48A964A9A5BCF2A51DE703E1E001BDA69E949D184E41F0B695764DF31DB2C522D245DA589492447D6C52B9F26EAFAF44E9E1642FA8E092776E9E10F19BC8B011D510D379A2662C2B6ABBF758A024428ECA98618C02F81FC5AC2D33CDACDED097F18D4A18E31",
268        "AEF6C1F537541B2F6F8EF547F4670681BE60BA9FDD3AA638412D50276A4E6A5724CB2A54D36D03C65458E75DB41327D33E8308831305F57EB03941D31C85A8C7CEECA9AB83F2FD6B791AA86F7F59836AEBBCA5F79421DC54D7735E5EC2F8160FA18F438124719F40FFF7A0402AA3B1F8F0F7D40AFDA98490ABA679D03D6DABE7",
269        "CAC293531556B49DDEE41C1F920B244391903916B828EE470A82ECB257AC85DC97A23913B4D4C63890BD0F1111DC15708F7B671DE985215C0E86C6B58AB683C5DCC8AB1CFDAC46DE86E330EB7AA608941A1AB320FC7BCD4FFC25C8D39406C362A13C838EA4E801E3AB35B3BBE247D5D6DF71E18C0B9831AE7A9687C2F06912BB",
270        "E0597942FE53C9D4A6CE625E9F5EB7D740C37C30C8CAF846286CD104FD00F57023315A2B914E61CDFBAF89B7599AEF2A0C9E1D51245E863319720B1F98CE5960F15CEC4832C8280825F8DE1E64015A2A24AD9937CEFC6285FAAA713113DC4BEDAA82ED5A4FEFBF8A05929ACDA527673E8A7B472B713FB9AEB16C73969B53C0CB",
271        "DCA4474F07B67E89E77C0E43ECE9FC1D526B5582A14C383C5868EE5A130DB6079B41BE9A189AF7B62996CD300C30A71AD4EC5F01419599D736F2AFD2AEF65D54302F02F790ADC4F1F27DCDCF53B730A54C7EF9EC13CF83D78B2B9FB1DFBC1749811882DCC12E569D1A8378C4F2E00084A2DFB165A74A330C1AE2858351E5FF79",
272        "B77D2594D67E8CC2ED83C61A79FCF88867CE47C00FD3E33D6AC7120EA70D64F6F797B9728CDA2BA78E51D589BC736EBC6A15D0A5E8ED4E733548D337CBF933E077B7F89249A4C852A2C069A2D9C620E4D6D34AE56B4CFA89A38B93D3AB2ADF00EF0F692AD37F9B74CC5A6E870B450C8A095B23BF3EF636D1215E2FF5B97E6CAB",
273        "F985A79A10491FB690DCF5324C9FC692CD70B68E515A24AAFCC2D3ED01CC61A51DD5D20467B3948029945ACB397C298E6E8EC8C2171B3E7B6DC1F5411CE77BC8D1FA2F24B274F35A1F34063368E90B763894F02B398DBECEBCE76E4D7B4DA7CFD1E71CB2F28564E5C3FE7A0D881187A252FE8B11D0D802B31A637084D8B8D5A3",
274        "D395DD283A3CBBEAB23B8C8C3FA10D67696FF1227D716B58F3337799A3D9EAB55A9E9A68C4105DB9F6206A8D93B1460DA2070EAC2A14182C277E06B0C558E7FE8314F2725B87FE0FF52495169BB78CE4B28C57298EF3ACFC79A2C0E749787DD9D2ED9356E69D1C3021887A49C416FDA27F918A8CD4BBAB4CAD607C7228458B37",
275        "8E6F6F2B79C770D351F0471B08C36ED54B110991C29A0CA1D2A2A3B91B048EBF14DF933B4763D82EEC2B503DE0905DB0AFAD78338A1557E59656E3B0709903DF90949393D19032EBC9D537795D9B8A47B4D49B7EA3757730B4EC45CA2E54F867DEA7469694A05CAD60FA44C07A61CA510C11E5A4905E36EE48153F17B6B561C3",
276        "B3340398135023A2E1C1E979EE15DEEDC2210394325043CF187646FFFC9C54756EA7BD6B46981ACEE1101FBDD95E50D1713E7BCC46AF5E343D7F52E801215301CFD678134CAD3965DB80030CA859FE9A35F917B97D9F00E6C53D1DA58CFC5D46921D1075C2BE39CEC97D673FEE2ECC8B5C387ABD8AA48FB3A9346CBB8D8CF75F",
277        "D12A243E445C49F9C5FC602B96E51FD25E28B6E85D07B206DC31283348686A9209D53BA2D2DD7D1AF42D8BB41479D57E8BC112BB086AE2B2520A9295AEF375FE3D24E027EAEC4864DDF850FE524C99DD4668A2864F16D6395019553E3C608B329337DB802B385B055D0E0D71CEF53766B64F3A2EC9411382ACA5317A164599D9",
278        "D44F6BFB1A1D23804EFD62C2C69A2F3829D1A731E36A4147E1B0F580352D0D3A70FDCF651597C0F7FBA59E3EA2690D016E45AC12A08C96D20CE9C7B25925228D1E2EA9992D748167B36E317C58D231F86A5F698013A927C8E84C79C85F75AC1D4385F6DA0594D171807ABEEEB04D8F4BCCF4E32B2C1A9E5B829D6A95A567A327",
279        "B0112D97990BD78BAD4A09F902D5E0BCFEDA15305F974C6A7ADD0428DBDE002297018D34FF3B583FFDE7C468CB21623DACBB5D50B1C7BAF015968676E44D5697C7FE32D5607E4FC403DC85993CF80FD8F688CA77BB5E79AF2B790044044C5C4C64A7E25140749E95BF0FF2ADC02ABBE353232CB3CAD3B5494A0E9915F28FD415",
280        "A50560E854A5FD2562C9BFC5522541F74FC556B983D4AEA23C1FBD1B00C6FB79FB3E5E993973F9EA2C1A5177E31011578DDF452D592DF89F6BBBC618E18A1EA18E7A748E4060B90F1DAD551EC405753FC071A61EEBE86043DC5EEB7488126338E1F7CD6F48FF9B7F5118DF72F77708429EF0B079339FB6DC260BF36BF62299AB",
281        "D437286AE74254A97B100A2A540D58E35C64EF46545BB2325FFD60D35B1AB2985EA497CFD140376D8F881485D2AAD99E751429BD4DA3DC59CA93B098EFFDA80651626488D3EC6C7395167972959594094B0E67852E4F55102D85376E1F295AC4A48ECC41956EECA93622762D2C6CA2DC53493A611926D05292EF8F7B50AD3483",
282        "B3C061BAE49FFE0EAA62E9960002DE266D404215BD37E204D91BD2D561A5D424C19FB943FE4EC8D3FAF42E79876B4D64B30C1C126E98DFEFC132D45D38548CA9736FF6A2CE83634E7C653D0CE0F31138D5E9A9F0C68E876C20A5371B9AC44BC24AB69E88996BC2CC87BF7B64B30FDB6C1B4EC53431CE9F4D90CCBF9ED163C4E1",
283        "E8578ABB703275BFD23DA020E016F38E2417E4434149625AFD418F5DC30B39A89E52DA567AEAFB484386254D5FB2F17C6F76C688213DF82B0C3B53CFBCED079595BEDD0F18330B6B8827215EEE683F4D4FA0F5FBCEF8D5BAF1456C2D7A4BA1C0CB04989CE21A7810797593F31AA20BBD7F9858021E7AC35036C319670F4A3733",
284        "87B363DC6B821776CBCC5A438E751F18B7FBFF61F4FE0E5884ED6F33376C2A5221EB8DDE6656D4DA49E06E26533965201744F15E5AC4650E2182E4772ED01407F97EE9D38CA2E6CE0D1A20A5064022C3CAA83A246BC02DD8A31AF2170E6EA422FD06B5F5071275710F2C58C468F00F832E564C0EE85EBA1F90F278E1F99BF8E3",
285        "BD0C80A0F158A95ED58C912E7A3384C34F337DE337C0AD2637B274CBB8761430C57FB81EB1217ACA052D22DF9EF8F7EA15CFE8C9DCA045869921E9FD6969BB6A2C6BC52F6B9CC0FE3FA495071695937949790F3CD8AB796AA003A764F4B90AEC1295ACFCC909665622AE73E0C7F731E880A3C4B6B3D89A200E3DDE9251DB6B7D",
286        "A74FC9458060876772200C8426F1A19513B1245C33CC769E89FB85A5717CDD8AA6AEFFD4F8856B7CB081AE8225C44424BABB7781408DF9AB8848C2507181DDB86A5A9F16072AF4C075156A6AF70D828F7C9997F698D96CF68888559517E13187184732E2E144951D17317B3937428AE6C321C9BDA6C75F3B03DAE670C3C1A8C1",
287        "AC12A35FCDF6BDF9A42E73FD2BA6AB3319E99BE3F09729C4B25E094DE630D6F1D6936E0D1B799251CE2A58FF4DCC6A42E20FE60559B3B4A0DD3DE03F20EF9410256C6C685215FE50A43E419E172C9241A4FF0647E5345F88CCA0F45AB0499BECE40DA09DB4891E64CC04968C4D9EBC693C91248339822B78326983679C0F5683",
288        "B1B8E7E7F6C585AFB369521EBE4658E3811B8FC62BDA14FD0B309784C700EEC77DA489F09346416DDCA890DDBA7362074D073A7446C48165DF060EB10194CCE14A19091315527BED42288082BD902596FB21CC9FAAE73E2BB4BDA23DB8DEF15751931C8D57954A6B94A99A86BA7BE4158C7388E4E0D83B757EA05D65A2526E89",
289        "C8106720D28480C1273BD107B645E2D62E5225F472C9D8C042EF4BF862CFFEA028F3258880CDA41FFB8449B1EF2B29E95B63790DE8BECFC131395B7260F643EFCB858DAF7ED9B10CF692FB64EF32A005804E0EB4A0C6C66327A40C85187AF30D2C50AF063E6EFA3A2B2D3C20B85315C64C2E1C1BC8F016C8AA6F4CB32E5D689B",
290        "E2A117B1DB050F05CD53879E69C6761CD50C240F5CF720980D8636AB5B113B8AF4CBDDF5993F647CE260A67B934252F2D81A7CD1396A11C61443603C4E51B1758A9CF49D503362C2B57DD371FEEBAA0B473566FA53B5B3EC2349BBA2096F8D872A17AEBB0C7A15588221B185AC5D938B483DF88C659055F28EC439A469B0D7CF",
291        "C5B95D09CB9D03FB85AE674DA53F35C01C64D97270B9A685BB599F3A083C4B117230405C4A62A8A521DAC14E36E6AA659E6B7BE7A148510EE2EBBE6E995CD16A583580D9F9B9D3B56BB1D1BADE2B8BA72BFD6D618109C922C69C9AA0610A7B222D382D1D203D13D7625BA9A6F8E4562833156E39AAE7C59FA76D3271B515B9CB",
292        "91AA04ECE5A7DEEBE53350484B1E4B529DE79155FA3979F262C0426287CDE395B2B15622751B828954A1882D7191BC2F193476E61E2D65F2996DAC270D8464689F6DF1A51B8D8B9A35A0DA99716EEB51DBA84059903383577BD36278AB5DCE4B7E77A943DE6DE3231BF15233527FE920226BF2F973CBC04C62D98BAE56BFD669",
293        "CCCC0FCEF87B5E6CCB28D7EABC239687FC87A2DD548BEE54AF6B90D75589858FBE3165345DA8A994CAEEB6880111D2DE550E545811348873E526A6751805CB94FD1C7209E899C5C9A31E2E535AC89ACF11CC8AAD04C565095155BC8245765465B8587B90CEEB8FD0EF51B8EC00B72DC77BA0B3AFEDA3E36E8F7CFCD170B7732F",
294        "C16D86912774A9E99524B3BDE0261D29D9DFE58D61922AB9A6F309806688DAEC94CE431D6A24D0E73011C4281DDCA1D20EE143DA89468229FF041D4B50C0204D5635E0EB228E6010DF2CC2964AC6226355FD6EAA345844D639936C86FC17011D283679CDD032C74F77E45D1C69E50C02EA5AFBAB17189720A1B7235EE6827649",
295        "AF5D91F4350B78B2B2344E63E51A741A10CECFF06B595EB409BC84ED893DBD3789401BC6C15257F0E2106C7CED6B95AE68A013BFA81D0792A660AAD4861D7EB6EFD3BDF4954881989F0A3E08B763226BDCA6EE7C9037C15FC88754C92297E23314CF1B861564556FC2F98EA3AE4220A6E2CD94317FA39305FE85E3ECBAB9BA81",
296        "D73E11E8A02214CBE305262BF8300B99D80CBA65EEF239B1E2638F5BADF58F7907F827C753972C63B13142D209061E9C3C5C420C89BEEF6AEB1D83529E3D4EE2965A31D90D286B87B4A6E72BBA383DF35A81DD09B64DE065E0D848A530E646A44C4091102D421793D3BCB6EC8BA7D18B593709A32B78A63A4C1806DC0DF34E93",
297        "B5D6110C2AC521B17C6629C3CA3988296B7A61E76B1920A7F43941D5791FFF5C653FC968377569ED40FC58F73537EAC23270390AB8B4CF23A8C4713AA9B72896AFAD6497C66E474E3FDE847E8C52AD970FD619819910C6A79E797ABF76B9E7E05CB66A5E318D6DB2530C4897B61B883A7DAE6ECA23C171109A3E4D7F7EE79D09",
298        "DC456EB07C5EB5292BC0ED810849DD81B56D6DF723EEA98C1E63612C818029D56832563E01857B197B1B50282B396DE6AF60B0BB2E6FFA05D9D53A27AC91EDFF48EDDD2F76F9C92374BA6EDF40D27DB54EEF5E754A74E9E39F3BB25BD178CA25856FB07160CEB5E29F715BA03CE9FB2204AAE572D87EA641ACDD0B4BEDACC9AF",
299        "925011DE4326F0980E1255EE071F1F8B7BFEEDCA29642D08CA38B261804B97A5D976352C3FFD23700AD4BE68C35DBE02CE7D5B6AA5CF06BC82CE2ABDCD68E4C2871E8EED946B42E27B725273D75165D17C7AED2D21EFF7042DE782048AA135C5AE4BEE01B693CA98D5AC14FABF188A1AE5D352889BC20657870C5895C8D5902F",
300        "9E0F4A1B16D9D70F6E74D8B4CD6CA0ECF194376FACB3A8A9E14ACACA6E6850C96FA1954AF1683A15350DD199BAD8170A33D1BC4D2C24C1424BE36AA549FBA13915C62C28C177ADB2BEFDB1EDD68889D584C6C5460848C2929E8215FED0C4BA7BD6B2709482F4433F1B3D555636B1288CF1E205CCC603C7F968EDD54EFCF9721D",
301        "87245D3718016C13D92105447C4DA48DBE80D2AA00306804B10CEC0F57672A27C1DD0A024B5BE05622D07205B01863970F2D0597192AABD17EDF9799369F14DBD7DB1DAF37748AFB43F265B47F04FC45C7A4C2B0CBF334A8F8558E1E73C39C0D83FB891FA057D4EF327B805C66267FBC965C659BF3CB4BC907923531247CA4E1",
302        "AAD5632C0E7859BA23F079C39A5BE3E3BEF4F09FEC96BD194AF546B32A7380860CE25A45DA9D189CDFB27B4835D3813B798855D0C85985A1EE2E62E6824046254EF2ABA2418BDB3B5B45EB7AD69FAE01D82C8B8D746AE401E501138DC39B1823B3E5237B6F6F2815B6AE47FEE886A938C30F692586CF08EE09EE75FCE1A4CB2F",
303        "FA78EA98161103243CD6472D2C02F3C507DE4401D7221A46BFB2E5F9D7B2161B1717A3C5ADF7841CAC56236DD398689778E34719EA11AEAC5E8F9130758AE3D73ED16F0FF1CFAC12C6354D8A1721F35CBAE019C91E87032BB55D27F1F140A83660751AA658E1670FCE87D7CC98AE6A9C5100E85479E83F49D3A2F4B7834C06A9",
304        "B3C7AB1C7F77C547528F3048D9E0DF71AECE7E56E2E007DDBCDE687D5B70225E40A8F8CE09F39FD32734A1972EE7CD9B97A668BAC92236441C88A1A57D0EEB03A1EBA43A99C49438105B3AAEFB9270340A8F9BDC9EA219FD12108794BDFB35D2299079529DEC7F342F103FF696EC48A47AB98F7A7DA4DA15D9793190D4DAF337",
305        "A079AF62F49AC73373CD44DC5232D3F18D15FCF4D1DDE48C927A5680E3C63B744AF6B65042F83F28EB717DCBDC9258A54F3A3684E491E3A54B4C4D6DB4589CDFE8094F6E9276A6E661BD0713F4FE82BF2919CD78EB93384293ADB19449C3986719F98C3E685AE84C1D13347FE7559F589A679A862698317AD5C6E0CFFAEAA1E1",
306        "D8C3E8EDE4EFB4D64CBC0A2DDB5B1883CE0A152060AC225212690B33978019338D2FEF228AEF85DAACDE945A7ED59D55FDF2E156E1512CE4DA96FACFFF2381E266D76B9D154F76DEA521E70C3A052349FD820A3F8575FB34AA8F7A2D44A3F1BD05ED1D2A788BA75C9559ACF9324D66A2F5AEB11D2E27C683606BC231599B1CA7",
307        "88AA5350A8598319784540645CAB484CE8B873B205AFDFA28C932BB3BBBC717CC3FD3894EA018B1F2E136DB3139CD26680195A242CDB518AF1138DC74DF2F182C850A48498231AFF79E7AA42E0B840E75D449231E8651E0D8609D184108C9A7F0E0B924216F9B06357EFEA94FB65C8FE76691331EA5D09823376C06403438C19",
308        "A26C149A84E5B9B4A3CF6BC6FE71F8AB544EB10ED37AA897EF69EAA6423450AC52B1B078C26F1397A7BD29EBB1DEE4F170E05F28667362E896BC8050CB6F3446DA8E6B3B38F22E054600EBE8D1326BAE6BBBBD752F23E88D36192F4DC29B3B862C1763A9274525EA708694150876540519875ACEDDB76B8387D52843B657791B",
309        "8F10FDDE6DE85CBBE871B99349FE4B4FD0CC2232B4FEE3C53BD4C97D88B1038517D7D07452789167840FB406AF8120ECBA0063D5CF91D90801F87E537C72E476D0D7607E226C01376C28CED9BAC98377B821752643B011CD0C559D990516F294ACD4F3D07F153E7099AAC12100D6F01689124F61159F754F09622DC0847E1535",
310        "A2025F02D48BADC31D486E29A08223ECABFAE04FF7BF2C33FB24AB4735F828DAD7FA8B182380E672075B6FC60D61936BB30B71F9652A6AEFD1FCF97A92AA2C64EE7895A228D2B0A4A865C458B2E786372325BB80ACA757C855C0B7D0A6842507C14A973889D6497411343E6737814D2B03ED040A0408741E8C5263D836161773",
311        "BB15C62B0516F2C5360E60C1AEEA0AB3722012E8E9BD90722306BA91B019531E67261F1A146052D339F32722B88C50B572553CBD1D057031B5093856BA2B6C0EF6C48671593F2562D8BFE0E3BEE4A097C668701DF061C943F5ED535536167CED5633C189C2EE779D845DD8EFD3A49597BB2F26C4C95B4F7A9184A2546F4977BF",
312        "EC2EC0ADE4ADD308E5B765D96752EEA82F1C5F6E0BDDFC59A5307D61E4B67CDDB917B0F0A96C731568B1EDE8A154E28ECE885DF69A50B3A528111D192BCB59E7B661C4D6094B1F6389E3C14237EE16FF3B1DE64E09DC001D356463E47957E6F8C20CCA238A382B0481AF7379A58E50580DFC4C135A9EB8AB24A0F50AB00AB32D",
313        "EF1CEAD50D6F1EF9778A7629CE5E6784617D018EF9CF364DA9199402C734B88EBFE71784E1AED1EEEC7F10A53D892A7C2A8DF90B3A450082927EC96262211D94E4F23C765A6913AC70201259492E991543485157757459BEEBB54A6B4D938C2AE815A30BA30594397BFD74B7EB2392347165BFA12314BCD1370D137E0BC75E87",
314        "D5886F6C8B68F522F40DDF5844416C5158AD0AB28122C239696CCB0218EDDCF9FA6D9A46772816E3FA3E3C96D4BB78532F6668A3FD5E533ECEF4C661400197D6D021FBD8EB719EA3543D0AC0E3F3B54326805073C90CEF9DA534D7D69F7362C985BC437F74B25891C0E24C14962D9F525F19BD9848C0422387426725059C4483",
315        "9FEE38034A604AE49B6CD2AE9BD17FF50437650E6E67446F2667878B8E1945818C9EF7C6B957DA5FCAEB2A3F422F68641E190EE4ED7A9672CE91BE0E9AC60820EE2A5CFFE62AD16C8BD36DC4889BCFE33659B33409E83B37FB8AA0BBA3CFFFD2F2D5418051387B33382083C356421B70A45AEB7E56A60979B816008426BDDC65",
316        "F2668E0933A7D3CA19A656A6AC620B409B7FB828B53EA7D97DAE673F517C509F45C0171BC329005A0A596A40FA7C54E656291C5C06E7B517F4C3B750AF0AFB2501E3AADCA47141D34D334DA9CE989D1A71C0343AE04D3D503146483A87C26A216775689BD2AA19D59878F20385C2347B1703B12731429EAAD136E458A64D5561",
317        "E49AE7547AA52F64A4032AD4A26D8DE2CDDAA62E2AEBAD7487979011FB25009FE63FD14D5207C2E15339032CA1EE9A6635887AC385974E3E6993FC4E7E293D23B72B436823CF00BE9041780559CDAE5A0841604F29828BABA2039578EAD0B4F20F6320EAE3ED3E0F7B05E426075CFE504D9A043D19E5C12CF20FBADF1DC0DC3F",
318        "9F6674FF25BD7EC0BAFA033B282E1D671F33BB4C32C389C75E3660247194030676138D9BF9F84DA4954F624025B855DD85D2362FD88DABF329E282D805B7B3C7E862CA3031B79333C66D8086A3379D0771B5B52644D6249931B7FED13464671402483E499BF611CC10E30D47AA63C81518F344DA1268E513C19D246579AE8F0D",
319        "DF1E305C26D9999C63DF98377F9034A52009AA720FF81D211C9AE2EEAB6DC71407B74F85B7ADB4C5A46D97EFB14DF0B1D039EBC3358026AD21F896A5FDC7E4EDBC958E53794FEFAE32CFFECFB214A676AAF015E9F8C2487CBB46DD3F2CF78A738FAFD7F73D7FFDC0B3AFA50E3845B7A2C9643C50CA64B7AD5452B5E9ABEE21CF",
320        "9D6B5B7FC602DA96D67CFC6FF4FDE635802BB263322B7A1FC1B5B404284652E6A2A2BDFC36F5EEE0F169CFB5DFF68C4016243A273E5E7C84188C6E3ACCA12FB597A96AAE18E5D2B602F019A993BD1312315A52DB26243378B6F7E047ABEA9202DEAD436094EAF09C498E968666E594B0016C8B319E487E8858D3C95C2A9CD853",
321        "C00DD87B17A7C0D332853DB012D1D1B05C6214BE03661268DF8FB14B10A064AB768C38328F66A8D2722686E83EB4F7EDFAD661DBBA0964E23C70E98BB668190143D05526F5C84B3363D594D5EF5FA8508CCD060D0B94AB713561F8838FA03ECB2221988A39FB083CAF6A3FDDB3B6E59374DFD325458FD79C337D55BBF93D73E3",
322        "9AC8785424F2762C1BCC88494E7FE0519B5CD09B0D7BDDDDF85919BD9EDAE1AC123972A9545088636D311D47945D54E9E8EF0E929A2FA87361D445C1E10362EAA3747B7E27FC4CD77F5D0C29723C418825039BDF321774781CB1D966F2FB797815F4CA9032FABFE3044975A29D132027759BC8F46034B22CD7E26E27FDCEC93B",
323        "E9EE3995DB13E10DA734846026FA656809FD3AE5E9D80AEA86B759E951BAE4FC2DB53D3F991446634FB2ABF2CA9A242DB42B41B76F64DAD6A610A4276FB32C79C120332E335F19E34A7C476EDCE433003A3E19ACB51A806D6F797AF6599F14CD63FE56F87865C44667BEC071BC3AE601349E161709CEDF29C0FD2CF50B521B81",
324        "A347585D86076890D0B50988448D48309944D91757874CE3FEC9AD52AE6C2C32F9136E3E86B6D8B5AB3583C15BBFB266F7BCEAC8A61A51D52EE044492F446EDBE9530EA6CFFB00460B882D12FD46A10032FC7DCCDA983D8E2D1973AD04745D66B399ECA32CCE72D42BACF4053E90B96A303D01575E8339409207A106CD56F3C7",
325        "F71154DE24ED8CA8C1668B28D43233F5E1897C2977D94BD68856393D838374C52CAF4845D6CCC3B6D61DBB926034D69DBD0ADDB8D82D3B8B23F6FDAB4280191CB5E45A287251D3E7CAA60BF91C128AE642EEA32B4B87F5D1308CCAA1A7547C10E282689AB09B0F27E5D097824ACDA52EE8D95440532EBBD5E59C9CE76CB35DB9",
326        "F219B18EAC478C1B41073771F880CD94406A93395F65FDDF13D0766FE4BF05612AC0137760BF1FF42F6D884C0A484F4439AA1CCF9046E11298F71F0B2B9FFD69CF6BC7725885211BBB5F7789F8DCA0F8832D8FD572311990322ADB4CEA089F48A8CC87978E5431B62A5E85A0EB1B8C3C0766F5AF5186FF1A7AAEFA9E8984D9A3",
327        "89AB79C144E63770F431A7EBF878A2741223B826F82EBC38CAB4B633D1F4222A85B91F580260E65C919491FD902129E9CC7C0794ED316D101DFC4C0ED09C2E9CD74B1D218A13CAE4D1E52C92B70E12272FB7333F3DFCFB8EFEC122D229420683A2AC68B25E3E34A1A324466DE29BD4AA2640306F85A3C82DCB3D1D9B9FF33141",
328        "83550CF0B4176281AF609C93B22170A9D1CEB0B25119D01A1CA35F6A5ABC3F386E9D2ADE14812F1AF77DFA22D014148FF219BAE8337AA2CCFE00C4E9C0357946645941C815FAD7ECB76D79BE090122F2386C7B9E349A20F2C1CB0F9BD693DF118569F6D8F38D19BC2535710A69494EDB2E9F561485BB452B1D9814E39A27097F",
329        "D0A2D6B5A31FB807733B977040B3FE4EAB1A92633814788C255C3F06D63965FCCC1C68EABE164507A29F49E38156C1670340B3BE7A4053AEE9F0CA0A6AFE07BE5E5050E05E1C3BF0B4A2F2B30DD3208B212F4006EE64CCE3E32FF3161AAA84C0EE38EE2C8FDCF0F64B5AAFFFBF020735433152F9AF7C3254F4161709C2F0C3D3",
330        "C3C31BFE9F9556CC6BF884E1EC838727AC7787CF35A849E9D8398D6FA6C431F62879EF7D2A55742C4BEC942578BF9B8D959AD429221304C5947352A03BA510CAA7CD5DAFB4982113843D998F821C882C3604F0DC1066601ED2CC0F8AE4832462F5688591489BDE289574E4448EA8C06FE8A5A32EAD4551D243B815CAD16BD67F",
331        "C0BB82F34EBCEF8D0CE9416D12B16E2361CFD9F1EFC031420A130AD2BAC559B15C840E295FC76E81C7C75BB798F8CD99D55F21BF07A20A901A1FCFB6D94DF1AD4B12ED3E6B75387FC6E399B1CBB569F7D1565E8E7A5DDFE508C1489F4BE59E795D80CB2E2A76EC96655822C1AD62A5C090ED8F5FFCD7D0800DE0D6CD687FF507",
332        "9FA82CA1CBAD50264962373D68D94C8010ACAB6D21B6101AF5FD8D4CE1AD43847A6F7633813588F1D825FD88C10DDD1E55A4EF0933EBE45D2D7FB9B8134CEE01BA49623A55940BCFA5FCFAD18CD72BFA0E8CCA0A256C18963A51A47D15E9882697F5031CE06EB63B394DBAFE5478DD4A76FBEFFD82E8FEE542F2F36066C38155",
333        "D1606F845FEFB7C07704C2F1425935B8FDE779F4E50841DC3BA38CBCD99626E51C52602C803DE1AAD2D00F926856568CB6801B52E4D35DF251A428C8175BE34430D0B1F3FF7BA40DEC8967C3646689D2F0EB851E3947D7803D41872DDCF3F1EAC00AFFBC8FDAF84104B64B980657A314EEECBCFF998DE594C340645E9FFBA58D",
334        "A0E18F0FEB771B648DCC644062ED54954C9EFE45E201B03E77FA623E3811B99A35BB84BA381CDC65FC47B214EA3E1397C8E31598B5DF082F4CD3AE08A4297CBF7948DF626B7ADB74028DA1A51655630176E9468AFD4E207EDF5F63D116CBF1D106A05973E953E582F9D6EF7C3E360743343039BE7388D0181156E332A69E87B5",
335        "8C5423E35B86F2B7485C91BF713E1165E631B2B14E6A5733F9E68C3DC769449F8BC10DA3C3BB0A36D7CCA347D1250BEA519ACDA15EA3DE9815B59A61DA64CB6CCB2CB71055A0B31B0BB61782011C9047899A0D7FBA60CCA16C7D1755260181AAA253582F15D42C1042D7C867DBE1E91208018FD41616E38CA5AFA37AC0B6EE23",
336        "F55F67231E633D9B8A7927A2D43419C451B2FE1EA38EC7C676586405CA691ACBC41D0EA6D1EDC35D22E675B4A0031CB41EB49CC23307DECFE0EBAFE71517B84E85443AF01D356DF627EEE8E32AA29BEA8B1CE4BD91C23ED88DED430C4ABE01CFA00D2936F775D69DBD0FB76C99F527D29AFD0A1C72AABEBD38DCB647CA084A57",
337        "DA134ED1D5DB78B31E1AD0E613CC24C1E8E97549083804E94065027CFC1D58BC315D46154E28FC90CCCE3C53D9E299F0E45BFE9028AC1D48E0109F939A7CDE5E7AC8D63A267D5465819C1319800B4401E6721D484AEF463C3E9C7A6A1AEF52F5DA22DDAB9E6841CAEEF6A8956A869632262A24CBB1E0D7E5DA2B1E41D8DE1EDD",
338        "EF6F541C02B399FE2DBAEE0284C6A15DCAA89B9078C6CB79E6156CD7611F56F414DA51A398BC89825A0D348882D903ADC00433F50853617A673E39D1243A810CABD65672CD4372436075B00C74E5B9E3FB8BBF24F0684BF0F6D89467BD9A80F999B684B2748D241168DA1315253D6C3D03621EF7D401D81CECF9335B1BC73DAF",
339        "F626681ECFA87E32C595D2DB9FF6431071A24E4EB3BB20F2CAC61183D30DD50563111326FFCFB440B4E1F52A88D2FA64D065B7CE600EE3DEBA88271604A3B7D50C5E2EAF8B7FA9AC3C634E8FFE37E4935F265616E6512AC1F7B790083B63C172233EA409A00C4425BB3961D3AD4E3FC3C29DAEFEE6499F18972469164A637AA1",
340        "C0EB8C18F7FC8B6B991FB8B3EFD5867BA34EC8D69676DD69026B7C16FFCB3BBE188D4B5B95DC8C629855E78878121735736A747CC1B02D06C84DED4AC9F5880789EF4B4C9A3F8533A0CE48667BECCBED261E2842EF282F8CBB89EB6DBBFA1657DD4905CA5DB3CB6BFB9D6F3DBB045A0219076EC5AE0A229FA78D18E3BBF14215",
341        "FD799F3DE3C582402C9E9F93693F179787A332B0BE598E9A22305148309D074813934E062AD144EF9BE2784206FEACFB2B077D93649480108DB039C3957250DC1A7E7DAB5694DFF681631D366785C47814370A4F4E5FF5144A4DB0B58B2BC78D3D28C89135D634FD5362D74564159F5A956786EDF739D63256A054E469EB0D1D",
342        "84B6F4F67BDB1345F98F58AFDE7E8EB960BB0DD1AA0DB3B28BD89B4C5A4D43C8AEEBE9C4C23D48AD1891C92B63CC5D099C4C38E6AB652DEBEB6DAB28E324ED301E0298F47D2C5D66E9C7FCBF68ABF21A184D1964060E5A317C02F0FA179FED5324229D4C8D57340FEE87A814C8DA460743CD5EE99F58D6061F47CA085CDFC35D",
343        "D4A985DC7251FABC42AB23E44EC31012EEFFD863902234F8FD5A4DF50E39E3EC805E7BEE495C91133AA1DE9178002ED6557ABDEF05C6CEACEA55A0CB5DD1C02CD84F4982330889E23705F2C5951A9DF6040DAC87C167F2154EDA89F7A94EBD30B70B07DA93ADB7E0E48616ACA4ECA6E34FA84811EB71C8692941B09DC4B67FB5",
344        "C6C71966075B3F41DF0C359B2112C078B201971126BB366DBF4AD62E3A4BF9EE6D21F7600C68E3D31F40D07E81B1D6C06CB01A70DD12F4276A6753518932664CBF89745FA118BE0BF6D7FAE7B180978B26EF71674EF7BA26BA14A23DF28B2A3B7D320B775F11803D1CA5EAFC7E161DBB957523C51AAE666567EF41B3863D678B",
345        "F5C105D8616ED64052D4D07FB0F54443AB684345C222B2A3362B02E6F542F26C7AC2A360F5A67008FE15FC32A06544DA74EAE5E809984AA7705452539BB51147A0BBEBE107905AF780EEF2507D00DE1A51B56F219AE33E5EB3E1B7C2C64843540244680AA8742558F04E8E1456522406CCA2DF2D77B706F7C9FB5E28C5583587",
346        "D84C235B0B5E45E6F1191717B3B1D31AC2525DED5E7F31F614D213D86F24983CCC7A32DD5437989325BAF88D15CF7D08D57E10327DC830AAF12880C8EB3AF1F5B86A47A4A254F1AAE30E26DA9521D52ECCF4D245E43C48952AC4283A4134C32E3C8FA414F0081E96BC3B84D2B903EA0D7F862293CF57315ACF2A15640CC12EA1",
347        "B1470B92DEFAD26EAC04AB86D711426D311749BD3B3C3BFC7F4B3450320B1C46A3459EC6C58601E8A251CB22AC1042EBD740070FED8865B14708540E44A8F07E87F6675398F101F4847436FE104EC149D80E193DC23BC6FC8D7F91E0D852BCC7DE590DE589A8FCFA992C40033BAB79E07AAE13075340AD71289C0CE3AA95DBA9",
348        "FD2747176BB2D56B2F1FA9367144326769F9C04C0BC60670FC92172FB2D9F5D83E7DD6D32181A3AA361DBE107551A7A6A00E3355427586E5AF691D18D0F1F5A7CDF7D4E93741E788E5B29290CDAEF4B99B64702662DD279487B5AA26F037B22415E008FC9D01B8C3B8A622E182CD92B76AF357E932E01C14C7F99A5D0D5281D7",
349        "E6845F2F06E9D0B5CC557114F1C9D0D2D6E745A4D3C18C25523BD1EE8D47D34398A87EF01ABEE5C9E138C78CDE5BC2392E926B71B49E2C7993EFF26877CAB389AC7361C30574D47C3525C6FB9ADFBC4EC72F194BDEF6426C4A0EEE58D63C6B0C9CBD17AA68C66668DA111CD9E57B75913434DD7FDBC88064AC3B3AD82CF80813",
350        "F43C70BF6F8FBE4CA1ED236DBCE7316688CDA611297F6E3C439C6FD924CAEF14A82AE92C71A882C5A2C71B36FE122BB400290F7129731F5563675D40231E08AC2FA6D5294F025678AC5BA73D8E1FB95BAF6F2D4B2CE7798E2766E07A3F02544688BE5E5158D8225DC3B547388E7B07666E09D906CAE95A670E35AAABB680D78D"
351    ],
352    [
353        "950BE5031347033FAD37E4AA8FBA7B9687432E00C8D5E7829B0366B5E602FB308513C315D751E9F704127BFAD3995001765A47BD45C213E3CE22E5142C279F39",
354        "C820C641F488C32070384A6352B341734028B1911699D15920B9727EF9AAE80669D5AE563A440346662EC10C8C83FB0F5739B0167809B5889AF40C37506126BB",
355        "FA410559EF3B513CC4F35F4EB779A37FD1AF64D4C5E0ED28AD5DBA9F38BA6CCF93DED47BA76D9808CC4C22EBE73D080A5E2A5FE693CC08C1F4DC0D84173EEA7D",
356        "C18BD4596F2306465F681678745D0B58A5DF09C0B861571B871DDE9FAA7E3938916DF243C7F861FF2D5B14FC53F80B7172AF0C921B7C8E47B9F73AD49360E5C5",
357        "E485ADC23D6EF038EB772041A04D563A807A304437D16BDACDFDBCC5D9EE239E12A97B6A53ED99B2D5A8E4BA266151C9FDFA2134A38B073387D9C86A1816ECA3",
358        "821D193D8FB6E67697A07DF0331C83844CFAA407910C132EC9A615E768A79533BB1C21B88FC8932F904E60D24677227F34CCA45A27AFEE634DF95C68F4B7F0D7",
359        "A9141AF1385F4211307817C5678613F92A097D084FF26B7DD79523CDE4B2A4EA8A6D0E18ABCC5AA2E398B5743233A9551C08646B2D12A4AD8666456F457670C5",
360        "8509AC3195D842D46011D33FD9F71CCB3D52AF1BA592A0CD8C9AE0BD5D55F09B4854C7A197B144422CAA26E7E3A5AD1A52D71801B33F708EF93AA7C1B4E182E1",
361        "87855071F5212E746BD2AAFA496CB9F85E15DA94EE5BF0E5CD76689AC4F56FD0CC980800284F253F2286FA2352180ADB8F50DEF79AF056629CFCC4521DF9E04B",
362        "F451B9CAD9C03F47107B5D7B8EBE4918F68913F896CFA3C0DC69A54AEEF157A2E30293316D2578E7071027A97766F1212226965C707E3C87351118E3DF4E1A29",
363        "EF76FEC7D7E2A14C9438674898A6C768DB6018E9176D11660AA2C1183CBB96DB591E1D00DFA7651EFADE072500DC2862330810F973FB136B2F19D4268551A36D",
364        "9DE68107026D8BE5C877A0DF48A22FDA40839B919EC85D5D7CCADD83B5AADA2166D9D782E6B162EFFE5885F00C0E7E08821E7175338A0851E3CE2E7476D493AB",
365        "A0604D1E2DF77BBC83513FE223FC6FE3E86EF6C12F49CDA115B67C2C1CDA66E74BDC44EA52791D29CEDFC4127EF09DC852DEEDE0FA1DFBE5AFF7A5716CF2484B",
366        "D5E7B523CEB070D56D19AC7EA93275B24E15DF5D8D370B2B4050210D9A174F22642F4F6FD2BC431BBEB822F75357F867278318951ACA67DCEA6843EBF504C711",
367        "B15E07774B0C62B38DF716526CEFB4196207FF6C705635D68690CFC6DDDA7F6AF4EFD67D79A0CA326E13845530BE6F7392C234CB080283B6EAB75C582F6253A1",
368        "E4D54D88F39A18752DAD01644566E33D211C7CF736A558D546CE33703ECBF19E861ED0FA2A4A7EB3F304A00351783146F5F9CFD3BA9C09A1AB38C529947CBFB3",
369        "85B9CFE6A148155E9D1B60A7B2E9C09EC19D619F960CC4D2E77530CB8FE851FE3867A8AF026A6C41C18761A1B1995570C94A04B8DE057748F067ADD2D0ECD257",
370        "CE75BF05A0C13D9ED6532FD1BE90A3B80879E48DD1C49F184F5683D9081CFEBB4092FB6F38C6FE1454C494E882C953720B94EF81FFB3B13D134BE7E3D6F96315",
371        "9C5CA030E4DC13B27B077CF2CDFF60CC9CB7CF3EE7BCA3705DF69DF76FFC41496DF9583B2076BE9AC11BA76E43B5BABF35AD8BDB11FE492C5D62C988EAFFC817",
372        "D5806BEC0AC97BCA29F9B82686A8B7E01BA39DBE2B213142AEFFDD9419053883C826730617EE142C735BFDAEDCE0B26AD0D0DB3FF979712BFF9E21342146E259",
373        "BA092E3076763C607E2F78A1C2D1404CB6D42B3AB4EFB5BA9B0FB0EA78DE9A09177E87114F44CDA595A20BCDFDB449BCE266732473FDC796207B50441946286F",
374        "939F93DD1219A637AAA706FB559EBAB0A8766D7B0545B276508B6B46486400DF4D4E13DE2A9A5BDD41D52732546CF87946BB74F97EABCC9B0229075A9272069D",
375        "B4B7A56C10204D2B5F06F41526C75C3EB5C4CB5E2E7ADFE1649193632026CEEDB2A6333E1311F7B2780953047386AA234E25D4DA972C23860D4E72666AC080E3",
376        "B4FFE30BA55A0B885D5DD37F14911DC8F07A7229CAC26CF9851C49BB24C303F1558B15A06785082C6C91DC35DDCE09D6A0E779A88AE9B62609E40ECBB95F9E3F",
377        "FB2B554471BD80C1EA0ABC1E981B6B1C295FCDA092265DFF26DAFEC43C86149A13AC9A3F80FD61AEC700160C4C70331932B3B5AC5EB55F48C6A83F01FEDFE467",
378        "84557409C4902ADC68838C737F054C184919DEB66F05A7338546403B2ECE09C8973B71655E777A814F16185EF04B95F8E70653F7638552F14D5DE9F3247DB71B",
379        "B6A309CADB61197E810529FB3E95F631CC151251604684E14BF7DFFA5975BA8CF9A3D069941A5BD49DC2CB23A277EABB663DEEBDBA83B7F5D764CD8EF1D2E695",
380        "ADEC1996AF439579949708184467F024BDD171A671FF7556A67C04506B3338073DF8DCC3E76E7266888A8C54449CF56A49484FF6C2D2CB4BC10DB5E7D4D9B445",
381        "CBFB371954F8B13A7F98FDA5725461940977B080993D5B7780E453F5BB9B45AE1CB35D0033AEF0CB7A8C5313BD5185D448CA2E3D68F82F12002DC3F152A5D5A9",
382        "DE32FAF3EE7F3C0DE9CD1CB30BDAC418B2E3DCB87B1F77EFF9D6608CEC55AEEB1B40C2124389D5D3E41E333255834E2F042DDAB87E0486DAE536B89FC1FBDC2F",
383        "B672C8EFA0C6ABF1D620B8B04E49DF2D94072C24A8D2C1B013DFC54D066B3913360FCC58A488CBF99124EDDD075160FAAD03EA89E41FEE05C34FAE610A374189",
384        "AFD8469A7E5B5C22A92D19938788CA29CE73614183D1A54D8474465220EFAE84411CA3278CD6FD2C3ABC678DD626F1FB18D3A3982A005074C286466FFEEB7A45",
385        "E5362FA16559939BAC32B0BFF252AC7F180C4091D43C91B00DF6373DC724F194ACC470D041FCA2045D60D4178D3B0953B1F2FDCA71C748DD32654FC7669DDD13",
386        "8F865C3961EE841333D88F137E0AC029062AE58F939C838D186071C507F3E567CDF1242AF43FCDBF765DFB88233CB471C004B986AC14731B30BD4FC6FA4BE269",
387        "E3964CBBB04E7015775BE43B22ED5106753A591E8DF03BFAB77DDF8CA201CC1955431FF2B02591CBE0C8871BE57D42E1E909EA6DB49803F70B2E2C65D14F0FFD",
388        "9696CB197B606EE02CCA95643546AF6EBDB3D58EF0382F2BA46BAF9089490A5856AD6E6DC3169C7B1AE4E6CDBB7B18BC9CFABDCCB5157649D475B3396A893B59",
389        "BAFD8A1188179951DC839A124CEE727660FAB437FE9A3C2709BC2E341FA1A45FBE5BC4A20F1CB3188B54513AC6D43280E5EED70B74AF81046631A811576B55E7",
390        "92895DB2E2AAE019580002C01C1DBA935D792F103B67306A4FA88F3AB82654289BAB50AC75A6CB878697774FA87C9D80FACC7B3BC17313C7D8A35C7189BF300D",
391        "BB0C473BE6123AFAFE899AA495B6D78970B2AC87BFB4D9FFBCC8723643FB16A4D7CAC41A3F796EC80EF9F9A8DBD865FCE5478B004774571B6D4F2D97F4D5BD55",
392        "A866A8610FB3CC7A2B7C3EC5E7BD29E9E169D16D082CE437049702BAC8E1E09B4748AB0E909EF571A9E15457EBEE5A18D08CE7932DCAFFD75547A7F33FF02F95",
393        "CE3E349F289CDE378FA58F3045A7D82A1DFBFDD996B7F3E3A2C9491EECD47918C49B2F1856D6C0FC651AF910B5C96D67026BCFFB364D8FA25A31455256BC9071",
394        "99A59C82D1C34EDBCD744FF2A95A37E33ACA8186186EDA2C3D1735A24941CECB348371FC1AB6308AA084E05A30F9F13E86CDACFF449157CB8E8F94B30BBB8F4F",
395        "9B314A83DB63DA474DB6B070AE67B2521EBAC21CCF8278FBFCD060550EFB472602741D3AC1A513E1275E1E9F8E67FC2F398B9481610CBE90AB005021D0FDC849",
396        "B4196B6E61962302B8724272285954D20596DDD441AB2A3033BA4E3253E8E82972948A58D6F4216A9EAD148D0A9C10A4AEE2AFCE5B038E602F52AA037C773867",
397        "CDEB84BD7CE892E41A58F7933B6A896973EBFFE1EA94C155144C0191F9352205EE46C643CF3F5C418167C5AFB7213B397F3A632A7E830814B99992FC0F5D143B",
398        "F86B59922DF083B61FBDE66D8011C61480E165A18D651023332E239C926E002EFF5204AC2D9875EF93B836A7384B36A3872F4DF80373EF28F169BE97A6DE63F5",
399        "D6F70FDA2E09E5B4839F241A3D9F223CA84983535A00C902AAB411A49D2A9A3348B1F6008859E3321745F6791E8FE6501DB8021725A88560512C76B34E744BF5",
400        "A5BDF7645EA236FFF0A12D36FBE46498E254F83BF0B6F933ED1A766021B95BE9598CE51891D626ACCA91D7DE7E25956366FB26CF31AFAE39E4DAB9842D836179",
401        "D323E9BEA09BEA8B691A5A4B5A29CC358776399698AF64F805C57687E841A2C29B5B153EAB110D4C1F13A9C81B0AAC2C57CE81A2A1A52DD1FF250D3C35C7326D",
402        "DFF31FB10CC71C19452452901C120A7DD8956FAED120686E2043CE81E8E0274E6CE02EBE0EFD6321495F669606D49FBFECA6F7A51C78DA4FDC73A642E01A8EF7",
403        "D6107F49C8CFAA2BD0A005437B907A3F6FDFEBCEBC112D6185E966FBFE9E342ED751298CC5E154C7C8F0C4ABA225AEDB61C6F5416975218A318C8BBD254D0289",
404        "CFE543DB06FF21FBC6B3C9E020C69C8DF22F192DB03D0377B4E3B8C8A54419B442800B03081337CA3509A5FBE6444E14E94E4EFCD1DFE46C9A9B95C6A3BEA371",
405        "F0D68F06CA1D5D7380E101EF9BCABD759BFD8DE3ED84AB4E27BB15BA586E1C9268D97B4AC9A3392C01867FF6648D896B4C02BA911E74F736A8815F691654C965",
406        "D47E63B9C3CBAF413BB89B3B247C5E4E0098A2CE5F85567F339DDBAB534F56882C66B0A80CD0CBDBBFB7806D361B4E107E3579BA98041CFBF15E69F9F2743D85",
407        "AAC1267E437998E93FCB9739FD63D68D4B1A34A442503C88D40882D6C0CC6B743D3CEB7AFBA603C637F5982BFF9D502EED2516B908AC4E16E61C67CF6B73DF67",
408        "BCD427E1D316C4F5D32A851D26A0289FB517F022887C61A5D6613EBF89F3089BACEE7D291B1D71DF6A6C9099208B7B97D56F1236CB62E507954B41E12002A06F",
409        "92A8F522503AA568A4C9339E444E47E2DFB87C467C49BDBFC19E0BD8344117EDC66CFB9355808605B4D777A04EA0A85C5DD7C7468C34C9993E844F01EC7E4339",
410        "C12DCA1CECDC04AD3D73E2D90021B46D4546588B3F3855D7AE5BFB2221B0E9421BC476D700E770D2090079039460CF191F33E1364E97FACBAD06E6941D50E697",
411        "FA9AC14055545821AB04DDDF4E1AB28AE01A6E56F544430536CB30F029125641D5DC87B86A3AC22D68A4DD83725B01BBD6C9D020D725FF61DA3F5227014BD163",
412        "BA2D42BA2D2A89BD14FF9902834B171A000FD335407975C12B46F78F63146691A9BB2D4345CEAFAADED958ECA027AFDA7D82BF82FBB2536470374310FBB74E9B",
413        "FE4ABCBA11BBCD9CA3005311131D5C2F16BA03823AC2E968F144EF2AE54294816B7D3FBA0836A13FF6FF220BCAF3C15FA85D8EBB52772FA6C450D4B6CEED284B",
414        "A7A587AAD228033013E58C1FAE39915E879800C1D59C81F76C15D85FCB42BBE965F066E2BA9AC989D736F20018AD671F6CFFE6078E44288766730F447E4D6877",
415        "E76B4009D22301EB04EC103E45D9989EBB30BFE8F8FDFA495CE6BBD7026F3716489440A38B93B816A4C3A9DF7054CED130372010E959E41433D08372597B6F7B",
416        "B168425A7A97CE229B95D24DBDF4677697F2E03EF6943902DF4DA9AF650BF03E32A50106DAC3945D80336542158FAF411C0DE27A226DFE6B564619762C847319",
417        "C524156E093EFE5CDE6BA247779142B3240B2DD6E85782E6097CCE246B8A97CF6C8CE9761EBD11C73FE4EA446376D4A431B2205D837DCA73838048EB7BB353F7",
418        "9C057EBA84B99E8E7544F2483617660F898C0B2FCCA770A3DBB50F865635AA2912C1CE02F4A2FA3EB958F912224E1C2EFCEF370CF440055E884431759B2CAC11",
419        "A0F56DA873C8CC2F349BCD3D9A9CBCA0F723632969D32FAE2C270B5C55565070604C8C7A3A9AC9641CE0C8411EEB4768E351D9E02605EA1364FBB575DD758AF3",
420        "A94985B686A544FE7BBE6DFED618EEED082C5CB9C1751DEF0F94642285D4FFCF9EE5AC4EB6CF157777F33F69D4DED8135F0455191F33A523A18B78EA9616D959",
421        "CBBA606DD34636E50FE24FE5B5F092B39D2D42E7B5A0A10D2046FDAFE1E838F34372E81A05CD5EB7CC71195F7E1A91B528D6CDD65BA567602EABE0FE2DDEDF83",
422        "FF36243B2B2347B34B11F40601FE2D6F15337F7F2D8AD06F6E234B3A8400F8DB4C22BC0B06C6D3470FAE096CD676FD8BD637B8E47F87A14362867DE4034D5C87",
423        "866CC9614CAAA1FA187F2FDA9A1EF6667CBADBDA8D86258E4AA5D329FF0EE8D3228606E05DE47200C2381703F0D04622E3F48C1BCE16C799C5E3E7F86F1689DD",
424        "94D5FC94B8CFCED073A9A5F5A1193DA8ACC04B27C64BD859C224483850FD81D61E065552EDFF6E752BE314D8B68C02495DC58AD5432634FCB31B4D8FF58F7A11",
425        "BBCED557E379D0D483869C2E1DFABBFE40513C59CE2057D9A0236059BFD68A6EF2A1DEA0D57BFD6E819AACACAD0D2CC9B6BD98AF0DE2ECCFC06ED6374D1D5781",
426        "A7C0BECC66EE810868C12FDD08AF4B57FB8E2FE72183FEA20C5A3918A3F1A81326F46C74B4452A6E6C443593DC8E9B619D7D59B9E7C39E6F3524E5A95F158247",
427        "D8DCE0CCC22FD2BC4667A167C2F1B7FE2ED3BA02213F6B8C347E965A6EE318F703081942F8D88F412A71C3DE7B8AA18F7B4A62393A48AD1205B8E3D49AA75379",
428        "BA2F688C87CF59C34773FAEEC5DFF5C1327A40348CB814B24E7C61F686B23053A80A6731C13126098E6EE63B9ECB61AB9BF8C37E0ADE27AD88C40B66B14826F1",
429        "DF2FC0151560479A8FB13B7735DC9839EA77E53D76EA70081309D0A21CAE0B06DD7B50336D5EE73A8562481F5A9B2CBE3FD4B6ED1AFFF51C0FFB1C628B5AE227",
430        "B833B801D5B3A8A5514FEBF374D55200FB5FE17209471CD72FED1DF436A01C402FA9309B2E3D8D124B3CB3A8B801FFC56DB618482C3C5C52B5E2808A9E15C259",
431        "859AFFE76A0B55578C76570EB501D1BE09FAF2C1544178AFD78AF68F475DB5D0B129C648DA38A357917EED431C5C54BC57DA5432EBBABEBBB4EB17E9CC239687",
432        "F7DD251307A788C120585CD4CEE4CCCB2BD2F9CE16777F87085710CE6385AE46DBA330076FAE3949541463BC9A7DE7179AE688EEB43F786B41EB95F7BAE70005",
433        "8708A78856F40F1DE000A342155E40886471B5965512574335A77C8B50041EE2891E9502B298F355825D3DF0645478366C6AE16F139EBBC6E539364DD0D23697",
434        "AE2E09A2F3AB97B077FB8CF07A7693DB19B67E38F60B53F880CAF3BDA153C348D50EDFE5FC90A53CD1A9913F817D58B0FE59E516EBC64EE37B7C13DE052B7CF5",
435        "EAD7E7B051DBDB49CF2BEBED5C37BB0B37550B82F87765F29C39388E1E330015DF43B64CCF3076A46FC90050AD8F7D3E43C0A77D6AFD14E1725459F76D7F824D",
436        "9DBA323E04E3765F78BC8AA7FE467A151A0CE6582E80DACFE33823F70B9A0402859FC9437D81FCD75080C6978BCE7352FAF3DB0505723A1C265893A98049984F",
437        "F4D853D7E5065D59E34DF51617BA35CA7807FFFC68D51F221040B40765A72427A556FC2F009A00F781130D3A0DF45E2FE6CDBE4D2D5D3F48BCDEEDA0F03D95CD",
438        "AC6B4EDD030F54E21199E050DC3D30877A8B89946EC732987DF6221DBC7F14AA8AE55DE5F536D49D73319CE156152678C1EAFA938EAB84E1A49C62C65FC76D43",
439        "DD60AE02D567AA316AA5ECEB9EB9B6499B13911240B3BFE021B06C967AB6F51951BFD55B7B4745D8EA0358B875D00DB9271C674F634F74380D7797B6572D74F1",
440        "B1BC33A4F45793664A70080BCF9D59CA698F95BF3125DD36B1976DA44FDB4CEA95A4406D5C98DF89E385BC59E1737D1A6D8F6A17201F0E540E3DE743BE9CE67F",
441        "BC7C2CC5CC0525994A28D95318BE8B53B62DFC75465CC78117D6E704916B1224F80553A54869A9B0A63302A88D5A8EB918A69892935EA0B4F6BEAA5CC03EC969",
442        "C3201006F186E01836F70F1F208C529D84FBC46E21695498D010221CA9078DA54C4F46D2637289E07D4BC6ACA02131234E9996868FC9DEDDC0A0A2F71B3C3031",
443        "D37A11B2DBF0E748390CC60043B5F84522ADDB5ABE60FB6C0FB1BB3FF760C15B8C7A139952CEEB5007093D4894FCCE4D7D705621CC485160D0221D8442B41EE1",
444        "871C41A72B97D3926CB18B86D7DEFE29B7D8AC7C2F7EFD2D105ECC8D17D3BFEB6C10C2260C1BD6C06C84D4B8A3FF1495F780C18274069A76A767017BBAEC0651",
445        "CDFD3AC7C071CBD60B380AFE38A58B3A1AC7436E6918227A1E3B06C7DE58A4B81F12DDB75B68BB7EFE17C142233532C9B589C22530070EFB04D0A888FAC7D731",
446        "8821AE888CFE44FB3667C54A1C40452D02309B64940AE5FA957390F250BDC919DC350E4DB6B4E5CF05F393D9B4DF89E55BB5F7DFC114F465A250EF55284BF793",
447        "C8DB61BCD3BB62FA69210A26F16C2BC1247A7D2D89607F26E31BC55487506C71539C85E656B904CE22CA2A3D6409ED349D2E28A7F21405768F47610D86D62363",
448        "A0C1FA9799B7525DFE9C74EFE534D31A3900243DE10C2F39AB04EA1012D1EB463D84CC9282D14585FD066D695C444D8435D6BCABEC55CECDE60D59821270C027",
449        "D3D0026DB9322FF66A8EBAE33894DDB38194BDE363488746902B68678A14908D6DF1C8FA2A86D2E026855A861BA406E3694FE64E4D72AC455B3C1354AAFF5AF1",
450        "B254E28D3260CBB6F358F6A19E01EB2BDA05C7BEC5C26908D16AC5CDE62EB09BA43CBC154B1EFD4BED910E1EA32288F86B41DE95FB9FD8F6B9E42F74CCDEB889",
451        "DD94ECE66B19E7201B165E79C6A63F5FAF1207A3F75EECB1CAF944CB06F47D4610163F46035834981B419A64AAD2C39575F4D10FBFF01DFAFAB3C1106E2D0E97",
452        "FFA2F7E4403DB8E0E647FACC4B514D4D7F8108EE7F7AF0ED6796A2BE34F535B81F229AE4765B5773478F40BED7E78CEC7181344512D11497C68B2F5EC3E66EA9",
453    ],
454    [
455        "B438E6DC10A4FD3C54C2D8CFA523352D7E0EBBC0698DDE11634CD9C74A4BC4B3",
456        "E5BD0A560D8016E350955A00D4357290C1A1D8CD5C0A8BAC4B614539445D0E51",
457        "F075A27FE420C074C2E486FDCFB7382B8EF95ED81C854ECBAB6DDFD9C1D86AD9",
458        "F7739E91EE6F60ADF49AEA52CAB66681361398C0237BCC11528CCCFB753400DF",
459        "C27F4B1681A3FF1310BC4D037465DFDC35EDA72AECA7FCB1827B002882600DA7",
460        "B8130DC628C9C797EB7AE6B5CE729B9E9A72C8653E279CCB033A20EFA8A9E6F9",
461        "D7111D58B4C715D55CBFFC9431A66D5DD9B0353324F0E766787BAF05F310EABB",
462        "C558647417D277108FCA8EE70ED17473D571627E24697DCD31AF86287EC80413",
463        "D4AA6679E29EB3723077744931E9B61F3B8E773959CC1AD5C43602F7F343E967",
464        "EB3C940E3CEE379A335328679BEDF2CB0BA79817D907DB0B5347E8D934639001",
465        "B6566B3FF2D4FD7FE4DAAA14B239082BCF92B25D973AE7FB5BE5AFAB8CD0F6BD",
466        "9E81DE90073B3FBAE81BC42447D19B3EBB78F3FEF68A02AFE38300938B7F3769",
467        "B76D8C07C3CFCA2F996C29748537DACF303F9BF61F093C474C781BCB9EB9E09B",
468        "DBA28942966B945607CE5E357201828ED2F14F069DCB5E34F2F54123CFADB99B",
469        "AB0A7E0FD9BD994F3EEE5494DCDB2AF436B35555A1D1A8757DA8D4A629A0B49F",
470        "AD22A2D05E023469037B8EF1FF621BD8143BA57AE9FE1C07F6A4323356052879",
471        "D971732AD1D5379F66F5B1E99874C8F8FB8FC56998FE4977A359919B8BCCE4C7",
472        "A0436AF4711C4786A54659478F0BBEC9C3A6D27D7E32A3B26169BC4BB0A15505",
473        "B437E84DF77FCBF0FB88C93A45D484D3423D131132C6D7E8369DC0E5990A2E9D",
474        "F4414941E800C6439E3DF842D9DD45405C5E3096DB67B2BC8682262BE0B0DAB5",
475        "CE85D69A3947877529995CAEF7425D622E26B8F5E74B7E7274F43ED0F519276B",
476        "CC66205C4977E372FDE513671056C307D75518598A0CF53C9FF42517449C7873",
477        "BA33E9C4CFEF7B36DDC783600EEE4691347809E27BD00D7611F8A4B6003631D7",
478        "B2911967C0696A979E8A22C2FEA281CE56954907B8297E4A432D414DCB2CB547",
479        "BBD0873D292F161EC5571179A17DB49CFC9A19F7652E881D08E82E30F5FEABBB",
480        "B97DB68BC6545BB28D133F0BAF68019F1B2043DCB7E3F12257F3C93217A2CAF9",
481        "B6C23113C921F5DAC713E22F767B012AA78710787031CD29ADEC9281E6F8C459",
482        "8E697AA38849591664152A4FC4E449935FDD7C8DD69B63FC1A58343EB54CCB61",
483        "E533AA624836342F7158668AF701BD8A06961E496D7F0D3B38CBF29F0DA5C809",
484        "A749F355228EA80EE2240B1DC99C03990E94BFC6687465855F0748B473AAA45F",
485        "98A7BBC75759D9B14D4CE357EF71DB3824C6C6917A9028F47357E723C6B25243",
486        "E8882552DA2BCFF21985C409D54CA7CC4893F27F61062780263C0799DBAFC9E7",
487        "849B374CD6143468B61582D57B1D1E6F7CA65CA383FD410CCBAC5E4085329CB3",
488        "8565A4BA170C19A5713CFCEAD25FBDA7705AE9C47CE6ABE785DD57471711CA07",
489        "8AC9B31991C9D79E735E8BB391B5A68B0C428B14AE2119B8339C9734D1876671",
490        "E7BBB82A039FFCF9D01F53A9770BD3E4CAE18F4BEB4EA5197B02D5C68702CEF5",
491        "F857E60F480475ED91FD14123478FC635AF83521FB2E94ECE46C7440EBFE4E63",
492        "A839ECA5059565118C5B9A79D0B89F6849403BDD461B8FDB4EAF7576731CE5DF",
493        "E3831F4E5F1671AEC28F56EB345F1678EB10D26E54FA75966BDEFAA035BE22A3",
494        "C80498D41B83D68EA085B0054CD414342965468E4D9E026767DD26C7963DC47B",
495        "FF0EC7408DC3F8CC39762D8C39B5DA96B203A8C9DD0AC25E58F79A8E917DE97B",
496        "A63D308DF7FBE16DB4A4E9FEDE003274E5B85DE7ABB13F0A8EB38F02A7DDCFF5",
497        "9B929C254506B600CF819E193AF3013F25D3291885156B855152BA43F2D1BA81",
498        "FB8A4145BDB7FA2B75D875503DBF028BECD05501E92804962EABE47AA9858949",
499        "A82CCB6CCD7DC78FBCC854CE9C834E1828EC4D68033BF838F5BFF9F7A16214D9",
500        "9B851E44F6417F65A43BB00AB4609150712587A3E1D900B492CC9C4CAD9B55AD",
501        "D7DCFD28034B953D2DF19AF42889085F145DE23ED3B71FD889EB93EF820A1839",
502        "D478259D2B9E350AD8FDA10FCA0C464D81665B3FE228B01D71ADB53E322B179D",
503        "D4246B1C4C0D9AC4EE2FB026AF473578046CE01473DE0DF590E089A319FC2275",
504        "F6664207CB82898DE1E0F636A71C9C01B879713AD9EEB1F3EF5ABE991C121F79",
505        "BA5F518269E074668A9FA35A031CA7CEB2862CA44B586A24BE3293DB30140F2F",
506        "80F7F9C359A447E5463BCD9BDD9205426F6838915C39039BAF20CD52A9A118BF",
507        "E703A269809E09ADE18AE5DD3F1220D7F65D64094FE1D6E87EE911D7B1485891",
508        "8493A06B67FA3D6352D31194492B7907416D762AE339B72F72261CCDBD4E0C79",
509        "DA06F1DF783F4DD7B5B9DE1DFE3086891E1297285AF79EEF754104FE973ACDF3",
510        "8A2138EC5156D7594E9B2EB6FFDF8515C32E6AA2AEB2ED4C47BC88DFD4CBDBFD",
511        "82BA78AE86EC4548863E768463927CB6020242B3DAE28B8C3A0D98FC420D833F",
512        "86B273063993C7761ECC875DC44CA7FE2A9A2FCC0AC7B3D36E2A94EF60CCBB47",
513        "95D9C037D01D75D001ACEF01837FF8627B8FF90444441FBD9FE43159237BAED7",
514        "F41F7D6D5853A0F29B8263F620F4343BBE3730180569CB3E28C30B3597DF8115",
515        "F83B0578874363679956E7E91DB36C082FC4859F6A459555C7A6EEACE6772217",
516        "98FF82FAB85FE5CF655E63AAEBB9FE8A7A3FBCFAA7E5C2AD52A452D9BD56E48D",
517        "FF6E473ED1476B3A936F110A2B414B6FBB69B64FB3312C26B0AFC5AFBFF1F395",
518        "8DF10B39B7C6039C517600CE474C16B846E7E7A3CD7702B1F3CE59577CFED3FB",
519        "A0FDAC99A3B16F11E0BE0676CE453346CD4A1BFD596896A9D55F8C7D50057BA5",
520        "9223ED52F5780F02AE28DFA82BFD9E27C575EC09DE2D78E22B16DA37E723967F",
521        "EBCD4594A61996BA9331264F58DD40F972A79D52D7DD22DD221C7C7D143F704B",
522        "8008CB0F827BC3AE7EF0B62C86E5E3B5FE9CCB5D1DFE63D530F2331A2C2360D9",
523        "9007F4B20A66F963BF8550493B7A995DD0CCF8B56D6380B4AE399F761D42CD9D",
524        "D7CB64523EDB9E8ADA6B2E524B315FDA3E3489E96A85240C85DF0844C3E1DFA9",
525        "B569B772784720E2A9E3505F5F75AF620FD9F5A18E58BE085D4FAA65C72DEE17",
526        "F270F0C5CD17F5693F903443617A6D0EFEC4F6E98D4C9F8FB4D4D07E299DD209",
527        "CC2A2A872ED97D18284C7265C6BCBF9E5FF9B1F3FA8188F78C2AC83BFADFAAB1",
528        "B03D5CEBA40A4B3364CA92495965B595E3FEBA51D5EAB922AD56088A2A7D65FB",
529        "83549AC93C9B0D0B44AA6160B262FF4BEBDBCF16B260594AC6DB93B7FE4B6C9D",
530        "931646B66ECD95DEA3CB34A992F59A142E29F429BCA15E60D6627458F0736B35",
531        "EF6CCF06CDE7B3A07116FD2BD2A1FFD5A861725E6BA0BD01E74E9B3E2D420897",
532        "F04A2A7D125E79579449894EAF3D2C991C6DE4EBAD92F7F2C9FE8DB26E65DEE7",
533        "CEE79989DA838324E26CD62A9FFD6FA13D51A0A7E57F6CA37803057DA2FDE39B",
534        "F02121937E159F92B5DE4DC4C84619E3FC43E3D198799CAD7F3F355290B05CB3",
535        "D33D9DEFA14FB7472E8A69AE476AAE64A9386E899F8D785BDD37928A0DEBF109",
536        "CE3D47E002E201F56EFC4118C4125412F60C4EAABA8CC5E9C461433AA4678879",
537        "BE971C80C76DB7F1337A8E0341BDDDECEB5EF41822C87241DFA53D8674731979",
538        "91DF6573263CB7A6891037DD8A8CE6FCBF9BA39E8FECADBB1731A3089C26CFAB",
539        "AA9063705BC56C8D202AC10B39F3E7128F50D0B75A081C9B499D640E79197645",
540        "CD6A1669E023A8660B896B05B1F1DCDD48C44F028000118E4D99990E45C77373",
541        "C7F5A0E9597B2D634BCD1C8762DF8D1539F01A4219D3844B3D31B95933E8EAFB",
542        "D542346E14DD9265F00E7ABFA864BB8C1FD39EB59F556B5232537C1FDDB377BF",
543        "8635E19B61E3190C71E99E112C0552B0AFFD0606A972D4D6B7374E699CD46A59",
544        "BB77CDDA618087DBAE040986A6E042CCD28D1332539C8B02AF2856761B38BDA3",
545        "CE3CF9747DA9ACA50A2E117818733FD6DDDCA727160CF815340C93C794EEEE6B",
546        "9AA03D7B7A3181523F9F8DAA963C2859D18E14B211ED49D26E88A8C925FAD853",
547        "BE6B43ECB5F24996BDA1517F90943F04A1B903B3352646F0001F1B494735AA6F",
548        "832CC8B68A762C4164318741CD683D374D6C7589CA2E736B8C78D782A9FD578F",
549        "A378E1A280DED1FFFBA21312708D8E3895D82F83CE4A8D334B560FC5836A0C33",
550        "D04F61E43CAD676B700B091B1E3DF1EF02A39DC8EBDB0C34BDC4C7E62D107D2F",
551        "FBBD80FDE7F571B2C7A32BFFE61B15A0DC7F3D043FEB47A7A61B05C19296052F",
552        "925DD7348F7C29A0D9B3DB9C0E0723D5F495D4CFD3A31B05B4DFC40906E852CF",
553        "FB9B4C0F1F5F1F0421731A7F47E10760AB4E0DA082964B9F9F35516B408660AD",
554        "D03C2B9F13FE76CE1A8D06B38F95D8FB3A84649B4484662DBCE5D8F42DE2A139"
555    ],
556];
557
558
559
560/// This generic struct `Random_Generic` is the struct for implementing a
561/// pseudo-random number generator both for primitive unsigned integers
562/// such as `u8`, `u16`, `u32`, `u64`, `u128`, and `usize`, and for `BigUInt`.
563/// Depending on the engine object, it uses hash algorithms or symmetric-key
564/// cryptographic algorithm to generate pseudo random numbers.
565/// 
566/// # Generic Parameters
567/// - COUNT: The length of the period of pseudo-random number sequence.
568///   If `COUNT` is `1000`, a new seed will be used every `1000` pseudo-random
569///   numbers, for example. The default value of `COUNT` is `u128::MAX`.
570/// - NTR: How many bytes of the true random numbers to be used as a seed.
571///   If `NTR` is `32`, thirty-two bytes of the true random number will be
572///   used as a seed. The default value of `NTR` is `64`.
573///   `NTR` cannot exceed `64`. Even if `NTR` is `100`, only sixty-four bytes
574///   of the true random numbers will be used, for example.
575/// 
576/// # Feature
577/// - The generic parameter `COUNT` should be `1` ~ `u128::MAX` inclusively.
578/// - The default value of `COUNT` is `340282366920938463463374607431768211455`
579///   which is `u128::MAX` and far less than theoretical period of pseudo-random
580///   numbers recursively generated by 512-bit hash algorithms. `COUNT is the
581///   limited number of pseudo-random numbers generated from a seed.
582/// - After it generates pseudo-random numbers `COUNT` times, it finds a new
583///   seed from a system automatically and generates next pseudo-random numbers
584///   with a new seed. In other words, it uses new seeds every `COUNT` times of
585///   generation of pseudo-random numbers.
586/// 
587/// # Panics
588/// If `COUNT` is `0`, the constructor methods
589/// such as `new()` and `new_with_seeds()` will panic!
590/// 
591/// # Predetermined Provided Specific `struct`s
592/// - Random_BIG_KECCAK_1024: uses a hash algorithm BIG_KECCAK_1024,
593///   and is cryptographically secure.
594/// - Random_SHA3_512: uses a hash algorithm SHA3_512, and is cryptographically
595///   secure and uses true random numbers far more frequently than
596///   `Any_SHA3_512` does.
597/// - Random_SHA2_512: uses a hash algorithm SHA2_512, and is cryptographically
598///   secure and uses true random numbers far more frequently than
599///   `Any_SHA2_512` does.
600/// - Any_SHAKE_256: uses a hash algorithm SHAKE_256,
601///   and is cryptographically secure.
602/// - Any_SHAKE_128: uses a hash algorithm SHAKE_128,
603///   and is cryptographically secure.
604/// - Any_SHA3_512: uses a hash algorithm SHA3_512, and is cryptographically
605///   secure and uses true random numbers far less often than `Random_SHA3_512`
606///   does.
607/// - Any_SHA3_256: uses a hash algorithm SHA3_256, and is cryptographically
608///   secure and uses true random numbers far less often than `Random_SHA3_256`
609///   does.
610/// - Any_SHA2_512: uses a hash algorithm SHA2_512, and is cryptographically
611///   secure and uses true random numbers far less often than `Random_SHA2_512`
612///   does.
613/// - Any_SHA2_256: uses a hash algorithm SHA2_256,
614///   and is cryptographically secure.
615/// - Slapdash_SHA1: uses a hash algorithm SHA1,
616///   and is NOT cryptographically secure.
617/// - Slapdash_SHA0: uses a hash algorithm SHA0,
618///   and is NOT cryptographically secure.
619/// - Slapdash_Num_C: uses a pseudo-random number generator algorithm of the
620///   function rand() of C standard library,
621///   and is NOT cryptographically secure.
622/// - Slapdash_MD5: uses a hash algorithm MD5,
623///   and is NOT cryptographically secure.
624/// - Slapdash_MD4: uses a hash algorithm MD4,
625///   and is NOT cryptographically secure.
626/// - Random_Rijndael: uses a symmetric-key encryption algorithm Rijndael,
627///   and is cryptographically secure and uses true random numbers far more
628///   frequently than `Any_Rijndael` does..
629/// - Any_Rijndael: uses a symmetric-key encryption algorithm Rijndael,
630///   and is cryptographically secure and uses true random numbers far less
631///   often than `Random_Rijndael` does.
632/// - Slapdash_DES: uses a symmetric-key encryption algorithm DES,
633///   and is NOT cryptographically secure.
634/// 
635/// - Random: a synonym of `Random_BIG_KECCAK_1024` at the moment, and is
636///   cryptographically secure and uses true random numbers far more frequently
637///   than `Any` does.
638/// - Any: a synonym of `Any_SHA2_512` at the moment, and is cryptographically
639///   secure and uses true random numbers far less often than `Random` does.
640/// - Slapdash: a synonym of `Slapdash_Num_C` at the moment,
641///   and is NOT cryptographically secure.
642/// - Random_* are cryptographically secure and uses true random numbers far
643///   more frequently than `Any_*` do.
644/// - Any_* are cryptographically secure and uses true random numbers far
645///   less often than `Random_*` do.
646/// 
647/// # QUICK START
648/// You can use either struct `Random` or `Any` or `Slapdash` depending on your
649/// purpose. `Random` and `Any` are for cryptographical purpose while Slapdash`
650/// is for non-cryptographical purpose. Look into the following examples.
651/// 
652/// ## Example
653/// ```
654/// use cryptocol::number::BigUInt_Prime;
655/// use cryptocol::random::Random;
656/// use cryptocol::define_utypes_with;
657/// define_utypes_with!(u64);
658/// 
659/// let mut rand = Random::new();
660/// // let mut rand = Any::new();
661/// println!("Random number = {}", rand.random_u128());
662/// println!("Random number = {}", rand.random_u64());
663/// println!("Random number = {}", rand.random_u32());
664/// println!("Random number = {}", rand.random_u16());
665/// println!("Random number = {}", rand.random_u8());
666/// 
667/// if let Some(num) = rand.random_under_uint(1234567890123456_u64)
668///     { println!("Random number u64 = {}", num); }
669/// 
670/// if let Some(num) = rand.random_minmax_uint(1234_u16, 6321)
671///     { println!("Random number u16 = {}", num); }
672/// 
673/// println!("Random odd number usize = {}", rand.random_odd_uint::<usize>());
674/// if let Some(num) = rand.random_odd_under_uint(1234_u16)
675///     { println!("Random odd number u16 = {}", num); }
676/// 
677/// println!("Random 128-bit number u128 = {}", rand.random_with_msb_set_uint::<u128>());
678/// println!("Random 16-bit odd number u16 = {}", rand.random_with_msb_set_uint::<u16>());
679/// println!("Random prime number u64 = {}", rand.random_prime_using_miller_rabin_uint::<u64>(5));
680/// println!("Random usize-sized prime number usize = {}", rand.random_prime_with_msb_set_using_miller_rabin_uint::<usize>(5));
681/// 
682/// let num: [u128; 20] = rand.random_array();
683/// for i in 0..20
684///     { println!("Random number {} => {}", i, num[i]); }
685/// 
686/// let mut num = [0_u64; 32];
687/// rand.put_random_in_array(&mut num);
688/// for i in 0..32
689///     { println!("Random number {} => {}", i, num[i]); }
690/// 
691/// let mut biguint: U512 = rand.random_biguint();
692/// println!("Random Number: {}", biguint);
693/// 
694/// let mut ceiling = U1024::max().wrapping_div_uint(3_u8);
695/// if let Some(r) = rand.random_under_biguint(&ceiling)
696/// {
697///     println!("Random Number less than {} is\n{}", ceiling, r);
698///     assert!(r < ceiling);
699/// }
700/// 
701/// ceiling = U1024::max().wrapping_div_uint(5_u8);
702/// let r = rand.random_under_biguint_(&ceiling);
703/// println!("Random Number less than {} is\n{}", ceiling, r);
704/// assert!(r < ceiling);
705/// 
706/// ceiling = U1024::max().wrapping_div_uint(4_u8);
707/// if let Some(r) = rand.random_odd_under_biguint(&ceiling)
708/// {
709///     println!("Random odd Number less than {} is\n{}", ceiling, r);
710///     assert!(r < ceiling);
711/// }
712/// 
713/// biguint = rand.random_with_msb_set_biguint();
714/// println!("Random Number: {}", biguint);
715/// 
716/// biguint = rand.random_odd_with_msb_set_biguint();
717/// println!("512-bit Random Odd Number = {}", biguint);
718/// assert!(biguint > U512::halfmax());
719/// assert!(biguint.is_odd());
720/// 
721/// biguint = rand.random_prime_using_miller_rabin_biguint(5);
722/// println!("Random Prime Number = {}", biguint);
723/// assert!(biguint.is_odd());
724/// 
725/// biguint = rand.random_prime_with_msb_set_using_miller_rabin_biguint(5);
726/// println!("512-bit Random Prime Number = {}", biguint);
727/// assert!(biguint.is_odd());
728/// ```
729#[allow(non_camel_case_types)]
730pub struct Random_Generic<const COUNT: u128 = {u128::MAX}>
731{
732    original_seed: [u64; 8],
733    original_aux: [u64; 8],
734    main_state: [u64; 8],
735    aux_state: [u64; 8],
736    count: u128,
737    collect_seed: fn() -> [u64; 8],
738    main_generator: Box<dyn Random_Engine>,
739    aux_generator: Box<dyn Random_Engine>,
740}
741
742impl<const COUNT: u128> Random_Generic<COUNT>
743{
744    // pub fn new_with<SG, AG>(mut main_generator: SG, mut aux_generator: AG) -> Self
745    /// Constructs a new `Random_Generic` object
746    /// with two random number generator engines.
747    /// 
748    /// # Arguments
749    /// - `main_generator` is a main random number generator engine
750    ///   which is of `Random_Engine`-type and
751    ///   for generating main pseudo-random numbers.
752    /// - `aux_generator` is an auxiliary random number generator engine
753    ///   which is of `Random_Engine`-type and
754    ///   for generating auxiliary pseudo-random numbers to use in
755    ///   generating the main pseudo-random numbers.
756    /// 
757    /// # Output
758    /// It returns a new object of `Random_Generic`.
759    /// 
760    /// # Panics
761    /// If `COUNT` is `0`, this method will panic!
762    /// 
763    /// # Cryptographical Security
764    /// - If you use either `Random_*` or `Any_*`, it is considered to be
765    ///   cryptographically secure.
766    /// - If you use `Slapdash_*`, it is considered that it may be
767    ///   cryptographically insecure.
768    /// 
769    /// # Example 1 for BIG_KECCAK_1024
770    /// ```
771    /// use cryptocol::random::RandGen;
772    /// use cryptocol::hash::BIG_KECCAK_1024;
773    /// use cryptocol::define_utypes_with;
774    /// define_utypes_with!(u64);
775    /// 
776    /// let mut rand = RandGen::new_with(BIG_KECCAK_1024::new(), BIG_KECCAK_1024::new());
777    /// let num: U512 = rand.random_prime_with_msb_set_using_miller_rabin_biguint(5);
778    /// println!("Random number = {}", num);
779    /// ```
780    /// 
781    /// # For more examples,
782    /// click [here](./documentation/random_random_biguint/struct.Random_Generic.html#method.new_with)
783    pub fn new_with<SG, AG>(mut main_generator: SG, mut aux_generator: AG) -> Self
784    where SG: Random_Engine + 'static, AG: Random_Engine + 'static
785    {
786        if COUNT == 0
787            { panic!("COUNT should be greater than 0."); }
788
789        let original_seed = Self::collect_seed();
790        let original_aux = Self::collect_seed();
791        let mut state = original_aux.clone();
792        for i in 0..4
793            { state[i << 1] = original_seed[i]; }
794        let main_state = state.clone();
795        for i in 0..8
796            { state[i] = !state[7-i]; }
797        let aux_state = state;
798        main_generator.sow_array(&main_state, &original_seed);
799        aux_generator.sow_array(&aux_state, &original_aux);
800        Self
801        {
802            original_seed,
803            original_aux,
804            main_state,
805            aux_state,
806            count: COUNT,
807            collect_seed: Self::collect_seed,
808            main_generator: Box::new(main_generator),
809            aux_generator: Box::new(aux_generator),
810        }
811    }
812
813    // pub fn new_with_generators_seeds<SG, AG>(mut main_generator: SG, mut aux_generator: AG, seed: u64, aux: u64) -> Self
814    /// Constructs a new `Random_Generic` object with
815    /// two random number generator engines and two seeds of type `u64` given.
816    /// 
817    /// # Arguments
818    /// - `main_generator` is a main random number generator engine
819    ///   which is of `Random_Engine`-type and
820    ///   for generating main pseudo-random numbers.
821    /// - `aux_generator` is an auxiliary random number generator engine
822    ///   which is of `Random_Engine`-type and
823    ///   for generating auxiliary pseudo-random numbers to use in
824    ///   generating the main pseudo-random numbers.
825    /// - `seed` is the seed number of `u64`.
826    /// - `aux` is the seed number of `u64`.
827    /// 
828    /// # Output
829    /// It returns a new object of `Random_Generic`.
830    /// 
831    /// # Panics
832    /// If `COUNT` is `0`, this method will panic!
833    /// 
834    /// # Cryptographical Security
835    /// - If you use either `Random_*` or `Any_*`, it is considered to be
836    ///   cryptographically secure.
837    /// - If you use `Slapdash_*`, it is considered that it may be
838    ///   cryptographically insecure.
839    /// - You are highly recommended to use the method
840    ///   `new_with_generators_seed_arrays()` rather than this method
841    ///   for security reason. It is because the default seed collector function
842    ///   collects 1024 bits as a seed. If you use this method, it results that
843    ///   you give only '128' bits (= '64' bits + '64' bits) as a seed and the
844    ///   other '896' bits will be made out of the '128' bits that you provided.
845    /// 
846    /// # Example 1 for BIG_KECCAK_1024
847    /// ```
848    /// use cryptocol::random::RandGen;
849    /// use cryptocol::hash::BIG_KECCAK_1024;
850    /// use cryptocol::define_utypes_with;
851    /// define_utypes_with!(u64);
852    /// 
853    /// let mut rand = RandGen::new_with_generators_seeds(BIG_KECCAK_1024::new(), BIG_KECCAK_1024::new(), 10500872879054459758_u64, 15887751380961987625_u64);
854    /// let num: U512 = rand.random_prime_with_msb_set_using_miller_rabin_biguint(5);
855    /// println!("Random number = {}", num);
856    /// ```
857    /// 
858    /// # For more examples,
859    /// click [here](./documentation/random_random_biguint/struct.Random_Generic.html#method.new_with_generators_seeds)
860    pub fn new_with_generators_seeds<SG, AG>(mut main_generator: SG, mut aux_generator: AG, seed: u64, aux: u64) -> Self
861    where SG: Random_Engine + 'static, AG: Random_Engine + 'static
862    {
863        if COUNT == 0
864            { panic!("COUNT should be greater than 0."); }
865
866        let mut main_state = [0_u64; 8];
867        main_state[1] = 1;
868        main_state[2] = seed;
869        main_state[3] = aux;
870        for i in 4..8
871            { main_state[i] = main_state[i-1].wrapping_add(main_state[i-2]); }
872        let original_seed = [seed, aux, aux.wrapping_add(0xfedcba0987654321), seed.wrapping_add(0xfedcba0987654321), aux.wrapping_sub(0xfedcba0987654321), seed.wrapping_sub(0xfedcba0987654321), seed.wrapping_add(0x1234567890abcdef), aux.wrapping_add(0x1234567890abcdef)];
873        main_generator.sow_array(&main_state, &original_seed);
874
875        let mut aux_state = [0_u64; 8];
876        aux_state[0] = 1;
877        aux_state[2] = aux;
878        aux_state[3] = seed;
879        for i in 4..8
880            { aux_state[i] = !aux_state[i-4]; }
881        let original_aux = [aux, !seed, !seed.wrapping_sub(0xfedcba0987654321), !aux.wrapping_sub(0xfedcba0987654321), !seed.wrapping_add(0xfedcba0987654321), !aux.wrapping_add(0xfedcba0987654321), !aux.wrapping_sub(0x1234567890abcdef), !seed.wrapping_sub(0x1234567890abcdef)];
882        aux_generator.sow_array(&aux_state, &original_aux);
883        Self
884        {
885            original_seed,
886            original_aux,
887            main_state,
888            aux_state,
889            count: COUNT,
890            collect_seed: Self::collect_seed,
891            main_generator: Box::new(main_generator),
892            aux_generator: Box::new(aux_generator),
893        }
894    }
895
896    // pub fn new_with_generators_seed_arrays<SG, AG>(mut main_generator: SG, mut aux_generator: AG, seed: [u64; 8], aux: [u64; 8]) -> Self
897    /// Constructs a new `Random_Generic` object with two random
898    /// number generator engines and two seed arrays of type `u64` given.
899    /// 
900    /// # Arguments
901    /// - `main_generator` is a main random number generator engine
902    ///   which is of `Random_Engine`-type and
903    ///   for generating main pseudo-random numbers.
904    /// - `aux_generator` is an auxiliary random number generator engine
905    ///   which is of `Random_Engine`-type and
906    ///   for generating auxiliary pseudo-random numbers to use in
907    ///   generating the main pseudo-random numbers.
908    /// - `seed` is the seed array and is of `[u64; 8]`.
909    /// - `aux` is the seed array and is of `[u64; 8]`.
910    /// 
911    /// # Output
912    /// It returns a new object of `Random_Generic`.
913    /// 
914    /// # Panics
915    /// If `COUNT` is `0`, this method will panic!
916    /// 
917    /// # Cryptographical Security
918    /// - If you use either `Random_*` or `Any_*`, it is considered to be
919    ///   cryptographically secure.
920    /// - If you use `Slapdash_*`, it is considered that it may be
921    ///   cryptographically insecure.
922    /// - You are highly recommended to use this method rather than the method
923    ///   new_with_generators_seeds for security reason. It is because the
924    ///   default seed collector function collects 1024 bits as a seed. If you
925    ///   use this method, it results that you give full '1024' bits (= '64'
926    ///   bits X '8' X '2') as a seed and it is equivalent to use a seed
927    ///   collector function.
928    /// 
929    /// # Example 1 for BIG_KECCAK_1024
930    /// ```
931    /// use cryptocol::random::{ RandGen, AnyGen, SlapdashGen };
932    /// use cryptocol::define_utypes_with;
933    /// define_utypes_with!(u64);
934    /// 
935    /// use cryptocol::hash::BIG_KECCAK_1024;
936    /// let seed = [10500872879054459758_u64, 14597581050087285790, 10790544591050087758, 17281050044597905758, 15900810579072854758, 10572800879059744558, 13758728710500905448, 15054105075808728459];
937    /// let aux = [10500054459758872879_u64, 15810500854459728790, 10790877585445910500, 10044597872810905758, 10579072855900814758, 14410572800879059558, 17105448597050095872, 18087279054105078459];
938    /// let mut rand = RandGen::new_with_generators_seed_arrays(BIG_KECCAK_1024::new(), BIG_KECCAK_1024::new(), seed, aux);
939    /// let num: U512 = rand.random_prime_with_msb_set_using_miller_rabin_biguint(5);
940    /// println!("Random number = {}", num);
941    /// ```
942    /// 
943    /// # For more examples,
944    /// click [here](./documentation/random_random_biguint/struct.Random_Generic.html#method.new_with_generators_seed_arrays)
945    pub fn new_with_generators_seed_arrays<SG, AG>(mut main_generator: SG, mut aux_generator: AG, seed: [u64; 8], aux: [u64; 8]) -> Self
946    where SG: Random_Engine + 'static, AG: Random_Engine + 'static
947    {
948        if COUNT == 0
949            { panic!("COUNT should be greater than 0."); }
950
951        let main_state = seed.clone();
952        main_generator.sow_array(&main_state, &seed);
953
954        let aux_state = aux.clone();
955        aux_generator.sow_array(&aux_state, &aux);
956        Self
957        {
958            original_seed: seed,
959            original_aux: aux,
960            main_state,
961            aux_state,
962            count: COUNT,
963            collect_seed: Self::collect_seed,
964            main_generator: Box::new(main_generator),
965            aux_generator: Box::new(aux_generator),
966        }
967    }
968
969    // pub fn new_with_generators_seed_collector<SG, AG>(mut main_generator: SG, mut aux_generator: AG, seed_collector: fn() -> [u64; 8]) -> Self
970    /// Constructs a new `Random_Generic` object
971    /// with two random number generator engines and a seed collector method.
972    /// 
973    /// # Arguments
974    /// - `main_generator` is a main random number generator engine
975    ///   which is of `Random_Engine`-type and
976    ///   for generating main pseudo-random numbers.
977    /// - `aux_generator` is an auxiliary random number generator engine
978    ///   which is of `Random_Engine`-type and
979    ///   for generating auxiliary pseudo-random numbers to use in
980    ///   generating the main pseudo-random numbers.
981    /// - `seed_collector` is a seed collector function to collect seeds, and
982    ///   is of the type `fn() -> [u64; 8]`.
983    /// 
984    /// # Output
985    /// It returns a new object of `Random_Generic`.
986    /// 
987    /// # Features
988    /// - The default seed collector function is provided in this module,
989    ///   but it is optimized for Unix/Linux though it works under Windows too.
990    /// - If you use this crate under Windows and/or you have a better one,
991    ///   you can use your own seed collector function by replacing the default
992    ///   seed collector function with your own one. 
993    /// 
994    /// # Panics
995    /// If `COUNT` is `0`, this method will panic!
996    /// 
997    /// # Cryptographical Security
998    /// - If you use either `Random_*` or `Any_*`, it is considered to be
999    ///   cryptographically secure.
1000    /// - If you use `Slapdash_*`, it is considered that it may be
1001    ///   cryptographically insecure.
1002    /// 
1003    /// # Example 1 for BIG_KECCAK_1024
1004    /// ```
1005    /// use cryptocol::hash::BIG_KECCAK_1024;
1006    /// use cryptocol::random::RandGen;
1007    /// use cryptocol::define_utypes_with;
1008    /// define_utypes_with!(u64);
1009    /// 
1010    /// fn seed_collector() -> [u64; 8]
1011    /// {
1012    ///     use std::time::{ SystemTime, UNIX_EPOCH };
1013    ///     use cryptocol::number::LongerUnion;
1014    /// 
1015    ///     let ptr = seed_collector as *const fn() -> [u64; 8] as u64;
1016    ///     let mut seed_buffer = [ptr; 8];
1017    ///     for i in 0..8
1018    ///         { seed_buffer[i] ^= ptr.swap_bytes().rotate_left(i as u32); }
1019    /// 
1020    ///     if let Ok(nanos) = SystemTime::now().duration_since(UNIX_EPOCH)
1021    ///     {
1022    ///         let common = LongerUnion::new_with(nanos.as_nanos());
1023    ///         for i in 0..4
1024    ///         {
1025    ///             let j = i << 1;
1026    ///             seed_buffer[j] = common.get_ulong_(0);
1027    ///             seed_buffer[j + 1] = common.get_ulong_(1);
1028    ///         }
1029    ///     }
1030    ///     seed_buffer
1031    /// }
1032    /// 
1033    /// let mut rand = RandGen::new_with_generators_seed_collector(BIG_KECCAK_1024::new(), BIG_KECCAK_1024::new(), seed_collector);
1034    /// let num: U512 = rand.random_prime_with_msb_set_using_miller_rabin_biguint(5);
1035    /// println!("Random number = {}", num);
1036    /// ```
1037    /// 
1038    /// # For more examples,
1039    /// click [here](./documentation/random_random_biguint/struct.Random_Generic.html#method.new_with_generators_seed_collector)
1040    pub fn new_with_generators_seed_collector<SG, AG>(mut main_generator: SG, mut aux_generator: AG, seed_collector: fn() -> [u64; 8]) -> Self
1041    where SG: Random_Engine + 'static, AG: Random_Engine + 'static
1042    {
1043        if COUNT == 0
1044            { panic!("COUNT should be greater than 0."); }
1045
1046        let original_seed = seed_collector();
1047        let original_aux = seed_collector();
1048        let mut state = original_aux.clone();
1049        for i in 0..4
1050            { state[i << 1] = original_seed[i]; }
1051        let main_state = state.clone();
1052        for i in 0..8
1053            { state[i] = !state[7-i]; }
1054        let aux_state = state;
1055        main_generator.sow_array(&main_state, &original_seed);
1056        aux_generator.sow_array(&aux_state, &original_aux);
1057        Self
1058        {
1059            original_seed,
1060            original_aux,
1061            main_state,
1062            aux_state,
1063            count: COUNT,
1064            collect_seed: seed_collector,
1065            main_generator: Box::new(main_generator),
1066            aux_generator: Box::new(aux_generator),
1067        }
1068    }
1069
1070    // pub fn new_with_generators_seed_collector_seeds<SG, AG>(mut main_generator: SG, mut aux_generator: AG, seed_collector: fn() -> [u64; 8], seed: u64, aux: u64) -> Self
1071    /// Constructs a new `Random_Generic` object with two random number
1072    /// generator engines, a seed collector function, and two seeds
1073    /// of type `u64` given.
1074    /// 
1075    /// # Arguments
1076    /// - `main_generator` is a main random number generator engine
1077    ///   which is of `Random_Engine`-type and
1078    ///   for generating main pseudo-random numbers.
1079    /// - `aux_generator` is an auxiliary random number generator engine
1080    ///   which is of `Random_Engine`-type and
1081    ///   for generating auxiliary pseudo-random numbers to use in
1082    ///   generating the main pseudo-random numbers.
1083    /// - `seed_collector` is a seed collector function to collect seeds, and
1084    ///   is of the type `fn() -> [u64; 8]`.
1085    /// - `seed` is the seed number of `u64`.
1086    /// - `aux` is the seed number of `u64`.
1087    /// 
1088    /// # Output
1089    /// It returns a new object of `Random_Generic`.
1090    /// 
1091    /// # Features
1092    /// - The default seed collector function is provided in this module,
1093    ///   but it is optimized for Unix/Linux though it works under Windows too.
1094    /// - If you use this crate under Windows and/or you have a better one,
1095    ///   you can use your own seed collector function by replacing the default
1096    ///   seed collector function with your own one.
1097    /// 
1098    /// # Panics
1099    /// If `COUNT` is `0`, this method will panic!
1100    /// 
1101    /// # Cryptographical Security
1102    /// - If you use either `Random_*` or `Any_*`, it is considered to be
1103    ///   cryptographically secure.
1104    /// - If you use `Slapdash_*`, it is considered that it may be
1105    ///   cryptographically insecure.
1106    /// - You are highly recommended to use the method
1107    ///   `new_with_generators_seed_collector_seed_arrays()` rather than this
1108    ///   method for security reason. It is because the default seed collector
1109    ///   function collects 1024 bits as a seed. If you use this method, it
1110    ///   results that you give only '128' bits (= '64' bits + '64' bits) as a
1111    ///   seed and the other '896' bits will be made out of the '128' bits that
1112    ///   you provided.
1113    /// 
1114    /// # Example 1 for BIG_KECCAK_1024
1115    /// ```
1116    /// use cryptocol::hash::BIG_KECCAK_1024;
1117    /// use cryptocol::random::RandGen;
1118    /// use cryptocol::define_utypes_with;
1119    /// define_utypes_with!(u64);
1120    /// 
1121    /// fn seed_collector() -> [u64; 8]
1122    /// {
1123    ///     use std::time::{ SystemTime, UNIX_EPOCH };
1124    ///     use cryptocol::number::LongerUnion;
1125    /// 
1126    ///     let ptr = seed_collector as *const fn() -> [u64; 8] as u64;
1127    ///     let mut seed_buffer = [ptr; 8];
1128    ///     for i in 0..8
1129    ///         { seed_buffer[i] ^= ptr.swap_bytes().rotate_left(i as u32); }
1130    /// 
1131    ///     if let Ok(nanos) = SystemTime::now().duration_since(UNIX_EPOCH)
1132    ///     {
1133    ///         let common = LongerUnion::new_with(nanos.as_nanos());
1134    ///         for i in 0..4
1135    ///         {
1136    ///             let j = i << 1;
1137    ///             seed_buffer[j] = common.get_ulong_(0);
1138    ///             seed_buffer[j + 1] = common.get_ulong_(1);
1139    ///         }
1140    ///     }
1141    ///     seed_buffer
1142    /// }
1143    /// 
1144    /// let mut rand = RandGen::new_with_generators_seed_collector_seeds(BIG_KECCAK_1024::new(), BIG_KECCAK_1024::new(), seed_collector, 10500872879054459758_u64, 15887751380961987625_u64);
1145    /// let num: U512 = rand.random_prime_with_msb_set_using_miller_rabin_biguint(5);
1146    /// println!("Random number = {}", num);
1147    /// ```
1148    /// 
1149    /// # For more examples,
1150    /// click [here](./documentation/random_random_biguint/struct.Random_Generic.html#method.new_with_generators_seed_collector_seeds)
1151    pub fn new_with_generators_seed_collector_seeds<SG, AG>(mut main_generator: SG, mut aux_generator: AG, seed_collector: fn() -> [u64; 8], seed: u64, aux: u64) -> Self
1152    where SG: Random_Engine + 'static, AG: Random_Engine + 'static
1153    {
1154        if COUNT == 0
1155            { panic!("COUNT should be greater than 0."); }
1156
1157        let mut main_state = [0_u64; 8];
1158        main_state[1] = 1;
1159        main_state[2] = seed;
1160        main_state[3] = aux;
1161        for i in 4..8
1162            { main_state[i] = main_state[i-1].wrapping_add(main_state[i-2]); }
1163        let original_seed = [seed, aux, aux.wrapping_add(0xfedcba0987654321), seed.wrapping_add(0xfedcba0987654321), aux.wrapping_sub(0xfedcba0987654321), seed.wrapping_sub(0xfedcba0987654321), seed.wrapping_add(0x1234567890abcdef), aux.wrapping_add(0x1234567890abcdef)];
1164        main_generator.sow_array(&main_state, &original_seed);
1165
1166        let mut aux_state = [0_u64; 8];
1167        aux_state[0] = 1;
1168        aux_state[2] = aux;
1169        aux_state[3] = seed;
1170        for i in 4..8
1171            { aux_state[i] = !aux_state[i-4]; }
1172        let original_aux = [aux, !seed, !seed.wrapping_sub(0xfedcba0987654321), !aux.wrapping_sub(0xfedcba0987654321), !seed.wrapping_add(0xfedcba0987654321), !aux.wrapping_add(0xfedcba0987654321), !aux.wrapping_sub(0x1234567890abcdef), !seed.wrapping_sub(0x1234567890abcdef)];
1173        aux_generator.sow_array(&aux_state, &original_aux);
1174        Self
1175        {
1176            original_seed,
1177            original_aux,
1178            main_state,
1179            aux_state,
1180            count: COUNT,
1181            collect_seed: seed_collector,
1182            main_generator: Box::new(main_generator),
1183            aux_generator: Box::new(aux_generator),
1184        }
1185    }
1186
1187    // pub fn new_with_generators_seed_collector_seed_arrays<SG, AG>(mut main_generator: SG, mut aux_generator: AG, seed_collector: fn() -> [u64; 8], seed: [u64; 8], aux: [u64; 8]) -> Self
1188    /// Constructs a new `Random_Generic` object with two random
1189    /// number generator engines and two seed arrays of type `u64`.
1190    /// 
1191    /// # Arguments
1192    /// - `main_generator` is a main random number generator engine
1193    ///   which is of `Random_Engine`-type and
1194    ///   for generating main pseudo-random numbers.
1195    /// - `aux_generator` is an auxiliary random number generator engine
1196    ///   which is of `Random_Engine`-type and
1197    ///   for generating auxiliary pseudo-random numbers to use in
1198    ///   generating the main pseudo-random numbers.
1199    /// - `seed_collector` is a seed collector function to collect seeds, and
1200    ///   is of the type `fn() -> [u64; 8]`.
1201    /// - `seed` is the seed array and is of `[u64; 8]`.
1202    /// - `aux` is the seed array and is of `[u64; 8]`.
1203    /// 
1204    /// # Output
1205    /// It returns a new object of `Random_Generic`.
1206    /// 
1207    /// # Features
1208    /// - The default seed collector function is provided in this module,
1209    ///   but it is optimized for Unix/Linux though it works under Windows too.
1210    /// - If you use this crate under Windows and/or you have a better one,
1211    ///   you can use your own seed collector function by replacing the default
1212    ///   seed collector function with your own one.
1213    /// - You are highly recommended to use this method rather than the method
1214    ///   new_with_generators_seed_collector_seeds for security reason. It is
1215    ///   because the default seed collector function collects 1024 bits as a
1216    ///   seed. If you use this method, it results that you give full '1024'
1217    ///   bits (= '64' bits X '8' X '2') as a seed and it is equivalent to use
1218    ///   a seed collector function
1219    /// 
1220    /// # Panics
1221    /// If `COUNT` is `0`, this method will panic!
1222    /// 
1223    /// # Cryptographical Security
1224    /// - If you use either `Random_*` or `Any_*`, it is considered to be
1225    ///   cryptographically secure.
1226    /// - If you use `Slapdash_*`, it is considered that it may be
1227    ///   cryptographically insecure.
1228    /// 
1229    /// # Example 1 for BIG_KECCAK_1024
1230    /// ```
1231    /// use cryptocol::hash::BIG_KECCAK_1024;
1232    /// use cryptocol::random::RandGen;
1233    /// use cryptocol::define_utypes_with;
1234    /// define_utypes_with!(u64);
1235    /// 
1236    /// fn seed_collector() -> [u64; 8]
1237    /// {
1238    ///     use std::time::{ SystemTime, UNIX_EPOCH };
1239    ///     use cryptocol::number::LongerUnion;
1240    /// 
1241    ///     let ptr = seed_collector as *const fn() -> [u64; 8] as u64;
1242    ///     let mut seed_buffer = [ptr; 8];
1243    ///     for i in 0..8
1244    ///         { seed_buffer[i] ^= ptr.swap_bytes().rotate_left(i as u32); }
1245    /// 
1246    ///     if let Ok(nanos) = SystemTime::now().duration_since(UNIX_EPOCH)
1247    ///     {
1248    ///         let common = LongerUnion::new_with(nanos.as_nanos());
1249    ///         for i in 0..4
1250    ///         {
1251    ///             let j = i << 1;
1252    ///             seed_buffer[j] = common.get_ulong_(0);
1253    ///             seed_buffer[j + 1] = common.get_ulong_(1);
1254    ///         }
1255    ///     }
1256    ///     seed_buffer
1257    /// }
1258    /// 
1259    /// let seed = [10500872879054459758_u64, 14597581050087285790, 10790544591050087758, 17281050044597905758, 15900810579072854758, 10572800879059744558, 13758728710500905448, 15054105075808728459];
1260    /// let aux = [10500054459758872879_u64, 15810500854459728790, 10790877585445910500, 10044597872810905758, 10579072855900814758, 14410572800879059558, 17105448597050095872, 18087279054105078459];
1261    /// let mut rand = RandGen::new_with_generators_seed_collector_seed_arrays(BIG_KECCAK_1024::new(), BIG_KECCAK_1024::new(), seed_collector, seed, aux);
1262    /// let num: U512 = rand.random_prime_with_msb_set_using_miller_rabin_biguint(5);
1263    /// println!("Random number = {}", num);
1264    /// ```
1265    /// 
1266    /// # For more examples,
1267    /// click [here](./documentation/random_random_biguint/struct.Random_Generic.html#method.new_with_generators_seed_collector_seed_arrays)
1268    pub fn new_with_generators_seed_collector_seed_arrays<SG, AG>(mut main_generator: SG, mut aux_generator: AG, seed_collector: fn() -> [u64; 8], seed: [u64; 8], aux: [u64; 8]) -> Self
1269    where SG: Random_Engine + 'static, AG: Random_Engine + 'static
1270    {
1271        if COUNT == 0
1272            { panic!("COUNT should be greater than 0."); }
1273
1274        let main_state = seed.clone();
1275        main_generator.sow_array(&main_state, &seed);
1276
1277        let aux_state = aux.clone();
1278        aux_generator.sow_array(&aux_state, &aux);
1279        Self
1280        {
1281            original_seed: seed,
1282            original_aux: aux,
1283            main_state,
1284            aux_state,
1285            count: COUNT,
1286            collect_seed: seed_collector,
1287            main_generator: Box::new(main_generator),
1288            aux_generator: Box::new(aux_generator),
1289        }
1290    }
1291
1292    // fn collect_seed() -> [u64; 8]
1293    /// Collects seed from a system.
1294    /// 
1295    /// # Output
1296    /// It returns a random number array `[u64; 8]` as seeds.
1297    fn collect_seed() -> [u64; 8]
1298    {
1299        let mut seed_buffer = [0_u64; 8];
1300        let mut read_long = 0_usize;
1301        #[cfg(not(target_family = "windows"))]
1302        {
1303            if let Ok(mut file) = File::open("/dev/random")
1304            {
1305                // let mut buffer = [0u8; 64];
1306                // if let Ok(n) = file.read(&mut buffer)
1307                if let Ok(n) = file.read(unsafe { &mut *(seed_buffer.as_mut_ptr() as *mut u8 as *mut [u8; 64]) }) //buffer)
1308                {
1309                    let n = if n >= 64 {64} else {n};
1310                    // unsafe { copy_nonoverlapping(buffer.as_ptr(), seed_buffer.as_mut_ptr() as *mut u8, n); }
1311                    read_long = n >> 3;
1312                    if (n & 0b111) != 0
1313                        { read_long += 1; }
1314                }
1315            }
1316        }
1317        if read_long < 8
1318        {
1319            if let Ok(nanos) = SystemTime::now().duration_since(UNIX_EPOCH)
1320            {
1321                let common = LongerUnion::new_with(nanos.as_nanos());
1322                seed_buffer[read_long] = common.get_ulong_(0);
1323                read_long += 1;
1324                if read_long < 8
1325                {
1326                    seed_buffer[read_long] = common.get_ulong_(1);
1327                    read_long += 1;
1328                }
1329            }
1330        }
1331        for i in read_long..8
1332            { seed_buffer[i] = RandomState::new().build_hasher().finish(); }
1333        seed_buffer
1334    }
1335
1336    // fn collect_seed_u64() -> u64
1337    /// Collects eight-byte seed from a system.
1338    /// 
1339    /// # Output
1340    /// It returns a true random number `u64` made as a seed.
1341    pub(super) fn collect_seed_u64() -> u64
1342    {
1343        #[cfg(not(target_family = "windows"))]
1344        {
1345            if let Ok(mut file) = File::open("/dev/random")
1346            {
1347                let mut buffer = [0u8; 8];
1348                if let Ok(_) = file.read(&mut buffer)
1349                {
1350                    let seed = LongUnion::new_with_ubytes(buffer);
1351                    return seed.get();
1352                }
1353            }
1354        }
1355        if let Ok(nanos) = SystemTime::now().duration_since(UNIX_EPOCH)
1356        {
1357            let common = LongerUnion::new_with(nanos.as_nanos());
1358            let idx = (common.get_ulong_(0) & 1) as usize;
1359            common.get_ulong_(idx)
1360        }
1361        else
1362        {
1363            let common = LongUnion::new_with(RandomState::new().build_hasher().finish());
1364            common.get()
1365        }
1366    }
1367
1368    // fn produce_main_state(&mut self) -> [u64; 8]
1369    /// Runs the registered pseudo-random number generator to prepare for
1370    /// generating a random number for main_state.
1371    fn produce_main_state(&mut self)
1372    {
1373        self.change_count();
1374        for i in 0..8
1375            { self.main_state[i] ^= self.original_seed[i]; }
1376        let xor = self.count ^ (self.original_aux[0] as u128 | (self.original_aux[1] as u128) << 64);
1377        let count = if (self.count == 0) || (xor == 0) {self.count} else {xor};
1378        self.main_state = self.main_generator.harvest(count, &self.main_state);
1379    }
1380
1381    // fn produce_aux_state(&mut self) -> [u64; 8]
1382    /// Runs the registered pseudo-random number generator to prepare for
1383    /// generating a random number for aux_state.
1384    fn produce_aux_state(&mut self)
1385    {
1386        self.change_count();
1387        for i in 0..8
1388            { self.aux_state[i] ^= self.original_aux[i]; }
1389        let xor = self.count ^ (self.original_seed[0] as u128 | (self.original_seed[1] as u128) << 64);
1390        let count = if (self.count == 0) || (xor == 0) {self.count} else {xor};
1391        self.aux_state = self.aux_generator.harvest(count, &self.aux_state);
1392    }
1393
1394    // fn change_count(&mut self)
1395    /// Changes`self.count` and `self.sugar` when `self.count` becomes `0`,
1396    /// changes the seeds for both generators when `self.sugar` becomes `true`.
1397    /// Otherwise, subracts `1` from `self.count`.
1398    fn change_count(&mut self)
1399    {
1400        if self.is_restarted()
1401        {
1402            self.count = COUNT;
1403        }
1404        self.count = self.count.wrapping_sub(1);
1405        if self.is_restarted()
1406        {
1407            self.original_seed = (self.collect_seed)();
1408            self.original_aux = (self.collect_seed)();
1409            for i in 0..8
1410            {
1411                self.main_state[i] ^= self.original_aux[i];
1412                self.aux_state[i] ^= self.original_seed[i];
1413            }
1414            self.main_generator.sow_array(&self.main_state, &self.original_seed);
1415            self.aux_generator.sow_array(&self.aux_state, &self.original_aux);
1416        }
1417    }
1418
1419    #[inline]
1420    fn is_restarted(&self) -> bool    { self.count == 0 }
1421
1422    // pub fn get_seed_collector(&self) -> fn() -> [u64; 8]
1423    /// Returns the function pointer to the current seed collector function.
1424    /// 
1425    /// # Output
1426    /// It returns the function pointer to the current seed collector function,
1427    /// and is of the type `fn() -> [u64; 8]`.
1428    /// 
1429    /// # Example 1 for Random
1430    /// ```
1431    /// use cryptocol::random::Random;
1432    /// let rand = Random::new();
1433    /// let seed = rand.get_seed_collector()();
1434    /// print!("seed = ");
1435    /// for i in 0..8
1436    ///     { print!("{} ", seed[i]); }
1437    /// ```
1438    /// 
1439    /// # For more examples,
1440    /// click [here](./documentation/random_random_biguint/struct.Random_Generic.html#method.get_seed_collector)
1441    #[inline]
1442    pub fn get_seed_collector(&self) -> fn() -> [u64; 8]
1443    {
1444        self.collect_seed
1445    }
1446
1447    // pub fn set_seed_collector(&mut self, collect_seed: fn() -> [u64; 8])
1448    /// Replaces the default seed collector function
1449    /// with new seed collector function.
1450    /// 
1451    /// # Arguments
1452    /// `collect_seed` is a new seed collector function to replace the default
1453    /// seed collector function, and is of the type `fn() -> [u64; 8]`.
1454    /// 
1455    /// # Example 1 for Random
1456    /// ```
1457    /// use cryptocol::random::Random;
1458    /// fn seed_collector() -> [u64; 8]
1459    /// {
1460    ///     use std::time::{ SystemTime, UNIX_EPOCH };
1461    ///     use cryptocol::number::LongerUnion;
1462    /// 
1463    ///     let ptr = seed_collector as *const fn() -> [u64; 8] as u64;
1464    ///     let mut seed_buffer = [ptr; 8];
1465    ///     for i in 0..8
1466    ///         { seed_buffer[i] ^= ptr.swap_bytes().rotate_left(i as u32); }
1467    /// 
1468    ///     if let Ok(nanos) = SystemTime::now().duration_since(UNIX_EPOCH)
1469    ///     {
1470    ///         let common = LongerUnion::new_with(nanos.as_nanos());
1471    ///         for i in 0..4
1472    ///         {
1473    ///             let j = i << 1;
1474    ///             seed_buffer[j] = common.get_ulong_(0);
1475    ///             seed_buffer[j + 1] = common.get_ulong_(1);
1476    ///         }
1477    ///     }
1478    ///     seed_buffer
1479    /// }
1480    /// type Func = *const fn() -> [u64; 8];
1481    /// 
1482    /// let mut rand = Random::new();
1483    /// rand.set_seed_collector(seed_collector);
1484    /// assert_eq!(seed_collector as Func, rand.get_seed_collector() as Func);
1485    /// println!("seed = {}", rand.random_u128());
1486    /// ```
1487    /// 
1488    /// # For more examples,
1489    /// click [here](./documentation/random_random_biguint/struct.Random_Generic.html#method.set_seed_collector)
1490    #[inline]
1491    pub fn set_seed_collector(&mut self, seed_collector: fn() -> [u64; 8])
1492    {
1493        self.collect_seed = seed_collector;
1494    }
1495
1496    // pub fn reset_seed_collector(&mut self)
1497    /// Replace the current seed collector function
1498    /// with the default seed collector function.
1499    /// 
1500    /// # Features
1501    /// After this method is performed, the previous seed collector function
1502    /// will be lost.
1503    /// 
1504    /// # Example 1 for Random
1505    /// ```
1506    /// fn seed_collector() -> [u64; 8]
1507    /// {
1508    ///     [0_u64; 8]
1509    /// }
1510    /// type Func = *const fn() -> [u64; 8];
1511    /// 
1512    /// use cryptocol::random::Random;
1513    /// let mut rand = Random::new();
1514    /// let collector = rand.get_seed_collector();
1515    /// rand.set_seed_collector(seed_collector);
1516    /// assert_eq!(seed_collector as Func, rand.get_seed_collector() as Func);
1517    /// rand.reset_seed_collector();
1518    /// assert_eq!(collector as Func, rand.get_seed_collector() as Func);
1519    /// ```
1520    /// 
1521    /// # For more examples,
1522    /// click [here](./documentation/random_random_biguint/struct.Random_Generic.html#method.reset_seed_collector)
1523    #[inline]
1524    pub fn reset_seed_collector(&mut self)
1525    {
1526        self.collect_seed = Self::collect_seed;
1527    }
1528
1529    // pub fn random_u8(&mut self) -> u8
1530    /// Generates random numbers of type `u8`.
1531    /// 
1532    /// # Output
1533    /// It returns a random number of type `u8`.
1534    /// 
1535    /// # Cryptographical Security
1536    /// - If you use either `Random_*` or `Any_*`, it is considered to be
1537    ///   cryptographically secure.
1538    /// - If you use `Slapdash_*`, it is considered that it may be
1539    ///   cryptographically insecure.
1540    /// 
1541    /// # Example 1 for Random
1542    /// ```
1543    /// use cryptocol::random::Random;
1544    /// let mut rand = Random::new();
1545    /// for i in 0..10
1546    ///     { println!("{} Random number (Random) = {}", i, rand.random_u8()); }
1547    /// ```
1548    /// 
1549    /// # For more examples,
1550    /// click [here](./documentation/random_random_smalluint/struct.Random_Generic.html#method.random_u8)
1551    pub fn random_u8(&mut self) -> u8
1552    {
1553        self.produce_aux_state();
1554        self.produce_main_state();
1555        let mut i = self.main_state[0] as usize & 0b111;
1556        let mut j = self.main_state[1] as usize & 0b111;
1557        i = self.aux_state[i] as usize & 0b111;
1558        j = self.aux_state[j] as usize & 0b111;
1559        LongUnion::new_with(self.main_state[i]).get_ubyte_(j)
1560    }
1561
1562    // pub fn random_u16(&mut self) -> u16
1563    /// Generates random numbers of type `u16`.
1564    /// 
1565    /// # Output
1566    /// It returns a random number of type `u16`.
1567    /// 
1568    /// # Cryptographical Security
1569    /// - If you use either `Random_*` or `Any_*`, it is considered to be
1570    ///   cryptographically secure.
1571    /// - If you use `Slapdash_*`, it is considered that it may be
1572    ///   cryptographically insecure.
1573    /// 
1574    /// # Example 1 for Random
1575    /// ```
1576    /// use cryptocol::random::Random;
1577    /// let mut rand = Random::new();
1578    /// for i in 0..10
1579    ///     { println!("{} Random number (Random) = {}", i, rand.random_u16()); }
1580    /// ```
1581    /// 
1582    /// # For more examples,
1583    /// click [here](./documentation/random_random_smalluint/struct.Random_Generic.html#method.random_u16)
1584    pub fn random_u16(&mut self) -> u16
1585    {
1586        self.produce_aux_state();
1587        self.produce_main_state();
1588        let mut i = self.main_state[2] as usize & 0b111;
1589        let mut j = self.main_state[3] as usize & 0b111;
1590        i = self.aux_state[i] as usize & 0b111;
1591        j = self.aux_state[j] as usize & 0b11;
1592        LongUnion::new_with(self.main_state[i]).get_ushort_(j)
1593    }
1594
1595    // pub fn random_u32(&mut self) -> u32
1596    /// Generates random numbers of type `u32`.
1597    /// 
1598    /// # Output
1599    /// It returns a random number of type `u32`.
1600    /// 
1601    /// # Cryptographical Security
1602    /// - If you use either `Random_*` or `Any_*`, it is considered to be
1603    ///   cryptographically secure.
1604    /// - If you use `Slapdash_*`, it is considered that it may be
1605    ///   cryptographically insecure.
1606    /// 
1607    /// # Example 1 for Random
1608    /// ```
1609    /// use cryptocol::random::Random;
1610    /// let mut rand = Random::new();
1611    /// for i in 0..10
1612    ///     { println!("{} Random number (Random) = {}", i, rand.random_u32()); }
1613    /// ```
1614    /// 
1615    /// # For more examples,
1616    /// click [here](./documentation/random_random_smalluint/struct.Random_Generic.html#method.random_u32)
1617    pub fn random_u32(&mut self) -> u32
1618    {
1619        self.produce_aux_state();
1620        self.produce_main_state();
1621        let mut i = self.main_state[4] as usize & 0b111;
1622        let mut j = self.main_state[5] as usize & 0b111;
1623        i = self.aux_state[i] as usize & 0b111;
1624        j = self.aux_state[j] as usize & 1;
1625        LongUnion::new_with(self.main_state[i]).get_uint_(j)
1626    }
1627
1628    // pub fn random_u64(&mut self) -> u64
1629    /// Generates random numbers of type `u64`.
1630    /// 
1631    /// # Output
1632    /// It returns a random number of type `u64`.
1633    /// 
1634    /// # Cryptographical Security
1635    /// - If you use either `Random_*` or `Any_*`, it is considered to be
1636    ///   cryptographically secure.
1637    /// - If you use `Slapdash_*`, it is considered that it may be
1638    ///   cryptographically insecure.
1639    /// 
1640    /// # Example 1 for Random
1641    /// ```
1642    /// use cryptocol::random::Random;
1643    /// let mut rand = Random::new();
1644    /// for i in 0..10
1645    ///     { println!("{} Random number (Random) = {}", i, rand.random_u64()); }
1646    /// ```
1647    /// 
1648    /// # For more examples,
1649    /// click [here](./documentation/random_random_smalluint/struct.Random_Generic.html#method.random_u64)
1650    pub fn random_u64(&mut self) -> u64
1651    {
1652        self.produce_aux_state();
1653        self.produce_main_state();
1654        let mut i = self.main_state[0] as usize & 0b111;
1655        i = self.aux_state[i] as usize & 0b111;
1656        self.main_state[i]
1657    }
1658
1659    // pub fn random_u128(&mut self) -> u128
1660    /// Generates random numbers of type `u128`.
1661    /// 
1662    /// # Output
1663    /// It returns a random number of type `u128`.
1664    /// 
1665    /// # Cryptographical Security
1666    /// - If you use either `Random_*` or `Any_*`, it is considered to be
1667    ///   cryptographically secure.
1668    /// - If you use `Slapdash_*`, it is considered that it may be
1669    ///   cryptographically insecure.
1670    /// 
1671    /// # Example 1 for Random
1672    /// ```
1673    /// use cryptocol::random::Random;
1674    /// let mut rand = Random::new();
1675    /// for i in 0..10
1676    ///     { println!("{} Random number (Random) = {}", i, rand.random_u128()); }
1677    /// ```
1678    /// 
1679    /// # For more examples,
1680    /// click [here](./documentation/random_random_smalluint/struct.Random_Generic.html#method.random_u128)
1681    pub fn random_u128(&mut self) -> u128
1682    {
1683        self.produce_aux_state();
1684        self.produce_main_state();
1685        let mut i = self.main_state[6] as usize & 0b111;
1686        let mut j = self.main_state[7] as usize & 0b111;
1687        i = self.aux_state[i] as usize & 0b111;
1688        j = self.aux_state[j] as usize & 0b111;
1689        let mut res = LongerUnion::new();
1690        res.set_ulong(0, self.main_state[i]);
1691        res.set_ulong(1, self.main_state[j]);
1692        res.get()
1693    }
1694
1695    // pub fn random_usize(&mut self) -> usize
1696    /// Generates random numbers of type `usize`.
1697    /// 
1698    /// # Output
1699    /// It returns a random number of type `usize`.
1700    /// 
1701    /// # Cryptographical Security
1702    /// - If you use either `Random_*` or `Any_*`, it is considered to be
1703    ///   cryptographically secure.
1704    /// - If you use `Slapdash_*`, it is considered that it may be
1705    ///   cryptographically insecure.
1706    /// 
1707    /// # Example 1 for Random
1708    /// ```
1709    /// use cryptocol::random::Random;
1710    /// let mut rand = Random::new();
1711    /// for i in 0..10
1712    ///     { println!("{} Random number (Random) = {}", i, rand.random_usize()); }
1713    /// ```
1714    /// 
1715    /// # For more examples,
1716    /// click [here](./documentation/random_random_smalluint/struct.Random_Generic.html#method.random_usize)
1717    #[inline]
1718    pub fn random_usize(&mut self) -> usize
1719    {
1720        // #[cfg(target_pointer_width = "8")]      return self.random_u8().into_usize();
1721        #[cfg(target_pointer_width = "16")]     return self.random_u16().into_usize();
1722        #[cfg(target_pointer_width = "32")]     return self.random_u32().into_usize();
1723        #[cfg(target_pointer_width = "64")]     return self.random_u64().into_usize();
1724        // #[cfg(target_pointer_width = "128")]    return self.random_u128().into_usize();
1725    }
1726
1727    // pub fn random_uint<T>(&mut self) -> T
1728    /// Generates random numbers of type `T`.
1729    /// 
1730    /// # Output
1731    /// It returns a random number of type `T`.
1732    /// 
1733    /// # Cryptographical Security
1734    /// - If you use either `Random_*` or `Any_*`, it is considered to be
1735    ///   cryptographically secure.
1736    /// - If you use `Slapdash_*`, it is considered that it may be
1737    ///   cryptographically insecure.
1738    /// 
1739    /// # Example 1 for Random
1740    /// ```
1741    /// use cryptocol::random::Random;
1742    /// let mut rand = Random::new();
1743    /// for i in 0..10
1744    ///     { println!("{} Random number (Random) = {}", i, rand.random_uint::<u8>()); }
1745    /// ```
1746    /// 
1747    /// # For more examples,
1748    /// click [here](./documentation/random_random_smalluint/struct.Random_Generic.html#method.random_uint)
1749    pub fn random_uint<T>(&mut self) -> T
1750    where T: SmallUInt
1751    {
1752        match T::size_in_bytes()
1753        {
1754            1 => T::u8_as_smalluint(self.random_u8()),
1755            2 => T::u16_as_smalluint(self.random_u16()),
1756            4 => T::u32_as_smalluint(self.random_u32()),
1757            8 => T::u64_as_smalluint(self.random_u64()),
1758            _ => T::u128_as_smalluint(self.random_u128()),
1759        }
1760    }
1761
1762    // pub fn random_under_uint<T>(&mut self, ceiling: T) -> Option<T>
1763    /// Generates random numbers of type `T` less than `ceiling`.
1764    /// 
1765    /// # Argument
1766    /// The argument `ceiling` is the upper limitation which the generated
1767    /// random number should be less than, and is of the type `T`.
1768    /// 
1769    /// # Output
1770    /// It returns a random number of type `T` less than `ceiling`
1771    /// wrapped by enum `Some` of `Option`.
1772    /// 
1773    /// # Features
1774    /// If `ceiling` is `0`, it returns `None`. Otherwise, it returns a
1775    /// random number of type `T` wrapped by enum `Some` of `Option`.
1776    /// 
1777    /// # Cryptographical Security
1778    /// - If you use either `Random_*` or `Any_*`, it is considered to be
1779    ///   cryptographically secure.
1780    /// - If you use `Slapdash_*`, it is considered that it may be
1781    ///   cryptographically insecure.
1782    /// 
1783    /// # Example 1 for Random
1784    /// ```
1785    /// use cryptocol::random::Random;
1786    /// let mut rand = Random::new();
1787    /// if let Some(num) = rand.random_under_uint(12_u8)
1788    ///     { println!("Random number u8 = {}", num); }
1789    /// ```
1790    /// 
1791    /// # For more examples,
1792    /// click [here](./documentation/random_random_smalluint/struct.Random_Generic.html#method.random_under_uint)
1793    #[inline]
1794    pub fn random_under_uint<T>(&mut self, ceiling: T) -> Option<T>
1795    where T: SmallUInt
1796    {
1797        if ceiling != T::zero() { Some(self.random_under_uint_::<T>(ceiling)) } else { None }
1798    }
1799
1800    // pub fn random_under_uint_<T>(&mut self, ceiling: T) -> T
1801    /// Generates random numbers of type `T` less than `ceiling`.
1802    /// 
1803    /// # Argument
1804    /// The argument `ceiling` is the upper limitation which the generated
1805    /// random number should be less than, and is of the type `T`.
1806    /// 
1807    /// # Output
1808    /// It returns a random number of type `T` less than `ceiling`.
1809    /// 
1810    /// # Panics
1811    /// If `ceiling` is `0`, it will panic.
1812    /// 
1813    /// # Caution
1814    /// Use only when `ceiling` is not `0`.
1815    /// 
1816    /// # Cryptographical Security
1817    /// - If you use either `Random_*` or `Any_*`, it is considered to be
1818    ///   cryptographically secure.
1819    /// - If you use `Slapdash_*`, it is considered that it may be
1820    ///   cryptographically insecure.
1821    /// 
1822    /// # Example 1 for Random
1823    /// ```
1824    /// use cryptocol::random::Random;
1825    /// let mut rand = Random::new();
1826    /// let num = rand.random_under_uint_(12_u8);
1827    /// println!("Random number u8 = {}", num);
1828    /// ```
1829    /// 
1830    /// # For more examples,
1831    /// click [here](./documentation/random_random_smalluint/struct.Random_Generic.html#method.random_under_uint_)
1832    #[inline]
1833    pub fn random_under_uint_<T>(&mut self, ceiling: T) -> T
1834    where T: SmallUInt
1835    {
1836        self.random_uint::<T>() % ceiling
1837    }
1838
1839    // pub fn random_minmax_uint<T>(&mut self, from: T, ceiling: T) -> Option<T>
1840    /// Generates random numbers of type `T` less than `ceiling` exclusively
1841    /// and greater than or equal to `from` inclusively.
1842    /// 
1843    /// # Arguments
1844    /// - `from` is the lower limitation which the generated random number
1845    ///   should be greater than or equal to, and is of the type `T`..
1846    /// - `ceiling` is the upper limitation which the generated random number
1847    ///   should be less than, and is of the type `T`.
1848    /// 
1849    /// # Output
1850    /// If `ceiling` is `0` or `from` is greater than or equal to `ceiling`,
1851    /// it returns a random number of type `T` less than `ceiling` and greater
1852    /// than or equal to `from`, and the returned random number is wrapped by
1853    /// enum `Some` of `Option`. Otherwise, it returns enum `None` of `Option`.
1854    /// 
1855    /// # Cryptographical Security
1856    /// - If you use either `Random_*` or `Any_*`, it is considered to be
1857    ///   cryptographically secure.
1858    /// - If you use `Slapdash_*`, it is considered that it may be
1859    ///   cryptographically insecure.
1860    /// 
1861    /// # Example 1
1862    /// ```
1863    /// use cryptocol::random::Random;
1864    /// let mut rand = Random::new();
1865    /// if let Some(num) = rand.random_minmax_uint(12_u8, 21)
1866    ///     { println!("Random number u8 = {}", num); }
1867    /// ```
1868    /// 
1869    /// # For more examples,
1870    /// click [here](./documentation/random_random_smalluint/struct.Random_Generic.html#method.random_minmax_uint)
1871    #[inline]
1872    pub fn random_minmax_uint<T>(&mut self, from: T, ceiling: T) -> Option<T>
1873    where T: SmallUInt
1874    {
1875        if ceiling > from { Some(self.random_minmax_uint_(from, ceiling)) } else { None }
1876    }
1877
1878    // pub fn random_minmax_uint_<T>(&mut self, from: T, ceiling: T) -> T
1879    /// Generates random numbers of type `T` less than `ceiling` exclusively
1880    /// and greater than or equal to `from` inclusively.
1881    /// 
1882    /// # Arguments
1883    /// - `from` is the lower limitation which the generated random number
1884    ///   should be greater than or equal to, and is of the type `T`..
1885    /// - `ceiling` is the upper limitation which the generated random number
1886    ///   should be less than, and is of the type `T`.
1887    /// 
1888    /// # Output
1889    /// It returns a random number of type `T` less than `ceiling`
1890    /// and greater than or equal to `from`.
1891    /// 
1892    /// # Panics
1893    /// If `ceiling` is `0` or `from` is greater than or equal to `ceiling`,
1894    /// it will panic.
1895    /// 
1896    /// # Caution
1897    /// Use this method only when you are sure that `ceiling` is not `0`
1898    /// and `from` is less than `ceiling`.
1899    /// 
1900    /// # Cryptographical Security
1901    /// - If you use either `Random_*` or `Any_*`, it is considered to be
1902    ///   cryptographically secure.
1903    /// - If you use `Slapdash_*`, it is considered that it may be
1904    ///   cryptographically insecure.
1905    /// 
1906    /// # Example 1 for Random
1907    /// ```
1908    /// use cryptocol::random::Random;
1909    /// let mut rand = Random::new();
1910    /// let num = rand.;random_minmax_uint_(12_u8, 21)
1911    /// println!("Random number u8 = {}", num);
1912    /// ```
1913    /// 
1914    /// # For more examples,
1915    /// click [here](./documentation/random_random_smalluint/struct.Random_Generic.html#method.random_minmax_uint_)
1916    #[inline]
1917    pub fn random_minmax_uint_<T>(&mut self, from: T, ceiling: T) -> T
1918    where T: SmallUInt
1919    {
1920        self.random_under_uint_(ceiling - from) + from
1921    }
1922
1923    // pub fn random_odd_uint<T>(&mut self) -> T
1924    /// Generates random odd numbers of type `T`.
1925    /// 
1926    /// # Output
1927    /// It returns a random odd number of type `T`.
1928    /// 
1929    /// # Cryptographical Security
1930    /// - If you use either `Random_*` or `Any_*`, it is considered to be
1931    ///   cryptographically secure.
1932    /// - If you use `Slapdash_*`, it is considered that it may be
1933    ///   cryptographically insecure.
1934    /// 
1935    /// # Example 1 for Random
1936    /// ```
1937    /// use cryptocol::random::Random;
1938    /// let mut rand = Random::new();
1939    /// println!("Random odd number u8 = {}", rand.random_odd_uint::<u8>());
1940    /// println!("Random odd number u16 = {}", rand.random_odd_uint::<u16>());
1941    /// println!("Random odd number u32 = {}", rand.random_odd_uint::<u32>());
1942    /// println!("Random odd number u64 = {}", rand.random_odd_uint::<u64>());
1943    /// println!("Random odd number u128 = {}", rand.random_odd_uint::<u128>());
1944    /// println!("Random odd number usize = {}", rand.random_odd_uint::<usize>());
1945    /// ```
1946    /// 
1947    /// # For more examples,
1948    /// click [here](./documentation/random_random_smalluint/struct.Random_Generic.html#method.random_odd_uint)
1949    pub fn random_odd_uint<T>(&mut self) -> T
1950    where T: SmallUInt
1951    {
1952        let mut res = self.random_uint::<T>();
1953        res.set_lsb();
1954        res
1955    }
1956
1957    // pub fn random_odd_under_uint<T>(&mut self, ceiling: T) -> Option<T>
1958    /// Generates random odd numbers of type `T` less than `ceiling`.
1959    /// 
1960    /// # Argument
1961    /// The argument `ceiling` is the upper limitation which the generated
1962    /// random number should be less than, and is of the type `T`.
1963    /// 
1964    /// # Output
1965    /// It returns a random odd numbers of type `T` less than `ceiling`
1966    /// wrapped by enum `Some` of `Option`.
1967    /// 
1968    /// # Features
1969    /// If `ceiling` is less than `2`, it returns `None`. Otherwise, it returns
1970    /// a random odd numbers of type `T` wrapped by enum `Some` of `Option`.
1971    /// 
1972    /// # Cryptographical Security
1973    /// - If you use either `Random_*` or `Any_*`, it is considered to be
1974    ///   cryptographically secure.
1975    /// - If you use `Slapdash_*`, it is considered that it may be
1976    ///   cryptographically insecure.
1977    /// 
1978    /// # Example 1 for Random
1979    /// ```
1980    /// use cryptocol::random::Random;
1981    /// let mut rand = Random::new();
1982    /// if let Some(num) = rand.random_odd_under_uint(12_u8)
1983    ///     { println!("Random odd number u8 = {}", num); }
1984    /// if let Some(num) = rand.random_odd_under_uint(1234_u16)
1985    ///     { println!("Random odd number u16 = {}", num); }
1986    /// if let Some(num) = rand.random_odd_under_uint(12345678_u32)
1987    ///     { println!("Random odd number u32 = {}", num); }
1988    /// if let Some(num) = rand.random_odd_under_uint(1234567890123456_u64)
1989    ///     { println!("Random odd number u64 = {}", num); }
1990    /// if let Some(num) = rand.random_odd_under_uint(12345678901234567890_u128)
1991    ///     { println!("Random odd number u128 = {}", num); }
1992    /// if let Some(num) = rand.random_odd_under_uint(123456789_usize)
1993    ///     { println!("Random odd number usize = {}", num); }
1994    /// if let Some(num) = rand.random_odd_under_uint(0_usize)
1995    ///     { println!("Random odd number usize = {}", num); }
1996    /// else
1997    ///     { println!("No random unsigned odd number under 0!"); }
1998    /// ```
1999    /// 
2000    /// # For more examples,
2001    /// click [here](./documentation/random_random_smalluint/struct.Random_Generic.html#method.random_odd_under_uint)
2002    #[inline]
2003    pub fn random_odd_under_uint<T>(&mut self, ceiling: T) -> Option<T>
2004    where T: SmallUInt
2005    {
2006        if ceiling.is_zero_or_one() { None } else { Some(self.random_odd_under_uint_(ceiling)) }
2007    }
2008
2009    // pub fn random_odd_under_uint_<T>(&mut self, ceiling: T) -> T
2010    /// Generates random odd numbers of type `T` less than `ceiling`.
2011    /// 
2012    /// # Argument
2013    /// The argument `ceiling` is the upper limitation which the generated
2014    /// random number should be less than, and is of the type `T`.
2015    /// 
2016    /// # Output
2017    /// It returns a random odd numbers of type `T` less than `ceiling`.
2018    /// 
2019    /// # Panics
2020    /// If `ceiling` is less than `2`, it will panic.
2021    /// 
2022    /// # Caution
2023    /// Use this method only when `ceiling` is greater than `1`.
2024    /// 
2025    /// # Cryptographical Security
2026    /// - If you use either `Random_*` or `Any_*`, it is considered to be
2027    ///   cryptographically secure.
2028    /// - If you use `Slapdash_*`, it is considered that it may be
2029    ///   cryptographically insecure.
2030    /// 
2031    /// # Example 1 for Random
2032    /// ```
2033    /// use cryptocol::random::Random;
2034    /// let mut rand = Random::new();
2035    /// 
2036    /// let num = rand.random_odd_under_uint_(12_u8);
2037    /// println!("Random odd number u8 = {}", num);
2038    /// 
2039    /// let num = rand.random_odd_under_uint_(1234_u16);
2040    /// println!("Random odd number u16 = {}", num);
2041    /// 
2042    /// let num = rand.random_odd_under_uint_(12345678_u32);
2043    /// println!("Random odd number u32 = {}", num);
2044    /// 
2045    /// let num = rand.random_odd_under_uint_(1234567890123456_u64);
2046    /// println!("Random odd number u64 = {}", num);
2047    /// 
2048    /// let num = rand.random_odd_under_uint_(12345678901234567890_u128);
2049    /// println!("Random odd number u128 = {}", num);
2050    /// 
2051    /// let num = rand.random_odd_under_uint_(123456789_usize);
2052    /// println!("Random odd number usize = {}", num);
2053    /// ```
2054    /// 
2055    /// # For more examples,
2056    /// click [here](./documentation/random_random_smalluint/struct.Random_Generic.html#method.random_odd_under_uint_)
2057    pub fn random_odd_under_uint_<T>(&mut self, mut ceiling: T) -> T
2058    where T: SmallUInt
2059    {
2060        if ceiling.is_zero_or_one()
2061            { panic!(); }
2062        ceiling.reset_lsb();
2063        let mut res = self.random_under_uint_(ceiling);
2064        res.set_lsb();
2065        res
2066    }
2067
2068    // pub fn random_with_msb_set_uint<T>(&mut self) -> T
2069    /// Generates random numbers of type `T` and of maximum size of `T`.
2070    /// 
2071    /// # Output
2072    /// It returns random numbers of type `T` and of maximum size of `T`.
2073    /// 
2074    /// # Cryptographical Security
2075    /// - If you use either `Random_*` or `Any_*`, it is considered to be
2076    ///   cryptographically secure.
2077    /// - If you use `Slapdash_*`, it is considered that it may be
2078    ///   cryptographically insecure.
2079    /// 
2080    /// # Example 1 for Random
2081    /// ```
2082    /// use cryptocol::random::Random;
2083    /// let mut rand = Random::new();
2084    /// println!("Random 8-bit number = {}", rand.random_with_msb_set_uint::<u8>());
2085    /// println!("Random 16-bit number = {}", rand.random_with_msb_set_uint::<u16>());
2086    /// println!("Random 32-bit number = {}", rand.random_with_msb_set_uint::<u32>());
2087    /// println!("Random 64-bit number = {}", rand.random_with_msb_set_uint::<u64>());
2088    /// println!("Random 128-bit number = {}", rand.random_with_msb_set_uint::<u128>());
2089    /// println!("Random usize-sized number = {}", rand.random_with_msb_set_uint::<usize>());
2090    /// ```
2091    /// 
2092    /// # For more examples,
2093    /// click [here](./documentation/random_random_smalluint/struct.Random_Generic.html#method.random_with_msb_set_uint)
2094    pub fn random_with_msb_set_uint<T>(&mut self) -> T
2095    where T: SmallUInt
2096    {
2097        let mut res = self.random_uint::<T>();
2098        res.set_msb();
2099        res
2100    }
2101
2102    // pub fn random_odd_with_msb_set_uint<T>(&mut self) -> T
2103    /// Generates random odd numbers of type `T` and of maximum size of `T`.
2104    /// 
2105    /// # Output
2106    /// It returns random odd numbers of type `T` and of maximum size of `T`.
2107    /// 
2108    /// # Cryptographical Security
2109    /// - If you use either `Random_*` or `Any_*`, it is considered to be
2110    ///   cryptographically secure.
2111    /// - If you use `Slapdash_*`, it is considered that it may be
2112    ///   cryptographically insecure.
2113    /// 
2114    /// # Example 1 for Random
2115    /// ```
2116    /// use cryptocol::random::Random;
2117    /// let mut rand = Random::new();
2118    /// println!("Random 8-bit odd number = {}", rand.random_odd_with_msb_set_uint::<u8>());
2119    /// println!("Random 16-bit odd number = {}", rand.random_odd_with_msb_set_uint::<u16>());
2120    /// println!("Random 32-bit odd number = {}", rand.random_odd_with_msb_set_uint::<u32>());
2121    /// println!("Random 64-bit odd number = {}", rand.random_odd_with_msb_set_uint::<u64>());
2122    /// println!("Random 128-bit odd number = {}", rand.random_odd_with_msb_set_uint::<u128>());
2123    /// println!("Random usize-sized odd number = {}", rand.random_odd_with_msb_set_uint::<usize>());
2124    /// ```
2125    /// 
2126    /// # For more examples,
2127    /// click [here](./documentation/random_random_smalluint/struct.Random_Generic.html#method.random_odd_with_msb_set_uint)
2128    pub fn random_odd_with_msb_set_uint<T>(&mut self) -> T
2129    where T: SmallUInt
2130    {
2131        let mut res = self.random_odd_uint::<T>();
2132        res.set_msb();
2133        res
2134    }
2135
2136    // pub fn random_prime_using_miller_rabin_uint<T>(&mut self, repetition: usize) -> T
2137    /// Returns a random prime number.
2138    /// 
2139    /// # Argument
2140    /// The argument `repetition` defines how many times it tests whether or not
2141    /// the generated random number is prime. Usually, `repetition` is given to
2142    /// be 5 to have 99.9% hit rate.
2143    /// 
2144    /// # Output
2145    /// A random prime number whose range is from 2 up to T::max() inclusively.
2146    /// 
2147    /// # Features
2148    /// - It uses
2149    ///   [Miller Rabin algorithm](https://en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_test).
2150    /// - If this test results in composite number, the tested number is surely
2151    ///   a composite number. If this test results in notprime number, the
2152    ///   probability that the tested number is not a prime number is 1/4 (= 25%).
2153    ///   So, if the test results in prime number twice, the probability that the
2154    ///   tested number is not a prime number is 1/16 (= 1/4 * 1/4 = 6.25%).
2155    ///   Therefore, if you test any number 5 times and they all result in a prime
2156    ///   number, the probability that the tested number is not a prime number is
2157    ///   1/1024 = (= 1/4 * 1/4 * 1/4 * 1/4 * 1/4 = 0.09765625%). In other words,
2158    ///   it is about 99.9% that the number is a prime number.
2159    /// - The random prime numbers that may or may not be cryptographically
2160    ///   secure depending on what pseudo-random number generator is used.
2161    /// 
2162    /// # Cryptographical Security
2163    /// - If you use either `Random_*` or `Any_*`, it is considered to be
2164    ///   cryptographically secure.
2165    /// - If you use `Slapdash_*`, it is considered that it may be
2166    ///   cryptographically insecure.
2167    /// 
2168    /// # Counterpart Methods
2169    /// If you want to use a `(sizeof::<T>() * 8)`-bit long random prime
2170    /// number, you are highly recommended to use the method
2171    /// [random_prime_with_msb_set_using_miller_rabin_uint()](struct@Random_Generic#method.random_prime_with_msb_set_using_miller_rabin_uint)
2172    /// rather than this method.
2173    /// 
2174    /// # Example 1 for Random
2175    /// ```
2176    /// use cryptocol::random::Random;
2177    /// let mut rand = Random::new();
2178    /// println!("Random 8-bit prime number = {}", rand.random_prime_using_miller_rabin_uint::<u8>(5));
2179    /// println!("Random 16-bit prime number = {}", rand.random_prime_using_miller_rabin_uint::<u16>(5));
2180    /// println!("Random 32-bit prime number = {}", rand.random_prime_using_miller_rabin_uint::<u32>(5));
2181    /// println!("Random 64-bit prime number = {}", rand.random_prime_using_miller_rabin_uint::<u64>(5));
2182    /// println!("Random 128-bit prime number = {}", rand.random_prime_using_miller_rabin_uint::<u128>(5));
2183    /// println!("Random usize-sized prime number = {}", rand.random_prime_using_miller_rabin_uint::<usize>(5));
2184    /// ```
2185    /// 
2186    /// # For more examples,
2187    /// click [here](./documentation/random_random_smalluint/struct.Random_Generic.html#method.random_prime_using_miller_rabin_uint)
2188    pub fn random_prime_using_miller_rabin_uint<T>(&mut self, repetition: usize) -> T
2189    where T: SmallUInt
2190    {
2191        let mut res = self.random_odd_uint::<T>();
2192        while !res.is_prime_using_miller_rabin(repetition)
2193            { res = self.random_odd_uint::<T>(); }
2194        res
2195    }
2196
2197    // pub fn random_prime_with_msb_set_using_miller_rabin_uint<T>(&mut self, repetition: usize) -> T
2198    /// Returns a full-sized random prime number, which is its MSB (Most
2199    /// Segnificant Bit) is set `1`.
2200    /// 
2201    /// # Argument
2202    /// The argument `repetition` defines how many times it tests whether or not
2203    /// the generated random number is prime. Usually, `repetition` is given to
2204    /// be 5 to have 99.9% hit rate.
2205    /// 
2206    /// # Output
2207    /// A full-sized random prime number, which is its MSB (Most Segnificant
2208    /// Bit) is set `1` and whose range is from 2 up to T::max() inclusively.
2209    /// 
2210    /// # Features
2211    /// - This method generates a random number, and then simply sets its MSB
2212    /// (Most Significant Bit) to be one, and then checks whether or not the
2213    /// generated random number is prime number, and then it repeats until it
2214    /// will generate a prime number.
2215    /// - It uses
2216    /// [Miller Rabin algorithm](https://en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_test).
2217    /// - If this test results in composite number, the tested number is surely
2218    /// a composite number. If this test results in notprime number, the
2219    /// probability that the tested number is not a prime number is 1/4 (= 25%).
2220    /// So, if the test results in prime number twice, the probability that the
2221    /// tested number is not a prime number is 1/16 (= 1/4 * 1/4 = 6.25%).
2222    /// Therefore, if you test any number 5 times and they all result in a prime
2223    /// number, the probability that the tested number is not a prime number is
2224    /// 1/1024 = (= 1/4 * 1/4 * 1/4 * 1/4 * 1/4 = 0.09765625%). In other words,
2225    /// it is about 99.9% that the number is a prime number.
2226    /// - The random prime numbers that may or may not be cryptographically
2227    /// secure depending on what pseudo-random number generator is used.
2228    /// 
2229    /// # Cryptographical Security
2230    /// - If you use either `Random_*` or `Any_*`, it is considered to be
2231    ///   cryptographically secure.
2232    /// - If you use `Slapdash_*`, it is considered that it may be
2233    ///   cryptographically insecure.
2234    /// 
2235    /// # Counterpart Methods
2236    /// - If you want to use a normal random prime number, you are highly
2237    /// recommended to use the method
2238    /// [random_prime_using_miller_rabin_uint()](struct@Random_Generic#method.random_prime_using_miller_rabin_uint)
2239    /// rather than this method.
2240    /// 
2241    /// # Example 1 for Random
2242    /// ```
2243    /// use cryptocol::random::Random;
2244    /// let mut rand = Random::new();
2245    /// println!("Random 8-bit prime number = {}", rand.random_prime_with_msb_set_using_miller_rabin_uint::<u8>(5));
2246    /// println!("Random 16-bit prime number = {}", rand.random_prime_with_msb_set_using_miller_rabin_uint::<u16>(5));
2247    /// println!("Random 32-bit prime number = {}", rand.random_prime_with_msb_set_using_miller_rabin_uint::<u32>(5));
2248    /// println!("Random 64-bit prime number = {}", rand.random_prime_with_msb_set_using_miller_rabin_uint::<u64>(5));
2249    /// println!("Random 128-bit prime number = {}", rand.random_prime_with_msb_set_using_miller_rabin_uint::<u128>(5));
2250    /// println!("Random usize-sized prime number = {}", rand.random_prime_with_msb_set_using_miller_rabin_uint::<usize>(5));
2251    /// ```
2252    /// 
2253    /// # For more examples,
2254    /// click [here](./documentation/random_random_smalluint/struct.Random_Generic.html#method.random_prime_with_msb_set_using_miller_rabin_uint)
2255    pub fn random_prime_with_msb_set_using_miller_rabin_uint<T>(&mut self, repetition: usize) -> T
2256    where T: SmallUInt
2257    {
2258        let mut res = self.random_odd_with_msb_set_uint::<T>();
2259        while !res.is_prime_using_miller_rabin(repetition)
2260            { res = self.random_odd_with_msb_set_uint::<T>(); }
2261        res
2262    }
2263
2264    // pub fn random_array<T, const N: usize>(&mut self) -> [T; N]
2265    /// Returns random number array [T; N].
2266    /// 
2267    /// # Output
2268    /// A random number array [T; N] each element of which has a range from
2269    /// `0` up to `T::max()` inclusively for both ends.
2270    /// 
2271    /// # Features
2272    /// The random numbers that may or may not be cryptographically secure
2273    /// depending on what pseudo-random number generator is used.
2274    /// 
2275    /// # Cryptographical Security
2276    /// - If you use either `Random_*` or `Any_*`, it is considered to be
2277    ///   cryptographically secure.
2278    /// - If you use `Slapdash_*`, it is considered that it may be
2279    ///   cryptographically insecure.
2280    /// 
2281    /// # Counterpart Methods
2282    /// If you want random BigUInt, you are highly recommended
2283    /// to use the method
2284    /// [random_biguint()](struct@Random_Generic#method.random_biguint)
2285    /// rather than this method.
2286    /// 
2287    /// # Example 1 for Random
2288    /// ```
2289    /// use cryptocol::random::Random;
2290    /// let mut rand = Random::new();
2291    /// let num: [u128; 5] = rand.random_array();
2292    /// for i in 0..5
2293    ///     { println!("Random number {} => {}", i, num[i]); }
2294    /// ```
2295    /// 
2296    /// # For more examples,
2297    /// click [here](./documentation/random_random_biguint/struct.Random_Generic.html#method.random_array)
2298    pub fn random_array<T, const N: usize>(&mut self) -> [T; N]
2299    where T: SmallUInt
2300    {
2301        let mut res = [T::zero(); N];
2302        self.put_random_in_array(&mut res);
2303        res
2304    }
2305
2306    // pub fn put_random_in_array<T, const N: usize>(&mut self, out: &mut [T; N])
2307    /// Puts random number array [T; N] in `out`.
2308    /// 
2309    /// # Argument
2310    /// `out` is a random number array [T; N] each element of which has
2311    /// a range from `0` up to `T::max()` inclusively for both ends.
2312    /// 
2313    /// # Features
2314    /// The random numbers that may or may not be cryptographically secure
2315    /// depending on what pseudo-random number generator is used.
2316    /// 
2317    /// # Cryptographical Security
2318    /// - If you use either `Random_*` or `Any_*`, it is considered to be
2319    ///   cryptographically secure.
2320    /// - If you use `Slapdash_*`, it is considered that it may be
2321    ///   cryptographically insecure.
2322    /// 
2323    /// # Counterpart Methods
2324    /// If you want random BigUInt, you are highly recommended
2325    /// to use the method
2326    /// [random_biguint()](struct@Random_Generic#method.random_biguint)
2327    /// rather than this method.
2328    /// 
2329    /// # Example 1 for Random
2330    /// ```
2331    /// use cryptocol::random::Random;
2332    /// let mut rand = Random::new();
2333    /// let mut num = [0_u128; 5];
2334    /// rand.put_random_in_array(&mut num);
2335    /// for i in 0..5
2336    ///     { println!("Random number {} => {}", i, num[i]); }
2337    /// ```
2338    /// 
2339    /// # For more examples,
2340    /// click [here](./documentation/random_random_biguint/struct.Random_Generic.html#method.put_random_in_array)
2341    pub fn put_random_in_array<T, const N: usize>(&mut self, out: &mut [T; N])
2342    where T: SmallUInt
2343    {
2344        self.produce_aux_state();
2345        self.produce_main_state();
2346        let mut tsize = T::size_in_bytes() as usize * N;
2347        const ASIZE: usize = 8 * 8; // = U64::size_in_bytes() as usize * 8;
2348        let mut j = 0_usize;
2349        let mut array = self.aux_state.clone();
2350        while tsize > 0
2351        {
2352            for i in 0..8
2353                { array[i] ^= self.main_state[i]; }
2354            let count = if tsize < ASIZE { tsize } else { ASIZE };
2355            unsafe { copy_nonoverlapping(array.as_ptr() as *const u8, (out.as_mut_ptr() as *mut u8).add(ASIZE * j), count); }
2356            self.produce_main_state();
2357            tsize -= count;
2358            j += 1;
2359        }
2360    }
2361
2362    // pub fn random_biguint<T, const N: usize>(&mut self) -> BigUInt<T, N>
2363    /// Constucts a new `BigUInt<T, N>`-type object which has the random value.
2364    /// 
2365    /// # Output
2366    /// A random number whose range is from `0` up to `BigUInt::max()`
2367    /// inclusively for both ends.
2368    /// 
2369    /// # Features
2370    /// The random numbers that may or may not be cryptographically secure
2371    /// depending on what pseudo-random number generator is used.
2372    /// 
2373    /// # Cryptographical Security
2374    /// - If you use either `Random_*` or `Any_*`, it is considered to be
2375    ///   cryptographically secure.
2376    /// - If you use `Slapdash_*`, it is considered that it may be
2377    ///   cryptographically insecure.
2378    /// 
2379    /// # Counterpart Methods
2380    /// - If you want to use a random number less than a certain value, you are
2381    ///   highly recommended to use the method
2382    ///   [random_under_biguint()](struct@Random_Generic#method.random_under_biguint)
2383    ///   rather than this method.
2384    /// - If you want to use a random odd number, you are highly recommended to
2385    ///   use the method
2386    ///   [random_odd_biguint()](struct@Random_Generic#method.random_odd_biguint)
2387    ///   rather than this method.
2388    /// - If you want to use a random odd number less than a certain value,
2389    ///   you are highly recommended to use the method
2390    ///   [ranodm_odd_under_biguint()](struct@Random_Generic#method.ranodm_odd_under_biguint)
2391    ///   rather than this method.
2392    /// - If you want to use a `(N * sizeof::<T>() * 8)`-bit long random
2393    ///   number, you are highly recommended to use the method
2394    ///   [random_with_msb_set_biguint()](struct@Random_Generic#method.random_with_msb_set_biguint)
2395    ///   rather than this method.
2396    /// - If you want to use a `(N * sizeof::<T>() * 8)`-bit long random odd
2397    ///   number, you are highly recommended to
2398    ///   use the method [random_odd_with_msb_set_biguint()](struct@Random_Generic#method.random_odd_with_msb_set_biguint)
2399    ///   rather than this method.
2400    /// - If you want to use a normal random prime number, you are highly recommended to
2401    ///   use the method [random_prime_using_miller_rabin_biguint()](struct@Random_Generic#method.random_prime_using_miller_rabin_biguint)
2402    ///   rather than this method.
2403    /// - If you want to use a `(N * sizeof::<T>() * 8)`-bit long random prime
2404    ///   number, you are highly recommended to
2405    ///   use the method [random_prime_with_msb_set_using_miller_rabin_biguint()](struct@Random_Generic#method.random_prime_with_msb_set_using_miller_rabin_biguint)
2406    ///   rather than this method.
2407    /// 
2408    /// # Example 1 for Random
2409    /// ```
2410    /// use cryptocol::random::Random;
2411    /// use cryptocol::define_utypes_with;
2412    /// define_utypes_with!(u128);
2413    /// 
2414    /// let mut rand = Random::new();
2415    /// let biguint: U256 = rand.random_biguint();
2416    /// println!("Random Number: {}", biguint);
2417    /// ```
2418    /// 
2419    /// # For more examples,
2420    /// click [here](./documentation/random_random_biguint/struct.Random_Generic.html#method.random_biguint)
2421    #[inline]
2422    pub fn random_biguint<T, const N: usize>(&mut self) -> BigUInt<T, N>
2423    where T: SmallUInt
2424    {
2425        BigUInt::<T, N>::from_array(self.random_array::<T, N>()                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    )
2426    }
2427
2428    // pub fn random_under_biguint<T, const N: usize>(&mut self, ceiling: &BigUInt<T, N>) -> Option<BigUInt<T, N>>
2429    /// Constucts a new `BigUInt<T, N>`-type object which has the random
2430    /// value less than a certain value, wrapped by enum `Some` of `Option`.
2431    /// 
2432    /// # Argument
2433    /// The argument `ceiling` is the upper limitation which the generated
2434    /// random number should be less than, and is of type `&BigUInt<T, N>`.
2435    /// 
2436    /// # Output
2437    /// A random number wrapped by enum `Some` of `Option`, whose range is
2438    /// between 0 inclusively and the certain value exclusively when `ceiling`
2439    /// is not zero. If `ceiling` is zero, `None` will be returned.
2440    /// 
2441    /// # Features
2442    /// - This method generates a random number, and then simply divides it by
2443    ///   the certain value to get its remainder.
2444    /// - The random numbers that may or may not be cryptographically
2445    ///   secure depending on what pseudo-random number generator is used.
2446    /// 
2447    /// # Cryptographical Security
2448    /// - If you use either `Random_*` or `Any_*`, it is considered to be
2449    ///   cryptographically secure.
2450    /// - If you use `Slapdash_*`, it is considered that it may be
2451    ///   cryptographically insecure.
2452    /// 
2453    /// # Counterpart Methods
2454    /// - If you want to use a normal random number, you are highly recommended
2455    ///   to use the method
2456    ///   [random_biguint()](struct@Random_Generic#method.random_biguint)
2457    ///   rather than this method.
2458    /// - If you want to use a random odd number, you are highly recommended to
2459    ///   use the method
2460    ///   [random_odd_biguint()](struct@Random_Generic#method.random_odd_biguint)
2461    ///   rather than this method.
2462    /// - If you want to use a random odd number less than a certain value,
2463    ///   you are highly recommended to use the method
2464    ///   [ranodm_odd_under_biguint()](struct@Random_Generic#method.ranodm_odd_under_biguint)
2465    ///   rather than this method.
2466    /// - If you want to use a `(N * sizeof::<T>() * 8)`-bit long random
2467    ///   number, you are highly recommended to use the method
2468    ///   [random_with_msb_set_biguint()](struct@Random_Generic#method.random_with_msb_set_biguint)
2469    ///   rather than this method.
2470    /// - If you want to use a `(N * sizeof::<T>() * 8)`-bit long random odd
2471    ///   number, you are highly recommended to use the method
2472    ///   [random_odd_with_msb_set_biguint()](struct@Random_Generic#method.random_odd_with_msb_set_biguint)
2473    ///   rather than this method.
2474    /// - If you want to use a normal random prime number, you are highly
2475    ///   recommended to use the method
2476    ///   [random_prime_using_miller_rabin_biguint()](struct@Random_Generic#method.random_prime_using_miller_rabin_biguint)
2477    ///   rather than this method.
2478    /// - If you want to use a `(N * sizeof::<T>() * 8)`-bit long random prime
2479    ///   number, you are highly recommended to use the method
2480    ///   [random_prime_with_msb_set_using_miller_rabin_biguint()](struct@Random_Generic#method.random_prime_with_msb_set_using_miller_rabin_biguint)
2481    ///   rather than this method.
2482    /// 
2483    /// # Example 1 for Random
2484    /// ```
2485    /// use cryptocol::random::Random;
2486    /// use cryptocol::define_utypes_with;
2487    /// define_utypes_with!(u64);
2488    /// 
2489    /// let mut rand = Random::new();
2490    /// let ceiling = U16384::max().wrapping_div_uint(3_u8);
2491    /// if let Some(r) = rand.random_under_biguint(&ceiling)
2492    /// {
2493    ///     println!("Random Number less than {} is\n{}", ceiling, r);
2494    ///     assert!(r < ceiling);
2495    /// }
2496    /// ```
2497    /// 
2498    /// # For more examples,
2499    /// click [here](./documentation/random_random_biguint/struct.Random_Generic.html#method.random_under_biguint)
2500    #[inline]
2501    pub fn random_under_biguint<T, const N: usize>(&mut self, ceiling: &BigUInt<T, N>) -> Option<BigUInt<T, N>>
2502    where T: SmallUInt
2503    {
2504        if ceiling.eq_uint(0_u8) {None} else {Some(self.random_under_biguint_::<T, N>(ceiling))}
2505    }
2506
2507    // pub fn random_under_biguint_<T, const N: usize>(&mut self, ceiling: &BigUInt<T, N>) -> BigUInt<T, N>
2508    /// Constucts a new `BigUInt<T, N>`-type object which has the random
2509    /// value less than a certain value.
2510    /// 
2511    /// # Argument
2512    /// The argument `ceiling` is the upper limitation which the generated
2513    /// random number should be less than, and is of type `&BigUInt<T, N>`.
2514    /// 
2515    /// # Output
2516    /// The random number whose range is between 0 inclusively
2517    /// and the certain value exclusively.
2518    /// 
2519    /// # Features
2520    /// - This method generates a random number, and then simply divides it by
2521    ///   the certain value to get its remainder.
2522    /// - The random numbers that may or may not be cryptographically
2523    ///   secure depending on what pseudo-random number generator is used.
2524    /// 
2525    /// # Panics
2526    /// If `ceiling` is zero, this method will panic.
2527    /// 
2528    /// # Caution
2529    /// Use this method only when you are sure that `ceiling` is not zero.
2530    /// 
2531    /// # Cryptographical Security
2532    /// - If you use either `Random_*` or `Any_*`, it is considered to be
2533    ///   cryptographically secure.
2534    /// - If you use `Slapdash_*`, it is considered that it may be
2535    ///   cryptographically insecure.
2536    /// 
2537    /// # Counterpart Methods
2538    /// - If you want to use a normal random number, you are highly recommended
2539    ///   to use the method
2540    ///   [random_biguint()](struct@Random_Generic#method.random_biguint)
2541    ///   rather than this method.
2542    /// - If you want to use a random odd number, you are highly recommended to
2543    ///   use the method
2544    ///   [random_odd_biguint()](struct@Random_Generic#method.random_odd_biguint)
2545    ///   rather than this method.
2546    /// - If you want to use a random odd number less than a certain value,
2547    ///   you are highly recommended to use the method
2548    ///   [ranodm_odd_under_biguint()](struct@Random_Generic#method.ranodm_odd_under_biguint)
2549    ///   rather than this method.
2550    /// - If you want to use a `(N * sizeof::<T>() * 8)`-bit long random
2551    ///   number, you are highly recommended to use the method
2552    ///   [random_with_msb_set_biguint()](struct@Random_Generic#method.random_with_msb_set_biguint)
2553    ///   rather than this method.
2554    /// - If you want to use a `(N * sizeof::<T>() * 8)`-bit long random odd
2555    ///   number, you are highly recommended to use the method
2556    ///   [random_odd_with_msb_set_biguint()](struct@Random_Generic#method.random_odd_with_msb_set_biguint)
2557    ///   rather than this method.
2558    /// - If you want to use a normal random prime number, you are highly
2559    ///   recommended to use the method
2560    ///   [random_prime_using_miller_rabin_biguint()](struct@Random_Generic#method.random_prime_using_miller_rabin_biguint)
2561    ///   rather than this method.
2562    /// - If you want to use a `(N * sizeof::<T>() * 8)`-bit long random prime
2563    ///   number, you are highly recommended to use the method
2564    ///   [random_prime_with_msb_set_using_miller_rabin_biguint()](struct@Random_Generic#method.random_prime_with_msb_set_using_miller_rabin_biguint)
2565    ///   rather than this method.
2566    /// 
2567    /// # Example 1 for Random
2568    /// ```
2569    /// use cryptocol::random::Random;
2570    /// use cryptocol::define_utypes_with;
2571    /// define_utypes_with!(u32);
2572    /// 
2573    /// let mut rand = Random::new();
2574    /// let ceiling = U16384::max().wrapping_div_uint(3_u8);
2575    /// let r = rand.random_under_biguint_(&ceiling);
2576    /// println!("Random Number less than {} is\n{}", ceiling, r);
2577    /// assert!(r < ceiling);
2578    /// ```
2579    /// 
2580    /// # For more examples,
2581    /// click [here](./documentation/random_random_biguint/struct.Random_Generic.html#method.random_under_biguint_)
2582    #[inline]
2583    pub fn random_under_biguint_<T, const N: usize>(&mut self, ceiling: &BigUInt<T, N>) -> BigUInt<T, N>
2584    where T: SmallUInt
2585    {
2586        self.random_biguint::<T, N>().wrapping_rem(ceiling)
2587    }
2588
2589    // pub fn random_odd_biguint<T, const N: usize>(&mut self) -> BigUInt<T, N>
2590    /// Constucts a new `BigUInt<T, N>`-type object which has the random odd
2591    /// value.
2592    /// 
2593    /// # Argument
2594    /// The argument `ceiling` is the upper limitation which the generated
2595    /// random number should be less than, and is of type `&BigUInt<T, N>`.
2596    /// 
2597    /// # Output
2598    /// The random number that this method `any_odd()` returns is a pure
2599    /// random odd number whose range is from `1` up to `BigUInt::max()`
2600    /// inclusively for both ends.
2601    /// 
2602    /// # Features
2603    /// - This method generates a random number, and then simply set the LSB
2604    /// (Least Significant Bit).
2605    /// - The random numbers that may or may not be cryptographically
2606    /// secure depending on what pseudo-random number generator is used.
2607    /// 
2608    /// # Cryptographical Security
2609    /// - If you use either `Random_*` or `Any_*`, it is considered to be
2610    ///   cryptographically secure.
2611    /// - If you use `Slapdash_*`, it is considered that it may be
2612    ///   cryptographically insecure.
2613    /// 
2614    /// # Counterpart Methods
2615    /// - If you want to use a normal random number, you are highly recommended
2616    ///   to use the method
2617    ///   [random_biguint()](struct@Random_Generic#method.random_biguint)
2618    ///   rather than this method.
2619    /// - If you want to use a random number less than a certain value, you are
2620    ///   highly recommended to use the method
2621    ///   [random_under_biguint()](struct@Random_Generic#method.random_under_biguint)
2622    ///   rather than this method.
2623    /// - If you want to use a random odd number, you are highly recommended to
2624    ///   use the method
2625    ///   [random_odd_biguint()](struct@Random_Generic#method.random_odd_biguint)
2626    ///   rather than this method.
2627    /// - If you want to use a random odd number less than a certain value,
2628    ///   you are highly recommended to use the method
2629    ///   [ranodm_odd_under_biguint()](struct@Random_Generic#method.ranodm_odd_under_biguint)
2630    ///   rather than this method.
2631    /// - If you want to use a `(N * sizeof::<T>() * 8)`-bit long random number,
2632    ///   you are highly recommended to use the method
2633    ///   [random_with_msb_set_biguint()](struct@Random_Generic#method.random_with_msb_set_biguint)
2634    ///   rather than this method.
2635    /// - If you want to use a `(N * sizeof::<T>() * 8)`-bit long random odd
2636    ///   number, you are highly recommended to use the method
2637    ///   [random_odd_with_msb_set_biguint()](struct@Random_Generic#method.random_odd_with_msb_set_biguint)
2638    ///   rather than this method.
2639    /// - If you want to use a normal random prime number, you are highly
2640    ///   recommended to use the method
2641    ///   [random_prime_using_miller_rabin_biguint()](struct@Random_Generic#method.random_prime_using_miller_rabin_biguint)
2642    ///   rather than this method.
2643    /// - If you want to use a `(N * sizeof::<T>() * 8)`-bit long random prime
2644    ///   number, you are highly recommended to use the method
2645    ///   [random_prime_with_msb_set_using_miller_rabin_biguint()](struct@Random_Generic#method.random_prime_with_msb_set_using_miller_rabin_biguint)
2646    ///   rather than this method.
2647    /// 
2648    /// # Example 1 for Random
2649    /// ```
2650    /// use cryptocol::random::Random;
2651    /// use cryptocol::define_utypes_with;
2652    /// define_utypes_with!(u16);
2653    /// 
2654    /// let mut rand = Random::new();
2655    /// let r: U16384 = rand.random_odd_biguint();
2656    /// println!("Random odd number is {}.", r);
2657    /// assert!(r.is_odd());
2658    /// ```
2659    /// 
2660    /// # For more examples,
2661    /// click [here](./documentation/random_random_biguint/struct.Random_Generic.html#method.random_odd_biguint)
2662    pub fn random_odd_biguint<T, const N: usize>(&mut self) -> BigUInt<T, N>
2663    where T: SmallUInt
2664    {
2665        let mut res = self.random_biguint::<T, N>();
2666        res.set_lsb();
2667        res
2668    }
2669
2670    // pub fn random_odd_under_biguint<T, const N: usize>(&mut self, ceiling: &BigUInt<T, N>) -> Option<BigUInt<T, N>>
2671    /// Constucts a new `BigUInt<T, N>`-type object which has the random odd
2672    /// value less than a certain value, wrapped by enum `Some` of `Option`.
2673    /// 
2674    /// # Argument
2675    /// The argument `ceiling` is the upper limitation which the generated
2676    /// random number should be less than, and is of type `&BigUInt<T, N>`.
2677    /// 
2678    /// # Output
2679    /// The random odd number whose range is between 0 inclusively and the
2680    /// certain value exclusively, wrapped by enum `Some` of `Option` if
2681    /// `ceiling` is not zero. If `ceiling` is zero, `None` will be returned.
2682    /// 
2683    /// # Features
2684    /// - This method generates a random number, and then simply divides it
2685    ///   by the certain value to get its remainder and then simply set the LSB
2686    ///   (Least Significant Bit).
2687    /// - The random numbers that may or may not be cryptographically
2688    ///   secure depending on what pseudo-random number generator is used.
2689    /// 
2690    /// # Cryptographical Security
2691    /// - If you use either `Random_*` or `Any_*`, it is considered to be
2692    ///   cryptographically secure.
2693    /// - If you use `Slapdash_*`, it is considered that it may be
2694    ///   cryptographically insecure.
2695    /// 
2696    /// # Counterpart Methods
2697    /// - If you want to use a normal random number, you are highly recommended
2698    ///   to use the method
2699    ///   [random_biguint()](struct@Random_Generic#method.random_biguint)
2700    ///   rather than this method.
2701    /// - If you want to use a random number less than a certain value, you are
2702    ///   highly recommended to use the method
2703    ///   [random_under_biguint()](struct@Random_Generic#method.random_under_biguint)
2704    ///   rather than this method.
2705    /// - If you want to use a random odd number, you are highly recommended to
2706    ///   use the method
2707    ///   [random_odd_biguint()](struct@Random_Generic#method.random_odd_biguint)
2708    ///   rather than this method.
2709    /// - If you want to use a `(N * sizeof::<T>() * 8)`-bit long random
2710    ///   number, you are highly recommended to use the method
2711    ///   [random_with_msb_set_biguint()](struct@Random_Generic#method.random_with_msb_set_biguint)
2712    ///   rather than this method.
2713    /// - If you want to use a `(N * sizeof::<T>() * 8)`-bit long random odd
2714    ///   number, you are highly recommended to use the method
2715    ///   [random_odd_with_msb_set_biguint()](struct@Random_Generic#method.random_odd_with_msb_set_biguint)
2716    ///   rather than this method.
2717    /// - If you want to use a normal random prime number, you are highly
2718    ///   recommended to use the method
2719    ///   [random_prime_using_miller_rabin_biguint()](struct@Random_Generic#method.random_prime_using_miller_rabin_biguint)
2720    ///   rather than this method.
2721    /// - If you want to use a `(N * sizeof::<T>() * 8)`-bit long random prime
2722    ///   number, you are highly recommended to use the method
2723    ///   [random_prime_with_msb_set_using_miller_rabin_biguint()](struct@Random_Generic#method.random_prime_with_msb_set_using_miller_rabin_biguint)
2724    ///   rather than this method.
2725    /// 
2726    /// # Example 1 for Random
2727    /// ```
2728    /// use cryptocol::random::Random;
2729    /// use cryptocol::define_utypes_with;
2730    /// define_utypes_with!(u8);
2731    /// 
2732    /// let mut rand = Random::new();
2733    /// let ceiling = U16384::max().wrapping_div_uint(3_u8);
2734    /// if let Some(r) = rand.random_odd_under_biguint(&ceiling)
2735    /// {
2736    ///     println!("Random odd number less than {} is\n{}", ceiling, r);
2737    ///     assert!(r < ceiling);
2738    ///     assert!(r.is_odd());
2739    /// }
2740    /// ```
2741    /// 
2742    /// # For more examples,
2743    /// click [here](./documentation/random_random_biguint/struct.Random_Generic.html#method.random_odd_under_biguint)
2744    #[inline]
2745    pub fn random_odd_under_biguint<T, const N: usize>(&mut self, ceiling: &BigUInt<T, N>) -> Option<BigUInt<T, N>>
2746    where T: SmallUInt
2747    {
2748        if ceiling.is_zero_or_one() { None } else { Some(self.random_odd_under_biguint_(ceiling)) }
2749    }
2750
2751    // pub fn random_odd_under_biguint_<T, const N: usize>(&mut self, ceiling: &BigUInt<T, N>) -> BigUInt<T, N>
2752    /// Constucts a new `BigUInt<T, N>`-type object which has the random odd
2753    /// value less than a certain value.
2754    /// 
2755    /// # Argument
2756    /// The argument `ceiling` is the upper limitation which the generated
2757    /// random number should be less than, and is of type `&BigUInt<T, N>`.
2758    /// 
2759    /// # Output
2760    /// The random odd number whose range is between 0 inclusively and the
2761    /// certain value exclusively.
2762    /// 
2763    /// # Features
2764    /// - This method generates a random number, and then simply divides it
2765    ///   by the certain value to get its remainder and then simply set the LSB
2766    ///   (Least Significant Bit).
2767    /// - The random numbers that may or may not be cryptographically
2768    ///   secure depending on what pseudo-random number generator is used.
2769    /// 
2770    /// # Panics
2771    /// If `ceiling` is zero, this method will panic.
2772    /// 
2773    /// # Caution
2774    /// Use this method only when you are sure that `ceiling` is not zero.
2775    /// 
2776    /// # Cryptographical Security
2777    /// - If you use either `Random_*` or `Any_*`, it is considered to be
2778    ///   cryptographically secure.
2779    /// - If you use `Slapdash_*`, it is considered that it may be
2780    ///   cryptographically insecure.
2781    /// 
2782    /// # Counterpart Methods
2783    /// - If you want to use a normal random number, you are highly recommended
2784    ///   to use the method
2785    ///   [random_biguint()](struct@Random_Generic#method.random_biguint)
2786    ///   rather than this method.
2787    /// - If you want to use a random number less than a certain value, you are
2788    ///   highly recommended to use the method
2789    ///   [random_under_biguint()](struct@Random_Generic#method.random_under_biguint)
2790    ///   rather than this method.
2791    /// - If you want to use a random odd number, you are highly recommended to
2792    ///   use the method
2793    ///   [random_odd_biguint()](struct@Random_Generic#method.random_odd_biguint)
2794    ///   rather than this method.
2795    /// - If you want to use a `(N * sizeof::<T>() * 8)`-bit long random
2796    ///   number, you are highly recommended to use the method
2797    ///   [random_with_msb_set_biguint()](struct@Random_Generic#method.random_with_msb_set_biguint)
2798    ///   rather than this method.
2799    /// - If you want to use a `(N * sizeof::<T>() * 8)`-bit long random odd
2800    ///   number, you are highly recommended to
2801    ///   use the method [random_odd_with_msb_set_biguint()](struct@Random_Generic#method.random_odd_with_msb_set_biguint)
2802    ///   rather than this method.
2803    /// - If you want to use a normal random prime number, you are highly
2804    ///   recommended to use the method
2805    ///   [random_prime_using_miller_rabin_biguint()](struct@Random_Generic#method.random_prime_using_miller_rabin_biguint)
2806    ///   rather than this method.
2807    /// - If you want to use a `(N * sizeof::<T>() * 8)`-bit long random prime
2808    ///   number, you are highly recommended to use the method
2809    ///   [random_prime_with_msb_set_using_miller_rabin_biguint()](struct@Random_Generic#method.random_prime_with_msb_set_using_miller_rabin_biguint)
2810    ///   rather than this method.
2811    /// 
2812    /// # Example 1 for Random
2813    /// ```
2814    /// use cryptocol::random::Random;
2815    /// use cryptocol::define_utypes_with;
2816    /// define_utypes_with!(u128);
2817    /// 
2818    /// let mut rand = Random::new();
2819    /// let ceiling = U16384::max().wrapping_div_uint(3_u8);
2820    /// let r = rand.random_odd_under_biguint_(&ceiling);
2821    /// println!("Random odd number less than {} is\n{}", ceiling, r);
2822    /// assert!(r < ceiling);
2823    /// assert!(r.is_odd());
2824    /// ```
2825    /// 
2826    /// # For more examples,
2827    /// click [here](./documentation/random_random_biguint/struct.Random_Generic.html#method.random_odd_under_biguint_)
2828    #[inline]
2829    pub fn random_odd_under_biguint_<T, const N: usize>(&mut self, ceiling: &BigUInt<T, N>) -> BigUInt<T, N>
2830    where T: SmallUInt
2831    {
2832        if ceiling.is_zero_or_one()
2833            { panic!(); }
2834        let mut ceiling = ceiling.clone();
2835        ceiling.reset_lsb();
2836        let mut res = self.random_under_biguint_(&ceiling);
2837        res.set_lsb();
2838        res
2839    }
2840
2841    // pub fn random_with_msb_set_biguint<T, const N: usize>(&mut self) -> BigUInt<T, N>
2842    /// Constucts a new `BigUInt<T, N>`-type object which has the random value
2843    /// with `(N * sizeof::<T>() * 8)`-bit length.
2844    /// 
2845    /// # Output
2846    /// The random number whose range is from !(BigUInt::max() >> 1) up to
2847    /// BigUInt::max() inclusively.
2848    /// 
2849    /// # Features
2850    /// - This method generates a random number, and then simply set the MSB
2851    ///   (Most Significant Bit).
2852    /// - The random numbers that may or may not be cryptographically
2853    ///   secure depending on what pseudo-random number generator is used.
2854    /// 
2855    /// # Cryptographical Security
2856    /// - If you use either `Random_*` or `Any_*`, it is considered to be
2857    ///   cryptographically secure.
2858    /// - If you use `Slapdash_*`, it is considered that it may be
2859    ///   cryptographically insecure.
2860    /// 
2861    /// # Counterpart Methods
2862    /// - If you want to use a normal random number, you are highly recommended
2863    ///   to use the method
2864    ///   [random_biguint()](struct@Random_Generic#method.random_biguint)
2865    ///   rather than this method.
2866    /// - If you want to use a random number less than a certain value, you are
2867    ///   highly recommended to use the method
2868    ///   [random_under_biguint()](struct@Random_Generic#method.random_under_biguint)
2869    ///   rather than this method.
2870    /// - If you want to use a random odd number, you are highly recommended to
2871    ///   use the method
2872    ///   [random_odd_biguint()](struct@Random_Generic#method.random_odd_biguint)
2873    ///   rather than this method.
2874    /// - If you want to use a random odd number less than a certain value,
2875    ///   you are highly recommended to use the method
2876    ///   [ranodm_odd_under_biguint()](struct@Random_Generic#method.ranodm_odd_under_biguint)
2877    ///   rather than this method.
2878    /// - If you want to use a `(N * sizeof::<T>() * 8)`-bit long random odd
2879    ///   number, you are highly recommended to
2880    ///   use the method [random_odd_with_msb_set_biguint()](struct@Random_Generic#method.random_odd_with_msb_set_biguint)
2881    ///   rather than this method.
2882    /// - If you want to use a `(N * sizeof::<T>() * 8)`-bit long random odd
2883    ///   number, you are highly recommended to
2884    ///   use the method [random_odd_with_msb_set_biguint()](struct@Random_Generic#method.random_odd_with_msb_set_biguint)
2885    ///   rather than this method.
2886    /// - If you want to use a normal random prime number, you are highly
2887    ///   recommended to use the method
2888    ///   [random_prime_using_miller_rabin_biguint()](struct@Random_Generic#method.random_prime_using_miller_rabin_biguint)
2889    ///   rather than this method.
2890    /// - If you want to use a `(N * sizeof::<T>() * 8)`-bit long random prime
2891    ///   number, you are highly recommended to use the method
2892    ///   [random_prime_with_msb_set_using_miller_rabin_biguint()](struct@Random_Generic#method.random_prime_with_msb_set_using_miller_rabin_biguint)
2893    ///   rather than this method.
2894    /// 
2895    /// # Example 1 for Random
2896    /// ```
2897    /// use cryptocol::random::Random;
2898    /// use cryptocol::define_utypes_with;
2899    /// define_utypes_with!(u64);
2900    /// 
2901    /// let mut rand = Random::new();
2902    /// let r: u64384 = rand.random_with_msb_set_biguint();
2903    /// println!("Random number is {}.", r);
2904    /// assert!(r > u64384::halfmax());
2905    /// ```
2906    /// 
2907    /// # For more examples,
2908    /// click [here](./documentation/random_random_biguint/struct.Random_Generic.html#method.random_with_msb_set_biguint)
2909    #[inline]
2910    pub fn random_with_msb_set_biguint<T, const N: usize>(&mut self) -> BigUInt<T, N>
2911    where T: SmallUInt
2912    {
2913        let mut res = self.random_biguint::<T, N>();
2914        res.set_msb();
2915        res
2916    }
2917
2918    // pub fn random_odd_with_msb_set_biguint<T, const N: usize>(&mut self) -> BigUInt<T, N>
2919    /// Constucts a new `BigUInt<T, N>`-type object which has the random odd
2920    /// value with `(N * sizeof::<T>() * 8)`-bit length
2921    /// 
2922    /// # Output
2923    /// The random number that this method random_odd_with_msb_set() returns is
2924    /// a random odd number whose range is from !(BigUInt::max() >> 1) + 1 up to
2925    /// BigUInt::max() inclusively.
2926    /// 
2927    /// # Features
2928    /// - This method generates a random number, and then simply set the MSB
2929    ///   (Most Significant Bit) and LSB (Least Significant Bit).
2930    /// - The random numbers that may or may not be cryptographically
2931    ///   secure depending on what pseudo-random number generator is used.
2932    /// 
2933    /// # Cryptographical Security
2934    /// - If you use either `Random_*` or `Any_*`, it is considered to be
2935    ///   cryptographically secure.
2936    /// - If you use `Slapdash_*`, it is considered that it may be
2937    ///   cryptographically insecure.
2938    /// 
2939    /// # Counterpart Methods
2940    /// - If you want to use a normal random number, you are highly recommended
2941    ///   to use the method
2942    ///   [random_biguint()](struct@Random_Generic#method.random_biguint)
2943    ///   rather than this method.
2944    /// - If you want to use a random number less than a certain value, you are
2945    ///   highly recommended to use the method
2946    ///   [random_under_biguint()](struct@Random_Generic#method.random_under_biguint)
2947    ///   rather than this method.
2948    /// - If you want to use a random odd number, you are highly recommended to
2949    ///   use the method
2950    ///   [random_odd_biguint()](struct@Random_Generic#method.random_odd_biguint)
2951    ///   rather than this method.
2952    /// - If you want to use a random odd number less than a certain value,
2953    ///   you are highly recommended to use the method
2954    ///   [ranodm_odd_under_biguint()](struct@Random_Generic#method.ranodm_odd_under_biguint)
2955    ///   rather than this method.
2956    /// - If you want to use a `(N * sizeof::<T>() * 8)`-bit long random
2957    ///   number, you are highly recommended to use the method
2958    ///   [random_with_msb_set_biguint()](struct@Random_Generic#method.random_with_msb_set_biguint)
2959    ///   rather than this method.
2960    /// - If you want to use a `(N * sizeof::<T>() * 8)`-bit long random
2961    ///   number, you are highly recommended to use the method
2962    ///   [random_with_msb_set_biguint()](struct@Random_Generic#method.random_with_msb_set_biguint)
2963    ///   rather than this method.
2964    /// - If you want to use a normal random prime number, you are highly
2965    ///   recommended to use the method
2966    ///   [random_prime_using_miller_rabin_biguint()](struct@Random_Generic#method.random_prime_using_miller_rabin_biguint)
2967    ///   rather than this method.
2968    /// - If you want to use a `(N * sizeof::<T>() * 8)`-bit long random prime
2969    ///   number, you are highly recommended to use the method
2970    ///   [random_prime_with_msb_set_using_miller_rabin_biguint()](struct@Random_Generic#method.random_prime_with_msb_set_using_miller_rabin_biguint)
2971    ///   rather than this method.
2972    /// 
2973    /// # Example 1 for Random
2974    /// ```
2975    /// use cryptocol::random::Random;
2976    /// use cryptocol::define_utypes_with;
2977    /// define_utypes_with!(u32);
2978    /// 
2979    /// let mut rand = Random::new();
2980    /// let r: U16384 = rand.random_odd_with_msb_set_biguint();
2981    /// println!("Random number is {}.", r);
2982    /// assert!(r > U16384::halfmax());
2983    /// assert!(r.is_odd());
2984    /// ```
2985    /// 
2986    /// # For more examples,
2987    /// click [here](./documentation/random_random_biguint/struct.Random_Generic.html#method.random_odd_with_msb_set_biguint)
2988    pub fn random_odd_with_msb_set_biguint<T, const N: usize>(&mut self) -> BigUInt<T, N>
2989    where T: SmallUInt
2990    {
2991        let mut r = self.random_with_msb_set_biguint();
2992        r.set_lsb();
2993        r
2994    }
2995
2996    // pub fn random_prime_using_miller_rabin_biguint<T, const N: usize>(&mut self, repetition: usize) -> BigUInt<T, N>
2997    /// Constucts a new `BigUInt<T, N>`-type object which represents a random
2998    /// prime number.
2999    /// 
3000    /// # Argument
3001    /// The argument `repetition` defines how many times it tests whether the
3002    /// generated random number is prime. Usually, `repetition` is given to be
3003    /// `5` for 99.9% accuracy or `7` for 99.99% accuracy.
3004    /// 
3005    /// # Output
3006    /// The random prime number that this method random_prime_Miller_Rabin()
3007    /// returns is a random prime number whose range is from
3008    /// 2 up to BigUInt::max() inclusively.
3009    /// 
3010    /// # Features
3011    /// - It uses
3012    ///   [Miller Rabin algorithm](https://en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_test).
3013    /// - If this test results in composite number, the tested number is surely
3014    ///   a composite number. If this test results in prime number, the
3015    ///   probability that the tested number is not a prime number is 1/4. So,
3016    ///   if the test results in prime number twice, the probability that the
3017    ///   tested number is not a prime number is 1/16 (= 1/4 * 1/4). Therefore,
3018    ///   if you test any number 5 times and they all result in a prime number,
3019    ///   it is 99.9% that the number is a prime number.
3020    /// - The random prime numbers that may or may not be cryptographically
3021    ///   secure depending on what pseudo-random number generator is used.
3022    /// 
3023    /// # Counterpart Methods
3024    /// - If you want to use a normal random number, you are highly recommended
3025    ///   to use the method
3026    ///   [random_biguint()](struct@Random_Generic#method.random_biguint)
3027    ///   rather than this method.
3028    /// - If you want to use a random number less than a certain value, you are
3029    ///   highly recommended to use the method
3030    ///   [random_under_biguint()](struct@Random_Generic#method.random_under_biguint)
3031    ///   rather than this method.
3032    /// - If you want to use a random odd number, you are highly recommended to
3033    ///   use the method
3034    ///   [random_odd_biguint()](struct@Random_Generic#method.random_odd_biguint)
3035    ///   rather than this method.
3036    /// - If you want to use a random odd number less than a certain value,
3037    ///   you are highly recommended to use the method
3038    ///   [ranodm_odd_under_biguint()](struct@Random_Generic#method.ranodm_odd_under_biguint)
3039    ///   rather than this method.
3040    /// - If you want to use a `(N * sizeof::<T>() * 8)`-bit long random
3041    ///   number, you are highly recommended to use the method
3042    ///   [random_with_msb_set_biguint()](struct@Random_Generic#method.random_with_msb_set_biguint)
3043    ///   rather than this method.
3044    /// - If you want to use a `(N * sizeof::<T>() * 8)`-bit long random odd
3045    ///   number, you are highly recommended to use the method
3046    ///   [random_odd_with_msb_set_biguint()](struct@Random_Generic#method.random_odd_with_msb_set_biguint)
3047    ///   rather than this method.
3048    /// - If you want to use a `(N * sizeof::<T>() * 8)`-bit long random prime
3049    ///   number, you are highly recommended to use the method
3050    ///   [random_prime_with_msb_set_using_miller_rabin_biguint()](struct@Random_Generic#method.random_prime_with_msb_set_using_miller_rabin_biguint)
3051    ///   rather than this method.
3052    /// 
3053    /// # Example 1 for Random
3054    /// ```
3055    /// use cryptocol::random::Random;
3056    /// use cryptocol::define_utypes_with;
3057    /// define_utypes_with!(u16);
3058    /// 
3059    /// let mut rand = Random::new();
3060    /// let prime: U256 = rand.random_prime_using_miller_rabin_biguint(5);
3061    /// println!("Random prime number: {}", prime);
3062    /// ```
3063    /// 
3064    /// # For more examples,
3065    /// click [here](./documentation/random_random_biguint/struct.Random_Generic.html#method.random_prime_using_miller_rabin_biguint)
3066    pub fn random_prime_using_miller_rabin_biguint<T, const N: usize>(&mut self, repetition: usize) -> BigUInt<T, N>
3067    where T: SmallUInt
3068    {
3069        let mut res = self.random_odd_biguint::<T, N>();
3070        while !res.is_prime_using_miller_rabin(repetition)
3071            { res = self.random_odd_biguint::<T, N>(); }
3072        res
3073    }
3074
3075    pub(crate) fn random_prime_candidate_with_msb_set_biguint<T, const N: usize>(&mut self) -> BigUInt<T, N>
3076    where T: SmallUInt
3077    {
3078        let mut candidate = self.random_odd_with_msb_set_biguint::<T, N>();
3079        while candidate.filter_out_composite_number()
3080        {
3081            candidate = self.random_odd_with_msb_set_biguint::<T, N>();
3082        }
3083        candidate
3084    }
3085
3086    pub(crate) fn random_prime_candidate_with_half_length_biguint<T, const N: usize>(&mut self) -> BigUInt<T, N>
3087    where T: SmallUInt
3088    {
3089        let half = T::BITS * N as u32;
3090        let mut candidate = self.random_odd_with_msb_set_biguint::<T, N>();
3091        candidate.shift_right_assign(half);
3092        candidate.set_lsb();
3093        while candidate.filter_out_composite_number()
3094        {
3095            candidate = self.random_odd_with_msb_set_biguint::<T, N>();
3096            candidate.shift_right_assign(half);
3097            candidate.set_lsb();
3098        }
3099        candidate
3100    }
3101
3102    // pub fn random_prime_with_msb_set_using_miller_rabin_biguint<T, const N: usize>(&mut self, repetition: usize) -> BigUInt<T, N>
3103    /// Constucts a new `BigUInt<T, N>`-type object which represents a random
3104    /// prime number of full-size of BigUInt<T, N>.
3105    /// 
3106    /// # Argument
3107    /// The argument `repetition` defines how many times it tests whether the
3108    /// generated random number is prime. Usually, `repetition` is given to be
3109    /// `5` for 99.9% accuracy or `7` for 99.99% accuracy.
3110    /// 
3111    /// # Output
3112    /// The random prime numbers which ranges from
3113    /// BigUInt::halfmax() up to BigUInt::max() inclusively.
3114    /// 
3115    /// # Features
3116    /// - This method uses concurrency.
3117    /// - This method generates a random number, and then simply sets its MSB
3118    ///   (Most Significant Bit) to be one, and then checks whether or not the
3119    ///   generated random number is prime number, and then it repeats until it
3120    ///   will generate a prime number.
3121    /// - It uses [Miller Rabin algorithm](https://en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_test).
3122    /// - If this test results in composite number, the tested number is surely
3123    ///   a composite number. If this test results in prime number, the
3124    ///   probability that the tested number is not a prime number is 1/4. So,
3125    ///   if the test results in prime number twice, the probability that the
3126    ///   tested number is not a prime number is 1/16 (= 1/4 * 1/4). Therefore,
3127    ///   if you test any number 5 times and they all result in a prime number,
3128    ///   it is 99.9% that the number is a prime number.
3129    /// 
3130    /// # Counterpart Methods
3131    /// - If you want to use a normal random number, you are highly recommended
3132    ///   to use the method
3133    ///   [random_biguint()](struct@Random_Generic#method.random_biguint)
3134    ///   rather than this method.
3135    /// - If you want to use a random number less than a certain value, you are
3136    ///   highly recommended to use the method
3137    ///   [random_under_biguint()](struct@Random_Generic#method.random_under_biguint)
3138    ///   rather than this method.
3139    /// - If you want to use a random odd number, you are highly recommended to
3140    ///   use the method
3141    ///   [random_odd_biguint()](struct@Random_Generic#method.random_odd_biguint)
3142    ///   rather than this method.
3143    /// - If you want to use a random odd number less than a certain value,
3144    ///   you are highly recommended to use the method
3145    ///   [ranodm_odd_under_biguint()](struct@Random_Generic#method.ranodm_odd_under_biguint)
3146    ///   rather than this method.
3147    /// - If you want to use a `(N * sizeof::<T>() * 8)`-bit long random
3148    ///   number, you are highly recommended to use the method
3149    ///   [random_with_msb_set_biguint()](struct@Random_Generic#method.random_with_msb_set_biguint)
3150    ///   rather than this method.
3151    /// - If you want to use a `(N * sizeof::<T>() * 8)`-bit long random odd
3152    ///   number, you are highly recommended to use the method
3153    ///   [random_odd_with_msb_set_biguint()](struct@Random_Generic#method.random_odd_with_msb_set_biguint)
3154    ///   rather than this method.
3155    /// - If you want to use a normal random prime number, you are highly
3156    ///   recommended to use the method
3157    ///   [random_prime_using_miller_rabin_biguint()](struct@Random_Generic#method.random_prime_using_miller_rabin_biguint)
3158    ///   rather than this method.
3159    /// 
3160    /// # Example 1 for Random
3161    /// ```
3162    /// use cryptocol::random::Random;
3163    /// use cryptocol::define_utypes_with;
3164    /// define_utypes_with!(u8);
3165    /// 
3166    /// let mut rand = Random::new();
3167    /// let prime: U256 = rand.random_prime_with_msb_set_using_miller_rabin_biguint(5);
3168    /// println!("Random prime number: {}", prime);
3169    /// ```
3170    /// 
3171    /// # For more examples,
3172    /// click [here](./documentation/random_random_biguint/struct.Random_Generic.html#method.random_prime_with_msb_set_using_miller_rabin_biguint)
3173    #[inline]
3174    pub fn random_prime_with_msb_set_using_miller_rabin_biguint<T, const N: usize>(&mut self, repetition: usize) -> BigUInt<T, N>
3175    where T: SmallUInt
3176    {
3177        self.random_primes_with_msb_set_using_miller_rabin_biguint(repetition, 1).pop().unwrap()
3178    }
3179
3180    // pub fn random_prime_with_msb_set_using_miller_rabin_biguint_sequentially<T, const N: usize>(&mut self, repetition: usize) -> BigUInt<T, N>
3181    /// Constucts a new `BigUInt<T, N>`-type object which represents a random
3182    /// prime number of full-size of BigUInt<T, N>.
3183    /// 
3184    /// # Argument
3185    /// The argument `repetition` defines how many times it tests whether the
3186    /// generated random number is prime. Usually, `repetition` is given to be
3187    /// `5` for 99.9% accuracy or `7` for 99.99% accuracy.
3188    /// 
3189    /// # Output
3190    /// The random prime numbers which ranges from
3191    /// BigUInt::halfmax() up to BigUInt::max() inclusively.
3192    /// 
3193    /// # Features
3194    /// - This method does not use concurrency.
3195    /// - This method generates a random number, and then simply sets its MSB
3196    ///   (Most Significant Bit) to be one, and then checks whether or not the
3197    ///   generated random number is prime number, and then it repeats until it
3198    ///   will generate a prime number.
3199    /// - It uses [Miller Rabin algorithm](https://en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_test).
3200    /// - If this test results in composite number, the tested number is surely
3201    ///   a composite number. If this test results in prime number, the
3202    ///   probability that the tested number is not a prime number is 1/4. So,
3203    ///   if the test results in prime number twice, the probability that the
3204    ///   tested number is not a prime number is 1/16 (= 1/4 * 1/4). Therefore,
3205    ///   if you test any number 5 times and they all result in a prime number,
3206    ///   it is 99.9% that the number is a prime number.
3207    /// 
3208    /// # Example 1 for Random
3209    /// ```
3210    /// use cryptocol::random::Random;
3211    /// use cryptocol::define_utypes_with;
3212    /// define_utypes_with!(u8);
3213    /// 
3214    /// let mut rand = Random::new();
3215    /// let prime: U256 = rand.random_prime_with_msb_set_using_miller_rabin_biguint_sequentially(5);
3216    /// println!("Random prime number: {}", prime);
3217    /// ```
3218    /// 
3219    /// # For more examples,
3220    /// click [here](./documentation/random_random_biguint/struct.Random_Generic.html#method.random_prime_with_msb_set_using_miller_rabin_biguint_sequentially)
3221    pub fn random_prime_with_msb_set_using_miller_rabin_biguint_sequentially<T, const N: usize>(&mut self, repetition: usize) -> BigUInt<T, N>
3222    where T: SmallUInt
3223    {
3224        let mut res = self.random_odd_with_msb_set_biguint::<T, N>();
3225        while !res.is_prime_using_miller_rabin(repetition)
3226            { res = self.random_odd_with_msb_set_biguint::<T, N>(); }
3227        res
3228    }
3229
3230    // pub fn random_primes_with_msb_set_using_miller_rabin_biguint<T, const N: usize>(&mut self, repetition: usize, how_many: usize) -> Vec<BigUInt<T, N>>
3231    /// Returns a collection of new `BigUInt<T, N>`-type objects which represent
3232    /// random prime numbers of full-size of BigUInt<T, N>.
3233    /// 
3234    /// # Argument
3235    /// - `repetition`: determines how many times it tests whether the
3236    ///   generated random number is prime. Usually, `repetition` is given
3237    ///   to be `5` for 99.9% accuracy or `7` for 99.99% accuracy.
3238    /// - `how_many`: determines how many prime numbers this method returns.
3239    /// 
3240    /// # Output
3241    /// The random prime number which ranges from
3242    /// BigUInt::halfmax() up to BigUInt::max() inclusively.
3243    /// 
3244    /// # Features
3245    /// - This method generates several threads, each of which checks whether or
3246    ///   not the given random number is prime number, and then it repeats until
3247    ///   it will find `how_many` prime numbers.
3248    /// - It uses [Miller Rabin algorithm](https://en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_test).
3249    /// - If this test results in composite number, the tested number is surely
3250    ///   a composite number. If this test results in prime number, the
3251    ///   probability that the tested number is not a prime number is 1/4. So,
3252    ///   if the test results in prime number twice, the probability that the
3253    ///   tested number is not a prime number is 1/16 (= 1/4 * 1/4). Therefore,
3254    ///   if you test any number 5 times and they all result in a prime number,
3255    ///   it is 99.9% that the number is a prime number.
3256    /// - The random prime numbers that may or may not be cryptographically
3257    ///   secure depending on what pseudo-random number generator is used.
3258    pub fn random_primes_with_msb_set_using_miller_rabin_biguint<T, const N: usize>(&mut self, repetition: usize, how_many: usize) -> Vec<BigUInt<T, N>>
3259    where T: SmallUInt
3260    {
3261        let mut v = Vec::new();
3262        let mut number_of_threads = match available_parallelism()
3263        {
3264            Ok(non_zero) => non_zero.get() as usize,
3265            Err(_) => 1_usize,
3266        };
3267
3268        if number_of_threads <= 2
3269        {
3270            for _ in 0..how_many
3271                { v.push(self.random_prime_with_msb_set_using_miller_rabin_biguint_sequentially::<T, N>(repetition)); }
3272            return v;
3273        }
3274        number_of_threads >>= 1;
3275        let mut candidates = VecDeque::new();
3276        for _ in 0..number_of_threads
3277        {
3278            let candidate = self.random_prime_candidate_with_msb_set_biguint::<T, N>();
3279            candidates.push_back((candidate, 0_usize));
3280        }
3281
3282        let prime_like = Mutex::new(candidates);
3283        let vv = Mutex::new(v);
3284        let running = AtomicBool::new(true);
3285        let len = A_LIST.len();
3286        scope(|s| {
3287            for _ in 0..number_of_threads
3288            {
3289                s.spawn(|| {
3290                    let mut rand = Random::new();
3291                    loop
3292                    {
3293                        let mut prime = { prime_like.lock().unwrap().pop_front().unwrap() };
3294                        if !running.load(Ordering::Relaxed)
3295                            { break; }
3296                        if repetition <= len
3297                        {
3298                            if prime.1 < repetition - 1
3299                            {
3300                                if prime.0.test_miller_rabin(&BigUInt::<T, N>::from_uint(A_LIST[prime.1]))
3301                                {
3302                                    prime.1 += 1;
3303                                    { prime_like.lock().unwrap().push_back(prime); }
3304                                }
3305                                else
3306                                {
3307                                    let candidate = rand.random_prime_candidate_with_msb_set_biguint::<T, N>();
3308                                    { prime_like.lock().unwrap().push_back((candidate, 0_usize)); }
3309                                }
3310                            }
3311                            else    // prime.1 >= repetition - 1
3312                            {
3313                                if prime.0.test_miller_rabin(&BigUInt::<T, N>::from_uint(A_LIST[prime.1]))
3314                                {
3315                                    let length;
3316                                    {
3317                                        let mut v = vv.lock().unwrap();
3318                                        v.push(prime.0);
3319                                        length = v.len();
3320                                    }
3321                                    if length >= how_many
3322                                    {
3323                                        running.store(false, Ordering::Relaxed);
3324                                        break;
3325                                    }
3326                                }
3327                                let candidate = rand.random_prime_candidate_with_msb_set_biguint::<T, N>();
3328                                { prime_like.lock().unwrap().push_back((candidate, 0_usize)); }
3329                            }
3330                        }
3331                        else    // if repetition > len
3332                        {
3333                            if prime.1 < len
3334                            {
3335                                if prime.0.test_miller_rabin(&BigUInt::<T, N>::from_uint(A_LIST[prime.1]))
3336                                {
3337                                    prime.1 += 1;
3338                                    { prime_like.lock().unwrap().push_back(prime); }
3339                                }
3340                                else
3341                                {
3342                                    let candidate = rand.random_prime_candidate_with_msb_set_biguint::<T, N>();
3343                                    { prime_like.lock().unwrap().push_back((candidate, 0_usize)); }
3344                                }
3345                            }
3346                            else if prime.1 == len
3347                            {
3348                                prime.1 = A_LIST[len-1] as usize + 2;
3349                                if prime.0.test_miller_rabin(&BigUInt::<T, N>::from_uint(prime.1))
3350                                {
3351                                    prime.1 += 2;
3352                                    { prime_like.lock().unwrap().push_back(prime); }
3353                                }
3354                                else
3355                                {
3356                                    let candidate = rand.random_prime_candidate_with_msb_set_biguint::<T, N>();
3357                                    { prime_like.lock().unwrap().push_back((candidate, 0_usize)); }
3358                                }
3359                            }
3360                            else    // if prime.1 > len
3361                            {
3362                                if prime.0.test_miller_rabin(&BigUInt::<T, N>::from_uint(prime.1))
3363                                {
3364                                    if prime.1 >= A_LIST[len-1] as usize + ((repetition - len) << 1)
3365                                    {
3366                                        let length;
3367                                        {
3368                                            let mut v = vv.lock().unwrap();
3369                                            v.push(prime.0);
3370                                            length = v.len();
3371                                        }
3372                                        if length >= how_many
3373                                        {
3374                                            running.store(false, Ordering::Relaxed);
3375                                            break;
3376                                        }
3377                                        let candidate = rand.random_prime_candidate_with_msb_set_biguint::<T, N>();
3378                                        { prime_like.lock().unwrap().push_back((candidate, 0_usize)); }
3379                                    }
3380                                    else
3381                                    {
3382                                        prime.1 += 2;
3383                                        { prime_like.lock().unwrap().push_back(prime); }
3384                                    }
3385                                }
3386                                else
3387                                {
3388                                    let candidate = rand.random_prime_candidate_with_msb_set_biguint::<T, N>();
3389                                    { prime_like.lock().unwrap().push_back((candidate, 0_usize)); }
3390                                }
3391                            }
3392                        }
3393                    }
3394                });
3395            }
3396        });
3397        vv.into_inner().unwrap()
3398    }
3399
3400    // pub fn random_prime_with_half_length_using_miller_rabin_biguint<T, const N: usize>(&mut self, repetition: usize) -> BigUInt<T, N>
3401    /// Constucts a new `BigUInt<T, N>`-type object which represents a 
3402    /// `N * T::size_in_bits() / 2`-bit random prime number.
3403    /// 
3404    /// # Argument
3405    /// The argument `repetition` defines how many times it tests whether the
3406    /// generated random number is prime. Usually, `repetition` is given to be
3407    /// `5` for 99.9% accuracy or `7` for 99.99% accuracy.
3408    /// 
3409    /// # Output
3410    /// This method returns a random prime number whose length is
3411    /// `N * T::size_in_bits() / 2` bits.
3412    /// 
3413    /// # Features
3414    /// - This method generates a random number of half length, and then simply
3415    ///   sets all the bytes from `N * T::size_in_bits() / 2`-th bit to 
3416    ///   `N * T::size_in_bits() - 1`-th bit to be `zero`, and then checks
3417    ///   whether or not the generated random number is prime number, and then
3418    ///   it repeats until it will generate a prime number. Here, 0-th bit is
3419    ///   LSB (Least Significant Bit) and `N * T::size_in_bits() - 1`-th bit
3420    ///   is MSB (Most Significant Bit).
3421    /// - It uses
3422    ///   [Miller Rabin algorithm](https://en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_test).
3423    /// - If this test results in composite number, the tested number is surely
3424    ///   a composite number. If this test results in prime number, the
3425    ///   probability that the tested number is not a prime number is 1/4. So,
3426    ///   if the test results in prime number twice, the probability that the
3427    ///   tested number is not a prime number is 1/16 (= 1/4 * 1/4). Therefore,
3428    ///   if you test any number 5 times and they all result in a prime number,
3429    ///   it is 99.9% that the number is a prime number.
3430    /// - The random prime numbers that may or may not be cryptographically
3431    ///   secure depending on what pseudo-random number generator is used.
3432    /// 
3433    /// # Cryptographical Security
3434    /// - If you use either `Random_*` or `Any_*`, it is considered to be
3435    ///   cryptographically secure.
3436    /// - If you use `Slapdash_*`, it is considered that it may be
3437    ///   cryptographically insecure.
3438    /// 
3439    /// # Counterpart Methods
3440    /// - If you want to use a normal random number, you are highly recommended
3441    ///   to use the method
3442    ///   [random_biguint()](struct@Random_Generic#method.random_biguint)
3443    ///   rather than this method.
3444    /// - If you want to use a random number less than a certain value, you are
3445    ///   highly recommended to use the method
3446    ///   [random_under_biguint()](struct@Random_Generic#method.random_under_biguint)
3447    ///   rather than this method.
3448    /// - If you want to use a random odd number, you are highly recommended to
3449    ///   use the method
3450    ///   [random_odd_biguint()](struct@Random_Generic#method.random_odd_biguint)
3451    ///   rather than this method.
3452    /// - If you want to use a random odd number less than a certain value,
3453    ///   you are highly recommended to use the method
3454    ///   [ranodm_odd_under_biguint()](struct@Random_Generic#method.ranodm_odd_under_biguint)
3455    ///   rather than this method.
3456    /// - If you want to use a `(N * sizeof::<T>() * 8)`-bit long random
3457    ///   number, you are highly recommended to use the method
3458    ///   [random_with_msb_set_biguint()](struct@Random_Generic#method.random_with_msb_set_biguint)
3459    ///   rather than this method.
3460    /// - If you want to use a `(N * sizeof::<T>() * 8)`-bit long random odd
3461    ///   number, you are highly recommended to use the method
3462    ///   [random_odd_with_msb_set_biguint()](struct@Random_Generic#method.random_odd_with_msb_set_biguint)
3463    ///   rather than this method.
3464    /// - If you want to use a normal random prime number, you are highly
3465    ///   recommended to use the method
3466    ///   [random_prime_using_miller_rabin_biguint()](struct@Random_Generic#method.random_prime_using_miller_rabin_biguint)
3467    ///   rather than this method.
3468    /// 
3469    /// # Example 1 for Random
3470    /// ```
3471    /// use cryptocol::random::Random;
3472    /// use cryptocol::define_utypes_with;
3473    /// define_utypes_with!(u128);
3474    /// 
3475    /// let mut rand = Random::new();
3476    /// let prime: U256 = rand.random_prime_with_half_length_using_miller_rabin_biguint(5);
3477    /// println!("Random prime number: {}", prime);
3478    /// ```
3479    /// 
3480    /// # For more examples,
3481    /// click [here](./documentation/random_random_biguint/struct.Random_Generic.html#method.random_prime_with_half_length_using_miller_rabin_biguint)
3482    pub fn random_prime_with_half_length_using_miller_rabin_biguint<T, const N: usize>(&mut self, repetition: usize) -> BigUInt<T, N>
3483    where T: SmallUInt
3484    {
3485        let half = (T::BITS * N as u32) >> 1;
3486        let mut res: BigUInt<T, N> = self.random_with_msb_set_biguint();
3487        res.shift_right_assign(half);
3488        res.set_lsb();
3489        while !res.is_prime_using_miller_rabin(repetition)
3490        {
3491            res = self.random_with_msb_set_biguint();
3492            res.shift_right_assign(half);
3493            res.set_lsb();
3494        }
3495        res
3496    }
3497
3498    // pub fn random_primes_with_half_length_using_miller_rabin_biguint<T, const N: usize>(&mut self, repetition: usize, how_many: usize) -> Vec<BigUInt<T, N>>
3499    /// Returns a collection of new `BigUInt<T, N>`-type objects which represent
3500    /// random prime numbers of half-size of BigUInt<T, N>.
3501    /// 
3502    /// # Argument
3503    /// - `repetition`: determines how many times it tests whether the
3504    ///   generated random number is prime. Usually, `repetition` is given
3505    ///   to be `5` for 99.9% accuracy or `7` for 99.99% accuracy.
3506    /// - `how_many`: determines how many prime numbers this method returns.
3507    /// 
3508    /// # Output
3509    /// The random prime number which ranges from
3510    /// BigUInt::halfmax() up to BigUInt::max() inclusively.
3511    /// 
3512    /// # Features
3513    /// - This method generates several threads, each of which checks whether or
3514    ///   not the given random number is prime number, and then it repeats until
3515    ///   it will find `how_many` prime numbers.
3516    /// - It uses [Miller Rabin algorithm](https://en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_test).
3517    /// - If this test results in composite number, the tested number is surely
3518    ///   a composite number. If this test results in prime number, the
3519    ///   probability that the tested number is not a prime number is 1/4. So,
3520    ///   if the test results in prime number twice, the probability that the
3521    ///   tested number is not a prime number is 1/16 (= 1/4 * 1/4). Therefore,
3522    ///   if you test any number 5 times and they all result in a prime number,
3523    ///   it is 99.9% that the number is a prime number.
3524    /// - The random prime numbers that may or may not be cryptographically
3525    ///   secure depending on what pseudo-random number generator is used.
3526    pub fn random_primes_with_half_length_using_miller_rabin_biguint<T, const N: usize>(&mut self, repetition: usize, how_many: usize) -> Vec<BigUInt<T, N>>
3527    where T: SmallUInt
3528    {
3529        let mut v = Vec::new();
3530        let mut number_of_threads = match available_parallelism()
3531        {
3532            Ok(non_zero) => non_zero.get() as usize,
3533            Err(_) => 1_usize,
3534        };
3535
3536        if number_of_threads <= 2
3537        {
3538            for _ in 0..how_many
3539                { v.push(self.random_prime_with_msb_set_using_miller_rabin_biguint_sequentially::<T, N>(repetition)); }
3540            return v;
3541        }
3542        number_of_threads >>= 1;
3543        let mut candidates = VecDeque::new();
3544        for _ in 0..number_of_threads
3545        {
3546            let candidate = self.random_prime_candidate_with_half_length_biguint::<T, N>();
3547            candidates.push_back((candidate, 0_usize));
3548        }
3549        let prime_like = Mutex::new(candidates);
3550        let vv = Mutex::new(v);
3551        let running = AtomicBool::new(true);
3552        let len = A_LIST.len();
3553        scope(|s| {
3554            for _ in 0..number_of_threads
3555            {
3556                s.spawn(|| {
3557                    let mut rand = Random::new();
3558                    loop
3559                    {
3560                        let mut prime = { prime_like.lock().unwrap().pop_front().unwrap() };
3561                        if !running.load(Ordering::Relaxed)
3562                            { break; }
3563                        if repetition <= len
3564                        {
3565                            if prime.1 < repetition - 1
3566                            {
3567                                if prime.0.test_miller_rabin(&BigUInt::<T, N>::from_uint(A_LIST[prime.1]))
3568                                {
3569                                    prime.1 += 1;
3570                                    { prime_like.lock().unwrap().push_back(prime); }
3571                                }
3572                                else
3573                                {
3574                                    let candidate = rand.random_prime_candidate_with_half_length_biguint::<T, N>();
3575                                    { prime_like.lock().unwrap().push_back((candidate, 0_usize)); }
3576                                }
3577                            }
3578                            else    // prime.1 >= repetition - 1
3579                            {
3580                                if prime.0.test_miller_rabin(&BigUInt::<T, N>::from_uint(A_LIST[prime.1]))
3581                                {
3582                                    let length;
3583                                    {
3584                                        let mut v = vv.lock().unwrap();
3585                                        v.push(prime.0);
3586                                        length = v.len();
3587                                    }
3588                                    if length >= how_many
3589                                    {
3590                                        running.store(false, Ordering::Relaxed);
3591                                        break;
3592                                    }
3593                                }
3594                                let candidate = rand.random_prime_candidate_with_half_length_biguint::<T, N>();
3595                                { prime_like.lock().unwrap().push_back((candidate, 0_usize)); }
3596                            }
3597                        }
3598                        else    // if repetition > len
3599                        {
3600                            if prime.1 < len
3601                            {
3602                                if prime.0.test_miller_rabin(&BigUInt::<T, N>::from_uint(A_LIST[prime.1]))
3603                                {
3604                                    prime.1 += 1;
3605                                    { prime_like.lock().unwrap().push_back(prime); }
3606                                }
3607                                else
3608                                {
3609                                    let candidate = rand.random_prime_candidate_with_half_length_biguint::<T, N>();
3610                                    { prime_like.lock().unwrap().push_back((candidate, 0_usize)); }
3611                                }
3612                            }
3613                            else if prime.1 == len
3614                            {
3615                                prime.1 = A_LIST[len-1] as usize + 2;
3616                                if prime.0.test_miller_rabin(&BigUInt::<T, N>::from_uint(prime.1))
3617                                {
3618                                    prime.1 += 2;
3619                                    { prime_like.lock().unwrap().push_back(prime); }
3620                                }
3621                                else
3622                                {
3623                                    let candidate = rand.random_prime_candidate_with_half_length_biguint::<T, N>();
3624                                    { prime_like.lock().unwrap().push_back((candidate, 0_usize)); }
3625                                }
3626                            }
3627                            else    // if prime.1 > len
3628                            {
3629                                if prime.0.test_miller_rabin(&BigUInt::<T, N>::from_uint(prime.1))
3630                                {
3631                                    if prime.1 >= A_LIST[len-1] as usize + ((repetition - len) << 1)
3632                                    {
3633                                        let length;
3634                                        {
3635                                            let mut v = vv.lock().unwrap();
3636                                            v.push(prime.0);
3637                                            length = v.len();
3638                                        }
3639                                        if length >= how_many
3640                                        {
3641                                            running.store(false, Ordering::Relaxed);
3642                                            break;
3643                                        }
3644                                        let candidate = rand.random_prime_candidate_with_half_length_biguint::<T, N>();
3645                                        { prime_like.lock().unwrap().push_back((candidate, 0_usize)); }
3646                                    }
3647                                    else
3648                                    {
3649                                        prime.1 += 2;
3650                                        { prime_like.lock().unwrap().push_back(prime); }
3651                                    }
3652                                }
3653                                else
3654                                {
3655                                    let candidate = rand.random_prime_candidate_with_half_length_biguint::<T, N>();
3656                                    { prime_like.lock().unwrap().push_back((candidate, 0_usize)); }
3657                                }
3658                            }
3659                        }
3660                    }
3661                });
3662            }
3663        });
3664        vv.into_inner().unwrap()
3665    }
3666
3667    // pub fn random_prime_with_half_length_using_rsa_biguint<T, const N: usize>(&mut self, repetition: usize) -> (BigUInt<T, N>, BigUInt<T, N>)
3668    /// Constucts a new `BigUInt<T, N>`-type object which represents a random
3669    /// prime number.
3670    /// 
3671    /// # Argument
3672    /// The argument `repetition` defines how many times it tests whether the
3673    /// generated random number is prime. Usually, `repetition` is given to be
3674    /// `5` for 99.9% accuracy or `7` for 99.99% accuracy.
3675    /// 
3676    /// # Output
3677    /// The tuple of the two random prime numbers that this method returns is
3678    /// the tuple of the two random prime number each of which ranges
3679    /// from BigUInt::halfmax() up to BigUInt::max() inclusively.
3680    /// 
3681    /// # Features
3682    /// This method uses Millar-Rabin algorithm and then determines whether or
3683    /// not the generated random prime number candidate is really prime with
3684    /// the RSA test. If it fails, this method repeats searching for another
3685    /// ranmdom prime candidate until this method finds the true random prime
3686    /// number, and return it.
3687    /// 
3688    /// # Example
3689    /// ```
3690    /// use cryptocol::random::Random;
3691    /// use cryptocol::define_utypes_with;
3692    /// define_utypes_with!(u64);
3693    /// 
3694    /// let mut prng = Random::new();
3695    /// let (prime1, prime2): (U1024, U1024) = prng.random_prime_with_half_length_using_rsa_biguint(7);
3696    /// let (prime1, prime2): (U512, U512) = (prime1.into_biguint(), prime2.into_biguint());
3697    /// println!("U512 Prime number: {}", prime1);
3698    /// println!("U512 Prime number: {}", prime2);
3699    /// ```
3700    pub fn random_prime_with_half_length_using_rsa_biguint<T, const N: usize>(&mut self, repetition: usize) -> (BigUInt<T, N>, BigUInt<T, N>)
3701    where T: SmallUInt
3702    {
3703        use crate::asymmetric::RSA_Generic;
3704        let length = N * (T::BITS >> 1) as usize;
3705        loop
3706        {
3707            let mut primes: Vec<BigUInt<T, N>> = self.random_primes_with_half_length_using_miller_rabin_biguint(repetition, 2);
3708            let prime_1 = primes.pop().unwrap();
3709            let mut prime_2 = primes.pop().unwrap();
3710            while prime_1 == prime_2
3711                { prime_2 = self.random_prime_with_half_length_using_miller_rabin_biguint(repetition); }
3712            let rsa = RSA_Generic::<N, T>::new_with_primes(prime_1.clone(), prime_2.clone());
3713            let message = rsa.get_modulus().shift_right(length);
3714            let cipher = rsa.encrypt_biguint(&message);
3715            let recover = rsa.decrypt_biguint(&cipher);
3716            if recover == message
3717            {
3718                let cipher = rsa.encrypt_biguint(&prime_1);
3719                let recover = rsa.decrypt_biguint(&cipher);
3720                if prime_1 == recover
3721                {
3722                    let cipher = rsa.encrypt_biguint(&prime_2);
3723                    let recover = rsa.decrypt_biguint(&cipher);
3724                    if prime_2 == recover
3725                        { return (prime_1, prime_2); }
3726                }
3727            }
3728        }
3729    }
3730
3731    // pub fn prepared_random_prime_with_msb_set<T, const N: usize>(&mut self) -> BigUInt<T, N>
3732    /// Constucts a new `BigUInt<T, N>`-type object out of the prepared prime
3733    /// number pool, which represents a prime number of full-size of
3734    /// BigUInt<T, N>.
3735    /// 
3736    /// # Output
3737    /// This method returns a prime number randomly chosen out of the prepared
3738    /// prime number pool consisting of many prime numbers, whose range is from
3739    /// BigUInt::halfmax() up to BigUInt::max() inclusively.
3740    /// 
3741    /// # Features
3742    /// - This method chooses a prime number ramdomly out of the prepared prime
3743    ///   number pool consisting of many prime numbers whose MSB (Most
3744    ///   Significant Bit) is set to be one.
3745    /// - It uses a prime number pool.
3746    /// 
3747    /// # Caution and Cryptographical Security
3748    /// The source code of this method is openly publicised. It means that
3749    /// anyone can have the full familiarity of the prime number pool which
3750    /// this method uses. So, you are NOT encouraged to use this method for
3751    /// serious cryptographical purposes. You can use this method temporarily
3752    /// for testing or debugging purposes because of the slowness of the
3753    /// Millar-Rabin algorithm for big numbers.
3754    /// 
3755    /// # Example 1 for Random
3756    /// ```
3757    /// use cryptocol::random::Random;
3758    /// use cryptocol::define_utypes_with;
3759    /// define_utypes_with!(u64);
3760    /// 
3761    /// let mut rand = Random::new();
3762    /// let biguint: U256 = rand.prepared_random_prime_with_msb_set();
3763    /// println!("Random Number: {}", biguint);
3764    /// ```
3765    /// 
3766    /// # For more examples,
3767    /// click [here](./documentation/random_random_biguint/struct.Random_Generic.html#method.prepared_random_prime_with_msb_set)
3768    #[inline]
3769    pub fn prepared_random_prime_with_msb_set<T, const N: usize>(&mut self) -> BigUInt<T, N>
3770    where T: SmallUInt
3771    {
3772        self.get_prepared_prime_number(T::size_in_bytes() as usize * N)
3773    }
3774
3775    // pub fn prepared_random_prime_with_half_length<T, const N: usize>(&mut self) -> BigUInt<T, N>
3776    /// Constucts a new `BigUInt<T, N>`-type object out of the prepared prime
3777    /// number pool, which represents a prime number of half-size of
3778    /// BigUInt<T, N>.
3779    /// 
3780    /// # Output
3781    /// This method returns a prime number randomly chosen out of the prepared
3782    /// prime number pool consisting of many prime numbers, whose length is
3783    /// `N * T::size_in_bits() / 2` bits.
3784    /// 
3785    /// # Features
3786    /// 
3787    /// - This method chooses a prime number ramdomly out of the prepared prime
3788    ///   number pool consisting of many prime numbers whose length is
3789    ///   `N * T::size_in_bits() / 2` bits.
3790    /// - It uses a prime number pool.
3791    /// 
3792    /// # Caution and Cryptographical Security
3793    /// The source code of this method is openly publicised. It means that
3794    /// anyone can have the full familiarity of the prime number pool which
3795    /// this method uses. So, you are NOT encouraged to use this method for
3796    /// serious cryptographical purposes. You can use this method temporarily
3797    /// for testing or debugging purposes because of the slowness of the
3798    /// Millar-Rabin algorithm for big numbers.
3799    /// 
3800    /// # Example 1 for Random
3801    /// ```
3802    /// use cryptocol::random::Random;
3803    /// use cryptocol::define_utypes_with;
3804    /// define_utypes_with!(u32);
3805    /// 
3806    /// let mut rand = Random::new();
3807    /// let biguint: U256 = rand.prepared_random_prime_with_half_length();
3808    /// println!("Random Number: {}", biguint);
3809    /// ```
3810    /// 
3811    /// # For more examples,
3812    /// click [here](./documentation/random_random_biguint/struct.Random_Generic.html#method.prepared_random_prime_with_half_length)
3813    pub fn prepared_random_prime_with_half_length<T, const N: usize>(&mut self) -> BigUInt<T, N>
3814    where T: SmallUInt
3815    {
3816        self.get_prepared_prime_number((T::size_in_bytes() as usize * N) >> 1)
3817    }
3818
3819    fn get_prepared_prime_number<T, const N: usize>(&mut self, length_in_bytes: usize) -> BigUInt<T, N>
3820    where T: SmallUInt
3821    {
3822        let row: usize;
3823        match length_in_bytes
3824        {
3825            512 =>  { row = 0; },   // 4096-bit
3826            256 =>  { row = 1; },   // 2048-bit
3827            128 =>  { row = 2; },   // 1024-bit
3828            64 =>   { row = 3; },   // 512-bit
3829            32 =>   { row = 4; },   // 256-bit
3830            _ =>
3831            {
3832                return
3833                    if length_in_bytes == T::size_in_bytes() as usize * N
3834                        { self.random_prime_with_msb_set_using_miller_rabin_biguint(7) }
3835                    else
3836                        { self.random_prime_with_half_length_using_miller_rabin_biguint(7) }
3837            },
3838        }
3839        let col = self.random_usize() % COLUMN;
3840        BigUInt::<T, N>::from_str_radix(NUM_STR[row][col], 16).unwrap()
3841    }
3842
3843    // pub fn prepared_random_prime_numbers(&mut self) -> &[[&str; COLUMN]; 4]
3844    /// Returns a refenece to the prepared prime number pool, which represents
3845    /// a two-dimensional array prime numbers.
3846    /// 
3847    /// # Output
3848    /// A refenece to the prepared prime number pool, which represents
3849    /// a two-dimensional array prime number strings.
3850    /// 
3851    /// # Features
3852    /// - The zeroth one-dimensional array contains 4096-bit prime number array.
3853    /// - The first one-dimensional array contains 2048-bit prime number array.
3854    /// - The second one-dimensional array contains 1024-bit prime number array.
3855    /// - The third one-dimensional array contains 512-bit prime number array.
3856    /// - The fourth one-dimensional array contains 256-bit prime number array.
3857    #[inline]
3858    pub fn prepared_random_prime_numbers() -> &'static [[&'static str; COLUMN]; ROW]
3859    {
3860        &NUM_STR
3861    }
3862
3863    // pub fn shuffle(&self, slice: &mut [T])
3864    /// Shuffles an array slice.
3865    pub fn shuffle<T>(&mut self, slice: &mut [T])
3866    {
3867        let len = slice.len();
3868        for n in (2..len).rev()
3869        {
3870            let m = self.random_under_uint_(n);
3871            slice.swap(m, n-1);
3872        }
3873    }
3874}
3875