xref: /xnu-8792.61.2/iokit/Tests/Tests.cpp (revision 42e220869062b56f8d7d0726fd4c88954f87902c)
1 /*
2  * Copyright (c) 1998-2021 Apple Computer, Inc. All rights reserved.
3  *
4  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5  *
6  * This file contains Original Code and/or Modifications of Original Code
7  * as defined in and that are subject to the Apple Public Source License
8  * Version 2.0 (the 'License'). You may not use this file except in
9  * compliance with the License. The rights granted to you under the License
10  * may not be used to create, or enable the creation or redistribution of,
11  * unlawful or unlicensed copies of an Apple operating system, or to
12  * circumvent, violate, or enable the circumvention or violation of, any
13  * terms of an Apple operating system software license agreement.
14  *
15  * Please obtain a copy of the License at
16  * http://www.opensource.apple.com/apsl/ and read it before using this file.
17  *
18  * The Original Code and all software distributed under the License are
19  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23  * Please see the License for the specific language governing rights and
24  * limitations under the License.
25  *
26  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27  */
28 /*
29  *
30  */
31 
32 #define TEST_HEADERS    0
33 #define IOKIT_ENABLE_SHARED_PTR
34 
35 #if TEST_HEADERS
36 
37 #include <libkern/OSByteOrder.h>
38 #include <libkern/c++/OSArray.h>
39 #include <libkern/c++/OSAllocation.h>
40 #include <libkern/c++/OSBoolean.h>
41 #include <libkern/c++/OSBoundedArray.h>
42 #include <libkern/c++/OSBoundedArrayRef.h>
43 #include <libkern/c++/OSBoundedPtr.h>
44 #include <libkern/c++/OSCollection.h>
45 #include <libkern/c++/OSCollectionIterator.h>
46 #include <libkern/c++/OSContainers.h>
47 #include <libkern/c++/OSCPPDebug.h>
48 #include <libkern/c++/OSData.h>
49 #include <libkern/c++/OSDictionary.h>
50 #include <libkern/c++/OSEndianTypes.h>
51 #include <libkern/c++/OSIterator.h>
52 #include <libkern/c++/OSKext.h>
53 #include <libkern/c++/OSLib.h>
54 #include <libkern/c++/OSMetaClass.h>
55 #include <libkern/c++/OSNumber.h>
56 #include <libkern/c++/OSObject.h>
57 #include <libkern/c++/OSOrderedSet.h>
58 #include <libkern/c++/OSSerialize.h>
59 #include <libkern/c++/OSSet.h>
60 #include <libkern/c++/OSSharedPtr.h>
61 #include <libkern/c++/OSString.h>
62 #include <libkern/c++/OSSymbol.h>
63 #include <libkern/c++/OSUnserialize.h>
64 #include <libkern/c++/OSValueObject.h>
65 #include <libkern/crypto/aes.h>
66 #include <libkern/crypto/aesxts.h>
67 #include <libkern/crypto/crypto_internal.h>
68 #include <libkern/crypto/des.h>
69 #include <libkern/crypto/md5.h>
70 #include <libkern/crypto/register_crypto.h>
71 #include <libkern/crypto/sha1.h>
72 #include <libkern/crypto/sha2.h>
73 #include <libkern/kernel_mach_header.h>
74 #include <libkern/kext_request_keys.h>
75 #include <libkern/kxld.h>
76 #include <libkern/kxld_types.h>
77 #include <libkern/locks.h>
78 #include <libkern/mkext.h>
79 #include <libkern/OSAtomic.h>
80 #include <libkern/OSBase.h>
81 #include <libkern/OSDebug.h>
82 #include <libkern/OSKextLib.h>
83 #include <libkern/OSKextLibPrivate.h>
84 #include <libkern/OSReturn.h>
85 #include <libkern/OSSerializeBinary.h>
86 #include <libkern/OSTypes.h>
87 #include <libkern/prelink.h>
88 #include <libkern/stack_protector.h>
89 #include <libkern/sysctl.h>
90 #include <libkern/tree.h>
91 #include <libkern/zconf.h>
92 #include <libkern/zlib.h>
93 
94 #include <IOKit/AppleKeyStoreInterface.h>
95 #include <IOKit/assert.h>
96 #include <IOKit/IOBSD.h>
97 #include <IOKit/IOBufferMemoryDescriptor.h>
98 #include <IOKit/IOCatalogue.h>
99 #include <IOKit/IOCommand.h>
100 #include <IOKit/IOCommandGate.h>
101 #include <IOKit/IOCommandPool.h>
102 #include <IOKit/IOCommandQueue.h>
103 #include <IOKit/IOConditionLock.h>
104 #include <IOKit/IOCPU.h>
105 //#include <IOKit/IODataQueue.h>
106 #include <IOKit/IODataQueueShared.h>
107 #include <IOKit/IODeviceMemory.h>
108 #include <IOKit/IODeviceTreeSupport.h>
109 #include <IOKit/IODMACommand.h>
110 #include <IOKit/IODMAController.h>
111 #include <IOKit/IODMAEventSource.h>
112 #include <IOKit/IOEventSource.h>
113 #include <IOKit/IOFilterInterruptEventSource.h>
114 #include <IOKit/IOHibernatePrivate.h>
115 #include <IOKit/IOInterleavedMemoryDescriptor.h>
116 #include <IOKit/IOInterruptAccounting.h>
117 #include <IOKit/IOInterruptAccountingPrivate.h>
118 #include <IOKit/IOInterruptController.h>
119 #include <IOKit/IOInterruptEventSource.h>
120 #include <IOKit/IOInterrupts.h>
121 #include <IOKit/IOKernelReporters.h>
122 #include <IOKit/IOKernelReportStructs.h>
123 #include <IOKit/IOKitDebug.h>
124 #include <IOKit/IOKitDiagnosticsUserClient.h>
125 #include <IOKit/IOKitKeys.h>
126 #include <IOKit/IOKitKeysPrivate.h>
127 #include <IOKit/IOKitServer.h>
128 #include <IOKit/IOLib.h>
129 #include <IOKit/IOLocks.h>
130 #include <IOKit/IOLocksPrivate.h>
131 #include <IOKit/IOMapper.h>
132 #include <IOKit/IOMemoryCursor.h>
133 #include <IOKit/IOMemoryDescriptor.h>
134 #include <IOKit/IOMessage.h>
135 #include <IOKit/IOMultiMemoryDescriptor.h>
136 #include <IOKit/IONotifier.h>
137 #include <IOKit/IONVRAM.h>
138 #include <IOKit/IOPlatformExpert.h>
139 #include <IOKit/IOPolledInterface.h>
140 #include <IOKit/IORangeAllocator.h>
141 #include <IOKit/IORegistryEntry.h>
142 #include <IOKit/IOReportMacros.h>
143 #include <IOKit/IOReportTypes.h>
144 #include <IOKit/IOReturn.h>
145 #include <IOKit/IOService.h>
146 #include <IOKit/IOServicePM.h>
147 #include <IOKit/IOSharedDataQueue.h>
148 #include <IOKit/IOSharedLock.h>
149 #include <IOKit/IOStatistics.h>
150 #include <IOKit/IOStatisticsPrivate.h>
151 #include <IOKit/IOSubMemoryDescriptor.h>
152 #include <IOKit/IOSyncer.h>
153 #include <IOKit/IOTimerEventSource.h>
154 #include <IOKit/IOTimeStamp.h>
155 #include <IOKit/IOTypes.h>
156 #include <IOKit/IOUserClient.h>
157 #include <IOKit/IOWorkLoop.h>
158 #include <IOKit/nvram/IONVRAMController.h>
159 #include <IOKit/OSMessageNotification.h>
160 #include <IOKit/platform/AppleMacIO.h>
161 #include <IOKit/platform/AppleMacIODevice.h>
162 #include <IOKit/platform/AppleNMI.h>
163 #include <IOKit/platform/ApplePlatformExpert.h>
164 #include <IOKit/power/IOPwrController.h>
165 #include <IOKit/pwr_mgt/IOPM.h>
166 #include <IOKit/pwr_mgt/IOPMinformee.h>
167 #include <IOKit/pwr_mgt/IOPMinformeeList.h>
168 #include <IOKit/pwr_mgt/IOPMLibDefs.h>
169 #include <IOKit/pwr_mgt/IOPMlog.h>
170 #include <IOKit/pwr_mgt/IOPMPowerSource.h>
171 #include <IOKit/pwr_mgt/IOPMPowerSourceList.h>
172 #include <IOKit/pwr_mgt/IOPMpowerState.h>
173 #include <IOKit/pwr_mgt/IOPMPrivate.h>
174 #include <IOKit/pwr_mgt/IOPowerConnection.h>
175 #include <IOKit/pwr_mgt/RootDomain.h>
176 #include <IOKit/rtc/IORTCController.h>
177 #include <IOKit/system.h>
178 #include <IOKit/system_management/IOWatchDogTimer.h>
179 #include <math.h>
180 
181 #endif /* TEST_HEADERS */
182 
183 #include <sys/sysctl.h>
184 #include <libkern/c++/OSData.h>
185 #include <IOKit/IOService.h>
186 #include <IOKit/IOUserClient.h>
187 #include "Tests.h"
188 
189 
190 #if DEVELOPMENT || DEBUG
191 
192 #include <IOKit/IOWorkLoop.h>
193 #include <IOKit/IOTimerEventSource.h>
194 #include <IOKit/IOInterruptEventSource.h>
195 #include <IOKit/IOCommandGate.h>
196 #include <IOKit/IOPlatformExpert.h>
197 #include <IOKit/IOSharedDataQueue.h>
198 #include <IOKit/IODataQueueShared.h>
199 #include <IOKit/IOServiceStateNotificationEventSource.h>
200 #include <IOKit/IOKitKeysPrivate.h>
201 #include <IOKit/IOKitServer.h>
202 #include <IOKit/IOBSD.h>
203 #include <kern/ipc_kobject.h>
204 #include <libkern/Block.h>
205 #include <libkern/Block_private.h>
206 #include <libkern/c++/OSAllocation.h>
207 #include <libkern/c++/OSBoundedArray.h>
208 #include <libkern/c++/OSBoundedArrayRef.h>
209 #include <libkern/c++/OSBoundedPtr.h>
210 #include <libkern/c++/OSSharedPtr.h>
211 #include <os/cpp_util.h>
212 #include <DriverKit/IODataQueueDispatchSource.h>
213 #include <libkern/zlib.h>
214 
215 static uint64_t gIOWorkLoopTestDeadline;
216 
217 #if TEST_ZLIB
218 
219 static void *
TestZLib_alloc(void * __unused opaque,u_int items,u_int size)220 TestZLib_alloc(void * __unused opaque, u_int items, u_int size)
221 {
222 	kern_return_t kr;
223 	vm_offset_t result;
224 
225 	kr = kmem_alloc(kernel_map, &result,
226 	    round_page(items * size) + ptoa(2),
227 	    (kma_flags_t)
228 	    (KMA_NOFAIL | KMA_KSTACK | KMA_KOBJECT |
229 	    KMA_GUARD_FIRST | KMA_GUARD_LAST),
230 	    VM_KERN_MEMORY_DIAG);
231 
232 	assert(KERN_SUCCESS == kr);
233 
234 	return (void *)(uintptr_t) (result + ptoa(1));
235 }
236 
237 static void
TestZLib_free(void * __unused ref,void * ptr)238 TestZLib_free(void * __unused ref, void * ptr)
239 {
240 }
241 
242 static int
TestZLib(int newValue)243 TestZLib(int newValue)
244 {
245 	static const char reproData[] =
246 	    "AAABAACAADAAEAAFAAGAAHAAIAAJAAKAALAAMAANAAOAAPAAQAARAASAATAAUAAVA"
247 	    "AWAAXAAYAAZABBABCABDABEABFABGABHABIABJABKABLABMABNABOABPABQABRABS"
248 	    "ABTABUABVABWABXABYABZACBACCACDACEACFACGACHACIACJACKACLACMACNACOAC"
249 	    "PACQACRACSACTACUACVACWACXACYACZADBADCADDADEADFADGADHADIADJADKADLA"
250 	    "DMADNADOADPADQADRADSADTADUADVADWADXADYADZAEBAECAEDAEEAEFAEGAEHAEI"
251 	    "AEJAEKAELAEMAENAEOAEPAEQAERAESAETAEUAEVAEWAEXAEYAEZAFBAFCAFDAFEAF"
252 	    "FAFGAFHAFIAFJAFKAFLAFMAFNAFOAFPAFQAFRAFSAFTAFUAFVAFWAFXAFYAFZAGBA"
253 	    "GCAGDAGEAGFAGGAGHAGIAGJAGKAGLAGMAGNAGOAGPAGQAGRAGSAGTAGUAGVAGWAGX"
254 	    "AGYAGZAHBAHCAHDAHEAHFAHGAHHAHIAHJAHKAHLAHMAHNAHOAHPAHQAHRAHSAHTAH"
255 	    "UAHVAHWAHXAHYAHZAIBAICAIDAIEAIFAIGAIHAIIAIJAIKAILAIMAINAIOAIPAIQA"
256 	    "IRAISAITAIUAIVAIWAIXAIYAIZAJBAJCAJDAJEAJFAJGAJHAJIAJJAJKAJLAJMAJN"
257 	    "AJOAJPAJQAJRAJSAJTAJUAJVAJWAJXAJYAJZAKBAKCAKDAKEAKFAKGAKHAKIAKJAK"
258 	    "KAKLAKMAKNAKOAKPAKQAKRAKSAKTAKUAKVAKWAKXAKYAKZALBALCALDALEALFALGA"
259 	    "LHALIALJALKALLALMALNALOALPALQALRALSALTALUALVALWALXALYALZAMBAMCAMD"
260 	    "AMEAMFAMGAMHAMIAMJAMKAMLAMMAMNAMOAMPAMQAMRAMSAMTAMUAMVAMWAM"
261 	    "XAMYAM"
262 	    "ZANBANCANDANEANFANGANHANIANJANKANLANMANNANOANPANQANRANSANTANUANVA"
263 	    "NWANXANYANZAOBAOCAODAOEAOFAOGAOHAOIAOJAOKAOLAOMAONAOOAOPAOQAORAOS"
264 	    "AOTAOUAOVAOWAOXAOYAOZAPBAPCAPDAPEAPFAPGAPHAPIAPJAPKAPLAPMAPNAPOAP"
265 	    "PAPQAPRAPSAPTAPUAPVAPWAPXAPYAPZAQBAQCAQDAQEAQFAQGAQHAQIAQJAQKAQLA"
266 	    "QMAQNAQOAQPAQQAQRAQSAQTAQUAQVAQWAQXAQYAQZARBARCARDAREARFARGARHARI"
267 	    "ARJARKARLARMARNAROARPARQARRARSARTARUARVARWARXARYARZASBASCASDASEAS"
268 	    "FASGASHASIASJASKASLASMASNASOASPASQASRASSASTASUASVASWASXASYASZATBA"
269 	    "TCATDATEATFATGATHATIATJATKATLATMATNATOATPATQATRATSATTATUATVATWATX"
270 	    "ATYATZAUBAUCAUDAUEAUFAUGAUHAUIAUJAUKAULAUMAUNAUOAUPAUQAURAUSAUTAU"
271 	    "UAUVAUWAUXAUYAUZAVBAVCAVDAVEAVFAVGAVHAVIAVJAVKAVLAVMAVNAVOAVPAVQA"
272 	    "VRAVSAVTAVUAVVAVWAVXAVYAVZAWBAWCAWDAWEAWFAWGAWHAWIAWJAWKAWLAWMAWN"
273 	    "AWOAWPAWQAWRAWSAWTAWUAWVAWWAWXAWYAWZAXBAXCAXDAXEAXFAXGAXHAXIAXJAX"
274 	    "KAXLAXMAXNAXOAXPAXQAXRAXSAXTAXUAXVAXWAXXAXYAXZAYBAYCAYDAYEAYFAYGA"
275 	    "YHAYIAYJAYKAYLAYMAYNAYOAYPAYQAYRAYSAYTAYUAYVAYWAYXAYYAYZAZBAZCAZD"
276 	    "AZEAZFAZGAZHAZIAZJAZKAZLAZMAZNAZOAZPAZQAZRAZSAZTAZUAZVAZWAZXAZYAZ"
277 	    "ZBBBCBBDBBEBBFBBGBBHBBIBBJBBKBBLBBMBBNBBOBBPBBQBBRBBSBBTBBUBBVBBW"
278 	    "BBXBBYBBZBCCBCDBCEBCFBCGBCHBCIBCJBCKBCLBCMBCNBCOBCPBCQBCRBCSBCTBC"
279 	    "UBCVBCWBCXBCYBCZBDCBDDBDEBDFBDGBDHBDIBDJBDKBDLBDMBDNBDOBDPBDQBDRB"
280 	    "DSBDTBDUBDVBDWBDXBDYBDZBECBEDBEEBEFBEGBEHBEIBEJBEKBELBEMBENBEOBEP"
281 	    "BEQBERBESBETBEUBEVBEWBEXBEYBEZBFCBFDBFEBFFBFGBFHBFIBFJBFKBFLBFMBF"
282 	    "NBFOBFPBFQBFRBFSBFTBFUBFVBFWBFXBFYBFZBGCBGDBGEBGFBGGBGHBGIBGJBGKB"
283 	    "GLBGMBGNBGOBGPBGQBGRBGSBGTBGUBGVBGWBGXBGYBGZBHCBHDBHEBHFBHGBHHBHI"
284 	    "BHJBHKBHLBHMBHNBHOBHPBHQBHRBHSBHTBHUBHVBHWBHXBHYBHZBICBIDBIEBIFBI"
285 	    "GBIHBIIBIJBIKBILBIMBINBIOBIPBIQBIRBISBITBIUBIVBIWBIXBIYBIZBJCBJDB"
286 	    "JEBJFBJGBJHBJIBJJBJKBJLBJMBJNBJOBJPBJQBJRBJSBJTBJUBJVBJWBJXBJYBJZ"
287 	    "BKCBKDBKEBKFBKGBKHBKIBKJBKKBKLBKMBKNBKOBKPBKQBKRBKSBKTBKUBKVBKWBK"
288 	    "XBKYBKZBLCBLDBLEBLFBLGBLHBLIBLJBLKBLLBLMBLNBLOBLPBLQBLRBLSBLTBLUB"
289 	    "LVBLWBLXBLYBLZBMCBMDBMEBMFBMGBMHBMIBMJBMKBMLBMMBMNBMOBMPBMQBMRBMS"
290 	    "BMTBMUBMVBMWBMXBMYBMZBNCBNDBNEBNFBNGBNHBNIBNJBNKBNLBNMBNNBNOBNPBN"
291 	    "QBNRBNSBNTBNUBNVBNWBNXBNYBNZBOCBODBOEBOFBOGBOHBOIBOJBOKBOLBOMBONB"
292 	    "OOBOPBOQBORBOSBOTBOUBOVBOWBOXBOYBOZBPCBPDBPEBPFBPGBPHBPIBPJBPKBPL"
293 	    "BPMBPNBPOBPPBPQBPRBPSBPTBPUBPVBPWBPXBPYBPZBQCBQDBQEBQFBQGBQHBQIBQ"
294 	    "JBQKBQLBQMBQNBQOBQPBQQBQRBQSBQTBQUBQVBQWBQXBQYBQZBRCBRDBREBRFBRGB"
295 	    "RHBRIBRJBRKBRLBRMBRNBROBRPBRQBRRBRSBRTBRUBRVBRWBRXBRYBRZBSCBSDBSE"
296 	    "BSFBSGBSHBSIBSJBSKBSLBSMBSNBSOBSPBSQBSRBSSBSTBSUBSVBSWBSXBSYBSZBT"
297 	    "CBTDBTEBTFBTGBTHBTIBTJBTKBTLBTMBTNBTOBTPBTQBTRBTSBTTBTUBTVBTWBTXB"
298 	    "TYBTZBUCBUDBUEBUFBUGBUHBUIBUJBUKBULBUMBUNBUOBUPBUQBURBUSBUTBUUBUV"
299 	    "BUWBUXBUYBUZBVCBVDBVEBVFBVGBVHBVIBVJBVKBVLBVMBVNBVOBVPBVQBVRBVSBV"
300 	    "TBVUBVVBVWBVXBVYBVZBWCBWDBWEBWFBWGBWHBWIBWJBWKBWLBWMBWNBWOBWPBWQB"
301 	    "WRBWSBWTBWUBWVBWWBWXBWYBWZBXCBXDBXEBXFBXGBXHBXIBXJBXKBXLBXMBXNBXO"
302 	    "BXPBXQBXRBXSBXTBXUBXVBXWBXXBXYBXZBYCBYDBYEBYFBYGBYHBYIBYJBYKBYLBY"
303 	    "MBYNBYOBYPBYQBYRBYSBYTBYUBYVBYWBYXBYYBYZBZCBZDBZEBZFBZGBZHBZIBZJB"
304 	    "ZKBZLBZMBZNBZOBZPBZQBZRBZSBZTBZUBZVBZWBZXBZYBZZCCCDCCECCFCCGCCHCC"
305 	    "ICCJCCKCCLCCMCCNCCOCCPCCQCCRCCSCCTCCUCCVCCWCCXCCYCCZCDDCDECDFCDGC"
306 	    "DHCDICDJCDKCDLCDMCDNCDOCDPCDQCDRCDSCDTCDUCDVCDWCDXCDYCDZCEDCEECEF"
307 	    "CEGCEHCEICEJCEKCELCEMCENCEOCEPCEQCERCESCETCEUCEVCEWCEXCEYCEZCFDCF"
308 	    "ECFFCFGCFHCFICFJCFKCFLCFMCFNCFOCFPCFQCFRCFSCFTCFUCFVCFWCFXCFYCFZC"
309 	    "GDCGECGFCGGCGHCGICGJCGKCGLCGMCGNCGOCGPCGQCGRCGSCGTCGUCGVCGWCGXCGY"
310 	    "CGZCHDCHECHFCHGCHHCHICHJCHKCHLCHMCHNCHOCHPCHQCHRCHSCHTCHUCHVCHWCH"
311 	    "XCHYCHZCIDCIECIFCIGCIHCIICIJCIKCILCIMCINCIOCIPCIQCIRCISCITCIUCIVC"
312 	    "IWCIXCIYCIZCJDCJECJFCJGCJHCJICJJCJKCJLCJMCJNCJOCJPCJQCJRCJSCJTCJU"
313 	    "CJVCJWCJXCJYCJZCKDCKECKFCKGCKHCKICKJCKKCKLCKMCKNCKOCKPCKQCKRCKSCK"
314 	    "TCKUCKVCKWCKXCKYCKZCLDCLECLFCLGCLHCLICLJCLKCLLCLMCLNCLOCLPCLQCLRC"
315 	    "LSCLTCLUCLVCLWCLXCLYCLZCMDCMECMFCMGCMHCMICMJCMKCMLCMMCMNCMOCMPCMQ"
316 	    "CMRCMSCMTCMUCMVCMWCMXCMYCMZCNDCNECNFCNGCNHCNICNJCNKCNLCNMCNNCNOCN"
317 	    "PCNQCNRCNSCNTCNUCNVCNWCNXCNYCNZCODCOECOFCOGCOHCOICOJCOKCOLCOMCONC"
318 	    "OOCOPCOQCORCOSCOTCOUCOVCOWCOXCOYCOZCPDCPECPFCPGCPHCPICPJCPKCPLCPM"
319 	    "CPNCPOCPPCPQCPRCPSCPTCPUCPVCPWCPXCPYCPZCQDCQECQFCQGCQHCQICQJCQKCQ"
320 	    "LCQMCQNCQOCQPCQQCQRCQSCQTCQUCQVCQWCQXCQYCQZCRDCRECRFCRGCRHCRICRJC"
321 	    "RKCRLCRMCRNCROCRPCRQCRRCRSCRTCRUCRVCRWCRXCRYCRZCSDCSECSFCSGCSHCSI"
322 	    "CSJCSKCSLCSMCSNCSOCSPCSQCSRCSSCSTCSUCSVCSWCSXCSYCSZCTDCTECTFCTGCT"
323 	    "HCTICTJCTKCTLCTMCTNCTOCTPCTQCTRCTSCTTCTUCTVCTWCTXCTYCTZCUDCUECUFC"
324 	    "UGCUHCUICUJCUKCULCUMCUNCUOCUPCUQCURCUSCUTCUUCUVCUWCUXCUYCUZCVDCVE"
325 	    "CVFCVGCVHCVICVJCVKCVLCVMCVNCVOCVPCVQCVRCVSCVTCVUCVVCVWCVXCVYCVZCW"
326 	    "DCWECWFCWGCWHCWICWJCWKCWLCWMCWNCWOCWPCWQCWRCWSCWTCWUCWVCWWCWXCWYC"
327 	    "WZCXDCXECXFCXGCXHCXICXJCXKCXLCXMCXNCXOCXPCXQCXRCXSCXTCXUCXVCXWCXX"
328 	    "CXYCXZCYDCYECYFCYGCYHCYICYJCYKCYLCYMCYNCYOCYPCYQCYRCYSCYTCYUCYVCY"
329 	    "WCYXCYYCYZCZDCZECZFCZGCZHCZICZJCZKCZLCZMCZNCZOCZPCZQCZRCZSCZTCZUC"
330 	    "ZVCZWCZXCZYCZZDDDEDDFDDGDDHDDIDDJDDKDDLDDMDDNDDODDPDDQDDRDDSDDTDD"
331 	    "UDDVDDWDDXDDYDDZDEEDEFDEGDEHDEIDEJDEKDELDEMDENDEODEPDEQDERDESDETD"
332 	    "EUDEVDEWDEXDEYDEZDFEDFFDFGDFHDFIDFJDFKDFLDFMDFNDFODFPDFQDFRDFSDFT"
333 	    "DFUDFVDFWDFXDFYDFZDGEDGFDGGDGHDGIDGJDGKDGLDGMDGNDGODGPDGQDGRDGSDG"
334 	    "TDGUDGVDGWDGXDGYDGZDHEDHFDHGDHHDHIDHJDHKDHLDHMDHNDHODHPDHQDHRDHSD"
335 	    "HTDHUDHVDHWDHXDHYDHZDIEDIFDIGDIHDIIDIJDIKDILDIMDINDIODIPDIQDIRDIS"
336 	    "DITDIUDIVDIWDIXDIYDIZDJEDJFDJGDJHDJIDJJDJKDJLDJMDJNDJODJPDJQDJRDJ"
337 	    "SDJTDJUDJVDJWDJXDJYDJZDKEDKFDKGDKHDKIDKJDKKDKLDKMDKNDKODKPDKQDKRD"
338 	    "KSDKTDKUDKVDKWDKXDKYDKZDLEDLFDLGDLHDLIDLJDLKDLLDLMDLNDLODLPDLQDLR"
339 	    "DLSDLTDLUDLVDLWDLXDLYDLZDMEDMFDMGDMHDMIDMJDMKDMLDMMDMNDMODMPDMQDM"
340 	    "RDMSDMTDMUDMVDMWDMXDMYDMZDNEDNFDNGDNHDNIDNJDNKDNLDNMDNNDNODNPDNQD"
341 	    "NRDNSDNTDNUDNVDNWDNXDNYDNZDOEDOFDOGDOHDOIDOJDOKDOLDOMDONDOODOPDOQ"
342 	    "DORDOSDOTDOUDOVDOWDOXDOYDOZDPEDPFDPGDPHDPIDPJDPKDPLDPMDPNDPODPPDP"
343 	    "QDPRDPSDPTDPUDPVDPWDPXDPYDPZDQEDQFDQGDQHDQIDQJDQKDQLDQMDQNDQODQPD"
344 	    "QQDQRDQSDQTDQUDQVDQWDQXDQYDQZDREDRFDRGDRHDRIDRJDRKDRLDRMDRNDRODRP"
345 	    "DRQDRRDRSDRTDRUDRVDRWDRXDRYDRZDSEDSFDSGDSHDSIDSJDSKDSLDSMDSNDSODS"
346 	    "PDSQDSRDSSDSTDSUDSVDSWDSXDSYDSZDTEDTFDTGDTHDTIDTJDTKDTLDTMDTNDTOD"
347 	    "TPDTQDTRDTSDTTDTUDTVDTWDTXDTYDTZDUEDUFDUGDUHDUIDUJDUKDULDUMDUNDUO"
348 	    "DUPDUQDURDUSDUTDUUDUVDUWDUXDUYDUZDVEDVFDVGDVHDVIDVJDVKDVLDVMDVNDV"
349 	    "ODVPDVQDVRDVSDVTDVUDVVDVWDVXDVYDVZDWEDWFDWGDWHDWIDWJDWKDWLDWMDWND"
350 	    "WODWPDWQDWRDWSDWTDWUDWVDWWDWXDWYDWZDXEDXFDXGDXHDXIDXJDXKDXLDXMDXN"
351 	    "DXODXPDXQDXRDXSDXTDXUDXVDXWDXXDXYDXZDYEDYFDYGDYHDYIDYJDYKDYLDYMDY"
352 	    "NDYODYPDYQDYRDYSDYTDYUDYVDYWDYXDYYDYZDZEDZFDZGDZHDZIDZJDZKDZLDZMD"
353 	    "ZNDZODZPDZQDZRDZSDZTDZUDZVDZWDZXDZYDZZEEEFEEGEEHEEIEEJEEKEELEEMEE"
354 	    "NEEOEEPEEQEEREESEETEEUEEVEEWEEXEEYEEZEFFEFGEFHEFIEFJEFKEFLEFMEFNE"
355 	    "FOEFPEFQEFREFSEFTEFUEFVEFWEFXEFYEFZEGFEGGEGHEGIEGJEGKEGLEGMEGNEGO"
356 	    "EGPEGQEGREGSEGTEGUEGVEGWEGXEGYEGZEHFEHGEHHEHIEHJEHKEHLEHMEHNEHOEH"
357 	    "PEHQEHREHSEHTEHUEHVEHWEHXEHYEHZEIFEIGEIHEIIEIJEIKEILEIMEINEIOEIPE"
358 	    "IQEIREISEITEIUEIVEIWEIXEIYEIZEJFEJGEJHEJIEJJEJKEJLEJMEJNEJOEJPEJQ"
359 	    "EJREJSEJTEJUEJVEJWEJXEJYEJZEKFEKGEKHEKIEKJEKKEKLEKMEKNEKOEKPEKQEK"
360 	    "REKSEKTEKUEKVEKWEKXEKYEKZELFELGELHELIELJELKELLELMELNELOELPELQELRE"
361 	    "LSELTELUELVELWELXELYELZEMFEMGEMHEMIEMJEMKEMLEMMEMNEMOEMPEMQEMREMS"
362 	    "EMTEMUEMVEMWEMXEMYEMZENFENGENHENIENJENKENLENMENNENOENPENQENRENSEN"
363 	    "TENUENVENWENXENYENZEOFEOGEOHEOIEOJEOKEOLEOMEONEOOEOPEOQEOREOSEOTE"
364 	    "OUEOVEOWEOXEOYEOZEPFEPGEPHEPIEPJEPKEPLEPMEPNEPOEPPEPQEPREPSEPTEPU"
365 	    "EPVEPWEPXEPYEPZEQFEQGEQHEQIEQJEQKEQLEQMEQNEQOEQPEQQEQREQSEQTEQUEQ"
366 	    "VEQWEQXEQYEQZERFERGERHERIERJERKERLERMERNEROERPERQERRERSERTERUERVE"
367 	    "RWERXERYERZESFESGESHESIESJESKESLESMESNESOESPESQESRESSESTESUESVESW"
368 	    "ESXESYESZETFETGETHETIETJETKETLETMETNETOETPETQETRETSETTETUETVETWET"
369 	    "XETYETZEUFEUGEUHEUIEUJEUKEULEUMEUNEUOEUPEUQEUREUSEUTEUUEUVEUWEUXE"
370 	    "UYEUZEVFEVGEVHEVIEVJEVKEVLEVMEVNEVOEVPEVQEVREVSEVTEVUEVVEVWEVXEVY"
371 	    "EVZEWFEWGEWHEWIEWJEWKEWLEWMEWNEWOEWPEWQEWREWSEWTEWUEWVEWWEWXEWYEW"
372 	    "ZEXFEXGEXHEXIEXJEXKEXLEXMEXNEXOEXPEXQEXREXSEXTEXUEXVEXWEXXEXYEXZE"
373 	    "YFEYGEYHEYIEYJEYKEYLEYMEYNEYOEYPEYQEYREYSEYTEYUEYVEYWEYXEYYEYZEZF"
374 	    "EZGEZHEZIEZJEZKEZLEZMEZNEZOEZPEZQEZREZSEZTEZUEZVEZWEZXEZYEZZFFFGF"
375 	    "FHFFIFFJFFKFFLFFMFFNFFOFFPFFQFFRFFSFFTFFUFFVFFWFFXFFYFFZFGGFGHFGI"
376 	    "FGJFGKFGLFGMFGNFGOFGPFGQFGRFGSFGTFGUFGVFGWFGXFGYFGZFHGFHHFHIFHJFH"
377 	    "KFHLFHMFHNFHOFHPFHQFHRFHSFHTFHUFHVFHWFHXFHYFHZFIGFIHFIIFIJFIKFILF"
378 	    "IMFINFIOFIPFIQFIRFISFITFIUFIVFIWFIXFIYFIZFJGFJHFJIFJJFJKFJLFJMFJN"
379 	    "FJOFJPFJQFJRFJSFJTFJUFJVFJWFJXFJYFJZFKGFKHFKIFKJFKKFKLFKMFKNFKOFK"
380 	    "PFKQFKRFKSFKTFKUFKVFKWFKXFKYFKZFLGFLHFLIFLJFLKFLLFLMFLNFLOFLPFLQF"
381 	    "LRFLSFLTFLUFLVFLWFLXFLYFLZFMGFMHFMIFMJFMKFMLFMMFMNFMOFMPFMQFMRFMS"
382 	    "FMTFMUFMVFMWFMXFMYFMZFNGFNHFNIFNJFNKFNLFNMFNNFNOFNPFNQFNRFNSFNTFN"
383 	    "UFNVFNWFNXFNYFNZFOGFOHFOIFOJFOKFOLFOMFONFOOFOPFOQFORFOSFOTFOUFOVF"
384 	    "OWFOXFOYFOZFPGFPHFPIFPJFPKFPLFPMFPNFPOFPPFPQFPRFPSFPTFPUFPVFPWFPX"
385 	    "FPYFPZFQGFQHFQIFQJFQKFQLFQMFQNFQOFQPFQQFQRFQSFQTFQUFQVFQWFQXFQYFQ"
386 	    "ZFRGFRHFRIFRJFRKFRLFRMFRNFROFRPFRQFRRFRSFRTFRUFRVFRWFRXFRYFRZFSGF"
387 	    "SHFSIFSJFSKFSLFSMFSNFSOFSPFSQFSRFSSFSTFSUFSVFSWFSXFSYFSZFTGFTHFTI"
388 	    "FTJFTKFTLFTMFTNFTOFTPFTQFTRFTSFTTFTUFTVFTWFTXFTYFTZFUGFUHFUIFUJFU"
389 	    "KFULFUMFUNFUOFUPFUQFURFUSFUTFUUFUVFUWFUXFUYFUZFVGFVHFVIFVJFVKFVLF"
390 	    "VMFVNFVOFVPFVQFVRFVSFVTFVUFVVFVWFVXFVYFVZFWGFWHFWIFWJFWKFWLFWMFWN"
391 	    "FWOFWPFWQFWRFWSFWTFWUFWVFWWFWXFWYFWZFXGFXHFXIFXJFXKFXLFXMFXNFXOFX"
392 	    "PFXQFXRFXSFXTFXUFXVFXWFXXFXYFXZFYGFYHFYIFYJFYKFYLFYMFYNFYOFYPFYQF"
393 	    "YRFYSFYTFYUFYVFYWFYXFYYFYZFZGFZHFZIFZJFZKFZLFZMFZNFZOFZPFZQFZRFZS"
394 	    "FZTFZUFZVFZWFZXFZYFZZGGGHGGIGGJGGKGGLGGMGGNGGOGGPGGQGGRGGSGGTGGUG"
395 	    "GVGGWGGXGGYGGZGHHGHIGHJGHKGHLGHMGHNGHOGHPGHQGHRGHSGHTGHUGHVGHWGHX"
396 	    "GHYGHZGIHGIIGIJGIKGILGIMGINGIOGIPGIQGIRGISGITGIUGIVGIWGIXGIYGIZGJ"
397 	    "HGJIGJJGJKGJLGJMGJNGJOGJPGJQGJRGJSGJTGJUGJVGJWGJXGJYGJZGKHGKIGKJG"
398 	    "KKGKLGKMGKNGKOGKPGKQGKRGKSGKTGKUGKVGKWGKXGKYGKZGLHGLIGLJGLKGLLGLM"
399 	    "GLNGLOGLPGLQGLRGLSGLTGLUGLVGLWGLXGLYGLZGMHGMIGMJGMKGMLGMMGMNGMOGM"
400 	    "PGMQGMRGMSGMTGMUGMVGMWGMXGMYGMZGNHGNIGNJGNKGNLGNMGNNGNOGNPGNQGNRG"
401 	    "NSGNTGNUGNVGNWGNXGNYGNZGOHGOIGOJGOKGOLGOMGONGOOGOPGOQGORGOSGOTGOU"
402 	    "GOVGOWGOXGOYGOZGPHGPIGPJGPKGPLGPMGPNGPOGPPGPQGPRGPSGPTGPUGPVGPWGP"
403 	    "XGPYGPZGQHGQIGQJGQKGQLGQMGQNGQOGQPGQQGQRGQSGQTGQUGQVGQWGQXGQYGQZG"
404 	    "RHGRIGRJGRKGRLGRMGRNGROGRPGRQGRRGRSGRTGRUGRVGRWGRXGRYGRZGSHGSIGSJ"
405 	    "GSKGSLGSMGSNGSOGSPGSQGSRGSSGSTGSUGSVGSWGSXGSYGSZGTHGTIGTJGTKGTLGT"
406 	    "MGTNGTOGTPGTQGTRGTSGTTGTUGTVGTWGTXGTYGTZGUHGUIGUJGUKGULGUMGUNGUOG"
407 	    "UPGUQGURGUSGUTGUUGUVGUWGUXGUYGUZGVHGVIGVJGVKGVLGVMGVNGVOGVPGVQGVR"
408 	    "GVSGVTGVUGVVGVWGVXGVYGVZGWHGWIGWJGWKGWLGWMGWNGWOGWPGWQGWRGWSGWTGW"
409 	    "UGWVGWWGWXGWYGWZGXHGXIGXJGXKGXLGXMGXNGXOGXPGXQGXRGXSGXTGXUGXVGXWG"
410 	    "XXGXYGXZGYHGYIGYJGYKGYLGYMGYNGYOGYPGYQGYRGYSGYTGYUGYVGYWGYXGYYGYZ"
411 	    "GZHGZIGZJGZKGZLGZMGZNGZOGZPGZQGZRGZSGZTGZUGZVGZWGZXGZYGZZHHHIHHJH"
412 	    "HKHHLHHMHHNHHOHHPHHQHHRHHSHHTHHUHHVHHWHHXHHYHHZHIIHIJHIKHILHIMHIN"
413 	    "HIOHIPHIQHIRHISHITHIUHIVHIWHIXHIYHIZHJIHJJHJKHJLHJMHJNHJOHJPHJQHJ"
414 	    "RHJSHJTHJUHJVHJWHJXHJYHJZHKIHKJHKKHKLHKMHKNHKOHKPHKQHKRHKSHKTHKUH"
415 	    "KVHKWHKXHKYHKZHLIHLJHLKHLLHLMHLNHLOHLPHLQHLRHLSHLTHLUHLVHLWHLXHLY"
416 	    "HLZHMIHMJHMKHMLHMMHMNHMOHMPHMQHMRHMSHMTHMUHMVHMWHMXHMYHMZHNIHNJHN"
417 	    "KHNLHNMHNNHNOHNPHNQHNRHNSHNTHNUHNVHNWHNXHNYHNZHOIHOJHOKHOLHOMHONH"
418 	    "OOHOPHOQHORHOSHOTHOUHOVHOWHOXHOYHOZHPIHPJHPKHPLHPMHPNHPOHPPHPQHPR"
419 	    "HPSHPTHPUHPVHPWHPXHPYHPZHQIHQJHQKHQLHQMHQNHQOHQPHQQHQRHQSHQTHQUHQ"
420 	    "VHQWHQXHQYHQZHRIHRJHRKHRLHRMHRNHROHRPHRQHRRHRSHRTHRUHRVHRWHRXHRYH"
421 	    "RZHSIHSJHSKHSLHSMHSNHSOHSPHSQHSRHSSHSTHSUHSVHSWHSXHSYHSZHTIHTJHTK"
422 	    "HTLHTMHTNHTOHTPHTQHTRHTSHTTHTUHTVHTWHTXHTYHTZHUIHUJHUKHULHUMHUNHU"
423 	    "OHUPHUQHURHUSHUTHUUHUVHUWHUXHUYHUZHVIHVJHVKHVLHVMHVNHVOHVPHVQHVRH"
424 	    "VSHVTHVUHVVHVWHVXHVYHVZHWIHWJHWKHWLHWMHWNHWOHWPHWQHWRHWSHWTHWUHWV"
425 	    "HWWHWXHWYHWZHXIHXJHXKHXLHXMHXNHXOHXPHXQHXRHXSHXTHXUHXVHXWHXXHXYHX"
426 	    "ZHYIHYJHYKHYLHYMHYNHYOHYPHYQHYRHYSHYTHYUHYVHYWHYXHYYHYZHZIHZJHZKH"
427 	    "ZLHZMHZNHZOHZPHZQHZRHZSHZTHZUHZVHZWHZXHZYHZZIIIJIIKIILIIMIINIIOII"
428 	    "PIIQIIRIISIITIIUIIVIIWIIXIIYIIZIJJIJKIJLIJMIJNIJOIJPIJQIJRIJSIJTI"
429 	    "JUIJVIJWIJXIJYIJZIKJIKKIKLIKMIKNIKOIKPIKQIKRIKSIKTIKUIKVIKWIKXIKY"
430 	    "IKZILJILKILLILMILNILOILPILQILRILSILTILUILVILWILXILYILZIMJIMKIMLIM"
431 	    "MIMNIMOIMPIMQIMRIMSIMTIMUIMVIMWIMXIMYIMZINJINKINLINMINNINOINPINQI"
432 	    "NRINSINTINUINVINWINXINYINZIOJIOKIOLIOMIONIOOIOPIOQIORIOSIOTIOUIOV"
433 	    "IOWIOXIOYIOZIPJIPKIPLIPMIPNIPOIPPIPQIPRIPSIPTIPUIPVIPWIPXIPYIPZIQ"
434 	    "JIQKIQLIQMIQNIQOIQPIQQIQRIQSIQTIQUIQVIQWIQXIQYIQZIRJIRKIRLIRMIRNI"
435 	    "ROIRPIRQIRRIRSIRTIRUIRVIRWIRXIRYIRZISJISKISLISMISNISOISPISQISRISS"
436 	    "ISTISUISVISWISXISYISZITJITKITLITMITNITOITPITQITRITSITTITUITVITWIT"
437 	    "XITYITZIUJIUKIULIUMIUNIUOIUPIUQIURIUSIUTIUUIUVIUWIUXIUYIUZIVJIVKI"
438 	    "VLIVMIVNIVOIVPIVQIVRIVSIVTIVUIVVIVWIVXIVYIVZIWJIWKIWLIWMIWNIWOIWP"
439 	    "IWQIWRIWSIWTIWUIWVIWWIWXIWYIWZIXJIXKIXLIXMIXNIXOIXPIXQIXRIXSIXTIX"
440 	    "UIXVIXWIXXIXYIXZIYJIYKIYLIYMIYNIYOIYPIYQIYRIYSIYTIYUIYVIYWIYXIYYI"
441 	    "YZIZJIZKIZLIZMIZNIZOIZPIZQIZRIZSIZTIZUIZVIZWIZXIZYIZZJJJKJJLJJMJJ"
442 	    "NJJOJJPJJQJJRJJSJJTJJUJJVJJWJJXJJYJJZJKKJKLJKMJKNJKOJKPJKQJKRJKSJ"
443 	    "KTJKUJKVJKWJKXJKYJKZJLKJLLJLMJLNJLOJLPJLQJLRJLSJLTJLUJLVJLWJLXJLY"
444 	    "JLZJMKJMLJMMJMNJMOJMPJMQJMRJMSJMTJMUJMVJMWJMXJMYJMZJNKJNLJNMJNNJN"
445 	    "OJNPJNQJNRJNSJNTJNUJNVJNWJNXJNYJNZJOKJOLJOMJONJOOJOPJOQJORJOSJOTJ"
446 	    "OUJOVJOWJOXJOYJOZJPKJPLJPMJPNJPOJPPJPQJPRJPSJPTJPUJPVJPWJPXJPYJPZ"
447 	    "JQKJQLJQMJQNJQOJQPJQQJQRJQSJQTJQUJQVJQWJQXJQYJQZJRKJRLJRMJRNJROJR"
448 	    "PJRQJRRJRSJRTJRUJRVJRWJRXJRYJRZJSKJSLJSMJSNJSOJSPJSQJSRJSSJSTJSUJ"
449 	    "SVJSWJSXJSYJSZJTKJTLJTMJTNJTOJTPJTQJTRJTSJTTJTUJTVJTWJTXJTYJTZJUK"
450 	    "JULJUMJUNJUOJUPJUQJURJUSJUTJUUJUVJUWJUXJUYJUZJVKJVLJVMJVNJVOJVPJV"
451 	    "QJVRJVSJVTJVUJVVJVWJVXJVYJVZJWKJWLJWMJWNJWOJWPJWQJWRJWSJWTJWUJWVJ"
452 	    "WWJWXJWYJWZJXKJXLJXMJXNJXOJXPJXQJXRJXSJXTJXUJXVJXWJXXJXYJXZJYKJYL"
453 	    "JYMJYNJYOJYPJYQJYRJYSJYTJYUJYVJYWJYXJYYJYZJZKJZLJZMJZNJZOJZPJZQJZ"
454 	    "RJZSJZTJZUJZVJZWJZXJZYJZZKKKLKKMKKNKKOKKPKKQKKRKKSKKTKKUKKVKKWKKX"
455 	    "KKYKKZKLLKLMKLNKLOKLPKLQKLRKLSKLTKLUKLVKLWKLXKLYKLZKMLKMMKMNKMOKM"
456 	    "PKMQKMRKMSKMTKMUKMVKMWKMXKMYKMZKNLKNMKNNKNOKNPKNQKNRKNSKNTKNUKNVK"
457 	    "NWKNXKNYKNZKOLKOMKONKOOKOPKOQKORKOSKOTKOUKOVKOWKOXKOYKOZKPLKPMKPN"
458 	    "KPOKPPKPQKPRKPSKPTKPUKPVKPWKPXKPYKPZKQLKQMKQNKQOKQPKQQKQRKQSKQTKQ"
459 	    "UKQVKQWKQXKQYKQZKRLKRMKRNKROKRPKRQKRRKRSKRTKRUKRVKRWKRXKRYKRZKSLK"
460 	    "SMKSNKSOKSPKSQKSRKSSKSTKSUKSVKSWKSXKSYKSZKTLKTMKTNKTOKTPKTQKTRKTS"
461 	    "KTTKTUKTVKTWKTXKTYKTZKULKUMKUNKUOKUPKUQKURKUSKUTKUUKUVKUWKUXKUYKU"
462 	    "ZKVLKVMKVNKVOKVPKVQKVRKVSKVTKVUKVVKVWKVXKVYKVZKWLKWMKWNKWOKWPKWQK"
463 	    "WRKWSKWTKWUKWVKWWKWXKWYKWZKXLKXMKXNKXOKXPKXQKXRKXSKXTKXUKXVKXWKXX"
464 	    "KXYKXZKYLKYMKYNKYOKYPKYQKYRKYSKYTKYUKYVKYWKYXKYYKYZKZLKZMKZNKZOKZ"
465 	    "PKZQKZRKZSKZTKZUKZVKZWKZXKZYKZZLLLMLLNLLOLLPLLQLLRLLSLLTLLULLVLLW"
466 	    "LLXLLYLLZLMMLMNLMOLMPLMQLMRLMSLMTLMULMVLMWLMXLMYLMZLNMLNNLNOLNPLN"
467 	    "QLNRLNSLNTLNULNVLNWLNXLNYLNZLOMLONLOOLOPLOQLORLOSLOTLOULOVLOWLOXL"
468 	    "OYLOZLPMLPNLPOLPPLPQLPRLPSLPTLPULPVLPWLPXLPYLPZLQMLQNLQOLQPLQQLQR"
469 	    "LQSLQTLQULQVLQWLQXLQYLQZLRMLRNLROLRPLRQLRRLRSLRTLRULRVLRWLRXLRYLR"
470 	    "ZLSMLSNLSOLSPLSQLSRLSSLSTLSULSVLSWLSXLSYLSZLTMLTNLTOLTPLTQLTRLTSL"
471 	    "TTLTULTVLTWLTXLTYLTZLUMLUNLUOLUPLUQLURLUSLUTLUULUVLUWLUXLUYLUZLVM"
472 	    "LVNLVOLVPLVQLVRLVSLVTLVULVVLVWLVXLVYLVZLWMLWNLWOLWPLWQLWRLWSLWTLW"
473 	    "ULWVLWWLWXLWYLWZLXMLXNLXOLXPLXQLXRLXSLXTLXULXVLXWLXXLXYLXZLYMLYNL"
474 	    "YOLYPLYQLYRLYSLYTLYULYVLYWLYXLYYLYZLZMLZNLZOLZPLZQLZRLZSLZTLZULZV"
475 	    "LZWLZXLZYLZZMMMNMMOMMPMMQMMRMMSMMTMMUMMVMMWMMXMMYMMZMNNMNOMNPMNQM"
476 	    "NRMNSMNTMNUMNVMNWMNXMNYMNZMONMOOMOPMOQMORMOSMOTMOUMOVMOWMOXMOYMOZ"
477 	    "MPNMPOMPPMPQMPRMPSMPTMPUMPVMPWMPXMPYMPZMQNMQOMQPMQQMQRMQSMQTMQUMQ"
478 	    "VMQWMQXMQYMQZMRNMROMRPMRQMRRMRSMRTMRUMRVMRWMRXMRYMRZMSNMSOMSPMSQM"
479 	    "SRMSSMSTMSUMSVMSWMSXMSYMSZMTNMTOMTPMTQMTRMTSMTTMTUMTVMTWMTX"
480 	    "MTYMTZ"
481 	    "MUNMUOMUPMUQMURMUSMUTMUUMUVMUWMUXMUYMUZMVNMVOMVPMVQMVRMVSMVTMVUMV"
482 	    "VMVWMVXMVYMVZMWNMWOMWPMWQMWRMWSMWTMWUMWVMWWMWXMWYMWZMXNMXOMXPMXQM"
483 	    "XRMXSMXTMXUMXVMXWMXXMXYMXZMYNMYOMYPMYQMYRMYSMYTMYUMYVMYWMYXMYYMYZ"
484 	    "MZNMZOMZPMZQMZRMZSMZTMZUMZVMZWMZXMZYMZZNNNONNPNNQNNRNNSNNTNNUNNVN"
485 	    "NWNNXNNYNNZNOONOPNOQNORNOSNOTNOUNOVNOWNOXNOYNOZNPONPPNPQNPRNPSNPT"
486 	    "NPUNPVNPWNPXNPYNPZNQONQPNQQNQRNQSNQTNQUNQVNQWNQXNQYNQZNRONRPNRQNR"
487 	    "RNRSNRTNRUNRVNRWNRXNRYNRZNSONSPNSQNSRNSSNSTNSUNSVNSWNSXNSYNSZNTON"
488 	    "TPNTQNTRNTSNTTNTUNTVNTWNTXNTYNTZNUONUPNUQNURNUSNUTNUUNUVNUWNUXNUY"
489 	    "NUZNVONVPNVQNVRNVSNVTNVUNVVNVWNVXNVYNVZNWONWPNWQNWRNWSNWTNWUNWVNW"
490 	    "WNWXNWYNWZNXONXPNXQNXRNXSNXTNXUNXVNXWNXXNXYNXZNYONYPNYQNYRNYSNYTN"
491 	    "YUNYVNYWNYXNYYNYZNZONZPNZQNZRNZSNZTNZUNZVNZWNZXNZYNZZOOOPOOQOOROO"
492 	    "SOOTOOUOOVOOWOOXOOYOOZOPPOPQOPROPSOPTOPUOPVOPWOPXOPYOPZOQPOQQOQRO"
493 	    "QSOQTOQUOQVOQWOQXOQYOQZORPORQORRORSORTORUORVORWORXORYORZOSPOSQOSR"
494 	    "OSSOSTOSUOSVOSWOSXOSYOSZOTPOTQOTROTSOTTOTUOTVOTWOTXOTYOTZOUPOUQOU"
495 	    "ROUSOUTOUUOUVOUWOUXOUYOUZOVPOVQOVROVSOVTOVUOVVOVWOVXOVYOVZOWPOWQO"
496 	    "WROWSOWTOWUOWVOWWOWXOWYOWZOXPOXQOXROXSOXTOXUOXVOXWOXXOXYOXZOYPOYQ"
497 	    "OYROYSOYTOYUOYVOYWOYXOYYOYZOZPOZQOZROZSOZTOZUOZVOZWOZXOZYOZZPPPQP"
498 	    "PRPPSPPTPPUPPVPPWPPXPPYPPZPQQPQRPQSPQTPQUPQVPQWPQXPQYPQZPRQPRRPRS"
499 	    "PRTPRUPRVPRWPRXPRYPRZPSQPSRPSSPSTPSUPSVPSWPSXPSYPSZPTQPTRPTSPTTPT"
500 	    "UPTVTABUABVABWABXABYABZACBACCACDACEACFACGACHACIACJACKACLACMACNACO"
501 	    "ACPACQACRACSACTACUACVACWACXACYACZADBADCADDADEADFADGADHADIADJADKAD"
502 	    "LADMADAAABAACAADAAEAAFAAGAAHAAIAAJAAKAALAAMAANAAOAAPAAQAARAASAATA"
503 	    "AUAAVAAWAAXAAYAAZABBABCABDABEABFABGABHABIABJABKABLABMABNABOABPABQ"
504 	    "ABRABSABHAFIAFJAFKAFLAFMAFNAFOAFPAFQAFRAFSAFTAFUAFVAFWAFXAFYAFZAG"
505 	    "BAGCAGDAGEAGFAGGAGHAGIAGJAGKAGLAGMAGNAGOAGPAGQAGRAGSAGTAGUAGVAGWA"
506 	    "GXAGYAGZAHNADOADPADQADRADSADTADUADVADWADXADYADZAEBAECAEDAEEAEFAEG"
507 	    "AEHAEIAEJAEKAELAEMAENAEOAEPAEQAERAESAETAEUAEVAEWAEXAEYAEZAFBAFCAF"
508 	    "DAFEAFFAFGAFUAIVAIWAIXAIYAIZAJBAJCAJDAJEAJFAJGAJHAJIAJJAJKAJLAJMA"
509 	    "JNAJOAJPAJQAJRAJSAJTAJUAJVAJWAJXAJYAJZAKBAKCAKDAKEAKFAKGAKHAKIAKJ"
510 	    "AKKAKLAKMAKNAKBAHCAHDAHEAHFAHGAHHAHIAHJAHKAHLAHMAHNAHOAHPAHQAHRAH"
511 	    "SAHTAHUAHVAHWAHXAHYAHZAIBAICAIDAIEAIFAIGAIHAIIAIJAIKAILAIMAINAIOA"
512 	    "IPAIQAIRAISAITAIIAMJAMKAMLAMMAMNAMOAMPAMQAMRAMSAMTAMUAMVAMWAM"
513 	    "XAMY"
514 	    "AMZANBANCANDANEANFANGANHANIANJANKANLANMANNANOANPANQANRANSANTANUAN"
515 	    "VANWANXANYANZAOBAOOAKPAKQAKRAKSAKTAKUAKVAKWAKXAKYAKZALBALCALDALEA"
516 	    "LFALGALHALIALJALKALLALMALNALOALPALQALRALSALTALUALVALWALXALYALZAMB"
517 	    "AMCAMDAMEAMFAMGAMHAMVAPWAPXAPYAPZAQBAQCAQDAQEAQFAQGAQHAQIAQJAQKAQ"
518 	    "LAQMAQNAQOAQPAQQAQRAQSAQTAQUAQVAQWAQXAQYAQZARBARCARDAREARFARGARHA"
519 	    "RIARJARKARLARMARNAROARCAODAOEAOFAOGAOHAOIAOJAOKAOLAOMAONAOOAOPAOQ"
520 	    "AORAOSAOTAOUAOVAOWAOXAOYAOZAPBAPCAPDAPEAPFAPGAPHAPIAPJAPKAPLAPMAP"
521 	    "NAPOAPPAPQAPRAPSAPTAPUAPJATKATLATMATNATOATPATQATRATSATTATUATVATWA"
522 	    "TXATYATZAUBAUCAUDAUEAUFAUGAUHAUIAUJAUKAULAUMAUNAUOAUPAUQAURAUSAUT"
523 	    "AUUAUVAUWAUXAUYAUZAVBAVCAVPARQARRARSARTARUARVARWARXARYARZASBASCAS"
524 	    "DASEASFASGASHASIASJASKASLASMASNASOASPASQASRASSASTASUASVASWASXASYA"
525 	    "SZATBATCATDATEATFATGATHATIATWAWXAWYAWZAXBAXCAXDAXEAXFAXGAXHAXIAXJ"
526 	    "AXKAXLAXMAXNAXOAXPAXQAXRAXSAXTAXUAXVAXWAXXAXYAXZAYBAYCAYDAYEAYFAY"
527 	    "GAYHAYIAYJAYKAYLAYMAYNAYOAYPAYDAVEAVFAVGAVHAVIAVJAVKAVLAVMAVNAVOA"
528 	    "VPAVQAVRAVSAVTAVUAVVAVWAVXAVYAVZAWBAWCAWDAWEAWFAWGAWHAWIAWJAWKAWL"
529 	    "AWMAWNAWOAWPAWQAWRAWSAWTAWUAWVAWBLBBMBBNBBOBBPBBQBBRBBSBBTBBUBBVB"
530 	    "BWBBXBBYBBZBCCBCDBCEBCFBCGBCHBCIBCJBCKBCLBCMBCNBCOBCPBCQBCRBCSBCT"
531 	    "BCUBCVBCWBCXBCYBCZBDCBDDBDEBDFBDGBQAYRAYSAYTAYUAYVAYWAYXAYYAYZAZB"
532 	    "AZCAZDAZEAZFAZGAZHAZIAZJAZKAZLAZMAZNAZOAZPAZQAZRAZSAZTAZUAZVAZWAZ"
533 	    "XAZYAZZBBBCBBDBBEBBFBBGBBHBBIBBJBBKBFDBFEBFFBFGBFHBFIBFJBFKBFLBFM"
534 	    "BFNBFOBFPBFQBFRBFSBFTBFUBFVBFWBFXBFYBFZBGCBGDBGEBGFBGGBGHBGIBGJBG"
535 	    "KBGLBGMBGNBGOBGPBGQBGRBGSBGTBGUBGVBGWBDHBDIBDJBDKBDLBDMBDNBDOBDPB"
536 	    "DQBDRBDSBDTBDUBDVBDWBDXBDYBDZBECBEDBEEBEFBEGBEHBEIBEJBEKBELBEMBEN"
537 	    "BEOBEPBEQBERBESBETBEUBEVBEWBEXBEYBEZBFCBITBIUBIVBIWBIXBIYBIZBJCBJ"
538 	    "DBJEBJFBJGBJHBJIBJJBJKBJLBJMBJNBJOBJPBJQBJRBJSBJTBJUBJVBJWBJXBJYB"
539 	    "JZBKCBKDBKEBKFBKGBKHBKIBKJBKKBKLBKMBKNBKOBGXBGYBGZBHCBHDBHEBHFBHG"
540 	    "BHHBHIBHJBHKBHLBHMBHNBHOBHPBHQBHRBHSBHTBHUBHVBHWBHXBHYBHZBICBIDBI"
541 	    "EBIFBIGBIHBIIBIJBIKBILBIMBINBIOBIPBIQBIRBISBMLBMMBMNBMOBMPBMQBMRB"
542 	    "MSBMTBMUBMVBMWBMXBMYBMZBNCBNDBNEBNFBNGBNHBNIBNJBNKBNLBNMBNNBNOBNP"
543 	    "BNQBNRBNSBNTBNUBNVBNWBNXBNYBNZBOCBODBOEBOFBOGBKPBKQBKRBKSBKTBKUBK"
544 	    "VBKWBKXBKYBKZBLCBLDBLEBLFBLGBLHBLIBLJBLKBLLBLMBLNBLOBLPBLQBLRBLSB"
545 	    "LTBLUBLVBLWBLXBLYBLZBMCBMDBMEBMFBMGBMHBMIBMJBMKBQDBQEBQFBQGBQHBQI"
546 	    "BQJBQKBQLBQMBQNBQOBQPBQQBQRBQSBQTBQUBQVBQWBQXBQYBQZBRCBRDBREBRFBR"
547 	    "GBRHBRIBRJBRKBRLBRMBRNBROBRPBRQBRRBRSBRTBRUBRVBRWBOHBOIBOJBOKBOLB"
548 	    "OMBONBOOBOPBOQBORBOSBOTBOUBOVBOWBOXBOYBOZBPCBPDBPEBPFBPGBPHBPIBPJ"
549 	    "BPKBPLBPMBPNBPOBPPBPQBPRBPSBPTBPUBPVBPWBPXBPYBPZBQCBTTBTUBTVBTWBT"
550 	    "XBTYBTZBUCBUDBUEBUFBUGBUHBUIBUJBUKBULBUMBUNBUOBUPBUQBURBUSBUTBUUB"
551 	    "UVBUWBUXBUYBUZBVCBVDBVEBVFBVGBVHBVIBVJBVKBVLBVMBVNBVOBRXBRYBRZBSC"
552 	    "BSDBSEBSFBSGBSHBSIBSJBSKBSLBSMBSNBSOBSPBSQBSRBSSBSTBSUBSVBSWBSXBS"
553 	    "YBSZBTCBTDBTEBTFBTGBTHBTIBTJBTKBTLBTMBTNBTOBTPBTQBTRBTSBXLBXMBXNB"
554 	    "XOBXPBXQBXRBXSBXTBXUBXVBXWBXXBXYBXZBYCBYDBYEBYFBYGBYHBYIBYJBYKBYL"
555 	    "BYMBYNBYOBYPBYQBYRBYSBYTBYUBYVBYWBYXBYYBYZBZCBZDBZEBZFBZGBVPBVQBV"
556 	    "RBVSBVTBVUBVVBVWBVXBVYBVZBWCBWDBWEBWFBWGBWHBWIBWJBWKBWLBWMBWNBWOB"
557 	    "WPBWQBWRBWSBWTBWUBWVBWWBWXBWYBWZBXCBXDBXEBXFBXGBXHBXIBXJBXKBCDFCD"
558 	    "GCDHCDICDJCDKCDLCDMCDNCDOCDPCDQCDRCDSCDTCDUCDVCDWCDXCDYCDZCEDCEEC"
559 	    "EFCEGCEHCEICEJCEKCELCEMCENCEOCEPCEQCERCESCETCEUCEVCEWCEXCEYCEZZHB"
560 	    "ZIBZJBZKBZLBZMBZNBZOBZPBZQBZRBZSBZTBZUBZVBZWBZXBZYBZZCCCDCCECCFCC"
561 	    "GCCHCCICCJCCKCCLCCMCCNCCOCCPCCQCCRCCSCCTCCUCCVCCWCCXCCYCCZCDDCDEC"
562 	    "GYCGZCHDCHECHFCHGCHHCHICHJCHKCHLCHMCHNCHOCHPCHQCHRCHSCHTCHUCHVCHW"
563 	    "CHXCHYCHZCIDCIECIFCIGCIHCIICIJCIKCILCIMCINCIOCIPCIQCIRCISCITCIUCI"
564 	    "VCFDCFECFFCFGCFHCFICFJCFKCFLCFMCFNCFOCFPCFQCFRCFSCFTCFUCFVCFWCFXC"
565 	    "FYCFZCGDCGECGFCGGCGHCGICGJCGKCGLCGMCGNCGOCGPCGQCGRCGSCGTCGUCGVCGW"
566 	    "CGXCKUCKVCKWCKXCKYCKZCLDCLECLFCLGCLHCLICLJCLKCLLCLMCLNCLOCLPCLQCL"
567 	    "RCLSCLTCLUCLVCLWCLXCLYCLZCMDCMECMFCMGCMHCMICMJCMKCMLCMMCMNCMOCMPC"
568 	    "MQCMRCIWCIXCIYCIZCJDCJECJFCJGCJHCJICJJCJKCJLCJMCJNCJOCJPCJQCJRCJS"
569 	    "CJTCJUCJVCJWCJXCJYCJZCKDCKECKFCKGCKHCKICKJCKKCKLCKMCKNCKOCKPCKQCK"
570 	    "RCKSCKTCOQCORCOSCOTCOUCOVCOWCOXCOYCOZCPDCPECPFCPGCPHCPICPJCPKCPLC"
571 	    "PMCPNCPOCPPCPQCPRCPSCPTCPUCPVCPWCPXCPYCPZCQDCQECQFCQGCQHCQICQJCQK"
572 	    "CQLCQMCQNCMSCMTCMUCMVCMWCMXCMYCMZCNDCNECNFCNGCNHCNICNJCNKCNLCNMCN"
573 	    "NCNOCNPCNQCNRCNSCNTCNUCNVCNWCNXCNYCNZCODCOECOFCOGCOHCOICOJCOKCOLC"
574 	    "OMCONCOOCOPCSMCSNCSOCSPCSQCSRCSSCSTCSUCSVCSWCSXCSYCSZCTDCTECTFCTG"
575 	    "CTHCTICTJCTKCTLCTMCTNCTOCTPCTQCTRCTSCTTCTUCTVCTWCTXCTYCTZCUDCUECU"
576 	    "FCUGCUHCUICUJCQOCQPCQQCQRCQSCQTCQUCQVCQWCQXCQYCQZCRDCRECRFCRGCRHC"
577 	    "RICRJCRKCRLCRMCRNCROCRPCRQCRRCRSCRTCRUCRVCRWCRXCRYCRZCSDCSECSFCSG"
578 	    "CSHCSICSJCSKCSLCWICWJCWKCWLCWMCWNCWOCWPCWQCWRCWSCWTCWUCWVCWWCWXCW"
579 	    "YCWZCXDCXECXFCXGCXHCXICXJCXKCXLCXMCXNCXOCXPCXQCXRCXSCXTCXUCXVCXWC"
580 	    "XXCXYCXZCYDCYECYFCUKCULCUMCUNCUOCUPCUQCURCUSCUTCUUCUVCUWCUXCUYCUZ"
581 	    "CVDCVECVFCVGCVHCVICVJCVKCVLCVMCVNCVOCVPCVQCVRCVSCVTCVUCVVCVWCVXCV"
582 	    "YCVZCWDCWECWFCWGCWHEDDFDDGDDHDDIDDJDDKDDLDDMDDNDDODDPDDQDDRDDSDDT"
583 	    "DDUDDVDDWDDXDDYDDZDEEDEFDEGDEHDEIDEJDEKDELDEMDENDEODEPDEQDERDESDE"
584 	    "TDEUDEVDEWDEXDEYDEZDFCYGCYHCYICYJCYKCYLCYMCYNCYOCYPCYQCYRCYSCYTCY"
585 	    "UCYVCYWCYXCYYCYZCZDCZECZFCZGCZHCZICZJCZKCZLCZMCZNCZOCZPCZQCZRCZSC"
586 	    "ZTCZUCZVCZWCZXCZYCZZDDDEDHFDHGDHHDHIDHJDHKDHLDHMDHNDHODHPDHQDHRDH"
587 	    "SDHTDHUDHVDHWDHXDHYDHZDIEDIFDIGDIHDIIDIJDIKDILDIMDINDIODIPDIQDIRD"
588 	    "ISDITDIUDIVDIWDIXDIYDIZDJEDFFDFGDFHDFIDFJDFKDFLDFMDFNDFODFPDFQDFR"
589 	    "DFSDFTDFUDFVDFWDFXDFYDFZDGEDGFDGGDGHDGIDGJDGKDGLDGMDGNDGODGPDGQDG"
590 	    "RDGSDGTDGUDGVDGWDGXDGYDGZDHEDLFDLGDLHDLIDLJDLKDLLDLMDLNDLODLPDLQD"
591 	    "LRDLSDLTDLUDLVDLWDLXDLYDLZDMEDMFDMGDMHDMIDMJDMKDMLDMMDMNDMODMPDMQ"
592 	    "DMRDMSDMTDMUDMVDMWDMXDMYDMZDNEDJFDJGDJHDJIDJJDJKDJLDJMDJNDJODJPDJ"
593 	    "QDJRDJSDJTDJUDJVDJWDJXDJYDJZDKEDKFDKGDKHDKIDKJDKKDKLDKMDKNDKODKPD"
594 	    "KQDKRDKSDKTDKUDKVDKWDKXDKYDKZDLEDPFDPGDPHDPIDPJDPKDPLDPMDPNDPODPP"
595 	    "DPQDPRDPSDPTDPUDPVDPWDPXDPYDPZDQEDQFDQGDQHDQIDQJDQKDQLDQMDQNDQODQ"
596 	    "PDQQDQRDQSDQTDQUDQVDQWDQXDQYDQZDREDNFDNGDNHDNIDNJDNKDNLDNMDNNDNOD"
597 	    "NPDNQDNRDNSDNTDNUDNVDNWDNXDNYDNZDOEDOFDOGDOHDOIDOJDOKDOLDOMDONDOO"
598 	    "DOPDOQDORDOSDOTDOUDOVDOWDOXDOYDOZDPEDTFDTGDTHDTIDTJDTKDTLDTMDTNDT"
599 	    "ODTPDTQDTRDTSDTTDTUDTVDTWDTXDTYDTZDUEDUFDUGDUHDUIDUJDUKDULDUMDUND"
600 	    "UODUPDUQDURDUSDUTDUUDUVDUWDUXDUYDUZDVEDRFDRGDRHDRIDRJDRKDRLDRMDRN"
601 	    "DRODRPDRQDRRDRSDRTDRUDRVDRWDRXDRYDRZDSEDSFDSGDSHDSIDSJDSKDSLDSMDS"
602 	    "NDSODSPDSQDSRDSSDSTDSUDSVDSWDSXDSYDSZDTEDXFDXGDXHDXIDXJDXKDXLDXMD"
603 	    "XNDXODXPDXQDXRDXSDXTDXUDXVDXWDXXDXYDXZDYEDYFDYGDYHDYIDYJDYKDYLDYM"
604 	    "DYNDYODYPDYQDYRDYSDYTDYUDYVDYWDYXDYYDYZDZEDVFDVGDVHDVIDVJDVKDVLDV"
605 	    "MDVNDVODVPDVQDVRDVSDVTDVUDVVDVWDVXDVYDVZDWEDWFDWGDWHDWIDWJDWKDWLD"
606 	    "WMDWNDWODWPDWQDWRDWSDWTDWUDWVDWWDWXDWYDWZDXFGEFHEFIEFJEFKEFLEFMEF"
607 	    "NEFOEFPEFQEFREFSEFTEFUEFVEFWEFXEFYEFZEGFEGGEGHEGIEGJEGKEGLEGMEGNE"
608 	    "GOEGPEGQEGREGSEGTEGUEGVEGWEGXEGYEGZEHFEHGEHHEEDZFDZGDZHDZIDZJDZKD"
609 	    "ZLDZMDZNDZODZPDZQDZRDZSDZTDZUDZVDZWDZXDZYDZZEEEFEEGEEHEEIEEJEEKEE"
610 	    "LEEMEENEEOEEPEEQEEREESEETEEUEEVEEWEEXEEYEEZEFFEJKEJLEJMEJNEJOEJPE"
611 	    "JQEJREJSEJTEJUEJVEJWEJXEJYEJZEKFEKGEKHEKIEKJEKKEKLEKMEKNEKOEKPEKQ"
612 	    "EKREKSEKTEKUEKVEKWEKXEKYEKZELFELGELHELIELJELKELLEHIEHJEHKEHLEHMEH"
613 	    "NEHOEHPEHQEHREHSEHTEHUEHVEHWEHXEHYEHZEIFEIGEIHEIIEIJEIKEILEIMEINE"
614 	    "IOEIPEIQEIREISEITEIUEIVEIWEIXEIYEIZEJFEJGEJHEJIEJJENOENPENQENRENS"
615 	    "ENTENUENVENWENXENYENZEOFEOGEOHEOIEOJEOKEOLEOMEONEOOEOPEOQEOREOSEO"
616 	    "TEOUEOVEOWEOXEOYEOZEPFEPGEPHEPIEPJEPKEPLEPMEPNEPOEPPELMELNELOELPE"
617 	    "LQELRELSELTELUELVELWELXELYELZEMFEMGEMHEMIEMJEMKEMLEMMEMNEMOEMPEMQ"
618 	    "EMREMSEMTEMUEMVEMWEMXEMYEMZENFENGENHENIENJENKENLENMENNERSERTERUER"
619 	    "VERWERXERYERZESFESGESHESIESJESKESLESMESNESOESPESQESRESSESTESUESVE"
620 	    "SWESXESYESZETFETGETHETIETJETKETLETMETNETOETPETQETRETSETTEPQEPREPS"
621 	    "EPTEPUEPVEPWEPXEPYEPZEQFEQGEQHEQIEQJEQKEQLEQMEQNEQOEQPEQQEQREQSEQ"
622 	    "TEQUEQVEQWEQXEQYEQZERFERGERHERIERJERKERLERMERNEROERPERQERREVWEVXE"
623 	    "VYEVZEWFEWGEWHEWIEWJEWKEWLEWMEWNEWOEWPEWQEWREWSEWTEWUEWVEWWEWXEWY"
624 	    "EWZEXFEXGEXHEXIEXJEXKEXLEXMEXNEXOEXPEXQEXREXSEXTEXUEXVEXWEXXETUET"
625 	    "VETWETXETYETZEUFEUGEUHEUIEUJEUKEULEUMEUNEUOEUPEUQEUREUSEUTEUUEUVE"
626 	    "UWEUXEUYEUZEVFEVGEVHEVIEVJEVKEVLEVMEVNEVOEVPEVQEVREVSEVTEVUEVVEFF"
627 	    "GFFHFFIFFJFFKFFLFFMFFNFFOFFPFFQFFRFFSFFTFFUFFVFFWFFXFFYFFZFGGFGHF"
628 	    "GIFGJFGKFGLFGMFGNFGOFGPFGQFGRFGSFGTFGUFGVFGWFGXFGYFGZFHGFHHFHIFHJ"
629 	    "XYEXZEYFEYGEYHEYIEYJEYKEYLEYMEYNEYOEYPEYQEYREYSEYTEYUEYVEYWEYXEYY"
630 	    "EYZEZFEZGEZHEZIEZJEZKEZLEZMEZNEZOEZPEZQEZREZSEZTEZUEZVEZWEZXEZYEZ"
631 	    "ZFFJOFJPFJQFJRFJSFJTFJUFJVFJWFJXFJYFJZFKGFKHFKIFKJFKKFKLFKMFKNFKO"
632 	    "FKPFKQFKRFKSFKTFKUFKVFKWFKXFKYFKZFLGFLHFLIFLJFLKFLLFLMFLNFLOFLPFL"
633 	    "QFLRFHKFHLFHMFHNFHOFHPFHQFHRFHSFHTFHUFHVFHWFHXFHYFHZFIGFIHFIIFIJF"
634 	    "IKFILFIMFINFIOFIPFIQFIRFISFITFIUFIVFIWFIXFIYFIZFJGFJHFJIFJJFJKFJL"
635 	    "FJMFJNFNWFNXFNYFNZFOGFOHFOIFOJFOKFOLFOMFONFOOFOPFOQFORFOSFOTFOUFO"
636 	    "VFOWFOXFOYFOZFPGFPHFPIFPJFPKFPLFPMFPNFPOFPPFPQFPRFPSFPTFPUFPVFPWF"
637 	    "PXFPYFPZFLSFLTFLUFLVFLWFLXFLYFLZFMGFMHFMIFMJFMKFMLFMMFMNFMOFMPFMQ"
638 	    "FMRFMSFMTFMUFMVFMWFMXFMYFMZFNGFNHFNIFNJFNKFNLFNMFNNFNOFNPFNQFNRFN"
639 	    "SFNTFNUFNVFSKFSLFSMFSNFSOFSPFSQFSRFSSFSTFSUFSVFSWFSXFSYFSZFTGFTHF"
640 	    "TIFTJFTKFTLFTMFTNFTOFTPFTQFTRFTSFTTFTUFTVFTWFTXFTYFTZFUGFUHFUIFUJ"
641 	    "FUKFULFUMFUNFQGFQHFQIFQJFQKFQLFQMFQNFQOFQPFQQFQRFQSFQTFQUFQVFQWFQ"
642 	    "XFQYFQZFRGFRHFRIFRJFRKFRLFRMFRNFROFRPFRQFRRFRSFRTFRUFRVFRWFRXFRYF"
643 	    "RZFSGFSHFSIFSJFWSFWTFWUFWVFWWFWXFWYFWZFXGFXHFXIFXJFXKFXLFXMFXNFXO"
644 	    "FXPFXQFXRFXSFXTFXUFXVFXWFXXFXYFXZFYGFYHFYIFYJFYKFYLFYMFYNFYOFYPFY"
645 	    "QFYRFYSFYTFYUFYVFUOFUPFUQFURFUSFUTFUUFUVFUWFUXFUYFUZFVGFVHFVIFVJF"
646 	    "VKFVLFVMFVNFVOFVPFVQFVRFVSFVTFVUFVVFVWFVXFVYFVZFWGFWHFWIFWJFWKFWL"
647 	    "FWMFWNFWOFWPFWQFWRHGHIGHJGHKGHLGHMGHNGHOGHPGHQGHRGHSGHTGHUGHVGHWG"
648 	    "HXGHYGHZGIHGIIGIJGIKGILGIMGINGIOGIPGIQGIRGISGITGIUGIVGIWGIXGIYGIZ"
649 	    "GJHGJIGJJGJKGJLGJMGJFYWFYXFYYFYZFZGFZHFZIFZJFZKFZLFZMFZNFZOFZPFZQ"
650 	    "FZRFZSFZTFZUFZVFZWFZXFZYFZZGGGHGGIGGJGGKGGLGGMGGNGGOGGPGGQGGRGGSG"
651 	    "GTGGUGGVGGWGGXGGYGGZGHTGLUGLVGLWGLXGLYGLZGMHGMIGMJGMKGMLGMMGMNGMO"
652 	    "GMPGMQGMRGMSGMTGMUGMVGMWGMXGMYGMZGNHGNIGNJGNKGNLGNMGNNGNOGNPGNQGN"
653 	    "RGNSGNTGNUGNVGNWGNXGNYGNNGJOGJPGJQGJRGJSGJTGJUGJVGJWGJXGJYGJZGKHG"
654 	    "KIGKJGKKGKLGKMGKNGKOGKPGKQGKRGKSGKTGKUGKVGKWGKXGKYGKZGLHGLIGLJGLK"
655 	    "GLLGLMGLNGLOGLPGLQGLRGLSGLMGQNGQOGQPGQQGQRGQSGQTGQUGQVGQWGQXGQYGQ"
656 	    "ZGRHGRIGRJGRKGRLGRMGRNGROGRPGRQGRRGRSGRTGRUGRVGRWGRXGRYGRZGSHGSIG"
657 	    "SJGSKGSLGSMGSNGSOGSPGSQGSRGSZGOHGOIGOJGOKGOLGOMGONGOOGOPGOQGORGOS"
658 	    "GOTGOUGOVGOWGOXGOYGOZGPHGPIGPJGPKGPLGPMGPNGPOGPPGPQGPRGPSGPTGPUGP"
659 	    "VGPWGPXGPYGPZGQHGQIGQJGQKGQLGQYGUZGVHGVIGVJGVKGVLGVMGVNGVOGVPGVQG"
660 	    "VRGVSGVTGVUGVVGVWGVXGVYGVZGWHGWIGWJGWKGWLGWMGWNGWOGWPGWQGWRGWSGWT"
661 	    "GWUGWVGWWGWXGWYGWZGXHGXIGXJGXKGXSGSTGSUGSVGSWGSXGSYGSZGTHGTIGTJGT"
662 	    "KGTLGTMGTNGTOGTPGTQGTRGTSGTTGTUGTVGTWGTXGTYGTZGUHGUIGUJGUKGULGUMG"
663 	    "UNGUOGUPGUQGURGUSGUTGUUGUVGUWGUXGURGZSGZTGZUGZVGZWGZXGZYGZZHHHIHH"
664 	    "JHHKHHLHHMHHNHHOHHPHHQHHRHHSHHTHHUHHVHHWHHXHHYHHZHIIHIJHIKHILHIMH"
665 	    "INHIOHIPHIQHIRHISHITHIUHIVHIWHIXHIYHLGXMGXNGXOGXPGXQGXRGXSGXTGXUG"
666 	    "XVGXWGXXGXYGXZGYHGYIGYJGYKGYLGYMGYNGYOGYPGYQGYRGYSGYTGYUGYVGYWGYX"
667 	    "GYYGYZGZHGZIGZJGZKGZLGZMGZNGZOGZPGZQGZLPHLQHLRHLSHLTHLUHLVHLWHLXH"
668 	    "LYHLZHMIHMJHMKHMLHMMHMNHMOHMPHMQHMRHMSHMTHMUHMVHMWHMXHMYHMZHNIHNJ"
669 	    "HNKHNLHNMHNNHNOHNPHNQHNRHNSHNTHNUHNVHNWHIZHJIHJJHJKHJLHJMHJNHJOHJ"
670 	    "PHJQHJRHJSHJTHJUHJVHJWHJXHJYHJZHKIHKJHKKHKLHKMHKNHKOHKPHKQHKRHKSH"
671 	    "KTHKUHKVHKWHKXHKYHKZHLIHLJHLKHLLHLMHLNHLOHQNHQOHQPHQQHQRHQSHQTHQU"
672 	    "HQVHQWHQXHQYHQZHRIHRJHRKHRLHRMHRNHROHRPHRQHRRHRSHRTHRUHRVHRWHRXHR"
673 	    "YHRZHSIHSJHSKHSLHSMHSNHSOHSPHSQHSRHSSHSTHSUHNXHNYHNZHOIHOJHOKHOLH"
674 	    "OMHONHOOHOPHOQHORHOSHOTHOUHOVHOWHOXHOYHOZHPIHPJHPKHPLHPMHPNHPOHPP"
675 	    "HPQHPRHPSHPTHPUHPVHPWHPXHPYHPZHQIHQJHQKHQLHQMHVLHVMHVNHVOHVPHVQHV"
676 	    "RHVSHVTHVUHVVHVWHVXHVYHVZHWIHWJHWKHWLHWMHWNHWOHWPHWQHWRHWSHWTHWUH"
677 	    "WVHWWHWXHWYHWZHXIHXJHXKHXLHXMHXNHXOHXPHXQHXRHXSHSVHSWHSXHSYHSZHTI"
678 	    "HTJHTKHTLHTMHTNHTOHTPHTQHTRHTSHTTHTUHTVHTWHTXHTYHTZHUIHUJHUKHULHU"
679 	    "MHUNHUOHUPHUQHURHUSHUTHUUHUVHUWHUXHUYHUZHVIHVJHVKHIIKIILIIMIINIIO"
680 	    "IIPIIQIIRIISIITIIUIIVIIWIIXIIYIIZIJJIJKIJLIJMIJNIJOIJPIJQIJRIJSIJ"
681 	    "TIJUIJVIJWIJXIJYIJZIKJIKKIKLIKMIKNIKOIKPIKQIKRIKSIKTXTHXUHXVHXWHX"
682 	    "XHXYHXZHYIHYJHYKHYLHYMHYNHYOHYPHYQHYRHYSHYTHYUHYVHYWHYXHYYHYZHZIH"
683 	    "ZJHZKHZLHZMHZNHZOHZPHZQHZRHZSHZTHZUHZVHZWHZXHZYHZZIIIJINNINOINPIN"
684 	    "QINRINSINTINUINVINWINXINYINZIOJIOKIOLIOMIONIOOIOPIOQIORIOSIOTIOUI"
685 	    "OVIOWIOXIOYIOZIPJIPKIPLIPMIPNIPOIPPIPQIPRIPSIPTIPUIPVIPWIKUIKVIKW"
686 	    "IKXIKYIKZILJILKILLILMILNILOILPILQILRILSILTILUILVILWILXILYILZIMJIM"
687 	    "KIMLIMMIMNIMOIMPIMQIMRIMSIMTIMUIMVIMWIMXIMYIMZINJINKINLINMISQISRI"
688 	    "SSISTISUISVISWISXISYISZITJITKITLITMITNITOITPITQITRITSITTITUITVITW"
689 	    "ITXITYITZIUJIUKIULIUMIUNIUOIUPIUQIURIUSIUTIUUIUVIUWIUXIUYIUZIPXIP"
690 	    "YIPZIQJIQKIQLIQMIQNIQOIQPIQQIQRIQSIQTIQUIQVIQWIQXIQYIQZIRJIRKIRLI"
691 	    "RMIRNIROIRPIRQIRRIRSIRTIRUIRVIRWIRXIRYIRZISJISKISLISMISNISOISPIXT"
692 	    "IXUIXVIXWIXXIXYIXZIYJIYKIYLIYMIYNIYOIYPIYQIYRIYSIYTIYUIYVIYWIYXIY"
693 	    "YIYZIZJIZKIZLIZMIZNIZOIZPIZQIZRIZSIZTIZUIZVIZWIZXIZYIZZJJJKJJLJJI"
694 	    "VJIVKIVLIVMIVNIVOIVPIVQIVRIVSIVTIVUIVVIVWIVXIVYIVZIWJIWKIWLIWMIWN"
695 	    "IWOIWPIWQIWRIWSIWTIWUIWVIWWIWXIWYIWZIXJIXKIXLIXMIXNIXOIXPIXQIXRIX"
696 	    "SYJLZJMKJMLJMMJMNJMOJMPJMQJMRJMSJMTJMUJMVJMWJMXJMYJMZJNKJNLJNMJNN"
697 	    "JNOJNPJNQJNRJNSJNTJNUJNVJNWJNXJNYJNZJOKJOLJOMJONJOOJOPJOQJORJOSJO"
698 	    "TJOMJJNJJOJJPJJQJJRJJSJJTJJUJJVJJWJJXJJYJJZJKKJKLJKMJKNJKOJKPJKQJ"
699 	    "KRJKSJKTJKUJKVJKWJKXJKYJKZJLKJLLJLMJLNJLOJLPJLQJLRJLSJLTJLUJLVJLW"
700 	    "JLXJLQJRRJRSJRTJRUJRVJRWJRXJRYJRZJSKJSLJSMJSNJSOJSPJSQJSRJSSJSTJS"
701 	    "UJSVJSWJSXJSYJSZJTKJTLJTMJTNJTOJTPJTQJTRJTSJTTJTUJTVJTWJTXJTYJTZJ"
702 	    "UKJULJUUJOVJOWJOXJOYJOZJPKJPLJPMJPNJPOJPPJPQJPRJPSJPTJPUJPVJPWJPX"
703 	    "JPYJPZJQKJQLJQMJQNJQOJQPJQQJQRJQSJQTJQUJQVJQWJQXJQYJQZJRKJRLJRMJR"
704 	    "NJROJRPJRYJWZJXKJXLJXMJXNJXOJXPJXQJXRJXSJXTJXUJXVJXWJXXJXYJXZJYKJ"
705 	    "YLJYMJYNJYOJYPJYQJYRJYSJYTJYUJYVJYWJYXJYYJYZJZKJZLJZMJZNJZOJZPJZQ"
706 	    "JZRJZSJZTJZMJUNJUOJUPJUQJURJUSJUTJUUJUVJUWJUXJUYJUZJVKJVLJVMJVNJV"
707 	    "OJVPJVQJVRJVSJVTJVUJVVJVWJVXJVYJVZJWKJWLJWMJWNJWOJWPJWQJWRJWSJWTJ"
708 	    "WUJWVJWWJWXJWMTKMUKMVKMWKMXKMYKMZKNLKNMKNNKNOKNPKNQKNRKNSKNTKNUKN"
709 	    "VKNWKNXKNYKNZKOLKOMKONKOOKOPKOQKORKOSKOTKOUKOVKOWKOXKOYKOZKPLKPMK"
710 	    "PNKPOKPPKPQKPRKUJZVJZWJZXJZYJZZKKKLKKMKKNKKOKKPKKQKKRKKSKKTKKUKKV"
711 	    "KKWKKXKKYKKZKLLKLMKLNKLOKLPKLQKLRKLSKLTKLUKLVKLWKLXKLYKLZKMLKMMKM"
712 	    "NKMOKMPKMQKMRKMSKSRKSSKSTKSUKSVKSWKSXKSYKSZKTLKTMKTNKTOKTPKTQKTRK"
713 	    "TSKTTKTUKTVKTWKTXKTYKTZKULKUMKUNKUOKUPKUQKURKUSKUTKUUKUVKUWKUXKUY"
714 	    "KUZKVLKVMKVNKVOKVPKPSKPTKPUKPVKPWKPXKPYKPZKQLKQMKQNKQOKQPKQQKQRKQ"
715 	    "SKQTKQUKQVKQWKQXKQYKQZKRLKRMKRNKROKRPKRQKRRKRSKRTKRUKRVKRWKRXKRYK"
716 	    "RZKSLKSMKSNKSOKSPKSQKYPKYQKYRKYSKYTKYUKYVKYWKYXKYYKYZKZLKZMKZNKZO"
717 	    "KZPKZQKZRKZSKZTKZUKZVKZWKZXKZYKZZLLLMLLNLLOLLPLLQLLRLLSLLTLLULLVL"
718 	    "LWLLXLLYLLZLMMLMNLMOLMPVQKVRKVSKVTKVUKVVKVWKVXKVYKVZKWLKWMKWNKWOK"
719 	    "WPKWQKWRKWSKWTKWUKWVKWWKWXKWYKWZKXLKXMKXNKXOKXPKXQKXRKXSKXTKXUKXV"
720 	    "KXWKXXKXYKXZKYLKYMKYNKYOKLPSLPTLPULPVLPWLPXLPYLPZLQMLQNLQOLQPLQQL"
721 	    "QRLQSLQTLQULQVLQWLQXLQYLQZLRMLRNLROLRPLRQLRRLRSLRTLRULRVLRWLRXLRY"
722 	    "LRZLSMLSNLSOLSPLSQLSRLSSLSTLMQLMRLMSLMTLMULMVLMWLMXLMYLMZLNMLNNLN"
723 	    "OLNPLNQLNRLNSLNTLNULNVLNWLNXLNYLNZLOMLONLOOLOPLOQLORLOSLOTLOULOVL"
724 	    "OWLOXLOYLOZLPMLPNLPOLPPLPQLPRLVWLVXLVYLVZLWMLWNLWOLWPLWQLWRLWSLWT"
725 	    "LWULWVLWWLWXLWYLWZLXMLXNLXOLXPLXQLXRLXSLXTLXULXVLXWLXXLXYLXZLYMLY"
726 	    "NLYOLYPLYQLYRLYSLYTLYULYVLYWLYXLSULSVLSWLSXLSYLSZLTMLTNLTOLTPLTQL"
727 	    "TRLTSLTTLTULTVLTWLTXLTYLTZLUMLUNLUOLUPLUQLURLUSLUTLUULUVLUWLUXLUY"
728 	    "LUZLVMLVNLVOLVPLVQLVRLVSLVTLVULVVOMOPMOQMORMOSMOTMOUMOVMOWMOXMOYM"
729 	    "OZMPNMPOMPPMPQMPRMPSMPTMPUMPVMPWMPXMPYMPZMQNMQOMQPMQQMQRMQSMQTMQU"
730 	    "MQVMQWMQXMQYMQZMRNMROMRPMRQMRRMRSMRLYYLYZLZMLZNLZOLZPLZQLZRLZSLZT"
731 	    "LZULZVLZWLZXLZYLZZMMMNMMOMMPMMQMMRMMSMMTMMUMMVMMWMMXMMYMMZMNNMNOM"
732 	    "NPMNQMNRMNSMNTMNUMNVMNWMNXMNYMNZMONMOYMUZMVNMVOMVPMVQMVRMVSMVTMVU"
733 	    "MVVMVWMVXMVYMVZMWNMWOMWPMWQMWRMWSMWTMWUMWVMWWMWXMWYMWZMXNMXOMXPMX"
734 	    "QMXRMXSMXTMXUMXVMXWMXXMXYMXZMYNMYOMYPMYTMRUMRVMRWMRXMRYMRZMSNMSOM"
735 	    "SPMSQMSRMSSMSTMSUMSVMSWMSXMSYMSZMTNMTOMTPMTQMTRMTSMTTMTUMTVMTWMTX"
736 	    "MTYMTZMUNMUOMUPMUQMURMUSMUTMUUMUVMUWMUXMUOXNOYNOZNPONPPNPQNPRNPSN"
737 	    "PTNPUNPVNPWNPXNPYNPZNQONQPNQQNQRNQSNQTNQUNQVNQWNQXNQYNQZNRONRPNRQ"
738 	    "NRRNRSNRTNRUNRVNRWNRXNRYNRZNSONSPNSQNSRNSSNQMYRMYSMYTMYUMYVMYWMYX"
739 	    "MYYMYZMZNMZOMZPMZQMZRMZSMZTMZUMZVMZWMZXMZYMZZNNNONNPNNQNNRNNSNNTN"
740 	    "NUNNVNNWNNXNNYNNZNOONOPNOQNORNOSNOTNOUNOVNOWNWPNWQNWRNWSNWTNWUNWV"
741 	    "NWWNWXNWYNWZNXONXPNXQNXRNXSNXTNXUNXVNXWNXXNXYNXZNYONYPNYQNYRNYSNY"
742 	    "TNYUNYVNYWNYXNYYNYZNZONZPNZQNZRNZSNZTNZUNZVNZWNSTNSUNSVNSWNSXNSYN"
743 	    "SZNTONTPNTQNTRNTSNTTNTUNTVNTWNTXNTYNTZNUONUPNUQNURNUSNUTNUUNUVNUW"
744 	    "NUXNUYNUZNVONVPNVQNVRNVSNVTNVUNVVNVWNVXNVYNVZNWONORXORYORZOSPOSQO"
745 	    "SROSSOSTOSUOSVOSWOSXOSYOSZOTPOTQOTROTSOTTOTUOTVOTWOTXOTYOTZOUPOUQ"
746 	    "OUROUSOUTOUUOUVOUWOUXOUYOUZOVPOVQOVROVSOVTOVUOVVOVWZXNZYNZZOOOPOO"
747 	    "QOOROOSOOTOOUOOVOOWOOXOOYOOZOPPOPQOPROPSOPTOPUOPVOPWOPXOPYOPZOQPO"
748 	    "QQOQROQSOQTOQUOQVOQWOQXOQYOQZORPORQORRORSORTORUORVORWOZXOZYOZZPPP"
749 	    "QPPRPPSPPTPPUPPVPPWPPXPPYPPZPQQPQRPQSPQTPQUPQVPQWPQXPQYPQZPRQPRRP"
750 	    "RSPRTPRUPRVPRWPRXPRYPRZPSQPSRPSSPSTPSUPSVPSWPSXPSYPSZPTOVXOVYOVZO"
751 	    "WPOWQOWROWSOWTOWUOWVOWWOWXOWYOWZOXPOXQOXROXSOXTOXUOXVOXWOXXOXYOXZ"
752 	    "OYPOYQOYROYSOYTOYUOYVOYWOYXOYYOYZOZPOZQOZROZSOZTOZUOZVOZWQPTRPTSP"
753 	    "TTPTUPTV";
754 
755 	z_stream strm = {};
756 	uint8_t *buf;
757 	size_t count;
758 	uLong bound;
759 
760 	strm.zalloc = &TestZLib_alloc;
761 	strm.zfree  = &TestZLib_free;
762 	deflateInit2(&strm,
763 	    Z_DEFAULT_COMPRESSION,
764 	    Z_DEFLATED,
765 	    15,
766 	    1,
767 	    Z_FIXED);
768 
769 	count = strlen(reproData);
770 	bound = deflateBound(&strm, count);
771 	buf   = IONew(uint8_t, bound);
772 
773 	strm.avail_out  = (uInt) bound;
774 	strm.next_out   = buf;
775 	strm.next_in    = (Bytef *) &reproData[0];
776 	strm.avail_in   = (uInt) count;
777 
778 	deflate(&strm, Z_FINISH);
779 	deflateEnd(&strm);
780 	IODelete(buf, uint8_t, bound);
781 
782 	return 0;
783 }
784 #endif /* TEST_ZLIB */
785 
786 
787 static void
TESAction(OSObject * owner,IOTimerEventSource * tes)788 TESAction(OSObject * owner, IOTimerEventSource * tes)
789 {
790 	if (mach_absolute_time() < gIOWorkLoopTestDeadline) {
791 		tes->setTimeout(1, kMicrosecondScale);
792 	}
793 }
794 
795 static int
IOWorkLoopTest(int newValue)796 IOWorkLoopTest(int newValue)
797 {
798 	IOReturn err;
799 	uint32_t idx;
800 	OSSharedPtr<IOWorkLoop> wl;
801 	OSSharedPtr<IOTimerEventSource> tes;
802 	OSSharedPtr<IOInterruptEventSource> ies;
803 
804 	wl = IOWorkLoop::workLoop();
805 	assert(wl);
806 	tes = IOTimerEventSource::timerEventSource(kIOTimerEventSourceOptionsPriorityWorkLoop, wl.get(), &TESAction);
807 	assert(tes);
808 	err = wl->addEventSource(tes.get());
809 	assert(kIOReturnSuccess == err);
810 	clock_interval_to_deadline(100, kMillisecondScale, &gIOWorkLoopTestDeadline);
811 	for (idx = 0; mach_absolute_time() < gIOWorkLoopTestDeadline; idx++) {
812 		tes->setTimeout(idx & 1023, kNanosecondScale);
813 	}
814 	tes->cancelTimeout();
815 	wl->removeEventSource(tes.get());
816 
817 	int value = 3;
818 
819 	tes = IOTimerEventSource::timerEventSource(kIOTimerEventSourceOptionsDefault, wl.get(), ^(IOTimerEventSource * tes){
820 		kprintf("wl %p, value %d\n", wl.get(), value);
821 	});
822 	err = wl->addEventSource(tes.get());
823 	assert(kIOReturnSuccess == err);
824 
825 	value = 2;
826 	tes->setTimeout(1, kNanosecondScale);
827 	IOSleep(1);
828 	wl->removeEventSource(tes.get());
829 
830 	ies = IOInterruptEventSource::interruptEventSource(wl.get(), NULL, 0, ^void (IOInterruptEventSource *sender, int count){
831 		kprintf("ies block %p, %d\n", sender, count);
832 	});
833 
834 	assert(ies);
835 	kprintf("ies %p\n", ies.get());
836 	err = wl->addEventSource(ies.get());
837 	assert(kIOReturnSuccess == err);
838 	ies->interruptOccurred(NULL, NULL, 0);
839 	IOSleep(1);
840 	ies->interruptOccurred(NULL, NULL, 0);
841 	IOSleep(1);
842 	wl->removeEventSource(ies.get());
843 
844 	return 0;
845 }
846 
847 static int
OSCollectionTest(int newValue)848 OSCollectionTest(int newValue)
849 {
850 	OSSharedPtr<OSArray> array = OSArray::withCapacity(8);
851 	array->setObject(kOSBooleanTrue);
852 	array->setObject(kOSBooleanFalse);
853 	array->setObject(kOSBooleanFalse);
854 	array->setObject(kOSBooleanTrue);
855 	array->setObject(kOSBooleanFalse);
856 	array->setObject(kOSBooleanTrue);
857 
858 	__block unsigned int index;
859 	index = 0;
860 	array->iterateObjects(^bool (OSObject * obj) {
861 		kprintf("%d:%d ", index, (obj == kOSBooleanTrue) ? 1 : (obj == kOSBooleanFalse) ? 0 : 2);
862 		index++;
863 		return false;
864 	});
865 	kprintf("\n");
866 
867 	OSSharedPtr<OSDictionary> dict = IOService::resourceMatching("hello");
868 	assert(dict);
869 	index = 0;
870 	dict->iterateObjects(^bool (const OSSymbol * sym, OSObject * obj) {
871 		OSString * str = OSDynamicCast(OSString, obj);
872 		assert(str);
873 		kprintf("%d:%s=%s\n", index, sym->getCStringNoCopy(), str->getCStringNoCopy());
874 		index++;
875 		return false;
876 	});
877 
878 	OSSharedPtr<OSSerializer> serializer = OSSerializer::withBlock(^bool (OSSerialize * s){
879 		return gIOBSDUnitKey->serialize(s);
880 	});
881 	assert(serializer);
882 	IOService::getPlatform()->setProperty("OSSerializer_withBlock", serializer.get());
883 
884 	OSSharedPtr<OSString> ab = OSString::withCString("abcdef", 2);
885 	assert(strcmp(ab->getCStringNoCopy(), "ab") == 0);
886 	OSSharedPtr<OSString> defgh = OSString::withCString("defgh", 10);
887 	assert(strcmp(defgh->getCStringNoCopy(), "defgh") == 0);
888 	OSSharedPtr<OSString> zyxwvut = OSString::withCString("zyxwvut", 7);
889 	assert(strcmp(zyxwvut->getCStringNoCopy(), "zyxwvut") == 0);
890 
891 	return 0;
892 }
893 
894 static int
OSAllocationTests(int)895 OSAllocationTests(int)
896 {
897 	OSAllocation<int> ints(100, OSAllocateMemory);
898 	assert(ints);
899 
900 	{
901 		int counter = 0;
902 		for (int& i : ints) {
903 			i = counter++;
904 		}
905 	}
906 
907 	{
908 		int counter = 0;
909 		for (int& i : ints) {
910 			assert(i == counter);
911 			++counter;
912 		}
913 	}
914 
915 	OSAllocation<int> arrayZero(100, OSAllocateMemoryZero);
916 	assert(arrayZero);
917 	for (const auto& i : arrayZero) {
918 		assert(i == 0);
919 	}
920 
921 	// Make sure we can have two-level OSAllocations
922 	{
923 		OSAllocation<OSAllocation<int> > testArray(10, OSAllocateMemory);
924 		for (int i = 0; i < 10; i++) {
925 			testArray[i] = OSAllocation<int>(10, OSAllocateMemory);
926 			for (int j = 0; j < 10; ++j) {
927 				testArray[i][j] = i + j;
928 			}
929 		}
930 
931 		for (int i = 0; i < 10; i++) {
932 			for (int j = 0; j < 10; ++j) {
933 				assert(testArray[i][j] == i + j);
934 			}
935 		}
936 	}
937 
938 	return 0;
939 }
940 
941 static int
OSDataAllocationTests(int)942 OSDataAllocationTests(int)
943 {
944 	OSDataAllocation<int> ints(100, OSAllocateMemory);
945 	assert(ints);
946 
947 	{
948 		int counter = 0;
949 		for (int& i : ints) {
950 			i = counter++;
951 		}
952 	}
953 
954 	{
955 		int counter = 0;
956 		for (const int& i : ints) {
957 			assert(i == counter);
958 			++counter;
959 		}
960 	}
961 
962 	OSDataAllocation<int> arrayZero(100, OSAllocateMemoryZero);
963 	assert(arrayZero);
964 	for (const auto& i : arrayZero) {
965 		assert(i == 0);
966 	}
967 
968 	return 0;
969 }
970 
971 static int
OSBoundedArrayTests(int)972 OSBoundedArrayTests(int)
973 {
974 	OSBoundedArray<int, 5> ints = {0, 1, 2, 3, 4};
975 	assert(ints.size() == 5);
976 
977 	{
978 		int counter = 0;
979 		for (int& i : ints) {
980 			i = counter++;
981 		}
982 	}
983 
984 	{
985 		int counter = 0;
986 		for (int& i : ints) {
987 			assert(i == counter);
988 			++counter;
989 		}
990 	}
991 
992 	return 0;
993 }
994 
995 static int
OSBoundedArrayRefTests(int)996 OSBoundedArrayRefTests(int)
997 {
998 	OSBoundedArray<int, 5> storage = {0, 1, 2, 3, 4};
999 	OSBoundedArrayRef<int> ints(storage);
1000 	assert(ints);
1001 
1002 	{
1003 		int counter = 0;
1004 		for (int& i : ints) {
1005 			i = counter++;
1006 		}
1007 	}
1008 
1009 	{
1010 		int counter = 0;
1011 		for (int& i : ints) {
1012 			assert(i == counter);
1013 			++counter;
1014 		}
1015 	}
1016 
1017 	assert(ints.length() == 5);
1018 	ints = OSBoundedArrayRef<int>();
1019 	assert(ints.length() == 0);
1020 	return 0;
1021 }
1022 
1023 class OSArraySubclass : public OSArray {
1024 	OSDeclareDefaultStructors(OSArraySubclass);
1025 public:
1026 	static OSSharedPtr<OSArraySubclass> withCapacity(unsigned int inCapacity);
1027 	virtual unsigned int iteratorSize() const APPLE_KEXT_OVERRIDE;
1028 };
1029 
1030 OSDefineMetaClassAndStructors(OSArraySubclass, OSArray);
1031 
1032 OSSharedPtr<OSArraySubclass>
withCapacity(unsigned int inCapacity)1033 OSArraySubclass::withCapacity(unsigned int inCapacity)
1034 {
1035 	OSSharedPtr<OSArraySubclass> me = OSMakeShared<OSArraySubclass>();
1036 
1037 	if (me && !me->initWithCapacity(inCapacity)) {
1038 		return nullptr;
1039 	}
1040 
1041 	return me;
1042 }
1043 
1044 unsigned int
iteratorSize() const1045 OSArraySubclass::iteratorSize() const
1046 {
1047 	unsigned int result = 64;
1048 	// Has to be larger than the OSArray iterator size to prevent out-of-bounds writes
1049 	assert(result >= OSArray::iteratorSize());
1050 	return result;
1051 }
1052 
1053 class OSCISubclass : public OSCollectionIterator {
1054 	OSDeclareDefaultStructors(OSCISubclass);
1055 public:
1056 	static OSSharedPtr<OSCISubclass> withCollection(const OSCollection * inColl);
1057 };
1058 
1059 OSDefineMetaClassAndStructors(OSCISubclass, OSCollectionIterator);
1060 
1061 OSSharedPtr<OSCISubclass>
withCollection(const OSCollection * inColl)1062 OSCISubclass::withCollection(const OSCollection * inColl)
1063 {
1064 	OSSharedPtr<OSCISubclass> me = OSMakeShared<OSCISubclass>();
1065 
1066 	if (me && !me->initWithCollection(inColl)) {
1067 		return nullptr;
1068 	}
1069 
1070 	return me;
1071 }
1072 
1073 static int
OSCollectionIteratorTests(int)1074 OSCollectionIteratorTests(int)
1075 {
1076 	OSSharedPtr<OSArray> array = OSArray::withCapacity(0);
1077 	OSSharedPtr<OSString> firstObj = OSString::withCString("test object");
1078 	OSSharedPtr<OSString> secondObj = OSString::withCString("test object 2");
1079 	OSObject * current = NULL;
1080 	OSSharedPtr<OSCollectionIterator> osci = NULL;
1081 	OSSharedPtr<OSCISubclass> osciSubclass = NULL;
1082 	size_t index = 0;
1083 	array->setObject(firstObj);
1084 	array->setObject(secondObj);
1085 
1086 	// Test iteration over a normal OSArray
1087 	osci = OSCollectionIterator::withCollection(array.get());
1088 	assert(osci != NULL);
1089 
1090 	index = 0;
1091 	while ((current = osci->getNextObject()) != NULL) {
1092 		if (index == 0) {
1093 			assert(current == firstObj);
1094 		} else if (index == 1) {
1095 			assert(current == secondObj);
1096 		} else {
1097 			panic("index out of range");
1098 		}
1099 		index++;
1100 	}
1101 
1102 	// Test iteration with a OSCollectionIterator subclass over a normal OSArray
1103 	osciSubclass = OSCISubclass::withCollection(array.get());
1104 	assert(osciSubclass != NULL);
1105 
1106 	index = 0;
1107 	while ((current = osciSubclass->getNextObject()) != NULL) {
1108 		if (index == 0) {
1109 			assert(current == firstObj);
1110 		} else if (index == 1) {
1111 			assert(current == secondObj);
1112 		} else {
1113 			panic("index out of range");
1114 		}
1115 		index++;
1116 	}
1117 
1118 	// Create the OSArray subclass
1119 	OSSharedPtr<OSArraySubclass> arraySubclass = OSArraySubclass::withCapacity(0);
1120 	arraySubclass->setObject(firstObj);
1121 	arraySubclass->setObject(secondObj);
1122 	// Test iteration over a subclassed OSArray, with a large iterator size
1123 	osci = OSCollectionIterator::withCollection(arraySubclass.get());
1124 	assert(osci != NULL);
1125 
1126 	index = 0;
1127 	while ((current = osci->getNextObject()) != NULL) {
1128 		if (index == 0) {
1129 			assert(current == firstObj);
1130 		} else if (index == 1) {
1131 			assert(current == secondObj);
1132 		} else {
1133 			panic("index out of range");
1134 		}
1135 		index++;
1136 	}
1137 
1138 	// Test iteration with a OSCollectionIterator subclass over a subclassed OSArray,
1139 	// with a large iterator size.
1140 	osciSubclass = OSCISubclass::withCollection(arraySubclass.get());
1141 	assert(osciSubclass != NULL);
1142 
1143 	index = 0;
1144 	while ((current = osciSubclass->getNextObject()) != NULL) {
1145 		if (index == 0) {
1146 			assert(current == firstObj);
1147 		} else if (index == 1) {
1148 			assert(current == secondObj);
1149 		} else {
1150 			panic("index out of range");
1151 		}
1152 		index++;
1153 	}
1154 
1155 	return 0;
1156 }
1157 
1158 static int
OSBoundedPtrTests(int)1159 OSBoundedPtrTests(int)
1160 {
1161 	int array[5] = {55, 66, 77, 88, 99};
1162 	OSBoundedPtr<int> begin(&array[0], &array[0], &array[5]);
1163 	OSBoundedPtr<int> end(&array[5], &array[0], &array[5]);
1164 
1165 	{
1166 		int counter = 0;
1167 		for (OSBoundedPtr<int> b = begin; b != end; ++b) {
1168 			*b = counter++;
1169 		}
1170 	}
1171 
1172 	{
1173 		int counter = 0;
1174 		for (OSBoundedPtr<int> b = begin; b != end; ++b) {
1175 			assert(*b == counter);
1176 			++counter;
1177 		}
1178 	}
1179 
1180 	return 0;
1181 }
1182 
1183 static int
IODataQueueDispatchSourceTests(int)1184 IODataQueueDispatchSourceTests(int)
1185 {
1186 	constexpr uint32_t NUM_ELEMENTS = 10;
1187 	constexpr uint32_t ELEMENT_SIZE = 16;
1188 	size_t entryHeaderSize;
1189 	IODataQueueDispatchSource * dqds;
1190 	kern_return_t kr;
1191 	IODataQueueClientEnqueueEntryBlock enqueueBlock = ^(void *data, size_t dataSize) {};
1192 	IODataQueueClientDequeueEntryBlock dequeueBlock = ^(const void *data, size_t dataSize) {};
1193 	uint32_t enqueued = 0;
1194 	uint32_t tail = 0;
1195 	uint32_t head = 0;
1196 
1197 	entryHeaderSize = IODataQueueDispatchSource::GetDataQueueEntryHeaderSize();
1198 
1199 	kr = IODataQueueDispatchSource::Create(NUM_ELEMENTS * (ELEMENT_SIZE + entryHeaderSize), NULL, &dqds);
1200 	assert(kr == kIOReturnSuccess);
1201 	assert(dqds != NULL);
1202 
1203 	// empty queue, should be able to enqueue NUM_ELEMENTS
1204 	kr = dqds->CanEnqueueData(ELEMENT_SIZE, NUM_ELEMENTS);
1205 	assert(kr == kIOReturnSuccess);
1206 
1207 	kr = dqds->CanEnqueueData(ELEMENT_SIZE, NUM_ELEMENTS + 1);
1208 	assert(kr == kIOReturnOverrun);
1209 
1210 	for (uint32_t i = 0; i < NUM_ELEMENTS * 10000; i++) {
1211 		// Randomly dequeue and enqueue elements
1212 
1213 		if (enqueued > 0) {
1214 			if (enqueued < NUM_ELEMENTS - 1 && (random() % 2) == 0) {
1215 				kr = dqds->Enqueue(ELEMENT_SIZE, enqueueBlock);
1216 				assert(kr == kIOReturnSuccess);
1217 				enqueued++;
1218 				tail++;
1219 			} else {
1220 				kr = dqds->Dequeue(dequeueBlock);
1221 				assert(kr == kIOReturnSuccess);
1222 				enqueued--;
1223 				head++;
1224 			}
1225 		} else {
1226 			kr = dqds->Enqueue(ELEMENT_SIZE, enqueueBlock);
1227 			assert(kr == kIOReturnSuccess);
1228 			enqueued++;
1229 			tail++;
1230 		}
1231 		if (tail > NUM_ELEMENTS) {
1232 			tail = 1;
1233 		}
1234 		if (head > NUM_ELEMENTS) {
1235 			head = 1;
1236 		}
1237 
1238 		for (uint32_t j = 0; j <= NUM_ELEMENTS; j++) {
1239 			// Can we enqueue `j` elements
1240 			kr = dqds->CanEnqueueData(ELEMENT_SIZE, j);
1241 
1242 			if (j < NUM_ELEMENTS - enqueued || (head <= tail && tail == enqueued && j == NUM_ELEMENTS - enqueued)) {
1243 				if (kr != kIOReturnSuccess) {
1244 					panic("i=%u j=%u enqueued=%u head=%u tail=%u kr=%d expected kIOReturnSuccess\n", i, j, enqueued, head, tail, kr);
1245 				}
1246 			} else {
1247 				if (kr != kIOReturnOverrun) {
1248 					panic("i=%u j=%u enqueued=%u head=%u tail=%u kr=%d expected kIOReturnOverrun\n", i, j, enqueued, head, tail, kr);
1249 				}
1250 			}
1251 
1252 			if ((random() % 16) == 1) {
1253 				// Verify result of CanEnqueueData
1254 
1255 				if (kr == kIOReturnSuccess) {
1256 					// There is space for `j` elements
1257 
1258 					for (uint32_t k = 0; k < j; k++) {
1259 						kr = dqds->Enqueue(ELEMENT_SIZE, enqueueBlock);
1260 						assert(kr == kIOReturnSuccess);
1261 						enqueued++;
1262 						tail++;
1263 						if (tail > NUM_ELEMENTS) {
1264 							tail = 1;
1265 						}
1266 					}
1267 				} else if (j == 1) {
1268 					// if we are checking to see if we can enqueue one element and CanEnqueueData says there's no space,
1269 					// ensure we can't Enqueue that element
1270 					kr = dqds->Enqueue(ELEMENT_SIZE, enqueueBlock);
1271 					assert(kr == kIOReturnOverrun);
1272 				}
1273 			}
1274 		}
1275 	}
1276 
1277 	OSSafeReleaseNULL(dqds);
1278 
1279 	return kIOReturnSuccess;
1280 }
1281 
1282 struct TrivialAggregateTestType {
1283 	int a;
1284 	bool b;
1285 	float c;
1286 };
1287 class NonTrivialConstructorAggregateTestType
1288 {
1289 public:
1290 	NonTrivialConstructorAggregateTestType() = default;
1291 	int a = 3;
1292 	bool b = true;
1293 	float c = 999.f;
1294 };
1295 OSDefineValueObjectForDependentType(int)
OSDefineValueObjectForDependentType(TrivialAggregateTestType)1296 OSDefineValueObjectForDependentType(TrivialAggregateTestType)
1297 OSDefineValueObjectForDependentType(NonTrivialConstructorAggregateTestType)
1298 
1299 static int
1300 OSValueObjectTests(int)
1301 {
1302 	constexpr auto nearlyEqual = [](float a, float b)
1303 	    {
1304 		    constexpr float epsilon = 0.000001f;
1305 		    const auto diff = a - b;
1306 		    return (diff >= -epsilon) && (diff <= epsilon);
1307 	    };
1308 
1309 	// test simple built-in type
1310 	{
1311 		using T = int;
1312 		OSSharedPtr<OSValueObject<T> > test = OSValueObject<T>::create();
1313 		assert(test);
1314 		if (test) {
1315 			assert(test->getRef() == 0);
1316 			assert(test->isEqualTo(0));
1317 			assert(test->getBytesNoCopy());
1318 			assert(test->getBytesNoCopy() == test->getMutableBytesNoCopy());
1319 			assert(test->getLength() == sizeof(T));
1320 		}
1321 	}
1322 
1323 	// test trivial aggregate type
1324 	{
1325 		using T = TrivialAggregateTestType;
1326 		OSSharedPtr<OSValueObject<T> > test = OSValueObject<T>::create();
1327 		assert(test);
1328 		if (test) {
1329 			const auto *const bytes = reinterpret_cast<const uint8_t*>(test->getBytesNoCopy());
1330 			bool bytesAreZero = true;
1331 			for (size_t byteIndex = 0; byteIndex < test->getLength(); byteIndex++) {
1332 				bytesAreZero &= bytes[byteIndex] == 0;
1333 			}
1334 			assert(bytesAreZero);
1335 		}
1336 	}
1337 
1338 	// test aggregate type with non-trivial constructor
1339 	{
1340 		using T = NonTrivialConstructorAggregateTestType;
1341 		OSSharedPtr<OSValueObject<T> > test = OSValueObject<T>::create();
1342 		assert(test);
1343 		if (test) {
1344 			const T other;
1345 			assert(test->isEqualTo(other));
1346 			assert(test->getRef().a == other.a);
1347 			assert(test->getRef().b == other.b);
1348 			assert(nearlyEqual(test->getRef().c, other.c));
1349 		}
1350 	}
1351 
1352 	// test copying of OSValueObject
1353 	{
1354 		using T = NonTrivialConstructorAggregateTestType;
1355 		OSSharedPtr<OSValueObject<T> > test1;
1356 		T valueCopy;
1357 		{
1358 			T value; // declared in sub-scope to ensure instance-independence when it falls out of scope
1359 			value.a = 1;
1360 			value.b = true;
1361 			value.c = 3.f;
1362 			valueCopy = value;
1363 			test1 = OSValueObject<T>::withValue(value);
1364 			assert(test1);
1365 			if (test1) {
1366 				assert(test1->isEqualTo(value));
1367 				assert(test1->getRef().a == value.a);
1368 				assert(test1->getRef().b == value.b);
1369 				assert(nearlyEqual(test1->getRef().c, value.c));
1370 			}
1371 			valueCopy.a = 100;
1372 			test1->getMutableRef().a = valueCopy.a;
1373 		}
1374 		if (test1) {
1375 			OSSharedPtr<OSValueObject<T> > test2 = OSValueObject<T>::withValueObject(test1.get());
1376 			if (test2) {
1377 				assert(test2->isEqualTo(test1.get()));
1378 				assert(test2->getRef().a == valueCopy.a);
1379 				assert(test2->getRef().b == valueCopy.b);
1380 				assert(nearlyEqual(test2->getRef().c, valueCopy.c));
1381 			}
1382 		}
1383 	}
1384 
1385 	return KERN_SUCCESS;
1386 }
1387 
1388 
1389 static int
IOSharedDataQueue_44636964(__unused int newValue)1390 IOSharedDataQueue_44636964(__unused int newValue)
1391 {
1392 	OSSharedPtr<IOSharedDataQueue> sd = IOSharedDataQueue::withCapacity(DATA_QUEUE_ENTRY_HEADER_SIZE + sizeof(UInt64));
1393 	UInt64 data = 0x11223344aa55aa55;
1394 	UInt32 data2 = 0x44332211;
1395 	UInt32 size = sizeof(UInt32);
1396 	/* enqueue moves tail to end */
1397 	sd->enqueue(&data, sizeof(UInt64));
1398 	/* dequeue moves head to end */
1399 	sd->dequeue(&data, &size);
1400 	/* Tail wraps around, head is still at end */
1401 	sd->enqueue(&data2, sizeof(UInt32));
1402 	/* something in the queue so peek() should return non-null */
1403 	assert(sd->peek() != NULL);
1404 	return KERN_SUCCESS;
1405 }
1406 
1407 #if 0
1408 #include <IOKit/IOUserClient.h>
1409 class TestUserClient : public IOUserClient
1410 {
1411 	OSDeclareDefaultStructors(TestUserClient);
1412 	virtual void stop( IOService *provider) APPLE_KEXT_OVERRIDE;
1413 	virtual bool finalize(IOOptionBits options) APPLE_KEXT_OVERRIDE;
1414 	virtual IOReturn externalMethod( uint32_t selector,
1415 	    IOExternalMethodArguments * arguments,
1416 	    IOExternalMethodDispatch * dispatch,
1417 	    OSObject * target,
1418 	    void * reference ) APPLE_KEXT_OVERRIDE;
1419 };
1420 
1421 void
1422 TestUserClient::stop( IOService *provider)
1423 {
1424 	kprintf("TestUserClient::stop\n");
1425 }
1426 bool
1427 TestUserClient::finalize(IOOptionBits options)
1428 {
1429 	kprintf("TestUserClient::finalize\n");
1430 	return true;
1431 }
1432 IOReturn
1433 TestUserClient::externalMethod( uint32_t selector,
1434     IOExternalMethodArguments * arguments,
1435     IOExternalMethodDispatch * dispatch,
1436     OSObject * target,
1437     void * reference )
1438 {
1439 	getProvider()->terminate();
1440 	IOSleep(500);
1441 	return 0;
1442 }
1443 OSDefineMetaClassAndStructors(TestUserClient, IOUserClient);
1444 #endif
1445 
1446 static int
IOServiceTest(int newValue)1447 IOServiceTest(int newValue)
1448 {
1449 	OSSharedPtr<OSDictionary> matching;
1450 	IONotifier        * note;
1451 	__block IOService * found;
1452 
1453 #if 0
1454 	found = new IOService;
1455 	found->init();
1456 	found->setName("IOTestUserClientProvider");
1457 	found->attach(IOService::getPlatform());
1458 	found->setProperty("IOUserClientClass", "TestUserClient");
1459 	found->registerService();
1460 #endif
1461 
1462 	matching = IOService::serviceMatching("IOPlatformExpert");
1463 	assert(matching);
1464 	found = nullptr;
1465 	note = IOService::addMatchingNotification(gIOMatchedNotification, matching.get(), 0,
1466 	    ^bool (IOService * newService, IONotifier * notifier) {
1467 		kprintf("found %s, %d\n", newService->getName(), newService->getRetainCount());
1468 		found = newService;
1469 		found->retain();
1470 		return true;
1471 	}
1472 	    );
1473 	assert(note);
1474 	assert(found);
1475 	note->remove();
1476 
1477 	note = found->registerInterest(gIOBusyInterest,
1478 	    ^IOReturn (uint32_t messageType, IOService * provider,
1479 	    void   * messageArgument, size_t argSize) {
1480 		kprintf("%p messageType 0x%08x %p\n", provider, messageType, messageArgument);
1481 		return kIOReturnSuccess;
1482 	}).detach();
1483 	assert(note);
1484 	IOSleep(1 * 1000);
1485 	note->remove();
1486 	found->release();
1487 
1488 	return 0;
1489 }
1490 
1491 static void
OSStaticPtrCastTests()1492 OSStaticPtrCastTests()
1493 {
1494 	// const& overload
1495 	{
1496 		OSSharedPtr<OSDictionary> const dict = OSMakeShared<OSDictionary>();
1497 		OSSharedPtr<OSCollection> collection = OSStaticPtrCast<OSCollection>(dict);
1498 		assert(collection == dict);
1499 	}
1500 	{
1501 		OSSharedPtr<OSDictionary> const dict = nullptr;
1502 		OSSharedPtr<OSCollection> collection = OSStaticPtrCast<OSCollection>(dict);
1503 		assert(collection == nullptr);
1504 	}
1505 	// && overload
1506 	{
1507 		OSSharedPtr<OSDictionary> dict = OSMakeShared<OSDictionary>();
1508 		OSDictionary* oldDict = dict.get();
1509 		OSSharedPtr<OSCollection> collection = OSStaticPtrCast<OSCollection>(os::move(dict));
1510 		assert(collection.get() == oldDict);
1511 		assert(dict == nullptr);
1512 	}
1513 	{
1514 		OSSharedPtr<OSDictionary> dict = nullptr;
1515 		OSSharedPtr<OSCollection> collection = OSStaticPtrCast<OSCollection>(os::move(dict));
1516 		assert(collection == nullptr);
1517 		assert(dict == nullptr);
1518 	}
1519 }
1520 
1521 static void
OSConstPtrCastTests()1522 OSConstPtrCastTests()
1523 {
1524 	// const& overload
1525 	{
1526 		OSSharedPtr<OSDictionary const> const dict = OSMakeShared<OSDictionary>();
1527 		OSSharedPtr<OSDictionary> dict2 = OSConstPtrCast<OSDictionary>(dict);
1528 		assert(dict2 == dict);
1529 	}
1530 	{
1531 		OSSharedPtr<OSDictionary const> const dict = OSMakeShared<OSDictionary>();
1532 		OSSharedPtr<OSDictionary const> dict2 = OSConstPtrCast<OSDictionary const>(dict);
1533 		assert(dict2 == dict);
1534 	}
1535 	{
1536 		OSSharedPtr<OSDictionary const> const dict = nullptr;
1537 		OSSharedPtr<OSDictionary> dict2 = OSConstPtrCast<OSDictionary>(dict);
1538 		assert(dict2 == nullptr);
1539 	}
1540 	{
1541 		OSSharedPtr<OSDictionary const> const dict = nullptr;
1542 		OSSharedPtr<OSDictionary const> dict2 = OSConstPtrCast<OSDictionary const>(dict);
1543 		assert(dict2 == nullptr);
1544 	}
1545 
1546 	// && overload
1547 	{
1548 		OSSharedPtr<OSDictionary const> dict = OSMakeShared<OSDictionary>();
1549 		OSDictionary const* oldDict = dict.get();
1550 		OSSharedPtr<OSDictionary> dict2 = OSConstPtrCast<OSDictionary>(os::move(dict));
1551 		assert(dict == nullptr);
1552 		assert(dict2 == oldDict);
1553 	}
1554 	{
1555 		OSSharedPtr<OSDictionary const> dict = nullptr;
1556 		OSSharedPtr<OSDictionary> dict2 = OSConstPtrCast<OSDictionary>(os::move(dict));
1557 		assert(dict == nullptr);
1558 		assert(dict2 == nullptr);
1559 	}
1560 }
1561 
1562 static void
OSDynamicPtrCastTests()1563 OSDynamicPtrCastTests()
1564 {
1565 	OSSharedPtr<OSDictionary> const dict = OSMakeShared<OSDictionary>();
1566 	{
1567 		OSSharedPtr<OSCollection> collection = OSDynamicPtrCast<OSCollection>(dict);
1568 		assert(collection != nullptr);
1569 	}
1570 	{
1571 		OSSharedPtr<OSArray> array = OSDynamicPtrCast<OSArray>(dict);
1572 		assert(array == nullptr);
1573 		assert(dict != nullptr);
1574 	}
1575 	{
1576 		OSTaggedSharedPtr<OSCollection, OSCollection> taggedDict(dict.get(), OSRetain);
1577 		OSTaggedSharedPtr<OSCollection, OSCollection> collection = OSDynamicPtrCast<OSCollection>(taggedDict);
1578 		assert(collection != nullptr);
1579 	}
1580 	{
1581 		OSTaggedSharedPtr<OSCollection, OSCollection> taggedDict(dict.get(), OSRetain);
1582 		OSTaggedSharedPtr<OSArray, OSCollection> array = OSDynamicPtrCast<OSArray>(taggedDict);
1583 		assert(array == nullptr);
1584 		assert(dict != nullptr);
1585 	}
1586 	{
1587 		OSSharedPtr<OSCollection> collection = OSDynamicPtrCast<OSCollection>(dict);
1588 		assert(collection.get() == OSDynamicCast(OSDictionary, dict.get()));
1589 		OSSharedPtr<OSDictionary> newDict = OSDynamicPtrCast<OSDictionary>(os::move(collection));
1590 		assert(collection == nullptr);
1591 		assert(newDict != nullptr);
1592 		assert(newDict.get() == dict.get());
1593 	}
1594 }
1595 
1596 
1597 class IOTestUserNotification : public IOUserNotification
1598 {
1599 	OSDeclareDefaultStructors(IOTestUserNotification);
1600 };
1601 
1602 OSDefineMetaClassAndStructors(IOTestUserNotification, IOUserNotification)
1603 
1604 struct IOUserNotificationTestThreadArgs {
1605 	IOTestUserNotification * userNotify;
1606 	IOLock * lock;
1607 	size_t * completed;
1608 	size_t iterations;
1609 };
1610 
1611 static bool
IOUserNotificationMatchingHandler(void * target __unused,void * ref __unused,IOService * newService __unused,IONotifier * notifier __unused)1612 IOUserNotificationMatchingHandler( void * target __unused,
1613     void * ref __unused, IOService * newService __unused, IONotifier * notifier __unused )
1614 {
1615 	return true;
1616 }
1617 
1618 static void
IOUserNotificationTestThread(void * arg,wait_result_t result __unused)1619 IOUserNotificationTestThread(void * arg, wait_result_t result __unused)
1620 {
1621 	IOUserNotificationTestThreadArgs * threadArgs = (IOUserNotificationTestThreadArgs *)arg;
1622 
1623 	OSSharedPtr<OSDictionary> dict = OSDictionary::withCapacity(0);
1624 	OSSharedPtr<OSString> rootPath = OSString::withCStringNoCopy(":/");
1625 	dict->setObject(gIOPathMatchKey, rootPath);
1626 
1627 	for (size_t i = 0; i < threadArgs->iterations; i++) {
1628 		if (i % 2 == 0) {
1629 			IONotifier * notify = IOService::addMatchingNotification( gIOWillTerminateNotification, dict.get(),
1630 			    &IOUserNotificationMatchingHandler, NULL );
1631 			threadArgs->userNotify->setNotification(notify);
1632 		} else {
1633 			threadArgs->userNotify->setNotification(NULL);
1634 		}
1635 	}
1636 
1637 	threadArgs->userNotify->setNotification(NULL);
1638 
1639 	IOLockLock(threadArgs->lock);
1640 	*threadArgs->completed = *threadArgs->completed + 1;
1641 	IOLockWakeup(threadArgs->lock, (event_t)threadArgs->completed, true);
1642 	IOLockUnlock(threadArgs->lock);
1643 }
1644 
1645 static int
IOUserNotificationTests(__unused int newValue)1646 IOUserNotificationTests(__unused int newValue)
1647 {
1648 	constexpr size_t numThreads = 10;
1649 	constexpr size_t numIterations = 500000;
1650 	OSSharedPtr<IOTestUserNotification> userNotify = OSMakeShared<IOTestUserNotification>();
1651 	IOLock * lock = IOLockAlloc();
1652 	size_t threadsCompleted;
1653 	size_t i = 0;
1654 	thread_t threads[numThreads];
1655 	kern_return_t kr;
1656 	bool result;
1657 
1658 	struct IOUserNotificationTestThreadArgs threadArgs = {
1659 		.userNotify = userNotify.get(),
1660 		.lock = lock,
1661 		.completed = &threadsCompleted,
1662 		.iterations = numIterations,
1663 	};
1664 
1665 	result = userNotify->init();
1666 	assert(result);
1667 
1668 	for (i = 0; i < numThreads; i++) {
1669 		kr = kernel_thread_start(&IOUserNotificationTestThread, (void *)&threadArgs, &threads[i]);
1670 		assert(kr == KERN_SUCCESS);
1671 	}
1672 
1673 	IOLockLock(lock);
1674 	while (threadsCompleted < numThreads) {
1675 		IOLockSleep(lock, &threadsCompleted, THREAD_UNINT);
1676 		IOLog("%s: Threads completed: %zu/%zu\n", __func__, threadsCompleted, numThreads);
1677 	}
1678 	IOLockUnlock(lock);
1679 
1680 	for (i = 0; i < numThreads; i++) {
1681 		thread_deallocate(threads[i]);
1682 	}
1683 
1684 	userNotify->setNotification(NULL);
1685 
1686 	IOLockFree(lock);
1687 
1688 	return KERN_SUCCESS;
1689 }
1690 
1691 static void
IOServiceMatchingSharedPtrTests()1692 IOServiceMatchingSharedPtrTests()
1693 {
1694 	OSSharedPtr<const OSSymbol> name = OSSymbol::withCString("name");
1695 	OSSharedPtr<const OSSymbol> value = OSSymbol::withCString("value");
1696 
1697 	{
1698 		OSSharedPtr<OSDictionary> table;
1699 		OSSharedPtr<OSDictionary> result = IOService::serviceMatching("name", table);
1700 		assert(result);
1701 		assert(result->getRetainCount() == 1);
1702 
1703 		table = result;
1704 		assert(table->getRetainCount() == 2);
1705 		OSSharedPtr<OSDictionary> result2 = IOService::serviceMatching("name", table);
1706 		assert(result2);
1707 		assert(result2 == table);
1708 		assert(result2->getRetainCount() == 3);
1709 	}
1710 
1711 	{
1712 		OSSharedPtr<OSDictionary> table;
1713 		OSSharedPtr<OSDictionary> result = IOService::serviceMatching(name.get(), table);
1714 		assert(result);
1715 		assert(result->getRetainCount() == 1);
1716 
1717 		table = result;
1718 		assert(table->getRetainCount() == 2);
1719 		OSSharedPtr<OSDictionary> result2 = IOService::serviceMatching(name.get(), table);
1720 		assert(result2);
1721 		assert(result2 == table);
1722 		assert(result2->getRetainCount() == 3);
1723 	}
1724 
1725 	{
1726 		OSSharedPtr<OSDictionary> table;
1727 		OSSharedPtr<OSDictionary> result = IOService::nameMatching("name", table);
1728 		assert(result);
1729 		assert(result->getRetainCount() == 1);
1730 
1731 		table = result;
1732 		assert(table->getRetainCount() == 2);
1733 		OSSharedPtr<OSDictionary> result2 = IOService::nameMatching("name", table);
1734 		assert(result2);
1735 		assert(result2 == table);
1736 		assert(result2->getRetainCount() == 3);
1737 	}
1738 
1739 	{
1740 		OSSharedPtr<OSDictionary> table;
1741 		OSSharedPtr<OSDictionary> result = IOService::nameMatching(name.get(), table);
1742 		assert(result);
1743 		assert(result->getRetainCount() == 1);
1744 
1745 		table = result;
1746 		assert(table->getRetainCount() == 2);
1747 		OSSharedPtr<OSDictionary> result2 = IOService::nameMatching(name.get(), table);
1748 		assert(result2);
1749 		assert(result2 == table);
1750 		assert(result2->getRetainCount() == 3);
1751 	}
1752 
1753 	{
1754 		OSSharedPtr<OSDictionary> table;
1755 		OSSharedPtr<OSDictionary> result = IOService::resourceMatching("name", table);
1756 		assert(result);
1757 		assert(result->getRetainCount() == 1);
1758 
1759 		table = result;
1760 		assert(table->getRetainCount() == 2);
1761 		OSSharedPtr<OSDictionary> result2 = IOService::resourceMatching("name", table);
1762 		assert(result2);
1763 		assert(result2 == table);
1764 		assert(result2->getRetainCount() == 3);
1765 	}
1766 
1767 	{
1768 		OSSharedPtr<OSDictionary> table;
1769 		OSSharedPtr<OSDictionary> result = IOService::resourceMatching(name.get(), table);
1770 		assert(result);
1771 		assert(result->getRetainCount() == 1);
1772 
1773 		table = result;
1774 		assert(table->getRetainCount() == 2);
1775 		OSSharedPtr<OSDictionary> result2 = IOService::resourceMatching(name.get(), table);
1776 		assert(result2);
1777 		assert(result2 == table);
1778 		assert(result2->getRetainCount() == 3);
1779 	}
1780 
1781 	{
1782 		OSSharedPtr<OSDictionary> table;
1783 		OSSharedPtr<OSDictionary> result = IOService::propertyMatching(name.get(), value.get(), table);
1784 		assert(result);
1785 		assert(result->getRetainCount() == 1);
1786 
1787 		table = result;
1788 		assert(table->getRetainCount() == 2);
1789 		OSSharedPtr<OSDictionary> result2 = IOService::propertyMatching(name.get(), value.get(), table);
1790 		assert(result2);
1791 		assert(result2 == table);
1792 		assert(result2->getRetainCount() == 3);
1793 	}
1794 
1795 	{
1796 		OSSharedPtr<OSDictionary> table;
1797 		OSSharedPtr<OSDictionary> result = IOService::registryEntryIDMatching(12, table);
1798 		assert(result);
1799 		assert(result->getRetainCount() == 1);
1800 
1801 		table = result;
1802 		assert(table->getRetainCount() == 2);
1803 		OSSharedPtr<OSDictionary> result2 = IOService::registryEntryIDMatching(12, table);
1804 		assert(result2);
1805 		assert(result2 == table);
1806 		assert(result2->getRetainCount() == 3);
1807 	}
1808 }
1809 
1810 static int
OSSharedPtrTests(int)1811 OSSharedPtrTests(int)
1812 {
1813 	OSDynamicPtrCastTests();
1814 	OSConstPtrCastTests();
1815 	OSStaticPtrCastTests();
1816 	IOServiceMatchingSharedPtrTests();
1817 	return 0;
1818 }
1819 
1820 static int
IOServiceStateNotificationTests(int)1821 IOServiceStateNotificationTests(int)
1822 {
1823 	IOService * service = IOService::getSystemStateNotificationService();
1824 	OSSharedPtr<OSString> str = OSString::withCString(kIOSystemStateClamshellKey);
1825 	kern_return_t kr = service->StateNotificationItemCreate(str.get(), NULL);
1826 	assert(kIOReturnSuccess == kr);
1827 
1828 	void (^sendClam)(OSBoolean * state) = ^void (OSBoolean * state) {
1829 		OSSharedPtr<OSDictionary> value;
1830 		kern_return_t kr;
1831 
1832 		value = OSDictionary::withCapacity(4);
1833 		value->setObject("value", state);
1834 		kr = IOService::getSystemStateNotificationService()->StateNotificationItemSet(str.get(), value.get());
1835 		assert(kIOReturnSuccess == kr);
1836 	};
1837 	sendClam(kOSBooleanTrue);
1838 	IOSleep(100);
1839 	sendClam(kOSBooleanFalse);
1840 
1841 	str = OSString::withCString("test");
1842 	OSSharedPtr<OSArray> array = OSArray::withCapacity(4);
1843 	array->setObject(str.get());
1844 	IOStateNotificationListenerRef listenerRef;
1845 	kr = service->stateNotificationListenerAdd(array.get(), &listenerRef, ^kern_return_t () {
1846 		IOLog("test handler\n");
1847 		kern_return_t kr;
1848 		OSDictionary * dict;
1849 		kr = service->StateNotificationItemCopy(str.get(), &dict);
1850 		if (kIOReturnSuccess == kr) {
1851 		        OSSharedPtr<OSSerialize> s = OSSerialize::withCapacity(4096);
1852 		        dict->serialize(s.get());
1853 		        IOLog("test handler %s\n", s->text());
1854 		}
1855 		return kIOReturnSuccess;
1856 	});
1857 	assert(kIOReturnSuccess == kr);
1858 
1859 	OSSharedPtr<IOEventSource> es =
1860 	    IOServiceStateNotificationEventSource::serviceStateNotificationEventSource(
1861 		service, array.get(),
1862 		^void () {
1863 		IOLog("test es handler\n");
1864 		kern_return_t kr;
1865 		OSDictionary * dict;
1866 		kr = service->StateNotificationItemCopy(str.get(), &dict);
1867 		if (kIOReturnSuccess == kr) {
1868 		        OSSharedPtr<OSSerialize> s = OSSerialize::withCapacity(4096);
1869 		        dict->serialize(s.get());
1870 		        IOLog("test es handler %s\n", s->text());
1871 		}
1872 	});
1873 	assert(es);
1874 	IOService::getPlatform()->getWorkLoop()->addEventSource(es.get());
1875 	es->enable();
1876 	IOSleep(30 * 1000);
1877 	IOService::getPlatform()->getWorkLoop()->removeEventSource(es.get());
1878 
1879 	return kIOReturnSuccess;
1880 }
1881 
1882 static int
IOMallocPageableTests(int)1883 IOMallocPageableTests(int)
1884 {
1885 	vm_size_t size = 0;
1886 	vm_size_t alignment = 0;
1887 
1888 	for (size = 0; size <= 4 * page_size; size += 64) {
1889 		for (alignment = 1; alignment <= page_size; alignment <<= 1) {
1890 			uintptr_t alignMask = alignment - 1;
1891 			void * addr = IOMallocPageable(size, alignment);
1892 			if (addr == NULL) {
1893 				IOLog("IOMallocPageable(size=%u, alignment=%u) failed\n", (uint32_t)size, (uint32_t)alignment);
1894 				return kIOReturnError;
1895 			}
1896 			if (((uintptr_t)addr & alignMask) != 0) {
1897 				IOLog("IOMallocPageable(size=%u, alignment=%u) returned unaligned pointer %p\n", (uint32_t)size, (uint32_t)alignment, addr);
1898 				return kIOReturnError;
1899 			}
1900 			IOFreePageable(addr, size);
1901 
1902 			addr = IOMallocPageableZero(size, alignment);
1903 			if (addr == NULL) {
1904 				IOLog("IOMallocPageableZero(size=%u, alignment=%u) failed\n", (uint32_t)size, (uint32_t)alignment);
1905 				return kIOReturnError;
1906 			}
1907 			if (((uintptr_t)addr & alignMask) != 0) {
1908 				IOLog("IOMallocPageableZero(size=%u, alignment=%u) returned unaligned pointer %p\n", (uint32_t)size, (uint32_t)alignment, addr);
1909 				return kIOReturnError;
1910 			}
1911 			for (char * ptr = (char *)addr; ptr < (char *)addr + size; ptr++) {
1912 				if (*ptr != 0) {
1913 					IOLog("IOMallocPageableZero(size=%u, alignment=%u) -> %p, byte at %p is nonzero\n", (uint32_t)size, (uint32_t)alignment, addr, ptr);
1914 				}
1915 			}
1916 			IOFreePageable(addr, size);
1917 		}
1918 	}
1919 
1920 	return kIOReturnSuccess;
1921 }
1922 
1923 
1924 #endif  /* DEVELOPMENT || DEBUG */
1925 
1926 #ifndef __clang_analyzer__
1927 // All the scary things that this function is doing, such as the intentional
1928 // overrelease of an OSData, are hidden from the static analyzer.
1929 static int
sysctl_iokittest(__unused struct sysctl_oid * oidp,__unused void * arg1,__unused int arg2,struct sysctl_req * req)1930 sysctl_iokittest(__unused struct sysctl_oid *oidp, __unused void *arg1, __unused int arg2, struct sysctl_req *req)
1931 {
1932 	int error;
1933 	int newValue, changed;
1934 
1935 	error = sysctl_io_number(req, 0, sizeof(int), &newValue, &changed);
1936 	if (error) {
1937 		return error;
1938 	}
1939 
1940 #if DEVELOPMENT || DEBUG
1941 	if (changed && (66 == newValue)) {
1942 		IOReturn ret;
1943 		OSSharedPtr<IOWorkLoop> wl = IOWorkLoop::workLoop();
1944 		OSSharedPtr<IOCommandGate> cg = IOCommandGate::commandGate(wl.get());
1945 		ret = wl->addEventSource(cg.get());
1946 
1947 		struct x {
1948 			uint64_t h;
1949 			uint64_t l;
1950 		};
1951 		struct x y;
1952 
1953 		y.h = 0x1111111122222222;
1954 		y.l = 0x3333333344444444;
1955 
1956 		kprintf("ret1 %d\n", ret);
1957 		ret = cg->runActionBlock(^(){
1958 			printf("hello %d 0x%qx\n", wl->inGate(), y.h);
1959 			return 99;
1960 		});
1961 		kprintf("ret %d\n", ret);
1962 	}
1963 
1964 	if (changed && (999 == newValue)) {
1965 		OSSharedPtr<OSData> data = OSData::withCapacity(16);
1966 		data->release();
1967 	}
1968 
1969 	if (changed && (newValue >= 6666) && (newValue <= 6669)) {
1970 		OSSharedPtr<OSIterator> iter;
1971 		IOService  * service;
1972 
1973 		service = NULL;
1974 		OSSharedPtr<OSDictionary> matchingDict = IOService::nameMatching("XHC1");
1975 		iter = IOService::getMatchingServices(matchingDict.get());
1976 		if (iter && (service = (IOService *) iter->getNextObject())) {
1977 			if (newValue == 6666) {
1978 				IOLog("terminating 0x%qx\n", service->getRegistryEntryID());
1979 				service->terminate();
1980 			} else if (newValue == 6667) {
1981 				IOLog("register 0x%qx\n", service->getRegistryEntryID());
1982 				service->registerService();
1983 			}
1984 		}
1985 		if (service) {
1986 			return 0;
1987 		}
1988 	}
1989 
1990 
1991 	if (changed && (555 == newValue)) {
1992 		IOServiceStateNotificationTests(newValue);
1993 	}
1994 #if TEST_ZLIB
1995 	if (changed && (122 == newValue)) {
1996 		error = TestZLib(newValue);
1997 		assert(KERN_SUCCESS == error);
1998 	}
1999 #endif /* TEST_ZLIB */
2000 	if (changed && newValue) {
2001 		error = IOWorkLoopTest(newValue);
2002 		assert(KERN_SUCCESS == error);
2003 		error = IOServiceTest(newValue);
2004 		assert(KERN_SUCCESS == error);
2005 		error = OSCollectionTest(newValue);
2006 		assert(KERN_SUCCESS == error);
2007 		error = OSCollectionIteratorTests(newValue);
2008 		assert(KERN_SUCCESS == error);
2009 		error = OSAllocationTests(newValue);
2010 		assert(KERN_SUCCESS == error);
2011 		error = OSDataAllocationTests(newValue);
2012 		assert(KERN_SUCCESS == error);
2013 		error = OSBoundedArrayTests(newValue);
2014 		assert(KERN_SUCCESS == error);
2015 		error = OSBoundedArrayRefTests(newValue);
2016 		assert(KERN_SUCCESS == error);
2017 		error = OSBoundedPtrTests(newValue);
2018 		assert(KERN_SUCCESS == error);
2019 		error = OSValueObjectTests(newValue);
2020 		assert(KERN_SUCCESS == error);
2021 		error = IOMemoryDescriptorTest(newValue);
2022 		assert(KERN_SUCCESS == error);
2023 		error = OSSharedPtrTests(newValue);
2024 		assert(KERN_SUCCESS == error);
2025 		error = IOSharedDataQueue_44636964(newValue);
2026 		assert(KERN_SUCCESS == error);
2027 		error = IOUserNotificationTests(newValue);
2028 		assert(KERN_SUCCESS == error);
2029 		error = IOMallocPageableTests(newValue);
2030 		assert(KERN_SUCCESS == error);
2031 		error = IODataQueueDispatchSourceTests(newValue);
2032 		assert(KERN_SUCCESS == error);
2033 	}
2034 #endif  /* DEVELOPMENT || DEBUG */
2035 
2036 	return error;
2037 }
2038 
2039 SYSCTL_PROC(_kern, OID_AUTO, iokittest,
2040     CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_KERN | CTLFLAG_LOCKED,
2041     NULL, 0, sysctl_iokittest, "I", "");
2042 #endif // __clang_analyzer__
2043 
2044 #if DEVELOPMENT || DEBUG
2045 
2046 /*
2047  * A simple wrapper around an IOService. This terminates the IOService in free().
2048  */
2049 class TestIOServiceHandle : public OSObject
2050 {
2051 	OSDeclareDefaultStructors(TestIOServiceHandle);
2052 public:
2053 	static TestIOServiceHandle * withService(IOService * service);
2054 
2055 private:
2056 	bool initWithService(IOService * service);
2057 	virtual void free() APPLE_KEXT_OVERRIDE;
2058 
2059 	IOService * fService;
2060 };
2061 
2062 OSDefineMetaClassAndStructors(TestIOServiceHandle, OSObject);
2063 
2064 TestIOServiceHandle *
withService(IOService * service)2065 TestIOServiceHandle::withService(IOService * service)
2066 {
2067 	TestIOServiceHandle * handle = new TestIOServiceHandle;
2068 	if (handle && !handle->initWithService(service)) {
2069 		return NULL;
2070 	}
2071 	return handle;
2072 }
2073 
2074 bool
initWithService(IOService * service)2075 TestIOServiceHandle::initWithService(IOService * service)
2076 {
2077 	fService = service;
2078 	fService->retain();
2079 	return true;
2080 }
2081 
2082 void
free()2083 TestIOServiceHandle::free()
2084 {
2085 	if (fService) {
2086 		fService->terminate();
2087 		OSSafeReleaseNULL(fService);
2088 	}
2089 }
2090 
2091 /*
2092  * Set up test IOServices. See the available services in xnu/iokit/Tests/TestServices.
2093  *
2094  * xnu darwintests use this sysctl to make these test services available. A send right is pushed
2095  * to the task that called the sysctl, which when deallocated removes the service. This ensures
2096  * that the registry isn't polluted by misbehaving tests.
2097  *
2098  * Since this sysctl allows callers to instantiate arbitrary classes based on their class name,
2099  * this can be a security concern. Tests that call this sysctl need the
2100  * kIOServiceTestServiceManagementEntitlementKey entitlement.
2101  */
2102 static int
sysctl_iokit_test_service_setup(struct sysctl_oid * oidp,__unused void * arg1,__unused int arg2,struct sysctl_req * req)2103 sysctl_iokit_test_service_setup(struct sysctl_oid *oidp, __unused void *arg1, __unused int arg2, struct sysctl_req *req)
2104 {
2105 	char classname[128] = {0};
2106 	IOService * service; // must not release
2107 	OSObject * obj = NULL; // must release
2108 	IOService * provider = NULL; // must not release
2109 	TestIOServiceHandle * handle = NULL; // must release
2110 	mach_port_name_t name __unused;
2111 	int error;
2112 
2113 	if (!IOTaskHasEntitlement(current_task(), kIOServiceTestServiceManagementEntitlementKey)) {
2114 		error = EPERM;
2115 		goto finish;
2116 	}
2117 
2118 	error = sysctl_handle_string(oidp, classname, sizeof(classname), req);
2119 	if (error != 0) {
2120 		goto finish;
2121 	}
2122 
2123 	/*
2124 	 * All test services currently attach to IOResources.
2125 	 */
2126 	provider = IOService::getResourceService();
2127 	if (!provider) {
2128 		IOLog("Failed to find IOResources\n");
2129 		error = ENOENT;
2130 		goto finish;
2131 	}
2132 
2133 	obj = OSMetaClass::allocClassWithName(classname);
2134 	if (!obj) {
2135 		IOLog("Failed to alloc class %s\n", classname);
2136 		error = ENOENT;
2137 		goto finish;
2138 	}
2139 
2140 	service = OSDynamicCast(IOService, obj);
2141 
2142 	if (!service) {
2143 		IOLog("Instance of class %s is not an IOService\n", classname);
2144 		error = EINVAL;
2145 		goto finish;
2146 	}
2147 
2148 	if (!service->init()) {
2149 		IOLog("Failed to initialize %s\n", classname);
2150 		error = EINVAL;
2151 		goto finish;
2152 	}
2153 
2154 	if (!service->attach(provider)) {
2155 		IOLog("Failed to attach %s\n", classname);
2156 		error = EINVAL;
2157 		goto finish;
2158 	}
2159 
2160 	if (!service->start(provider)) {
2161 		IOLog("Failed to start %s\n", classname);
2162 		error = EINVAL;
2163 		goto finish;
2164 	}
2165 
2166 	handle = TestIOServiceHandle::withService(service);
2167 	if (!handle) {
2168 		IOLog("Failed to create service handle\n");
2169 		error = ENOMEM;
2170 		goto finish;
2171 	}
2172 	name = iokit_make_send_right(current_task(), handle, IKOT_IOKIT_OBJECT);
2173 
2174 	error = 0;
2175 
2176 finish:
2177 
2178 	OSSafeReleaseNULL(obj);
2179 	OSSafeReleaseNULL(handle);
2180 	return error;
2181 }
2182 
2183 
2184 SYSCTL_PROC(_kern, OID_AUTO, iokit_test_service_setup,
2185     CTLTYPE_STRING | CTLFLAG_WR | CTLFLAG_KERN | CTLFLAG_LOCKED,
2186     NULL, 0, sysctl_iokit_test_service_setup, "-", "");
2187 
2188 #endif /* DEVELOPMENT || DEBUG */
2189 
2190 
2191 static __unused void
CastCompileTest(OSObject * obj)2192 CastCompileTest(OSObject *obj)
2193 {
2194 	IOService * service1 = OSDynamicCast(IOService, obj);
2195 	if (service1) {
2196 		service1->terminate();
2197 	}
2198 	IOService *service2 = OSRequiredCast(IOService, obj);
2199 	if (service2) {
2200 		service2->terminate();
2201 	}
2202 }
2203