10888a09821a98ac0680fad765217302858e70fa4Paul Duffin/* 20888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Copyright (C) 2014 The Guava Authors 30888a09821a98ac0680fad765217302858e70fa4Paul Duffin * 40888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Licensed under the Apache License, Version 2.0 (the "License"); 50888a09821a98ac0680fad765217302858e70fa4Paul Duffin * you may not use this file except in compliance with the License. 60888a09821a98ac0680fad765217302858e70fa4Paul Duffin * You may obtain a copy of the License at 70888a09821a98ac0680fad765217302858e70fa4Paul Duffin * 80888a09821a98ac0680fad765217302858e70fa4Paul Duffin * http://www.apache.org/licenses/LICENSE-2.0 90888a09821a98ac0680fad765217302858e70fa4Paul Duffin * 100888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Unless required by applicable law or agreed to in writing, software 110888a09821a98ac0680fad765217302858e70fa4Paul Duffin * distributed under the License is distributed on an "AS IS" BASIS, 120888a09821a98ac0680fad765217302858e70fa4Paul Duffin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130888a09821a98ac0680fad765217302858e70fa4Paul Duffin * See the License for the specific language governing permissions and 140888a09821a98ac0680fad765217302858e70fa4Paul Duffin * limitations under the License. 150888a09821a98ac0680fad765217302858e70fa4Paul Duffin */ 160888a09821a98ac0680fad765217302858e70fa4Paul Duffin 170888a09821a98ac0680fad765217302858e70fa4Paul Duffinpackage com.google.common.base; 180888a09821a98ac0680fad765217302858e70fa4Paul Duffin 190888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport com.google.caliper.BeforeExperiment; 200888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport com.google.caliper.Benchmark; 210888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport com.google.caliper.Param; 220888a09821a98ac0680fad765217302858e70fa4Paul Duffin 230888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.ArrayList; 240888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.Collections; 250888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.List; 260888a09821a98ac0680fad765217302858e70fa4Paul Duffin 270888a09821a98ac0680fad765217302858e70fa4Paul Duffin@SuppressWarnings("unused") // Nested enums used reflectively in setUp. 280888a09821a98ac0680fad765217302858e70fa4Paul Duffinpublic class EnumsBenchmark { 290888a09821a98ac0680fad765217302858e70fa4Paul Duffin 300888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Param({"Small", "Medium", "Large"}) 310888a09821a98ac0680fad765217302858e70fa4Paul Duffin String enumSize; 320888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Param({"0.2", "0.8"}) 330888a09821a98ac0680fad765217302858e70fa4Paul Duffin float hitRate; 340888a09821a98ac0680fad765217302858e70fa4Paul Duffin 350888a09821a98ac0680fad765217302858e70fa4Paul Duffin private Class<? extends Enum> enumType; 360888a09821a98ac0680fad765217302858e70fa4Paul Duffin private String[] sampleData; 370888a09821a98ac0680fad765217302858e70fa4Paul Duffin 380888a09821a98ac0680fad765217302858e70fa4Paul Duffin @BeforeExperiment 390888a09821a98ac0680fad765217302858e70fa4Paul Duffin @SuppressWarnings("unchecked") 400888a09821a98ac0680fad765217302858e70fa4Paul Duffin void setUp() throws ClassNotFoundException { 410888a09821a98ac0680fad765217302858e70fa4Paul Duffin Preconditions.checkArgument(hitRate >= 0 && hitRate <= 1, 420888a09821a98ac0680fad765217302858e70fa4Paul Duffin "hitRate must be in the range [0,1]"); 430888a09821a98ac0680fad765217302858e70fa4Paul Duffin 440888a09821a98ac0680fad765217302858e70fa4Paul Duffin enumType = (Class<? extends Enum>) 450888a09821a98ac0680fad765217302858e70fa4Paul Duffin Class.forName(EnumsBenchmark.class.getCanonicalName() + "$" + enumSize + "Enum"); 460888a09821a98ac0680fad765217302858e70fa4Paul Duffin 470888a09821a98ac0680fad765217302858e70fa4Paul Duffin Enum<?>[] allConstants = enumType.getEnumConstants(); 480888a09821a98ac0680fad765217302858e70fa4Paul Duffin List<String> hits = new ArrayList<String>(); 490888a09821a98ac0680fad765217302858e70fa4Paul Duffin for (int i = 0; i < hitRate * 256 / 3; ++i) { 500888a09821a98ac0680fad765217302858e70fa4Paul Duffin hits.add(allConstants[0].name()); 510888a09821a98ac0680fad765217302858e70fa4Paul Duffin hits.add(allConstants[allConstants.length / 2].name()); 520888a09821a98ac0680fad765217302858e70fa4Paul Duffin hits.add(allConstants[allConstants.length - 1].name()); 530888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 540888a09821a98ac0680fad765217302858e70fa4Paul Duffin 550888a09821a98ac0680fad765217302858e70fa4Paul Duffin List<String> misses = new ArrayList<String>(); 560888a09821a98ac0680fad765217302858e70fa4Paul Duffin for (int i = 0; i < 256 - hits.size(); ++i) { 570888a09821a98ac0680fad765217302858e70fa4Paul Duffin misses.add("INVALID"); 580888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 590888a09821a98ac0680fad765217302858e70fa4Paul Duffin 600888a09821a98ac0680fad765217302858e70fa4Paul Duffin List<String> sampleDataList = new ArrayList<String>(); 610888a09821a98ac0680fad765217302858e70fa4Paul Duffin sampleDataList.addAll(hits); 620888a09821a98ac0680fad765217302858e70fa4Paul Duffin sampleDataList.addAll(misses); 630888a09821a98ac0680fad765217302858e70fa4Paul Duffin Collections.shuffle(sampleDataList); 640888a09821a98ac0680fad765217302858e70fa4Paul Duffin sampleData = sampleDataList.toArray(new String[sampleDataList.size()]); 650888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 660888a09821a98ac0680fad765217302858e70fa4Paul Duffin 670888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Benchmark 680888a09821a98ac0680fad765217302858e70fa4Paul Duffin void getIfPresent(int repetitions) { 690888a09821a98ac0680fad765217302858e70fa4Paul Duffin for (int i = 0; i < repetitions; ++i) { 700888a09821a98ac0680fad765217302858e70fa4Paul Duffin Enums.getIfPresent(enumType, sampleData[i & 255]); 710888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 720888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 730888a09821a98ac0680fad765217302858e70fa4Paul Duffin 740888a09821a98ac0680fad765217302858e70fa4Paul Duffin private enum SmallEnum { 750888a09821a98ac0680fad765217302858e70fa4Paul Duffin X0, X1, X2 760888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 770888a09821a98ac0680fad765217302858e70fa4Paul Duffin 780888a09821a98ac0680fad765217302858e70fa4Paul Duffin private enum MediumEnum { 790888a09821a98ac0680fad765217302858e70fa4Paul Duffin X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, 800888a09821a98ac0680fad765217302858e70fa4Paul Duffin X19, X20, X21, X22, X23, X24, X25, X26, X27, X28, X29, X30, X31, X32, X33, X34, X35, X36, X37, 810888a09821a98ac0680fad765217302858e70fa4Paul Duffin X38, X39, X40, X41, X42, X43, X44, X45, X46, X47, X48, X49, X50, X51, X52, X53, X54, X55, X56, 820888a09821a98ac0680fad765217302858e70fa4Paul Duffin X57, X58, X59, X60, X61, X62, X63, X64, X65, X66, X67, X68, X69, X70, X71, X72, X73, X74, X75, 830888a09821a98ac0680fad765217302858e70fa4Paul Duffin X76, X77, X78, X79, X80, X81, X82, X83, X84, X85, X86, X87, X88, X89, X90, X91, X92, X93, X94, 840888a09821a98ac0680fad765217302858e70fa4Paul Duffin X95, X96, X97, X98, X99 850888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 860888a09821a98ac0680fad765217302858e70fa4Paul Duffin 870888a09821a98ac0680fad765217302858e70fa4Paul Duffin private enum LargeEnum { 880888a09821a98ac0680fad765217302858e70fa4Paul Duffin X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, 890888a09821a98ac0680fad765217302858e70fa4Paul Duffin X21, X22, X23, X24, X25, X26, X27, X28, X29, X30, X31, X32, X33, X34, X35, X36, X37, X38, X39, 900888a09821a98ac0680fad765217302858e70fa4Paul Duffin X40, X41, X42, X43, X44, X45, X46, X47, X48, X49, X50, X51, X52, X53, X54, X55, X56, X57, X58, 910888a09821a98ac0680fad765217302858e70fa4Paul Duffin X59, X60, X61, X62, X63, X64, X65, X66, X67, X68, X69, X70, X71, X72, X73, X74, X75, X76, X77, 920888a09821a98ac0680fad765217302858e70fa4Paul Duffin X78, X79, X80, X81, X82, X83, X84, X85, X86, X87, X88, X89, X90, X91, X92, X93, X94, X95, X96, 930888a09821a98ac0680fad765217302858e70fa4Paul Duffin X97, X98, X99, X100, X101, X102, X103, X104, X105, X106, X107, X108, X109, X110, X111, X112, 940888a09821a98ac0680fad765217302858e70fa4Paul Duffin X113, X114, X115, X116, X117, X118, X119, X120, X121, X122, X123, X124, X125, X126, X127, X128, 950888a09821a98ac0680fad765217302858e70fa4Paul Duffin X129, X130, X131, X132, X133, X134, X135, X136, X137, X138, X139, X140, X141, X142, X143, X144, 960888a09821a98ac0680fad765217302858e70fa4Paul Duffin X145, X146, X147, X148, X149, X150, X151, X152, X153, X154, X155, X156, X157, X158, X159, X160, 970888a09821a98ac0680fad765217302858e70fa4Paul Duffin X161, X162, X163, X164, X165, X166, X167, X168, X169, X170, X171, X172, X173, X174, X175, X176, 980888a09821a98ac0680fad765217302858e70fa4Paul Duffin X177, X178, X179, X180, X181, X182, X183, X184, X185, X186, X187, X188, X189, X190, X191, X192, 990888a09821a98ac0680fad765217302858e70fa4Paul Duffin X193, X194, X195, X196, X197, X198, X199, X200, X201, X202, X203, X204, X205, X206, X207, X208, 1000888a09821a98ac0680fad765217302858e70fa4Paul Duffin X209, X210, X211, X212, X213, X214, X215, X216, X217, X218, X219, X220, X221, X222, X223, X224, 1010888a09821a98ac0680fad765217302858e70fa4Paul Duffin X225, X226, X227, X228, X229, X230, X231, X232, X233, X234, X235, X236, X237, X238, X239, X240, 1020888a09821a98ac0680fad765217302858e70fa4Paul Duffin X241, X242, X243, X244, X245, X246, X247, X248, X249, X250, X251, X252, X253, X254, X255, X256, 1030888a09821a98ac0680fad765217302858e70fa4Paul Duffin X257, X258, X259, X260, X261, X262, X263, X264, X265, X266, X267, X268, X269, X270, X271, X272, 1040888a09821a98ac0680fad765217302858e70fa4Paul Duffin X273, X274, X275, X276, X277, X278, X279, X280, X281, X282, X283, X284, X285, X286, X287, X288, 1050888a09821a98ac0680fad765217302858e70fa4Paul Duffin X289, X290, X291, X292, X293, X294, X295, X296, X297, X298, X299, X300, X301, X302, X303, X304, 1060888a09821a98ac0680fad765217302858e70fa4Paul Duffin X305, X306, X307, X308, X309, X310, X311, X312, X313, X314, X315, X316, X317, X318, X319, X320, 1070888a09821a98ac0680fad765217302858e70fa4Paul Duffin X321, X322, X323, X324, X325, X326, X327, X328, X329, X330, X331, X332, X333, X334, X335, X336, 1080888a09821a98ac0680fad765217302858e70fa4Paul Duffin X337, X338, X339, X340, X341, X342, X343, X344, X345, X346, X347, X348, X349, X350, X351, X352, 1090888a09821a98ac0680fad765217302858e70fa4Paul Duffin X353, X354, X355, X356, X357, X358, X359, X360, X361, X362, X363, X364, X365, X366, X367, X368, 1100888a09821a98ac0680fad765217302858e70fa4Paul Duffin X369, X370, X371, X372, X373, X374, X375, X376, X377, X378, X379, X380, X381, X382, X383, X384, 1110888a09821a98ac0680fad765217302858e70fa4Paul Duffin X385, X386, X387, X388, X389, X390, X391, X392, X393, X394, X395, X396, X397, X398, X399, X400, 1120888a09821a98ac0680fad765217302858e70fa4Paul Duffin X401, X402, X403, X404, X405, X406, X407, X408, X409, X410, X411, X412, X413, X414, X415, X416, 1130888a09821a98ac0680fad765217302858e70fa4Paul Duffin X417, X418, X419, X420, X421, X422, X423, X424, X425, X426, X427, X428, X429, X430, X431, X432, 1140888a09821a98ac0680fad765217302858e70fa4Paul Duffin X433, X434, X435, X436, X437, X438, X439, X440, X441, X442, X443, X444, X445, X446, X447, X448, 1150888a09821a98ac0680fad765217302858e70fa4Paul Duffin X449, X450, X451, X452, X453, X454, X455, X456, X457, X458, X459, X460, X461, X462, X463, X464, 1160888a09821a98ac0680fad765217302858e70fa4Paul Duffin X465, X466, X467, X468, X469, X470, X471, X472, X473, X474, X475, X476, X477, X478, X479, X480, 1170888a09821a98ac0680fad765217302858e70fa4Paul Duffin X481, X482, X483, X484, X485, X486, X487, X488, X489, X490, X491, X492, X493, X494, X495, X496, 1180888a09821a98ac0680fad765217302858e70fa4Paul Duffin X497, X498, X499, X500, X501, X502, X503, X504, X505, X506, X507, X508, X509, X510, X511, X512, 1190888a09821a98ac0680fad765217302858e70fa4Paul Duffin X513, X514, X515, X516, X517, X518, X519, X520, X521, X522, X523, X524, X525, X526, X527, X528, 1200888a09821a98ac0680fad765217302858e70fa4Paul Duffin X529, X530, X531, X532, X533, X534, X535, X536, X537, X538, X539, X540, X541, X542, X543, X544, 1210888a09821a98ac0680fad765217302858e70fa4Paul Duffin X545, X546, X547, X548, X549, X550, X551, X552, X553, X554, X555, X556, X557, X558, X559, X560, 1220888a09821a98ac0680fad765217302858e70fa4Paul Duffin X561, X562, X563, X564, X565, X566, X567, X568, X569, X570, X571, X572, X573, X574, X575, X576, 1230888a09821a98ac0680fad765217302858e70fa4Paul Duffin X577, X578, X579, X580, X581, X582, X583, X584, X585, X586, X587, X588, X589, X590, X591, X592, 1240888a09821a98ac0680fad765217302858e70fa4Paul Duffin X593, X594, X595, X596, X597, X598, X599, X600, X601, X602, X603, X604, X605, X606, X607, X608, 1250888a09821a98ac0680fad765217302858e70fa4Paul Duffin X609, X610, X611, X612, X613, X614, X615, X616, X617, X618, X619, X620, X621, X622, X623, X624, 1260888a09821a98ac0680fad765217302858e70fa4Paul Duffin X625, X626, X627, X628, X629, X630, X631, X632, X633, X634, X635, X636, X637, X638, X639, X640, 1270888a09821a98ac0680fad765217302858e70fa4Paul Duffin X641, X642, X643, X644, X645, X646, X647, X648, X649, X650, X651, X652, X653, X654, X655, X656, 1280888a09821a98ac0680fad765217302858e70fa4Paul Duffin X657, X658, X659, X660, X661, X662, X663, X664, X665, X666, X667, X668, X669, X670, X671, X672, 1290888a09821a98ac0680fad765217302858e70fa4Paul Duffin X673, X674, X675, X676, X677, X678, X679, X680, X681, X682, X683, X684, X685, X686, X687, X688, 1300888a09821a98ac0680fad765217302858e70fa4Paul Duffin X689, X690, X691, X692, X693, X694, X695, X696, X697, X698, X699, X700, X701, X702, X703, X704, 1310888a09821a98ac0680fad765217302858e70fa4Paul Duffin X705, X706, X707, X708, X709, X710, X711, X712, X713, X714, X715, X716, X717, X718, X719, X720, 1320888a09821a98ac0680fad765217302858e70fa4Paul Duffin X721, X722, X723, X724, X725, X726, X727, X728, X729, X730, X731, X732, X733, X734, X735, X736, 1330888a09821a98ac0680fad765217302858e70fa4Paul Duffin X737, X738, X739, X740, X741, X742, X743, X744, X745, X746, X747, X748, X749, X750, X751, X752, 1340888a09821a98ac0680fad765217302858e70fa4Paul Duffin X753, X754, X755, X756, X757, X758, X759, X760, X761, X762, X763, X764, X765, X766, X767, X768, 1350888a09821a98ac0680fad765217302858e70fa4Paul Duffin X769, X770, X771, X772, X773, X774, X775, X776, X777, X778, X779, X780, X781, X782, X783, X784, 1360888a09821a98ac0680fad765217302858e70fa4Paul Duffin X785, X786, X787, X788, X789, X790, X791, X792, X793, X794, X795, X796, X797, X798, X799, X800, 1370888a09821a98ac0680fad765217302858e70fa4Paul Duffin X801, X802, X803, X804, X805, X806, X807, X808, X809, X810, X811, X812, X813, X814, X815, X816, 1380888a09821a98ac0680fad765217302858e70fa4Paul Duffin X817, X818, X819, X820, X821, X822, X823, X824, X825, X826, X827, X828, X829, X830, X831, X832, 1390888a09821a98ac0680fad765217302858e70fa4Paul Duffin X833, X834, X835, X836, X837, X838, X839, X840, X841, X842, X843, X844, X845, X846, X847, X848, 1400888a09821a98ac0680fad765217302858e70fa4Paul Duffin X849, X850, X851, X852, X853, X854, X855, X856, X857, X858, X859, X860, X861, X862, X863, X864, 1410888a09821a98ac0680fad765217302858e70fa4Paul Duffin X865, X866, X867, X868, X869, X870, X871, X872, X873, X874, X875, X876, X877, X878, X879, X880, 1420888a09821a98ac0680fad765217302858e70fa4Paul Duffin X881, X882, X883, X884, X885, X886, X887, X888, X889, X890, X891, X892, X893, X894, X895, X896, 1430888a09821a98ac0680fad765217302858e70fa4Paul Duffin X897, X898, X899, X900, X901, X902, X903, X904, X905, X906, X907, X908, X909, X910, X911, X912, 1440888a09821a98ac0680fad765217302858e70fa4Paul Duffin X913, X914, X915, X916, X917, X918, X919, X920, X921, X922, X923, X924, X925, X926, X927, X928, 1450888a09821a98ac0680fad765217302858e70fa4Paul Duffin X929, X930, X931, X932, X933, X934, X935, X936, X937, X938, X939, X940, X941, X942, X943, X944, 1460888a09821a98ac0680fad765217302858e70fa4Paul Duffin X945, X946, X947, X948, X949, X950, X951, X952, X953, X954, X955, X956, X957, X958, X959, X960, 1470888a09821a98ac0680fad765217302858e70fa4Paul Duffin X961, X962, X963, X964, X965, X966, X967, X968, X969, X970, X971, X972, X973, X974, X975, X976, 1480888a09821a98ac0680fad765217302858e70fa4Paul Duffin X977, X978, X979, X980, X981, X982, X983, X984, X985, X986, X987, X988, X989, X990, X991, 1490888a09821a98ac0680fad765217302858e70fa4Paul Duffin X992, X993, X994, X995, X996, X997, X998, X999, X1000, X1001, X1002, X1003, X1004, X1005, X1006, 1500888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1007, X1008, X1009, X1010, X1011, X1012, X1013, X1014, X1015, X1016, X1017, X1018, X1019, 1510888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1020, X1021, X1022, X1023, X1024, X1025, X1026, X1027, X1028, X1029, X1030, X1031, X1032, 1520888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1033, X1034, X1035, X1036, X1037, X1038, X1039, X1040, X1041, X1042, X1043, X1044, X1045, 1530888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1046, X1047, X1048, X1049, X1050, X1051, X1052, X1053, X1054, X1055, X1056, X1057, X1058, 1540888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1059, X1060, X1061, X1062, X1063, X1064, X1065, X1066, X1067, X1068, X1069, X1070, X1071, 1550888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1072, X1073, X1074, X1075, X1076, X1077, X1078, X1079, X1080, X1081, X1082, X1083, X1084, 1560888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1085, X1086, X1087, X1088, X1089, X1090, X1091, X1092, X1093, X1094, X1095, X1096, X1097, 1570888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1098, X1099, X1100, X1101, X1102, X1103, X1104, X1105, X1106, X1107, X1108, X1109, X1110, 1580888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1111, X1112, X1113, X1114, X1115, X1116, X1117, X1118, X1119, X1120, X1121, X1122, X1123, 1590888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1124, X1125, X1126, X1127, X1128, X1129, X1130, X1131, X1132, X1133, X1134, X1135, X1136, 1600888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1137, X1138, X1139, X1140, X1141, X1142, X1143, X1144, X1145, X1146, X1147, X1148, X1149, 1610888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1150, X1151, X1152, X1153, X1154, X1155, X1156, X1157, X1158, X1159, X1160, X1161, X1162, 1620888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1163, X1164, X1165, X1166, X1167, X1168, X1169, X1170, X1171, X1172, X1173, X1174, X1175, 1630888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1176, X1177, X1178, X1179, X1180, X1181, X1182, X1183, X1184, X1185, X1186, X1187, X1188, 1640888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1189, 1650888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1190, X1191, X1192, X1193, X1194, X1195, X1196, X1197, X1198, X1199, X1200, X1201, X1202, 1660888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1203, X1204, X1205, X1206, X1207, X1208, X1209, X1210, X1211, X1212, X1213, X1214, X1215, 1670888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1216, X1217, X1218, X1219, X1220, X1221, X1222, X1223, X1224, X1225, X1226, X1227, X1228, 1680888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1229, X1230, X1231, X1232, X1233, X1234, X1235, X1236, X1237, X1238, X1239, X1240, X1241, 1690888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1242, X1243, X1244, X1245, X1246, X1247, X1248, X1249, X1250, X1251, X1252, X1253, X1254, 1700888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1255, X1256, X1257, X1258, X1259, X1260, X1261, X1262, X1263, X1264, X1265, X1266, X1267, 1710888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1268, X1269, X1270, X1271, X1272, X1273, X1274, X1275, X1276, X1277, X1278, X1279, X1280, 1720888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1281, X1282, X1283, X1284, X1285, X1286, X1287, X1288, X1289, X1290, X1291, X1292, X1293, 1730888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1294, X1295, X1296, X1297, X1298, X1299, X1300, X1301, X1302, X1303, X1304, X1305, X1306, 1740888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1307, X1308, X1309, X1310, X1311, X1312, X1313, X1314, X1315, X1316, X1317, X1318, X1319, 1750888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1320, X1321, X1322, X1323, X1324, X1325, X1326, X1327, X1328, X1329, X1330, X1331, X1332, 1760888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1333, X1334, X1335, X1336, X1337, X1338, X1339, X1340, X1341, X1342, X1343, X1344, X1345, 1770888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1346, X1347, X1348, X1349, X1350, X1351, X1352, X1353, X1354, X1355, X1356, X1357, X1358, 1780888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1359, X1360, X1361, X1362, X1363, X1364, X1365, X1366, X1367, X1368, X1369, X1370, X1371, 1790888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1372, X1373, X1374, X1375, X1376, X1377, X1378, X1379, X1380, X1381, X1382, X1383, X1384, 1800888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1385, X1386, X1387, X1388, X1389, X1390, X1391, X1392, X1393, X1394, X1395, X1396, X1397, 1810888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1398, X1399, X1400, X1401, X1402, X1403, X1404, X1405, X1406, X1407, X1408, X1409, X1410, 1820888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1411, X1412, X1413, X1414, X1415, X1416, X1417, X1418, X1419, X1420, X1421, X1422, X1423, 1830888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1424, X1425, X1426, X1427, X1428, X1429, X1430, X1431, X1432, X1433, X1434, X1435, X1436, 1840888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1437, X1438, X1439, X1440, X1441, X1442, X1443, X1444, X1445, X1446, X1447, X1448, X1449, 1850888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1450, X1451, X1452, X1453, X1454, X1455, X1456, X1457, X1458, X1459, X1460, X1461, X1462, 1860888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1463, X1464, X1465, X1466, X1467, X1468, X1469, X1470, X1471, X1472, X1473, X1474, X1475, 1870888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1476, X1477, X1478, X1479, X1480, X1481, X1482, X1483, X1484, X1485, X1486, X1487, X1488, 1880888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1489, X1490, X1491, X1492, X1493, X1494, X1495, X1496, X1497, X1498, X1499, X1500, X1501, 1890888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1502, X1503, X1504, X1505, X1506, X1507, X1508, X1509, X1510, X1511, X1512, X1513, X1514, 1900888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1515, X1516, X1517, X1518, X1519, X1520, X1521, X1522, X1523, X1524, X1525, X1526, X1527, 1910888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1528, X1529, X1530, X1531, X1532, X1533, X1534, X1535, X1536, X1537, X1538, X1539, X1540, 1920888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1541, X1542, X1543, X1544, X1545, X1546, X1547, X1548, X1549, X1550, X1551, X1552, X1553, 1930888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1554, X1555, X1556, X1557, X1558, X1559, X1560, X1561, X1562, X1563, X1564, X1565, X1566, 1940888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1567, X1568, X1569, X1570, X1571, X1572, X1573, X1574, X1575, X1576, X1577, X1578, X1579, 1950888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1580, X1581, X1582, X1583, X1584, X1585, X1586, X1587, X1588, X1589, X1590, X1591, X1592, 1960888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1593, X1594, X1595, X1596, X1597, X1598, X1599, X1600, X1601, X1602, X1603, X1604, X1605, 1970888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1606, X1607, X1608, X1609, X1610, X1611, X1612, X1613, X1614, X1615, X1616, X1617, X1618, 1980888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1619, X1620, X1621, X1622, X1623, X1624, X1625, X1626, X1627, X1628, X1629, X1630, X1631, 1990888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1632, X1633, X1634, X1635, X1636, X1637, X1638, X1639, X1640, X1641, X1642, X1643, X1644, 2000888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1645, X1646, X1647, X1648, X1649, X1650, X1651, X1652, X1653, X1654, X1655, X1656, X1657, 2010888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1658, X1659, X1660, X1661, X1662, X1663, X1664, X1665, X1666, X1667, X1668, X1669, X1670, 2020888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1671, X1672, X1673, X1674, X1675, X1676, X1677, X1678, X1679, X1680, X1681, X1682, X1683, 2030888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1684, X1685, X1686, X1687, X1688, X1689, X1690, X1691, X1692, X1693, X1694, X1695, X1696, 2040888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1697, X1698, X1699, X1700, X1701, X1702, X1703, X1704, X1705, X1706, X1707, X1708, X1709, 2050888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1710, X1711, X1712, X1713, X1714, X1715, X1716, X1717, X1718, X1719, X1720, X1721, X1722, 2060888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1723, X1724, X1725, X1726, X1727, X1728, X1729, X1730, X1731, X1732, X1733, X1734, X1735, 2070888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1736, X1737, X1738, X1739, X1740, X1741, X1742, X1743, X1744, X1745, X1746, X1747, X1748, 2080888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1749, X1750, X1751, X1752, X1753, X1754, X1755, X1756, X1757, X1758, X1759, X1760, X1761, 2090888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1762, X1763, X1764, X1765, X1766, X1767, X1768, X1769, X1770, X1771, X1772, X1773, X1774, 2100888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1775, X1776, X1777, X1778, X1779, X1780, X1781, X1782, X1783, X1784, X1785, X1786, X1787, 2110888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1788, X1789, X1790, X1791, X1792, X1793, X1794, X1795, X1796, X1797, X1798, X1799, X1800, 2120888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1801, X1802, X1803, X1804, X1805, X1806, X1807, X1808, X1809, X1810, X1811, X1812, X1813, 2130888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1814, X1815, X1816, X1817, X1818, X1819, X1820, X1821, X1822, X1823, X1824, X1825, X1826, 2140888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1827, X1828, X1829, X1830, X1831, X1832, X1833, X1834, X1835, X1836, X1837, X1838, X1839, 2150888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1840, X1841, X1842, X1843, X1844, X1845, X1846, X1847, X1848, X1849, X1850, X1851, X1852, 2160888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1853, X1854, X1855, X1856, X1857, X1858, X1859, X1860, X1861, X1862, X1863, X1864, X1865, 2170888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1866, X1867, X1868, X1869, X1870, X1871, X1872, X1873, X1874, X1875, X1876, X1877, X1878, 2180888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1879, X1880, X1881, X1882, X1883, X1884, X1885, X1886, X1887, X1888, X1889, X1890, X1891, 2190888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1892, X1893, X1894, X1895, X1896, X1897, X1898, X1899, X1900, X1901, X1902, X1903, X1904, 2200888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1905, X1906, X1907, X1908, X1909, X1910, X1911, X1912, X1913, X1914, X1915, X1916, X1917, 2210888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1918, X1919, X1920, X1921, X1922, X1923, X1924, X1925, X1926, X1927, X1928, X1929, X1930, 2220888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1931, X1932, X1933, X1934, X1935, X1936, X1937, X1938, X1939, X1940, X1941, X1942, X1943, 2230888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1944, X1945, X1946, X1947, X1948, X1949, X1950, X1951, X1952, X1953, X1954, X1955, X1956, 2240888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1957, X1958, X1959, X1960, X1961, X1962, X1963, X1964, X1965, X1966, X1967, X1968, X1969, 2250888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1970, X1971, X1972, X1973, X1974, X1975, X1976, X1977, X1978, X1979, X1980, X1981, X1982, 2260888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1983, X1984, X1985, X1986, X1987, X1988, X1989, X1990, X1991, X1992, X1993, X1994, X1995, 2270888a09821a98ac0680fad765217302858e70fa4Paul Duffin X1996, X1997, X1998, X1999, X2000, X2001, X2002, X2003, X2004, X2005, X2006, X2007, X2008, 2280888a09821a98ac0680fad765217302858e70fa4Paul Duffin X2009, X2010, X2011, X2012, X2013, X2014, X2015, X2016, X2017, X2018, X2019, X2020, X2021, 2290888a09821a98ac0680fad765217302858e70fa4Paul Duffin X2022, X2023, X2024, X2025, X2026, X2027, X2028, X2029, X2030, X2031, X2032, X2033, X2034, 2300888a09821a98ac0680fad765217302858e70fa4Paul Duffin X2035, X2036, X2037, X2038, X2039, X2040, X2041, X2042, X2043, X2044, X2045, X2046, X2047, 2310888a09821a98ac0680fad765217302858e70fa4Paul Duffin X2048, X2049, X2050, X2051, X2052, X2053, X2054, X2055, X2056, X2057, X2058, X2059, X2060, 2320888a09821a98ac0680fad765217302858e70fa4Paul Duffin X2061, X2062, X2063, X2064, X2065, X2066, X2067, X2068, X2069, X2070, X2071, X2072, X2073, 2330888a09821a98ac0680fad765217302858e70fa4Paul Duffin X2074, X2075, X2076, X2077, X2078, X2079, X2080, X2081, X2082, X2083, X2084, X2085, X2086, 2340888a09821a98ac0680fad765217302858e70fa4Paul Duffin X2087, X2088, X2089, X2090, X2091, X2092, X2093, X2094, X2095, X2096, X2097, X2098, X2099, 2350888a09821a98ac0680fad765217302858e70fa4Paul Duffin X2100, X2101, X2102, X2103, X2104, X2105, X2106, X2107, X2108, X2109, X2110, X2111, X2112, 2360888a09821a98ac0680fad765217302858e70fa4Paul Duffin X2113, X2114, X2115, X2116, X2117, X2118, X2119, X2120, X2121, X2122, X2123, X2124, X2125, 2370888a09821a98ac0680fad765217302858e70fa4Paul Duffin X2126, X2127, X2128, X2129, X2130, X2131, X2132, X2133, X2134, X2135, X2136, X2137, X2138, 2380888a09821a98ac0680fad765217302858e70fa4Paul Duffin X2139, X2140, X2141, X2142, X2143, X2144, X2145, X2146, X2147, X2148, X2149, X2150, X2151, 2390888a09821a98ac0680fad765217302858e70fa4Paul Duffin X2152, X2153, X2154, X2155, X2156, X2157, X2158, X2159, X2160, X2161, X2162, X2163, X2164, 2400888a09821a98ac0680fad765217302858e70fa4Paul Duffin X2165, X2166, X2167, X2168, X2169, X2170, X2171, X2172, X2173, X2174, X2175, X2176, X2177, 2410888a09821a98ac0680fad765217302858e70fa4Paul Duffin X2178, X2179, X2180, X2181, X2182, X2183, X2184, X2185, X2186, X2187, X2188, X2189, X2190, 2420888a09821a98ac0680fad765217302858e70fa4Paul Duffin X2191, X2192, X2193, X2194, X2195, X2196, X2197, X2198, X2199, X2200, X2201, X2202, X2203, 2430888a09821a98ac0680fad765217302858e70fa4Paul Duffin X2204, X2205, X2206, X2207, X2208, X2209, X2210, X2211, X2212, X2213, X2214, X2215, X2216, 2440888a09821a98ac0680fad765217302858e70fa4Paul Duffin X2217, X2218, X2219, X2220, X2221, X2222, X2223, X2224, X2225, X2226, X2227, X2228, X2229, 2450888a09821a98ac0680fad765217302858e70fa4Paul Duffin X2230, X2231, X2232, X2233, X2234, X2235, X2236, X2237, X2238, X2239, X2240, X2241, X2242, 2460888a09821a98ac0680fad765217302858e70fa4Paul Duffin X2243, X2244, X2245, X2246, X2247, X2248, X2249, X2250, X2251, X2252, X2253, X2254, X2255, 2470888a09821a98ac0680fad765217302858e70fa4Paul Duffin X2256, X2257, X2258, X2259, X2260, X2261, X2262, X2263, X2264, X2265, X2266, X2267, X2268, 2480888a09821a98ac0680fad765217302858e70fa4Paul Duffin X2269, X2270, X2271, X2272, X2273, X2274, X2275, X2276, X2277, X2278, X2279, X2280, X2281, 2490888a09821a98ac0680fad765217302858e70fa4Paul Duffin X2282, X2283, X2284, X2285, X2286, X2287, X2288, X2289, X2290, X2291, X2292, X2293, X2294, 2500888a09821a98ac0680fad765217302858e70fa4Paul Duffin X2295, X2296, X2297, X2298, X2299, X2300, X2301, X2302, X2303, X2304, X2305, X2306, X2307, 2510888a09821a98ac0680fad765217302858e70fa4Paul Duffin X2308, X2309, X2310, X2311, X2312, X2313, X2314, X2315, X2316, X2317, X2318, X2319, X2320, 2520888a09821a98ac0680fad765217302858e70fa4Paul Duffin X2321, X2322, X2323, X2324, X2325, X2326, X2327, X2328, X2329, X2330, X2331, X2332, X2333, 2530888a09821a98ac0680fad765217302858e70fa4Paul Duffin X2334, X2335, X2336, X2337, X2338, X2339, X2340, X2341, X2342, X2343, X2344, X2345, X2346, 2540888a09821a98ac0680fad765217302858e70fa4Paul Duffin X2347, X2348, X2349, X2350, X2351, X2352, X2353, X2354, X2355, X2356, X2357, X2358, X2359, 2550888a09821a98ac0680fad765217302858e70fa4Paul Duffin X2360, X2361, X2362, X2363, X2364, X2365, X2366, X2367, X2368, X2369, X2370, X2371, X2372, 2560888a09821a98ac0680fad765217302858e70fa4Paul Duffin X2373, X2374, X2375, X2376, X2377, X2378, X2379, X2380, X2381, X2382, X2383, X2384, X2385, 2570888a09821a98ac0680fad765217302858e70fa4Paul Duffin X2386, X2387, X2388, X2389, X2390, X2391, X2392, X2393, X2394, X2395, X2396, X2397, X2398, 2580888a09821a98ac0680fad765217302858e70fa4Paul Duffin X2399, X2400, X2401, X2402, X2403, X2404, X2405, X2406, X2407, X2408, X2409, X2410, X2411, 2590888a09821a98ac0680fad765217302858e70fa4Paul Duffin X2412, X2413, X2414, X2415, X2416, X2417, X2418, X2419, X2420, X2421, X2422, X2423, X2424, 2600888a09821a98ac0680fad765217302858e70fa4Paul Duffin X2425, X2426, X2427, X2428, X2429, X2430, X2431, X2432, X2433, X2434, X2435, X2436, X2437, 2610888a09821a98ac0680fad765217302858e70fa4Paul Duffin X2438, X2439, X2440, X2441, X2442, X2443, X2444, X2445, X2446, X2447, X2448, X2449, X2450, 2620888a09821a98ac0680fad765217302858e70fa4Paul Duffin X2451, X2452, X2453, X2454, X2455, X2456, X2457, X2458, X2459, X2460, X2461, X2462, X2463, 2630888a09821a98ac0680fad765217302858e70fa4Paul Duffin X2464, X2465, X2466, X2467, X2468, X2469, X2470, X2471, X2472, X2473, X2474, X2475, X2476, 2640888a09821a98ac0680fad765217302858e70fa4Paul Duffin X2477, X2478, X2479, X2480, X2481, X2482, X2483, X2484, X2485, X2486, X2487, X2488, X2489, 2650888a09821a98ac0680fad765217302858e70fa4Paul Duffin X2490, X2491, X2492, X2493, X2494, X2495, X2496, X2497, X2498, X2499 2660888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 2670888a09821a98ac0680fad765217302858e70fa4Paul Duffin} 268